diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 916dcb7b9660396ff9ea3e2ec6466a65131dcc59..7889b52afa141d9ec38c739b7bff350fc88997fa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -95,7 +95,7 @@ cargo-check-benches: stage: test <<: *docker-env script: - - BUILD_DUMMY_WASM_BINARY=1 time cargo check --benches + - BUILD_DUMMY_WASM_BINARY=1 time cargo check --benches --all - sccache -s @@ -106,7 +106,7 @@ cargo-check-subkey: - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 script: - cd ./subkey - - BUILD_DUMMY_WASM_BINARY=1 time cargo check --release # makes sense to save artifacts for building it + - BUILD_DUMMY_WASM_BINARY=1 time cargo check --release - sccache -s @@ -121,8 +121,17 @@ test-linux-stable: &test-linux variables: - $DEPLOY_TAG script: - - time cargo test --all --release --verbose --locked + - time cargo test --all --release --verbose --locked | + tee output.log - sccache -s + after_script: + - echo "___Collecting warnings for check_warnings job___" + - awk '/^warning:/,/^$/ { print }' output.log > ${CI_COMMIT_SHORT_SHA}_warnings.log + artifacts: + name: $CI_COMMIT_SHORT_SHA + expire_in: 24 hrs + paths: + - ${CI_COMMIT_SHORT_SHA}_warnings.log test-srml-staking: &test-srml-staking @@ -165,7 +174,7 @@ test-linux-stable-int: &> ${CI_COMMIT_SHORT_SHA}_int_failure.log - sccache -s after_script: - - awk '/FAILED/,0' ${CI_COMMIT_SHORT_SHA}_int_failure.log + - awk '/FAILED|^error\[/,0' ${CI_COMMIT_SHORT_SHA}_int_failure.log artifacts: name: $CI_COMMIT_SHORT_SHA when: on_failure @@ -214,7 +223,7 @@ check-web-wasm: #### stage: build -build-linux-release: +build-linux-substrate: stage: build <<: *collect-artifacts <<: *docker-env @@ -224,27 +233,27 @@ build-linux-release: - $DEPLOY_TAG script: - time cargo build --release --verbose - - mkdir -p ./artifacts - - mv ./target/release/substrate ./artifacts/. + - mkdir -p ./artifacts/substrate/ + - mv ./target/release/substrate ./artifacts/substrate/. - echo -n "Substrate version = " - if [ "${CI_COMMIT_TAG}" ]; then - echo "${CI_COMMIT_TAG}" | tee ./artifacts/VERSION; + echo "${CI_COMMIT_TAG}" | tee ./artifacts/substrate/VERSION; else - ./artifacts/substrate --version | - sed -n -r 's/^substrate ([0-9.]+.*-[0-9a-f]{7,13})-.*$/\1/p' | - tee ./artifacts/VERSION; + ./artifacts/substrate/substrate --version | + sed -n -r 's/^substrate ([0-9.]+.*-[0-9a-f]{7,13})-.*$/\1/p' | + tee ./artifacts/substrate/VERSION; fi - - sha256sum ./artifacts/substrate | tee ./artifacts/substrate.sha256 + - sha256sum ./artifacts/substrate/substrate | tee ./artifacts/substrate/substrate.sha256 - printf '\n# building node-template\n\n' - - ./scripts/node-template-release.sh ./artifacts/substrate-node-template.tar.gz - - cp -r scripts/docker/* ./artifacts + - ./scripts/node-template-release.sh ./artifacts/substrate/substrate-node-template.tar.gz + - cp -r scripts/docker/substrate.Dockerfile ./artifacts/substrate/ - sccache -s build-linux-subkey: stage: build <<: *collect-artifacts <<: *docker-env - # <<: *build-only + <<: *build-only except: variables: - $DEPLOY_TAG @@ -252,15 +261,16 @@ build-linux-subkey: - cd ./subkey - BUILD_DUMMY_WASM_BINARY=1 time cargo build --release --verbose - cd .. - # - time cargo build --release - sccache -s - - mkdir -p ./artifacts - - mv ./target/release/subkey ./artifacts/. + - mkdir -p ./artifacts/subkey + - mv ./target/release/subkey ./artifacts/subkey/. - echo -n "Subkey version = " - - ./artifacts/subkey --version | + - ./artifacts/subkey/subkey --version | sed -n -r 's/^subkey ([0-9.]+.*)/\1/p' | - tee ./artifacts/SUBKEY-VERSION; - - sha256sum ./artifacts/subkey | tee ./artifacts/subkey.sha256 + tee ./artifacts/subkey/VERSION; + - sha256sum ./artifacts/subkey/subkey | tee ./artifacts/subkey/subkey.sha256 + - cp -r scripts/docker/subkey.Dockerfile ./artifacts/subkey/ + - sccache -s build-rust-doc-release: stage: build @@ -280,67 +290,102 @@ build-rust-doc-release: - echo "" > ./crate-docs/index.html - sccache -s +check_warnings: + stage: build + <<: *docker-env + except: + variables: + - $DEPLOY_TAG + variables: + GIT_STRATEGY: none + dependencies: + - test-linux-stable + script: + - if [ -s ${CI_COMMIT_SHORT_SHA}_warnings.log ]; then + cat ${CI_COMMIT_SHORT_SHA}_warnings.log; + exit 1; + else + echo "___No warnings___"; + fi + allow_failure: true + #### stage: publish -.publish-build: &publish-build - stage: publish - dependencies: - - build-linux-release - - build-linux-subkey +.publish-docker-release: &publish-docker-release <<: *build-only <<: *kubernetes-build - -publish-docker-release: - <<: *publish-build image: docker:stable services: - docker:dind - # collect VERSION artifact here to pass it on to kubernetes - <<: *collect-artifacts - variables: - DOCKER_HOST: tcp://localhost:2375 - DOCKER_DRIVER: overlay2 - GIT_STRATEGY: none - # DOCKERFILE: scripts/docker/Dockerfile - CONTAINER_IMAGE: parity/substrate before_script: - test "$Docker_Hub_User_Parity" -a "$Docker_Hub_Pass_Parity" || ( echo "no docker credentials provided"; exit 1 ) - docker login -u "$Docker_Hub_User_Parity" -p "$Docker_Hub_Pass_Parity" - docker info script: - - VERSION="$(cat ./artifacts/VERSION)" - - echo "Substrate version = ${VERSION}" + - cd ./artifacts/$PRODUCT/ + - VERSION="$(cat ./VERSION)" + - echo "${PRODUCT} version = ${VERSION}" - test -z "${VERSION}" && exit 1 - - cd ./artifacts - docker build --build-arg VCS_REF="${CI_COMMIT_SHA}" --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" --tag $CONTAINER_IMAGE:$VERSION - --tag $CONTAINER_IMAGE:latest . + --tag $CONTAINER_IMAGE:latest + --file $DOCKERFILE . - docker push $CONTAINER_IMAGE:$VERSION - docker push $CONTAINER_IMAGE:latest + +publish-docker-substrate: + stage: publish + <<: *publish-docker-release + # collect VERSION artifact here to pass it on to kubernetes + <<: *collect-artifacts + dependencies: + - build-linux-substrate + variables: + DOCKER_HOST: tcp://localhost:2375 + DOCKER_DRIVER: overlay2 + GIT_STRATEGY: none + PRODUCT: substrate + DOCKERFILE: $PRODUCT.Dockerfile + CONTAINER_IMAGE: parity/$PRODUCT after_script: - docker logout # only VERSION information is needed for the deployment - - find ./artifacts/ -depth -not -name VERSION -not -name artifacts -delete + - find ./artifacts/ -depth -not -name VERSION -type f -delete + +publish-docker-subkey: + stage: publish + <<: *publish-docker-release + dependencies: + - build-linux-subkey + variables: + DOCKER_HOST: tcp://localhost:2375 + DOCKER_DRIVER: overlay2 + GIT_STRATEGY: none + PRODUCT: subkey + DOCKERFILE: $PRODUCT.Dockerfile + CONTAINER_IMAGE: parity/$PRODUCT + after_script: + - docker logout publish-s3-release: - <<: *publish-build + stage: publish + <<: *build-only + <<: *kubernetes-build + dependencies: + - build-linux-substrate + - build-linux-subkey image: parity/awscli:latest variables: GIT_STRATEGY: none BUCKET: "releases.parity.io" PREFIX: "substrate/${ARCH}-${DOCKER_OS}" script: - - aws s3 sync ./artifacts/ s3://${BUCKET}/${PREFIX}/$(cat ./artifacts/VERSION)/ + - aws s3 sync ./artifacts/ s3://${BUCKET}/${PREFIX}/$(cat ./artifacts/substrate/VERSION)/ - echo "update objects in latest path" - - for file in ./artifacts/*; do - name="$(basename ${file})"; - aws s3api copy-object - --copy-source ${BUCKET}/${PREFIX}/$(cat ./artifacts/VERSION)/${name} - --bucket ${BUCKET} --key ${PREFIX}/latest/${name}; - done + - aws s3 sync s3://${BUCKET}/${PREFIX}/$(cat ./artifacts/substrate/VERSION)/ s3://${BUCKET}/${PREFIX}/latest/ after_script: - aws s3 ls s3://${BUCKET}/${PREFIX}/latest/ --recursive --human-readable --summarize @@ -423,8 +468,8 @@ publish-gh-doc: - kubernetes-parity-build before_script: - test -z "${DEPLOY_TAG}" && - test -f ./artifacts/VERSION && - DEPLOY_TAG="$(cat ./artifacts/VERSION)" + test -f ./artifacts/substrate/VERSION && + DEPLOY_TAG="$(cat ./artifacts/substrate/VERSION)" - test "${DEPLOY_TAG}" || ( echo "Neither DEPLOY_TAG nor VERSION information available"; exit 1 ) script: - echo "Substrate version = ${DEPLOY_TAG}" @@ -450,7 +495,7 @@ publish-gh-doc: .deploy-cibuild: &deploy-cibuild <<: *deploy dependencies: - - publish-docker-release + - publish-docker-substrate .deploy-tag: &deploy-tag <<: *deploy @@ -483,7 +528,7 @@ deploy-ue1-tag: .validator-deploy: &validator-deploy stage: flaming-fir dependencies: - - build-linux-release + - build-linux-substrate image: parity/azure-ansible:v1 allow_failure: true when: manual diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000000000000000000000000000000000000..2106b2a59e1b3eaea8c407c2267a964b0ccc4c06 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,15 @@ +# Lists some code owners +# +# For details about syntax, see: +# https://help.github.com/en/articles/about-code-owners +# But here are some important notes: +# +# - 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, @pepyakin) or email can be used. Keep in mind, that handles might work better because they +# are more recognizable on GitHub, you can use them for mentioning unlike an email. +# - The latest matching rule, if multiple, takes precedence. + +/srml/contracts/ @pepyakin +/core/executor/ @pepyakin diff --git a/Cargo.lock b/Cargo.lock index 4a985f432f87285e3d02b5e78962b9e2e8ba449d..a207eb8ad95777d1644d8537bd50c3f24c8f6016 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -50,7 +50,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -76,6 +76,11 @@ dependencies = [ "xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "arc-swap" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "arrayref" version = "0.3.5" @@ -83,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "arrayvec" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -102,8 +107,8 @@ name = "asn1_der_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -113,37 +118,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "atty" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace-sys 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "backtrace-sys" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -190,11 +194,11 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -213,6 +217,11 @@ name = "bitvec" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bitvec" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "blake2" version = "0.8.0" @@ -229,7 +238,7 @@ name = "blake2-rfc" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -276,13 +285,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bstr" -version = "0.2.1" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-automata 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -298,6 +307,11 @@ name = "bumpalo" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "byte-slice-cast" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byte-tools" version = "0.2.0" @@ -344,13 +358,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cargo_metadata" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -361,7 +375,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rayon 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -395,7 +409,7 @@ name = "chrono" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -407,7 +421,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -417,7 +431,7 @@ version = "2.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -431,7 +445,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -447,7 +461,7 @@ name = "cmake" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -461,7 +475,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -482,25 +496,25 @@ name = "criterion" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -513,28 +527,12 @@ dependencies = [ "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "crossbeam" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "crossbeam-channel" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -542,8 +540,8 @@ name = "crossbeam-deque" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -551,21 +549,21 @@ name = "crossbeam-deque" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-epoch" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -573,12 +571,12 @@ name = "crossbeam-queue" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-utils" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -618,11 +616,11 @@ name = "csv" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bstr 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -638,8 +636,8 @@ name = "ctor" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -692,9 +690,9 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -704,10 +702,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -775,10 +773,10 @@ name = "env_logger" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -792,7 +790,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -800,7 +798,7 @@ name = "error-chain" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -818,7 +816,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -828,8 +826,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -843,20 +841,20 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "finality-grandpa" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -865,7 +863,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -878,10 +876,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide_c_api 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -907,7 +905,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "fork-tree" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -916,7 +914,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -926,7 +924,7 @@ name = "fs2" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1067,7 +1065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1077,7 +1075,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1086,7 +1084,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1105,15 +1103,15 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "bstr 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "h2" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1122,7 +1120,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1130,12 +1128,12 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1205,7 +1203,7 @@ dependencies = [ [[package]] name = "hmac" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1276,19 +1274,19 @@ dependencies = [ [[package]] name = "hyper" -version = "0.12.31" +version = "0.12.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1315,10 +1313,10 @@ dependencies = [ [[package]] name = "impl-codec" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1327,7 +1325,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1335,7 +1333,7 @@ name = "impl-serde" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1358,7 +1356,7 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1382,10 +1380,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1395,11 +1393,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.31 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1411,9 +1409,9 @@ version = "12.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1432,8 +1430,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1441,10 +1439,10 @@ name = "jsonrpc-http-server" version = "12.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hyper 0.12.31 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-server-utils 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1456,9 +1454,9 @@ version = "12.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1470,7 +1468,7 @@ dependencies = [ "globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1484,7 +1482,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-server-utils 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ws 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1497,11 +1495,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "keccak-hasher" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1541,10 +1539,10 @@ dependencies = [ "fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1568,7 +1566,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.59" +version = "0.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1576,39 +1574,40 @@ name = "libloading" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-deflate 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-wasm-ext 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-websocket 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1619,7 +1618,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1631,12 +1630,12 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1654,39 +1653,38 @@ dependencies = [ [[package]] name = "libp2p-core-derive" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-deflate" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "flate2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1694,28 +1692,26 @@ dependencies = [ "cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-identify" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1726,22 +1722,21 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1754,14 +1749,15 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1775,14 +1771,14 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1791,16 +1787,16 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1811,18 +1807,16 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1830,45 +1824,44 @@ dependencies = [ [[package]] name = "libp2p-plaintext" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-secio" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "asn1_der 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1876,22 +1869,35 @@ dependencies = [ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-swarm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1899,55 +1905,55 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-wasm-ext" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-websocket" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "soketto 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-yamux" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1958,9 +1964,9 @@ version = "5.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1981,9 +1987,9 @@ name = "libz-sys" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2017,17 +2023,25 @@ dependencies = [ "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2047,7 +2061,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2061,20 +2075,23 @@ name = "memchr" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "memoffset" -version = "0.2.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "memory-db" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-util-mem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2086,13 +2103,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2108,13 +2125,13 @@ name = "miniz-sys" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "miniz_oxide" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2122,13 +2139,13 @@ dependencies = [ [[package]] name = "miniz_oxide_c_api" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2140,8 +2157,8 @@ dependencies = [ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2154,7 +2171,7 @@ version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2165,7 +2182,7 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2187,7 +2204,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2208,11 +2225,11 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.24 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)", "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2225,7 +2242,7 @@ version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2235,9 +2252,9 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2247,25 +2264,30 @@ version = "2.0.0" dependencies = [ "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", + "srml-balances 2.0.0", "srml-contracts 2.0.0", "srml-finality-tracker 2.0.0", + "srml-im-online 0.1.0", "srml-indices 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", "srml-timestamp 2.0.0", "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-basic-authorship 2.0.0", "substrate-cli 2.0.0", "substrate-client 2.0.0", - "substrate-consensus-aura 2.0.0", - "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-babe 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-finality-grandpa 2.0.0", "substrate-finality-grandpa-primitives 2.0.0", @@ -2278,6 +2300,7 @@ dependencies = [ "substrate-service-test 2.0.0", "substrate-telemetry 2.0.0", "substrate-transaction-pool 2.0.0", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "transaction-factory 0.0.1", ] @@ -2288,7 +2311,7 @@ version = "2.0.0" dependencies = [ "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "srml-balances 2.0.0", @@ -2307,7 +2330,7 @@ dependencies = [ "substrate-state-machine 2.0.0", "substrate-test-client 2.0.0", "substrate-trie 2.0.0", - "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2315,9 +2338,9 @@ dependencies = [ name = "node-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2330,9 +2353,9 @@ version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.31 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core-client 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "substrate-rpc 2.0.0", ] @@ -2343,15 +2366,15 @@ version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", - "srml-aura 2.0.0", "srml-authorship 0.1.0", + "srml-babe 2.0.0", "srml-balances 2.0.0", "srml-collective 2.0.0", "srml-contracts 2.0.0", @@ -2360,7 +2383,9 @@ dependencies = [ "srml-executive 2.0.0", "srml-finality-tracker 2.0.0", "srml-grandpa 2.0.0", + "srml-im-online 0.1.0", "srml-indices 2.0.0", + "srml-membership 2.0.0", "srml-session 2.0.0", "srml-staking 2.0.0", "srml-sudo 2.0.0", @@ -2369,10 +2394,12 @@ dependencies = [ "srml-timestamp 2.0.0", "srml-treasury 2.0.0", "substrate-client 2.0.0", - "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", + "substrate-consensus-common-primitives 2.0.0", "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", + "substrate-session 2.0.0", "substrate-wasm-builder-runner 1.0.2", ] @@ -2384,23 +2411,25 @@ dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "node-template-runtime 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "substrate-basic-authorship 2.0.0", "substrate-cli 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", "substrate-executor 2.0.0", + "substrate-finality-grandpa-primitives 2.0.0", "substrate-inherents 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-transaction-pool 2.0.0", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2408,9 +2437,9 @@ dependencies = [ name = "node-template-runtime" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2427,6 +2456,7 @@ dependencies = [ "substrate-consensus-aura-primitives 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", + "substrate-session 2.0.0", "substrate-wasm-builder-runner 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2449,12 +2479,32 @@ dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-integer" version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-rational" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2463,7 +2513,7 @@ name = "num-traits" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2471,14 +2521,9 @@ name = "num_cpus" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "numtoa" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "ole32-sys" version = "0.2.0" @@ -2503,15 +2548,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.23" +version = "0.10.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2521,13 +2566,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-sys" -version = "0.9.47" +version = "0.9.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2562,24 +2607,12 @@ source = "git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7 [[package]] name = "parity-codec" -version = "4.1.1" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "bitvec 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parity-codec-derive" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2592,19 +2625,20 @@ dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multihash" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2612,6 +2646,30 @@ dependencies = [ "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-scale-codec" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bitvec 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-slice-cast 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec-derive 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "vecarray 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parity-send-wrapper" version = "0.1.0" @@ -2672,12 +2730,22 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2688,7 +2756,7 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2700,7 +2768,7 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2714,7 +2782,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2722,6 +2790,20 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "paste" version = "0.1.5" @@ -2738,8 +2820,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2768,7 +2850,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "pkg-config" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2776,15 +2858,6 @@ name = "ppv-lite86" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pretty_assertions" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "pretty_assertions" version = "0.6.1" @@ -2798,11 +2871,11 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fixed-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-codec 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-codec 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2821,8 +2894,8 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2835,7 +2908,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2844,7 +2917,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2864,14 +2937,14 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quote" -version = "0.6.12" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2882,7 +2955,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2892,7 +2965,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2905,7 +2978,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2915,8 +2988,8 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2934,8 +3007,8 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "getrandom 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2945,16 +3018,15 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_chacha" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3009,7 +3081,7 @@ name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3021,7 +3093,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3032,7 +3104,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3070,7 +3142,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3088,14 +3160,6 @@ name = "redox_syscall" version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ref_thread_local" version = "0.0.0" @@ -3103,19 +3167,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "regex" -version = "1.1.9" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-automata" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3123,10 +3187,10 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.8" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ucd-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3139,13 +3203,13 @@ dependencies = [ [[package]] name = "rhododendron" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3153,9 +3217,9 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3166,7 +3230,7 @@ name = "rocksdb" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3176,7 +3240,7 @@ version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3204,7 +3268,7 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3241,7 +3305,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "same-file" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3258,19 +3322,17 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.1.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3299,7 +3361,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3325,7 +3387,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3340,20 +3402,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.94" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.94" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3363,7 +3425,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3433,12 +3495,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "slog" -version = "2.4.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "slog-async" +version = "2.3.0" +source = "git+https://github.com/paritytech/slog-async#107848e7ded5e80dc43f6296c2b96039eb92c0a5" +dependencies = [ + "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "slog-json" version = "2.3.0" @@ -3446,19 +3519,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "slog-scope" -version = "4.1.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3467,8 +3540,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3504,7 +3577,7 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3528,10 +3601,10 @@ version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-version 2.0.0", "substrate-client 2.0.0", @@ -3539,8 +3612,8 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", "substrate-test-runtime-client 2.0.0", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", - "trybuild 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3548,9 +3621,9 @@ name = "sr-io" version = "2.0.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-offchain 2.0.0", @@ -3565,15 +3638,17 @@ name = "sr-primitives" version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-std 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-primitives 2.0.0", ] @@ -3582,12 +3657,12 @@ name = "sr-sandbox" version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3602,8 +3677,8 @@ name = "sr-version" version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -3612,8 +3687,8 @@ dependencies = [ name = "srml-assets" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3627,9 +3702,9 @@ name = "srml-aura" version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3638,6 +3713,7 @@ dependencies = [ "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-consensus-aura-primitives 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", @@ -3647,12 +3723,13 @@ dependencies = [ name = "srml-authorship" version = "0.1.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", + "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", ] @@ -3662,13 +3739,14 @@ version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-session 2.0.0", + "srml-staking 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", @@ -3681,9 +3759,9 @@ dependencies = [ name = "srml-balances" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3698,9 +3776,9 @@ name = "srml-collective" version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3717,10 +3795,10 @@ dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-sandbox 2.0.0", @@ -3738,9 +3816,9 @@ dependencies = [ name = "srml-democracy" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3755,9 +3833,9 @@ name = "srml-elections" version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3771,8 +3849,8 @@ dependencies = [ name = "srml-example" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "srml-balances 2.0.0", @@ -3786,8 +3864,8 @@ name = "srml-executive" version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3802,8 +3880,8 @@ dependencies = [ name = "srml-finality-tracker" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3817,8 +3895,8 @@ dependencies = [ name = "srml-generic-asset" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3831,8 +3909,8 @@ dependencies = [ name = "srml-grandpa" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3844,14 +3922,30 @@ dependencies = [ "substrate-primitives 2.0.0", ] +[[package]] +name = "srml-im-online" +version = "0.1.0" +dependencies = [ + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-application-crypto 2.0.0", + "substrate-primitives 2.0.0", +] + [[package]] name = "srml-indices" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3861,12 +3955,26 @@ dependencies = [ "substrate-primitives 2.0.0", ] +[[package]] +name = "srml-membership" +version = "2.0.0" +dependencies = [ + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", +] + [[package]] name = "srml-metadata" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -3876,15 +3984,16 @@ name = "srml-session" version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", ] @@ -3893,13 +4002,14 @@ dependencies = [ name = "srml-staking" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", + "srml-authorship 0.1.0", "srml-balances 2.0.0", "srml-session 2.0.0", "srml-support 2.0.0", @@ -3913,8 +4023,8 @@ dependencies = [ name = "srml-sudo" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3930,10 +4040,10 @@ version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3949,10 +4059,10 @@ name = "srml-support-procedural" version = "2.0.0" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "srml-support-procedural-tools 2.0.0", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3961,9 +4071,9 @@ version = "2.0.0" dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "srml-support-procedural-tools-derive 2.0.0", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3971,21 +4081,22 @@ name = "srml-support-procedural-tools-derive" version = "2.0.0" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-test" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "srml-support 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "trybuild 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3993,9 +4104,9 @@ name = "srml-system" version = "2.0.0" dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4007,8 +4118,8 @@ dependencies = [ name = "srml-timestamp" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4022,8 +4133,8 @@ dependencies = [ name = "srml-treasury" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4085,24 +4196,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "strum" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "strum_macros" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4114,12 +4225,13 @@ dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", - "substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "srml-balances 2.0.0", + "srml-system 2.0.0", + "substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4134,15 +4246,28 @@ dependencies = [ "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-application-crypto" +version = "2.0.0" +dependencies = [ + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-runtime-client 2.0.0", +] + [[package]] name = "substrate-basic-authorship" version = "2.0.0" dependencies = [ - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", - "substrate-consensus-aura-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", @@ -4153,12 +4278,12 @@ dependencies = [ [[package]] name = "substrate-bip39" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4168,7 +4293,7 @@ version = "2.0.0" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4177,9 +4302,9 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -4202,15 +4327,16 @@ name = "substrate-client" version = "2.0.0" dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4231,14 +4357,14 @@ name = "substrate-client-db" version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-rocksdb 0.1.4 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", @@ -4258,14 +4384,16 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", "srml-aura 2.0.0", "srml-support 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", "substrate-consensus-common 2.0.0", @@ -4273,24 +4401,25 @@ dependencies = [ "substrate-executor 2.0.0", "substrate-inherents 2.0.0", "substrate-keyring 2.0.0", + "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-aura-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", - "substrate-primitives 2.0.0", ] [[package]] @@ -4298,45 +4427,54 @@ name = "substrate-consensus-babe" version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "fork-tree 2.0.0", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", "srml-babe 2.0.0", "srml-support 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-consensus-slots 2.0.0", + "substrate-consensus-uncles 2.0.0", "substrate-executor 2.0.0", "substrate-inherents 2.0.0", "substrate-keyring 2.0.0", + "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-babe-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", "substrate-consensus-slots 2.0.0", - "substrate-primitives 2.0.0", ] [[package]] @@ -4344,19 +4482,28 @@ name = "substrate-consensus-common" version = "2.0.0" dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime-client 2.0.0", - "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-consensus-common-primitives" +version = "2.0.0" +dependencies = [ + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-client 2.0.0", ] [[package]] @@ -4366,10 +4513,10 @@ dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rhododendron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rhododendron 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", @@ -4387,17 +4534,30 @@ dependencies = [ name = "substrate-consensus-slots" version = "2.0.0" dependencies = [ - "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime-client 2.0.0", - "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-consensus-uncles" +version = "2.0.0" +dependencies = [ + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "srml-authorship 0.1.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -4406,13 +4566,14 @@ version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", "substrate-client 2.0.0", @@ -4425,7 +4586,7 @@ dependencies = [ "substrate-trie 2.0.0", "tiny-keccak 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4433,27 +4594,30 @@ name = "substrate-finality-grandpa" version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "finality-grandpa 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "finality-grandpa 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "fork-tree 2.0.0", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "srml-finality-tracker 2.0.0", "substrate-client 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-finality-grandpa-primitives 2.0.0", "substrate-inherents 2.0.0", "substrate-keyring 2.0.0", + "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4463,20 +4627,20 @@ dependencies = [ name = "substrate-finality-grandpa-primitives" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", - "substrate-primitives 2.0.0", ] [[package]] name = "substrate-inherents" version = "2.0.0" dependencies = [ - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -4487,8 +4651,8 @@ version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", - "strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "strum 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "strum_macros 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", ] @@ -4496,10 +4660,12 @@ dependencies = [ name = "substrate-keystore" version = "2.0.0" dependencies = [ - "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-application-crypto 2.0.0", "substrate-primitives 2.0.0", "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4519,23 +4685,25 @@ dependencies = [ "fork-tree 2.0.0", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-keyring 2.0.0", "substrate-peerset 2.0.0", @@ -4546,7 +4714,6 @@ dependencies = [ "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4557,18 +4724,19 @@ name = "substrate-offchain" version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-client-db 2.0.0", + "substrate-keystore 2.0.0", + "substrate-network 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4583,8 +4751,8 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4592,9 +4760,9 @@ name = "substrate-peerset" version = "2.0.0" dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4609,27 +4777,29 @@ dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", - "substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-serializer 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "twox-hash 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4645,19 +4815,21 @@ dependencies = [ "jsonrpc-core-client 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-derive 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", "substrate-client 2.0.0", "substrate-executor 2.0.0", + "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", + "substrate-session 2.0.0", "substrate-state-machine 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", @@ -4671,8 +4843,8 @@ dependencies = [ "jsonrpc-http-server 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-ws-server 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-rpc 2.0.0", ] @@ -4692,7 +4864,7 @@ dependencies = [ name = "substrate-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4705,27 +4877,32 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", "node-primitives 2.0.0", "node-runtime 2.0.0", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", "substrate-client-db 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-executor 2.0.0", "substrate-finality-grandpa 2.0.0", + "substrate-finality-grandpa-primitives 2.0.0", "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-offchain 2.0.0", "substrate-primitives 2.0.0", "substrate-rpc-servers 2.0.0", + "substrate-session 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", @@ -4742,7 +4919,7 @@ dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", @@ -4753,14 +4930,24 @@ dependencies = [ "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-session" +version = "2.0.0" +dependencies = [ + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", +] + [[package]] name = "substrate-state-db" version = "2.0.0" dependencies = [ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", ] @@ -4768,17 +4955,17 @@ dependencies = [ name = "substrate-state-machine" version = "2.0.0" dependencies = [ - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", - "trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4789,14 +4976,15 @@ dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", "futures-timer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "slog-async 2.3.0 (git+https://github.com/paritytech/slog-async)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog-scope 4.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4806,8 +4994,8 @@ name = "substrate-test-client" version = "2.0.0" dependencies = [ "futures-preview 0.3.0-alpha.17 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-client-db 2.0.0", @@ -4823,15 +5011,20 @@ name = "substrate-test-runtime" version = "2.0.0" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", + "srml-babe 2.0.0", "srml-executive 2.0.0", "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-application-crypto 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", "substrate-consensus-babe-primitives 2.0.0", @@ -4840,16 +5033,19 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", + "substrate-session 2.0.0", + "substrate-state-machine 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-trie 2.0.0", "substrate-wasm-builder-runner 1.0.2", - "trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-test-runtime-client" version = "2.0.0" dependencies = [ + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-primitives 2.0.0", "substrate-test-client 2.0.0", @@ -4864,10 +5060,10 @@ dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime 2.0.0", @@ -4879,9 +5075,9 @@ version = "2.0.0" dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-keyring 2.0.0", @@ -4895,17 +5091,17 @@ name = "substrate-trie" version = "2.0.0" dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", - "trie-bench 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-bench 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4913,11 +5109,11 @@ name = "substrate-wasm-builder" version = "1.0.4" dependencies = [ "build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cargo_metadata 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cargo_metadata 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4941,11 +5137,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.39" +version = "0.15.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4955,8 +5151,8 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4967,11 +5163,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "target_info" version = "0.1.0" @@ -4992,7 +5193,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5007,17 +5208,6 @@ dependencies = [ "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "termion" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "textwrap" version = "0.10.0" @@ -5039,7 +5229,7 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5051,7 +5241,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5071,7 +5261,7 @@ name = "tinytemplate" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5081,7 +5271,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5154,7 +5344,7 @@ name = "tokio-executor" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5175,7 +5365,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5183,10 +5373,10 @@ name = "tokio-reactor" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5198,7 +5388,7 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.10.0-alpha.3" +version = "0.10.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5238,9 +5428,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5252,7 +5442,7 @@ name = "tokio-timer" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5275,7 +5465,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5290,8 +5480,8 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5304,7 +5494,7 @@ name = "toml" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5316,8 +5506,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "transaction-factory" version = "0.0.1" dependencies = [ - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-cli 2.0.0", "substrate-client 2.0.0", @@ -5328,46 +5518,46 @@ dependencies = [ [[package]] name = "trie-bench" -version = "0.14.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-db" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-root" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-standardmap" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5377,12 +5567,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "trybuild" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5418,7 +5608,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "ucd-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -5517,6 +5707,16 @@ name = "vec_map" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "vecarray" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "vergen" version = "3.0.4" @@ -5542,8 +5742,8 @@ name = "wabt" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "wabt-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5553,17 +5753,17 @@ name = "wabt-sys" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "cmake 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "walkdir" -version = "2.2.8" +version = "2.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5574,81 +5774,81 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen-macro 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bumpalo 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.47" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5657,19 +5857,22 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasmi" -version = "0.4.5" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5685,14 +5888,14 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5738,7 +5941,7 @@ dependencies = [ [[package]] name = "weedle" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5750,7 +5953,7 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5807,7 +6010,7 @@ dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5852,7 +6055,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5875,8 +6078,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5889,15 +6092,16 @@ dependencies = [ "checksum aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f10b352bc3fc08ae24dc5d2d3ddcac153678533986122dc283d747b12071000" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" +"checksum arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4662175ead9cd84451d5c35070517777949a2ed84551764129cedb88384841" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" -"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" +"checksum arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d73f9beda665eaa98ab9e4f7442bd4e7de6652587de55b2525e52e29c1b0ba" "checksum asn1_der 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bea40e881533b1fe23afca9cd1c1ca022219a10fce604099ecfc96bfa26eaf1a" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "checksum assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" -"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" -"checksum backtrace 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "18b50f5258d1a9ad8396d2d345827875de4261b158124d4c819d9b351454fae5" -"checksum backtrace-sys 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)" = "5b3a000b9c543553af61bc01cbfc403b04b5caa9e421033866f2e98061eb3e61" +"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" +"checksum autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "22130e92352b948e7e82a49cdb0aa94f2211761117f29e052dd397c1ac33542b" +"checksum backtrace 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)" = "88fb679bc9af8fa639198790a77f52d345fe13656c08b43afa9424c206b731c6" +"checksum backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "82a830b4ef2d1124a711c71d263c5abdc710ef8e907bd508c88be475cebc422b" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" @@ -5906,6 +6110,7 @@ dependencies = [ "checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum bitvec 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b67491e1cc6f37da6c4415cd743cb8d2e2c65388acc91ca3094a054cbf3cbd0c" +"checksum bitvec 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9633b74910e1870f50f5af189b08487195cdb83c0e27a71d6f64d5e09dd0538b" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" @@ -5913,9 +6118,10 @@ dependencies = [ "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" "checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" -"checksum bstr 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6cc0572e02f76cb335f309b19e0a0d585b4f62788f7d26de2a13a836a637385f" +"checksum bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e0a692f1c740e7e821ca71a22cf99b9b2322dfa94d10f71443befb1797b3946a" "checksum build-helper 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" "checksum bumpalo 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2cd43d82f27d68911e6ee11ee791fb248f138f5d69424dc02e098d4f152b0b05" +"checksum byte-slice-cast 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7cbcbf18128ec71d8d4a0d054461ec59fff5b75b7d10a4c9b7c7cb1a379c3e77" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" @@ -5923,9 +6129,9 @@ dependencies = [ "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" -"checksum cargo_metadata 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "929766d993a2fde7a0ae962ee82429069cd7b68839cd9375b98efd719df65d3a" +"checksum cargo_metadata 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e904f164f39cae0c3a4f2713eb97a47ba64676a071e99a69ddfef4994694d2c" "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" -"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "ce400c638d48ee0e9ab75aef7997609ec57367ccfe1463f21bf53c3eca67bf46" "checksum cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7fa24eb00d5ffab90eaeaf1092ac85c04c64aaf358ea6f84505b8116d24c6af" "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "77d81f58b7301084de3b958691458a53c3f7e0b1d702f77e550b6a88e3a88abe" @@ -5940,13 +6146,12 @@ dependencies = [ "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394" "checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" -"checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" -"checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" +"checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" "checksum crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13" "checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" -"checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" +"checksum crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9" "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -"checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" +"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" @@ -5978,7 +6183,7 @@ dependencies = [ "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" -"checksum finality-grandpa 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9e7cba2aaadf09932452a4fc054a77451b31eb99bc0b42bf54bd44f01a9daf4" +"checksum finality-grandpa 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9681c1f75941ea47584573dd2bc10558b2067d460612945887e00744e43393be" "checksum fixed-hash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "516877b7b9a1cc2d0293cbce23cd6203f0edbfd4090e6ca4489fecb5aa73050e" "checksum flate2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "550934ad4808d5d39365e5d61727309bf18b3b02c6c56b729cb92e7dd84bc3d8" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" @@ -6008,9 +6213,9 @@ dependencies = [ "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" "checksum globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" -"checksum h2 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "a539b63339fbbb00e081e84b6e11bd1d9634a82d91da2984a18ac74a8823f392" -"checksum hash-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4a2710506bcc28e53b6d48d9686b233a31ad831597da7de91e6112a2fc8f260" -"checksum hash256-std-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff4a5dcbaf4fe8977852851d137546bcad8679c9582f170032ca35b30701138e" +"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" +"checksum hash-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32c87fec93c4a2d264483ef843ac1930ae7c7999d97d73721305a5188b4c23a4" +"checksum hash256-std-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16293646125e09e5bc216d9f73fa81ab31c4f97007d56c036bbf15a58e970540" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8e04cb7a5051270ef3fa79f8c7604d581ecfa73d520e74f554e45541c4b5881a" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" @@ -6019,16 +6224,16 @@ dependencies = [ "checksum hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c3da68162fdd2147e66682e78e729bd77f93b4c99656db058c5782d8c6b6225a" "checksum hex-literal-impl 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06095d08c7c05760f11a071b3e1d4c5b723761c01bd8d7201c30a9536668a612" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" -"checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" +"checksum hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" "checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" "checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" -"checksum hyper 0.12.31 (registry+https://github.com/rust-lang/crates.io-index)" = "6481fff8269772d4463253ca83c788104a7305cb3fb9136bc651a6211e46e03f" +"checksum hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)" = "7cb44cbce9d8ee4fb36e4c0ad7b794ac44ebaad924b9c8291a63215bb44c2c8f" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -"checksum impl-codec 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62ed8ff267bc916dd848a800b96d3129aec73d5b23a5e3d018c83655d0c55371" +"checksum impl-codec 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "78c441b3d2b5e24b407161e76d482b7bbd29b5da357707839ac40d95152f031f" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" "checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" @@ -6038,7 +6243,7 @@ dependencies = [ "checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" -"checksum js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "eac16f41aa9b9388230b1d6617d7ed897a1af5416b8fe1c8734dcef79c7aae10" +"checksum js-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "da3ea71161651a4cd97d999b2da139109c537b15ab33abc8ae4ead38deac8a03" "checksum jsonrpc-client-transports 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6be24a8de4ced80f6fd8b6ace54aa610823a7642976a0e8e00e3bb2f4d8c33f0" "checksum jsonrpc-core 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0216cf4c95fb373d89c63572672097b8aa74cfcdd77054accbf545d840be5bd7" "checksum jsonrpc-core-client 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1603b6cc05060de7794c2962edd705e1ad2698bd2b0d2ddd4489f8c85df122b7" @@ -6048,7 +6253,7 @@ dependencies = [ "checksum jsonrpc-server-utils 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d7aac8e0029d19582b68c9fd498d18bdcf0846612c968acc93b6e5ae67eea4e0" "checksum jsonrpc-ws-server 12.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "698fee4fcaf09a5927b7e39dd8a8136a102b343cebacaa351fc4def01a050a5b" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" -"checksum keccak-hasher 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3767172fe16797c41f975f12f38247964ace8e5e1a2539b82d5e19f9106b1cb9" +"checksum keccak-hasher 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bf18164fd7ce989041f8fc4a1ae72a8bd1bec3575f2aeaf1d4968fc053aabef" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" @@ -6056,28 +6261,29 @@ dependencies = [ "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "3262021842bf00fe07dbd6cf34ff25c99d7a7ebef8deea84db72be3ea3bb0aff" +"checksum libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "d44e80633f007889c7eff624b709ab43c92d708caad982295768a7b13ca3b5eb" "checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -"checksum libp2p 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29f6b3be5b0cb89f7a072352e2a3bf86991dce0909624181e9e343db0b558568" -"checksum libp2p-core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c71c33e59899d57ed0a14272984705561abd71788a2b303598ec57dac32130e8" -"checksum libp2p-core-derive 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e6df0fa6933f4be908cfd8c6d627776aa8c909066ba7ce13b017bfe18b9c92b" -"checksum libp2p-deflate 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "448fe9d2231bc21bb308f394346780666a376274ceaf3380e5c7adf3cdbf5a9c" -"checksum libp2p-dns 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67ec2cea26aaccd4bdf264075d6a499bc635b90cb23419bcc3b1f2f0d135c451" -"checksum libp2p-floodsub 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c39c17f2b7c994106e00ccd71a9941d8574c01bef5f97e36d9a106cbde14fab" -"checksum libp2p-identify 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9455cc0752fd3e3f35e9464598576c54476772eaa927b773f7fdf5686ae51f" -"checksum libp2p-kad 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1f595983a76012779d6941a9d51fc0b9b95d720315787bf8d73f6672351f6d8" -"checksum libp2p-mdns 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0e7847e6e13a793d70ee5a5d833ddb13ff277c4c0d4fc65b5bc8543ef37df8cf" -"checksum libp2p-mplex 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29bd0885dd9154d93a1fa83e06a10aba2f0e3a0bf9eb63233c095141fbfaf525" -"checksum libp2p-noise 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8f8e0852efc26bfcba11fcc7c4fb593ed00446c19b6d90db39794a3a7ac48e13" -"checksum libp2p-ping 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dfda9d329eacf6a8e875c18b5e5317a47b326cb58372f506fff8b6259c8951a" -"checksum libp2p-plaintext 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "86759777e5441725b60c6e78b23933b03a531b45d1f3e7d1fb430df49e0b151c" -"checksum libp2p-ratelimit 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f965ff88fda7b1fff062b18b25d781b86c17ea335a237958220895f3e3ddfdd8" -"checksum libp2p-secio 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df1d980a61a1423518205f6710e692102c94efb8132b5dcc54ffe5dbac621360" -"checksum libp2p-tcp 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24faf4ebb10b805f2e2221540097f764075edd18ca735cab0430a118382888df" -"checksum libp2p-uds 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f57a4942babd03f582a838238093b08f94521f63c8b12889a914be5c3cc170c2" -"checksum libp2p-wasm-ext 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5427b52a8a51460961fadd72bd9fdcd957a2a7706588559423ccb86b58a52a7d" -"checksum libp2p-websocket 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "152dce704e235f47b9460004d7ac09663d43f4ca3cb99ddb8d4e0be54240673e" -"checksum libp2p-yamux 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "907bf1f31d572aa8537595a784f59c86b94162eb03dc51839c32ab4a05a5faad" +"checksum libp2p 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18b3404dae1e3110caaae14b2d59bf7254b1e988ed7ed38da59c005bed711e7d" +"checksum libp2p-core 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efa1b75b0b388c0f33bc2e2f5d385885f9ed77f622802895b68ac8397aaef2de" +"checksum libp2p-core-derive 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "954fe45edba727b76196abff0d3894116c32a07e4f8173a8f26caf3484add4c0" +"checksum libp2p-deflate 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "56b77964eaf8ba7019df8de2a02f2241ee240011d6de69f4991baf174ad42d2e" +"checksum libp2p-dns 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c2625c6acd4073403f1107e4e038efa02ba5de54de0d08567a2cc338560d63f" +"checksum libp2p-floodsub 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d14e6c61c6e69f291261c8ec001b85a2c6426f2074183a40c337c29ed7939bd1" +"checksum libp2p-identify 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34ba4b8d4e27f4848a6b121604d98818a8527f4269948ba77dfe49f0f1c3dc8f" +"checksum libp2p-kad 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "93384ee24fe137bf3afa8263b8d9e63c6bd6c92aad7cc50949fdba2b90db93a4" +"checksum libp2p-mdns 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd24b59da234647e15c34054158b6853a505301d5888719593e6fcd7841c39d9" +"checksum libp2p-mplex 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b101952e8dfdc5c902f1063cd8bfbb80e735857a16d387033ae8180df578009" +"checksum libp2p-noise 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1dd3313a8216b92e3ae5a24034d6fc35bf9671e9f4ad4b2ce445291852508b77" +"checksum libp2p-ping 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c803a4d21c97e14eb8b5019cc32242e296f1d1835de8664e5464d7dc31f068d" +"checksum libp2p-plaintext 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbac75c9683aa5997887420007ea2cf47ab9b68584b4edfa2b20598c9d509273" +"checksum libp2p-ratelimit 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7abef2e38e9d4bb5036724d325dd0518007e32d73d5171334d4d5355995bb4d8" +"checksum libp2p-secio 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "33c208e7c74c15c72e7092503d6772ed5b2add2155e08234ae10169769e3135c" +"checksum libp2p-swarm 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8788a19e54240ba632ec0913bb951e7fd744f4e6151b2dc1a8b44d80b2947830" +"checksum libp2p-tcp 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "180543c45126c4eec42f35594e169a8d7c891253bc127297ca7781c05ad8bce6" +"checksum libp2p-uds 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffaf9dfc24beaf7ad5be01a6eabe67842cd02575da68a08ebe11b5a8821fc4a9" +"checksum libp2p-wasm-ext 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "35307568a484cce18eae7516201ecbbfc3fb7e17c7f235d407690aee6adaa046" +"checksum libp2p-websocket 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e6c6d86998e66848f16b65e89896d94fa3825e218d2fc44cbc6b84e8ef97bb9" +"checksum libp2p-yamux 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1c03b89d025c7b01c966348e4d618b1ec4b95f3c09749ca9f2b2c98240aabfe6" "checksum librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19778314deaa7048f2ea7d07b8aa12e1c227acebe975a37eeab6d2f8c74e41b" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" @@ -6085,20 +6291,21 @@ dependencies = [ "checksum linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7c91c4c7bbeb4f2f7c4e5be11e6a05bd6830bc37249c47ce1ad86ad453ff9c" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" +"checksum lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" +"checksum log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c275b6ad54070ac2d665eef9197db647b32239c9d244bfb6f041a766d00da5b3" "checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" "checksum malloc_size_of_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "35adee9ed962cf7d07d62cb58bc45029f3227f5b5b86246caa8632f06c187bc3" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" -"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "896b24d1a9850e7a25b070d552f311cbb8735214456efa222dcc4c431073c215" +"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f" +"checksum memory-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a688133a81c915553c1dd9c3e859949f43a854cb8f8773e690e849b53b1f89f0" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum merlin 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "66448a173ad394ef5ebf734efa724f3644dcffda083b1e89979da4461ddac079" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" "checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" -"checksum miniz_oxide 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b6c3756d66cf286314d5f7ebe74886188a9a92f5eee68b06f31ac2b4f314c99d" -"checksum miniz_oxide_c_api 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5b78ca5446dd9fe0dab00e058731b6b08a8c1d2b9cdb8efb10876e24e9ae2494" +"checksum miniz_oxide 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c061edee74a88eb35d876ce88b94d77a0448a201de111c244b70d047f5820516" +"checksum miniz_oxide_c_api 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6c675792957b0d19933816c4e1d56663c341dd9bfa31cb2140ff2267c1d8ecf4" "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" @@ -6111,24 +6318,26 @@ dependencies = [ "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" +"checksum num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "57450397855d951f1a41305e54851b1a7b8f5d2e349543a02a2effe25459f718" "checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2885278d5fe2adc2f75ced642d52d879bffaceb5a2e0b1d4309ffdfb239b454" "checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273" -"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" +"checksum openssl 0.10.24 (registry+https://github.com/rust-lang/crates.io-index)" = "8152bb5a9b5b721538462336e3bef9a539f892715e5037fda0f984577311af15" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" +"checksum openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)" = "b5ba300217253bcc5dc68bed23d782affa45000193866e025329aa8a7a9f05b8" "checksum output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" -"checksum parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7902deb39d3b431897f211c1918789938251e67a740f55effd53201e79c0906c" -"checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" +"checksum parity-codec 4.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2900f06356edf90de66a2922db622b36178dca71e85625eae58d0d9cc6cff2ac" "checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" -"checksum parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eb83358a0c05e52c44d658981fec2d146d3516d1adffd9e553684f8c8e9e8fa5" +"checksum parity-multihash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df3a17dc27848fd99e4f87eb0f8c9baba6ede0a6d555400c850ca45254ef4ce3" +"checksum parity-scale-codec 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "00fd14ff806ad82cea9a8f909bb116443d92efda7c9acd4502690af64741ad81" +"checksum parity-scale-codec-derive 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a81f3cd93ed368a8e41c4e79538e99ca6e8f536096de23e3a0bc3e782093ce28" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-util-mem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2005637ccf93dbb60c85081ccaaf3f945f573da48dcc79f27f9646caa3ec1dc" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" @@ -6136,37 +6345,38 @@ dependencies = [ "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" "checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" +"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" "checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" +"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" "checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" "checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" -"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" +"checksum pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c1d2cfa5a714db3b5f24f0915e74fcdf91d09d496ba61329705dda7774d2af" "checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b" -"checksum pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a029430f0d744bc3d15dd474d591bed2402b645d024583082b9f63bb936dac6" "checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" -"checksum primitive-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "366ef730e56c11fd21ab3e518866cf7feb0fdf7f7c16ddc68485579e9d802787" +"checksum primitive-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e44400d651ca5276415dc8e00541c5c9d03844f1f0a87ad28f0a8fadcb2300bc" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "982a35d1194084ba319d65c4a68d24ca28f5fdb5b8bc20899e4eef8641ea5178" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum protobuf 2.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5f00e4a3cb64ecfeac2c0a73c74c68ae3439d7a6bead3870be56ad5dd2620a6f" +"checksum protobuf 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8aefcec9f142b524d98fc81d07827743be89dd6586a1ba6ab21fa66a500b3fa5" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9c35d9c36a562f37eca96e79f66d5fd56eefbc22560dacc4a864cabd2d277456" -"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" +"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" "checksum rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d47eab0e83d9693d40f825f86948aa16eff6750ead4bdffc4ab95b8b3a7f052c" "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -"checksum rand_chacha 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e193067942ef6f485a349a113329140d0ab9e2168ce92274499bb0e9a4190d9d" +"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "615e683324e75af5d43d8f7a39ffe3ee4a9dc42c5c701167a71dc59c3a493aca" @@ -6182,13 +6392,12 @@ dependencies = [ "checksum rayon-core 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbe0df8435ac0c397d467b6cad6d25543d06e8a019ef3f6af3c384597515bd2" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d813022b2e00774a48eaf43caaa3c20b45f040ba8cbf398e2e8911a06668dbe6" -"checksum regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d9d8297cc20bbb6184f8b45ff61c8ee6a9ac56c156cec8e38c3e5084773c44ad" -"checksum regex-automata 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3ed09217220c272b29ef237a974ad58515bde75f194e3ffa7e6d0bf0f3b01f86" -"checksum regex-syntax 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "9b01330cce219c1c6b2e209e5ed64ccd587ae5c67bed91c0b49eecf02ae40e21" +"checksum regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6b23da8dfd98a84bd7e08700190a5d9f7d2d38abd4369dd1dae651bc40bfd2cc" +"checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" +"checksum regex-syntax 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5485bf1523a9ed51c4964273f22f63f24e31632adb5dad134f488f86a3875c" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" -"checksum rhododendron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "057fecd57cc69e24d9d215c9f283a42133c3f48952e4fc06b088ecf3ce3d90bb" +"checksum rhododendron 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "36542aafc2429a4c010fafa079a20dee953b663cb2427f51d86cf1d436846b4d" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" "checksum rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1651697fefd273bfb4fd69466cc2a9d20de557a0213b97233b22b5e95924b5e" "checksum rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c34fa7bcae7fca3c8471e8417088bbc3ad9af8066b0ecf4f3c0d98a0d772716e" @@ -6200,9 +6409,9 @@ dependencies = [ "checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" -"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" +"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" "checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" -"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" +"checksum schnorrkel 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "77e8d6a92f49a53f21b71c090a5559bf45c469071ebe556aebaf2dca3abc5cb5" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" "checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" @@ -6212,8 +6421,8 @@ dependencies = [ "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" -"checksum serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "076a696fdea89c19d3baed462576b8f6d663064414b5c793642da8dfeb99475b" -"checksum serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "ef45eb79d6463b22f5f9e16d283798b7c0175ba6050bc25c1a946c122727fe7b" +"checksum serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)" = "d46b3dfedb19360a74316866cef04687cd4d6a70df8e6a506c63512790769b72" +"checksum serde_derive 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)" = "c22a0820adfe2f257b098714323563dd06426502abbbce4f51b72ef544c5027f" "checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704" "checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" @@ -6222,9 +6431,10 @@ dependencies = [ "checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" -"checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" +"checksum slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cc9c640a4adbfbcc11ffb95efe5aa7af7309e002adab54b185507dbf2377b99" +"checksum slog-async 2.3.0 (git+https://github.com/paritytech/slog-async)" = "" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" -"checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" +"checksum slog-scope 4.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1d3ec6214d46e57a7ec87c1972bbca66c59172a0cfffa5233c54726afb946bf" "checksum slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eff3b513cf2e0d1a60e1aba152dc72bedc5b05585722bb3cebd7bcb1e31b98f" "checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" @@ -6239,20 +6449,20 @@ dependencies = [ "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7" "checksum structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107" -"checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" -"checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d69ace596e9ca97837cc41f8edcfc4e0a997f227d5fc153d1010b60a0fe9acda" +"checksum strum 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e5d1c33039533f051704951680f1adfd468fd37ac46816ded0d9ee068e60f05f" +"checksum strum_macros 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "47cd23f5c7dee395a00fa20135e2ec0fffcdfa151c56182966d7a3261343432e" +"checksum substrate-bip39 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3be511be555a3633e71739a79e4ddff6a6aaa6579fa6114182a51d72c3eb93c5" "checksum substrate-wasm-builder-runner 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f52ecbff6cc3d6e5c6401828e15937b680f459d6803ce238f01fe615bc40d071" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" -"checksum syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d960b829a55e56db167e861ddb43602c003c7be0bee1d345021703fac2fb7c" +"checksum syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)" = "eadc09306ca51a40555dd6fc2b415538e9e18bc9f870e47b1a524a79fe2dcf5e" "checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum sysinfo 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c3e2cab189e59f72710e3dd5e1e0d5be0f6c5c999c326f2fdcdf3bf4483ec9fd" +"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" -"checksum termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a8fb22f7cde82c8220e5aeacb3258ed7ce996142c77cba193f203515e26c330" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" @@ -6269,7 +6479,7 @@ dependencies = [ "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" -"checksum tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" +"checksum tokio-rustls 0.10.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e5cebc3ca33110e460c4d2e7c5e863b159fadcbf125449d896720695b2af709" "checksum tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2162248ff317e2bc713b261f242b69dbb838b85248ed20bb21df56d60ea4cae7" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" "checksum tokio-threadpool 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "90ca01319dea1e376a001e8dc192d42ebde6dd532532a5bad988ac37db365b19" @@ -6279,17 +6489,17 @@ dependencies = [ "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-bench 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "401abff5ad06075d2c65d1eedeaaa70616d0df268f3186a82cf1aa2d798977d7" -"checksum trie-db 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1803d8ff63ec3743bee883aacf3df74c524ffab188d9abebe18ded4da0dcd5d4" -"checksum trie-root 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "226f4b2e7bc6a71172ffe7f137385cf63833de7c684059dde7520ddbf1fb04f4" -"checksum trie-standardmap 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b65b79aee5dcdcc7247fdd811f7e26b47e65ecc17f776ecf5db8e8fd46db3b54" +"checksum trie-bench 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1861db0e69cc3d650083ca1e70e6f5aeb871491409abc0efaf321dff48df24a" +"checksum trie-db 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b65d609ae631d808c6c1cc23a622733d5a0b66a7d67e9f5cd5171562a1f4cb5" +"checksum trie-root 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b0eaa64e50d686c89e6d4817ed33cb18cfa249e9071b7918b18ecfacc7867" +"checksum trie-standardmap 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "64fda153c00484d640bc91334624be22ead0e5baca917d9fd53ff29bdebcf9b2" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" -"checksum trybuild 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b7592bfd3449da952920cb55618d55f34779293127f76d946c4a54f258ca87b8" +"checksum trybuild 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f2e8e773ac21d176ee05243456b9f1a942cd1a586dab188ced05b8e8d58dc635" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7834480552ffc48e1930ceddd701f47d2234319d80b7bcbbe2fe7202933c101" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" -"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" +"checksum ucd-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa9b3b49edd3468c0e6565d85783f51af95212b6fa3986a5500954f00b460874" "checksum uint 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5375d2c574f89adad4108ad525c93e39669853a602560bf5ed4ca9943b10799" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "checksum unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84e5511b2a947f3ae965dcb29b13b7b1691b6e7332cf5dbc1744138d5acb7f6" @@ -6304,28 +6514,29 @@ dependencies = [ "checksum utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9d50aa7650df78abf942826607c62468ce18d9019673d4a2ebe1865dbb96ffde" "checksum vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "33dd455d0f96e90a75803cfeb7f948768c08d70a6de9a8d2362461935698bf95" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" +"checksum vecarray 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d68a73b7d7d950c6558b6009e9fba229fb67562bda9fd02198f614f4ecf83f" "checksum vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6aba5e34f93dc7051dfad05b98a18e9156f27e7b431fe1d2398cb6061c0a1dba" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "74e463a508e390cc7447e70f640fbf44ad52e1bd095314ace1fdf99516d32add" "checksum wabt-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a6265b25719e82598d104b3717375e37661d41753e2c84cde3f51050c7ed7e3c" -"checksum walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c7904a7e2bb3cdf0cf5e783f44204a85a37a93151738fa349f06680f59a98b45" +"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e" "checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" -"checksum wasm-bindgen 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "22029998cc650473cb05f10f19c06a1536b9e1f1572e4f5dacd45ab4d3f85877" -"checksum wasm-bindgen-backend 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "6f858ff3cb4196c702e8c24b75fba1d3ab46958de4f7c253627f0507aae1507c" -"checksum wasm-bindgen-futures 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "cc16facd42fc3d0fa0cae78b39516bac04496cf80518fd09bbfa33e9b0e9c92d" -"checksum wasm-bindgen-macro 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "15c29f04eb117312931e7b02878453ee63d67a6f291797651890128bf5ee71db" -"checksum wasm-bindgen-macro-support 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "92b1356b623816248dfe0e2c4b7e113618d647808907ff6a3d9838ebee8e82ee" -"checksum wasm-bindgen-shared 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "15de16ddb30cfd424a87598b30021491bae1607d32e52056979865c98b7913b4" -"checksum wasm-bindgen-webidl 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "21724123084234fff2f986018b790afc5d6f45c9a3903025e6c55d0068cb7d15" +"checksum wasm-bindgen 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "4de97fa1806bb1a99904216f6ac5e0c050dc4f8c676dc98775047c38e5c01b55" +"checksum wasm-bindgen-backend 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "5d82c170ef9f5b2c63ad4460dfcee93f3ec04a9a36a4cc20bc973c39e59ab8e3" +"checksum wasm-bindgen-futures 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "73c25810ee684c909488c214f55abcbc560beb62146d352b9588519e73c2fed9" +"checksum wasm-bindgen-macro 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "f07d50f74bf7a738304f6b8157f4a581e1512cd9e9cdb5baad8c31bbe8ffd81d" +"checksum wasm-bindgen-macro-support 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "95cf8fe77e45ba5f91bc8f3da0c3aa5d464b3d8ed85d84f4d4c7cc106436b1d7" +"checksum wasm-bindgen-shared 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "d9c2d4d4756b2e46d3a5422e06277d02e4d3e1d62d138b76a4c681e925743623" +"checksum wasm-bindgen-webidl 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "24e47859b4eba3d3b9a5c2c299f9d6f8d0b613671315f6f0c5c7f835e524b36a" "checksum wasm-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6101df9a5987df809216bdda7289f52b58128e6b6a6546e9ee3e6b632b4921" -"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" +"checksum wasmi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "48437c526d40a6a593c50c5367dac825b8d6a04411013e866eca66123fb56faa" "checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" -"checksum web-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "22306ce642c58266cb5c5938150194911322bc179aa895146076217410ddbc82" +"checksum web-sys 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "86d515d2f713d3a6ab198031d2181b7540f8e319e4637ec2d4a41a208335ef29" "checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" "checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" "checksum websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0adcd2a64c5746c9702b354a1b992802b0c363df1dfa324a74cb7aebe10e0cbf" -"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" +"checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" "checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" diff --git a/Cargo.toml b/Cargo.toml index b8b6311a30cb9732f4253f57bd7f2e56144db4cc..be6c89c2b7b1002b39511cc7423d57ea89578027 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ vergen = "3" [workspace] members = [ + "core/application-crypto", "core/cli", "core/client", "core/client/db", @@ -27,6 +28,7 @@ members = [ "core/consensus/common", "core/consensus/rhd", "core/consensus/slots", + "core/consensus/uncles", "core/executor", "core/executor/runtime-test", "core/finality-grandpa", @@ -42,6 +44,7 @@ members = [ "core/serializer", "core/service", "core/service/test", + "core/session", "core/sr-api-macros", "core/sr-io", "core/sr-primitives", @@ -77,7 +80,9 @@ members = [ "srml/finality-tracker", "srml/generic-asset", "srml/grandpa", + "srml/im-online", "srml/indices", + "srml/membership", "srml/metadata", "srml/session", "srml/staking", diff --git a/Dockerfile b/Dockerfile index b7512b26561edd71bd099b6399fd70eb4a4aa425..0271db8d1461d7a8c58fb52f9f6306e5ca833e2e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ WORKDIR /substrate COPY . /substrate RUN apt-get update && \ - apt-get upgrade -y && \ + apt-get dist-upgrade -y && \ apt-get install -y cmake pkg-config libssl-dev git clang RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ @@ -21,7 +21,7 @@ RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ cargo install --git https://github.com/alexcrichton/wasm-gc && \ rustup default nightly && \ rustup default stable && \ - cargo build --$PROFILE + cargo build "--$PROFILE" # ===== SECOND STAGE ====== diff --git a/README.adoc b/README.adoc index fd929e87a26ae4847375771c5892f50697cab163..aaab6df3cc2f2cafcb730b1001e85bd4375a5e42 100644 --- a/README.adoc +++ b/README.adoc @@ -308,7 +308,7 @@ cargo run --release \-- \ Additional Substrate CLI usage options are available and may be shown by running `cargo run \-- --help`. -== WASM binaries +=== WASM binaries The WASM binaries are built during the normal `cargo build` process. To control the WASM binary building, we support multiple environment variables: @@ -329,13 +329,17 @@ be `NODE_RUNTIME`. [[flaming-fir]] === Joining the Flaming Fir Testnet -Flaming Fir is the new testnet for Substrate master (2.0). Please note that master is not compatible with the BBQ-Birch, Charred-Cherry, Dried-Danta or Emberic-Elm testnets. Ensure you have the dependencies listed above before compiling. -The master branch might have breaking changes as development progresses, therefore you should make sure you have a reasonably updated client when trying to sync Flaming Fir. +Flaming Fir is the new testnet for Substrate master (2.0) to test the latest development features. Please note that master is not compatible with the BBQ Birch, Charred Cherry, Dried Danta or Emberic Elm testnets. Ensure you have the dependencies listed above before compiling. + +Since Flaming Fir is targeting the master branch we make absolutely no guarantees of stability and/or persistence of the network. We might reset the chain at any time if it is necessary to deploy new changes. Currently, the validators are running with a client built from `d013bd900`, if you build from this commit you should be able to successfully sync, later commits may not work as new breaking changes may be introduced in master. + +Latest known working version: `d013bd900` [source, shell] ---- git clone https://github.com/paritytech/substrate.git cd substrate +git checkout -b flaming-fir d013bd900 ---- You can run the tests if you like: @@ -362,7 +366,7 @@ If you are successful, you will see your node syncing at https://telemetry.polka === Joining the Emberic Elm Testnet -Emberic Elm is the testnet for Substrate 1.0. Please note that 1.0 is not compatible with the BBQ-Birch, Charred-Cherry, Dried-Danta or Flaming-Fir testnets. +Emberic Elm is the testnet for Substrate 1.0. Please note that 1.0 is not compatible with the BBQ Birch, Charred Cherry, Dried Danta or Flaming Fir testnets. In order to join the Emberic Elm testnet you should build from the `v1.0` branch. Ensure you have the dependencies listed above before compiling. [source, shell] diff --git a/core/application-crypto/Cargo.toml b/core/application-crypto/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..6d39b12653fa51e5237dc57045948ca7519ed751 --- /dev/null +++ b/core/application-crypto/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "substrate-application-crypto" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" +description = "Provides facilities for generating application specific crypto wrapper types." + +[dependencies] +primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +serde = { version = "1.0", optional = true, features = ["derive"] } +rstd = { package = "sr-std", path = "../sr-std", default-features = false } +rio = { package = "sr-io", path = "../sr-io", default-features = false } + +[dev-dependencies] +test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } +sr-primitives = { path = "../sr-primitives" } + +[features] +default = [ "std" ] +std = [ "primitives/std", "codec/std", "serde", "rstd/std", "rio/std" ] diff --git a/core/application-crypto/src/ed25519.rs b/core/application-crypto/src/ed25519.rs new file mode 100644 index 0000000000000000000000000000000000000000..6c5458492b6b8654201cfeeb7c268b2609e35834 --- /dev/null +++ b/core/application-crypto/src/ed25519.rs @@ -0,0 +1,75 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Ed25519 crypto types. + +use crate::{RuntimePublic, KeyTypeId}; + +pub use primitives::ed25519::*; + +mod app { + use crate::key_types::ED25519; + crate::app_crypto!(super, ED25519); +} + +pub use app::Public as AppPublic; +pub use app::Signature as AppSignature; +#[cfg(feature="std")] +pub use app::Pair as AppPair; + +impl RuntimePublic for Public { + type Signature = Signature; + + fn all(key_type: KeyTypeId) -> crate::Vec { + rio::ed25519_public_keys(key_type) + } + + fn generate_pair(key_type: KeyTypeId, seed: Option<&str>) -> Self { + rio::ed25519_generate(key_type, seed) + } + + fn sign>(&self, key_type: KeyTypeId, msg: &M) -> Option { + rio::ed25519_sign(key_type, self, msg) + } + + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { + rio::ed25519_verify(&signature, msg.as_ref(), self) + } +} + +#[cfg(test)] +mod tests { + use sr_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; + use primitives::{testing::KeyStore, crypto::Pair, traits::BareCryptoStore as _}; + use test_client::{ + TestClientBuilder, DefaultTestClientBuilderExt, TestClientBuilderExt, + runtime::{TestAPI, app_crypto::ed25519::{AppPair, AppPublic}}, + }; + + #[test] + fn ed25519_works_in_runtime() { + let keystore = KeyStore::new(); + let test_client = TestClientBuilder::new().set_keystore(keystore.clone()).build(); + let (signature, public) = test_client.runtime_api() + .test_ed25519_crypto(&BlockId::Number(0)) + .expect("Tests `ed25519` crypto."); + + let key_pair = keystore.read().ed25519_key_pair(crate::key_types::ED25519, &public.as_ref()) + .expect("There should be at a `ed25519` key in the keystore for the given public key."); + + assert!(AppPair::verify(&signature, "ed25519", &AppPublic::from(key_pair.public()))); + } +} diff --git a/core/application-crypto/src/lib.rs b/core/application-crypto/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..d9bff822eedee4ecc9e99f4e0c4d9393ec6c7577 --- /dev/null +++ b/core/application-crypto/src/lib.rs @@ -0,0 +1,320 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Traits and macros for constructing application specific strongly typed crypto wrappers. + +#![warn(missing_docs)] + +#![cfg_attr(not(feature = "std"), no_std)] + +#[doc(hidden)] +pub use primitives::{self, crypto::{CryptoType, Public, Derive, IsWrappedBy, Wraps}}; +#[doc(hidden)] +#[cfg(feature = "std")] +pub use primitives::crypto::{SecretStringError, DeriveJunction, Ss58Codec, Pair}; +pub use primitives::{crypto::{KeyTypeId, key_types}}; + +#[doc(hidden)] +pub use codec; +#[doc(hidden)] +#[cfg(feature = "std")] +pub use serde; +#[doc(hidden)] +pub use rstd::{ops::Deref, vec::Vec}; + +pub mod ed25519; +pub mod sr25519; +mod traits; + +pub use traits::*; + +/// Declares Public, Pair, Signature types which are functionally equivalent to `$pair`, but are new +/// Application-specific types whose identifier is `$key_type`. +/// +/// ```rust +///# use substrate_application_crypto::{app_crypto, wrap, ed25519, KeyTypeId}; +/// // Declare a new set of crypto types using Ed25519 logic that identifies as `KeyTypeId` +/// // of value `b"fuba"`. +/// app_crypto!(ed25519, KeyTypeId(*b"_uba")); +/// ``` +#[macro_export] +macro_rules! app_crypto { + ($module:ident, $key_type:expr) => { + #[cfg(feature="std")] + $crate::app_crypto!($module::Pair, $module::Public, $module::Signature, $key_type); + #[cfg(not(feature="std"))] + $crate::app_crypto!($module::Public, $module::Signature, $key_type); + }; + ($pair:ty, $public:ty, $sig:ty, $key_type:expr) => { + $crate::app_crypto!($public, $sig, $key_type); + + $crate::wrap!{ + /// A generic `AppPublic` wrapper type over $pair crypto; this has no specific App. + #[derive(Clone)] + pub struct Pair($pair); + } + + impl $crate::CryptoType for Pair { + type Pair = Pair; + } + + #[cfg(feature = "std")] + impl $crate::Pair for Pair { + type Public = Public; + type Seed = <$pair as $crate::Pair>::Seed; + type Signature = Signature; + type DeriveError = <$pair as $crate::Pair>::DeriveError; + fn generate_with_phrase(password: Option<&str>) -> (Self, String, Self::Seed) { + let r = <$pair>::generate_with_phrase(password); + (Self(r.0), r.1, r.2) + } + fn from_phrase(phrase: &str, password: Option<&str>) + -> Result<(Self, Self::Seed), $crate::SecretStringError> + { + <$pair>::from_phrase(phrase, password).map(|r| (Self(r.0), r.1)) + } + fn derive< + Iter: Iterator + >(&self, path: Iter) -> Result { + self.0.derive(path).map(Self) + } + fn from_seed(seed: &Self::Seed) -> Self { Self(<$pair>::from_seed(seed)) } + fn from_seed_slice(seed: &[u8]) -> Result { + <$pair>::from_seed_slice(seed).map(Self) + } + fn from_standard_components< + I: Iterator + >( + seed: &str, + password: Option<&str>, + path: I, + ) -> Result { + <$pair>::from_standard_components::(seed, password, path).map(Self) + } + fn sign(&self, msg: &[u8]) -> Self::Signature { + Signature(self.0.sign(msg)) + } + fn verify>( + sig: &Self::Signature, + message: M, + pubkey: &Self::Public, + ) -> bool { + <$pair>::verify(&sig.0, message, pubkey.as_ref()) + } + fn verify_weak, M: AsRef<[u8]>>( + sig: &[u8], + message: M, + pubkey: P, + ) -> bool { + <$pair>::verify_weak(sig, message, pubkey) + } + fn public(&self) -> Self::Public { Public(self.0.public()) } + fn to_raw_vec(&self) -> Vec { self.0.to_raw_vec() } + } + impl $crate::AppKey for Pair { + type UntypedGeneric = $pair; + type Public = Public; + type Pair = Pair; + type Signature = Signature; + const ID: $crate::KeyTypeId = $key_type; + } + impl $crate::AppPair for Pair { + type Generic = $pair; + } + }; + ($public:ty, $sig:ty, $key_type:expr) => { + $crate::wrap!{ + /// A generic `AppPublic` wrapper type over $public crypto; this has no specific App. + #[derive( + Clone, Default, Eq, PartialEq, Ord, PartialOrd, $crate::codec::Encode, + $crate::codec::Decode, + )] + #[cfg_attr(feature = "std", derive(Debug, Hash))] + pub struct Public($public); + } + + impl $crate::Derive for Public { + #[cfg(feature = "std")] + fn derive>(&self, + path: Iter + ) -> Option { + self.0.derive(path).map(Self) + } + } + + #[cfg(feature = "std")] + impl std::fmt::Display for Public { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + use $crate::Ss58Codec; + write!(f, "{}", self.0.to_ss58check()) + } + } + #[cfg(feature = "std")] + impl $crate::serde::Serialize for Public { + fn serialize(&self, serializer: S) -> std::result::Result where + S: $crate::serde::Serializer + { + use $crate::Ss58Codec; + serializer.serialize_str(&self.to_ss58check()) + } + } + #[cfg(feature = "std")] + impl<'de> $crate::serde::Deserialize<'de> for Public { + fn deserialize(deserializer: D) -> std::result::Result where + D: $crate::serde::Deserializer<'de> + { + use $crate::Ss58Codec; + Public::from_ss58check(&String::deserialize(deserializer)?) + .map_err(|e| $crate::serde::de::Error::custom(format!("{:?}", e))) + } + } + + impl AsRef<[u8]> for Public { + fn as_ref(&self) -> &[u8] { self.0.as_ref() } + } + + impl AsMut<[u8]> for Public { + fn as_mut(&mut self) -> &mut [u8] { self.0.as_mut() } + } + + impl $crate::CryptoType for Public { + #[cfg(feature="std")] + type Pair = Pair; + } + + impl $crate::Public for Public { + fn from_slice(x: &[u8]) -> Self { Self(<$public>::from_slice(x)) } + } + + impl $crate::AppKey for Public { + type UntypedGeneric = $public; + type Public = Public; + #[cfg(feature="std")] + type Pair = Pair; + type Signature = Signature; + const ID: $crate::KeyTypeId = $key_type; + } + + impl $crate::AppPublic for Public { + type Generic = $public; + } + + impl $crate::RuntimeAppPublic for Public where $public: $crate::RuntimePublic { + type Signature = Signature; + + fn all() -> $crate::Vec { + <$public as $crate::RuntimePublic>::all($key_type).into_iter().map(Self).collect() + } + + fn generate_pair(seed: Option<&str>) -> Self { + Self(<$public as $crate::RuntimePublic>::generate_pair($key_type, seed)) + } + + fn sign>(&self, msg: &M) -> Option { + <$public as $crate::RuntimePublic>::sign( + self.as_ref(), + $key_type, + msg, + ).map(Signature) + } + + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { + <$public as $crate::RuntimePublic>::verify(self.as_ref(), msg, &signature.as_ref()) + } + } + + $crate::wrap! { + /// A generic `AppPublic` wrapper type over $public crypto; this has no specific App. + #[derive(Clone, Default, Eq, PartialEq, $crate::codec::Encode, $crate::codec::Decode)] + #[cfg_attr(feature = "std", derive(Debug, Hash))] + pub struct Signature($sig); + } + + impl $crate::Deref for Signature { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { self.0.as_ref() } + } + + impl AsRef<[u8]> for Signature { + fn as_ref(&self) -> &[u8] { self.0.as_ref() } + } + + impl $crate::CryptoType for Signature { + #[cfg(feature="std")] + type Pair = Pair; + } + + impl $crate::AppKey for Signature { + type UntypedGeneric = $sig; + type Public = Public; + #[cfg(feature="std")] + type Pair = Pair; + type Signature = Signature; + const ID: $crate::KeyTypeId = $key_type; + } + + impl $crate::AppSignature for Signature { + type Generic = $sig; + } + } +} + +/// Implement bidirectional `From` and on-way `AsRef`/`AsMut` for two types, `$inner` and `$outer`. +/// +/// ```rust +/// substrate_application_crypto::wrap! { +/// pub struct Wrapper(u32); +/// } +/// ``` +#[macro_export] +macro_rules! wrap { + ($( #[ $attr:meta ] )* struct $outer:ident($inner:ty);) => { + $( #[ $attr ] )* + struct $outer( $inner ); + $crate::wrap!($inner, $outer); + }; + ($( #[ $attr:meta ] )* pub struct $outer:ident($inner:ty);) => { + $( #[ $attr ] )* + pub struct $outer( $inner ); + $crate::wrap!($inner, $outer); + }; + ($inner:ty, $outer:ty) => { + impl $crate::Wraps for $outer { + type Inner = $inner; + } + impl From<$inner> for $outer { + fn from(inner: $inner) -> Self { + Self(inner) + } + } + impl From<$outer> for $inner { + fn from(outer: $outer) -> Self { + outer.0 + } + } + impl AsRef<$inner> for $outer { + fn as_ref(&self) -> &$inner { + &self.0 + } + } + impl AsMut<$inner> for $outer { + fn as_mut(&mut self) -> &mut $inner { + &mut self.0 + } + } + } +} diff --git a/core/application-crypto/src/sr25519.rs b/core/application-crypto/src/sr25519.rs new file mode 100644 index 0000000000000000000000000000000000000000..af112dc70ee7e6b1c669dae7c5edd6e65dfa59e3 --- /dev/null +++ b/core/application-crypto/src/sr25519.rs @@ -0,0 +1,75 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Sr25519 crypto types. + +use crate::{RuntimePublic, KeyTypeId}; + +pub use primitives::sr25519::*; + +mod app { + use crate::key_types::SR25519; + crate::app_crypto!(super, SR25519); +} + +pub use app::Public as AppPublic; +pub use app::Signature as AppSignature; +#[cfg(feature="std")] +pub use app::Pair as AppPair; + +impl RuntimePublic for Public { + type Signature = Signature; + + fn all(key_type: KeyTypeId) -> crate::Vec { + rio::sr25519_public_keys(key_type) + } + + fn generate_pair(key_type: KeyTypeId, seed: Option<&str>) -> Self { + rio::sr25519_generate(key_type, seed) + } + + fn sign>(&self, key_type: KeyTypeId, msg: &M) -> Option { + rio::sr25519_sign(key_type, self, msg) + } + + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { + rio::sr25519_verify(&signature, msg.as_ref(), self) + } +} + +#[cfg(test)] +mod tests { + use sr_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; + use primitives::{testing::KeyStore, crypto::Pair, traits::BareCryptoStore as _}; + use test_client::{ + TestClientBuilder, DefaultTestClientBuilderExt, TestClientBuilderExt, + runtime::{TestAPI, app_crypto::sr25519::{AppPair, AppPublic}}, + }; + + #[test] + fn sr25519_works_in_runtime() { + let keystore = KeyStore::new(); + let test_client = TestClientBuilder::new().set_keystore(keystore.clone()).build(); + let (signature, public) = test_client.runtime_api() + .test_sr25519_crypto(&BlockId::Number(0)) + .expect("Tests `sr25519` crypto."); + + let key_pair = keystore.read().sr25519_key_pair(crate::key_types::SR25519, public.as_ref()) + .expect("There should be at a `sr25519` key in the keystore for the given public key."); + + assert!(AppPair::verify(&signature, "sr25519", &AppPublic::from(key_pair.public()))); + } +} diff --git a/core/application-crypto/src/traits.rs b/core/application-crypto/src/traits.rs new file mode 100644 index 0000000000000000000000000000000000000000..d7f1eafe35407d94e6a27ef476e26e67763029bf --- /dev/null +++ b/core/application-crypto/src/traits.rs @@ -0,0 +1,120 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use primitives::crypto::{KeyTypeId, CryptoType, IsWrappedBy, Public}; +#[cfg(feature = "std")] +use primitives::crypto::Pair; + +/// An application-specific key. +pub trait AppKey: 'static + Send + Sync + Sized + CryptoType + Clone { + /// The corresponding type as a generic crypto type. + type UntypedGeneric: IsWrappedBy; + + /// The corresponding public key type in this application scheme. + type Public: AppPublic; + + /// The corresponding key pair type in this application scheme. + #[cfg(feature="std")] + type Pair: AppPair; + + /// The corresponding signature type in this application scheme. + type Signature: AppSignature; + + /// An identifier for this application-specific key type. + const ID: KeyTypeId; +} + +/// Type which implements Debug and Hash in std, not when no-std (std variant). +#[cfg(feature = "std")] +pub trait MaybeDebugHash: std::fmt::Debug + std::hash::Hash {} +#[cfg(feature = "std")] +impl MaybeDebugHash for T {} + +/// Type which implements Debug and Hash in std, not when no-std (no-std variant). +#[cfg(not(feature = "std"))] +pub trait MaybeDebugHash {} +#[cfg(not(feature = "std"))] +impl MaybeDebugHash for T {} + +/// A application's public key. +pub trait AppPublic: AppKey + Public + Ord + PartialOrd + Eq + PartialEq + MaybeDebugHash + codec::Codec { + /// The wrapped type which is just a plain instance of `Public`. + type Generic: + IsWrappedBy + Public + Ord + PartialOrd + Eq + PartialEq + MaybeDebugHash + codec::Codec; +} + +/// A application's key pair. +#[cfg(feature = "std")] +pub trait AppPair: AppKey + Pair::Public> { + /// The wrapped type which is just a plain instance of `Pair`. + type Generic: IsWrappedBy + Pair::Public as AppPublic>::Generic>; +} + +/// A application's signature. +pub trait AppSignature: AppKey + Eq + PartialEq + MaybeDebugHash { + /// The wrapped type which is just a plain instance of `Signature`. + type Generic: IsWrappedBy + Eq + PartialEq + MaybeDebugHash; +} + +/// A runtime interface for a public key. +pub trait RuntimePublic: Sized { + /// The signature that will be generated when signing with the corresponding private key. + type Signature; + + /// Returns all public keys for the given key type in the keystore. + fn all(key_type: KeyTypeId) -> crate::Vec; + + /// Generate a public/private pair for the given key type and store it in the keystore. + /// + /// Returns the generated public key. + fn generate_pair(key_type: KeyTypeId, seed: Option<&str>) -> Self; + + /// Sign the given message with the corresponding private key of this public key. + /// + /// The private key will be requested from the keystore using the given key type. + /// + /// Returns the signature or `None` if the private key could not be found or some other error + /// occurred. + fn sign>(&self, key_type: KeyTypeId, msg: &M) -> Option; + + /// Verify that the given signature matches the given message using this public key. + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool; +} + +/// A runtime interface for an application's public key. +pub trait RuntimeAppPublic: Sized { + /// The signature that will be generated when signing with the corresponding private key. + type Signature; + + /// Returns all public keys for this application in the keystore. + fn all() -> crate::Vec; + + /// Generate a public/private pair and store it in the keystore. + /// + /// Returns the generated public key. + fn generate_pair(seed: Option<&str>) -> Self; + + /// Sign the given message with the corresponding private key of this public key. + /// + /// The private key will be requested from the keystore. + /// + /// Returns the signature or `None` if the private key could not be found or some other error + /// occurred. + fn sign>(&self, msg: &M) -> Option; + + /// Verify that the given signature matches the given message using this public key. + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool; +} diff --git a/core/basic-authorship/Cargo.toml b/core/basic-authorship/Cargo.toml index fa409f1b747d13472a38f28cbf7e701ab1ec6ae2..003eb79349266471802a298ed3b2d477a6451fcc 100644 --- a/core/basic-authorship/Cargo.toml +++ b/core/basic-authorship/Cargo.toml @@ -6,15 +6,15 @@ edition = "2018" [dependencies] log = "0.4" -codec = { package = "parity-codec", version = "4.1.1" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } +futures-preview = "=0.3.0-alpha.17" +codec = { package = "parity-scale-codec", version = "1.0.0" } +sr-primitives = { path = "../../core/sr-primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } client = { package = "substrate-client", path = "../../core/client" } -aura_primitives = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives" } consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } -primitives = { package = "substrate-primitives", path = "../../core/primitives" } inherents = { package = "substrate-inherents", path = "../inherents" } -transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } substrate-telemetry = { path = "../telemetry" } +transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } [dev-dependencies] test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 56a959ccbc9ca1bdc137c0594d6801fcfeac8452..2030f2be5a2f92c858447bd73d2ac85fb4d6a488 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -18,101 +18,25 @@ // FIXME #1021 move this into substrate-consensus-common // -use std::{self, time, sync::Arc}; - -use log::{info, debug, trace}; +use std::{time, sync::Arc}; use client::{ - self, error, Client as SubstrateClient, CallExecutor, - block_builder::api::BlockBuilder as BlockBuilderApi, runtime_api::Core, + error, Client as SubstrateClient, CallExecutor, + block_builder::api::BlockBuilder as BlockBuilderApi, }; use codec::Decode; -use consensus_common::{self, evaluation}; +use consensus_common::{evaluation}; +use inherents::InherentData; +use log::{error, info, debug, trace}; use primitives::{H256, Blake2Hasher, ExecutionContext}; -use runtime_primitives::traits::{ - Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, - DigestFor, +use sr_primitives::{ + traits::{Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, DigestFor, BlakeTwo256}, + generic::BlockId, + ApplyError, }; -use runtime_primitives::generic::BlockId; -use runtime_primitives::ApplyError; use transaction_pool::txpool::{self, Pool as TransactionPool}; -use inherents::InherentData; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; -/// Build new blocks. -pub trait BlockBuilder { - /// Push an extrinsic onto the block. Fails if the extrinsic is invalid. - fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<(), error::Error>; -} - -/// Local client abstraction for the consensus. -pub trait AuthoringApi: Send + Sync + ProvideRuntimeApi where - ::Api: Core -{ - /// The block used for this API type. - type Block: BlockT; - /// The error used by this API type. - type Error: std::error::Error; - - /// Build a block on top of the given block, with inherent extrinsics and - /// inherent digests pre-pushed. - fn build_block) -> ()>( - &self, - at: &BlockId, - inherent_data: InherentData, - inherent_digests: DigestFor, - build_ctx: F, - ) -> Result; -} - -impl<'a, B, E, Block, RA> BlockBuilder - for client::block_builder::BlockBuilder<'a, Block, SubstrateClient> -where - B: client::backend::Backend + 'static, - E: CallExecutor + Send + Sync + Clone + 'static, - Block: BlockT, - RA: Send + Sync + 'static, - SubstrateClient : ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: BlockBuilderApi, -{ - fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<(), error::Error> { - client::block_builder::BlockBuilder::push(self, extrinsic).map_err(Into::into) - } -} - -impl AuthoringApi for SubstrateClient where - B: client::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + Clone + 'static, - Block: BlockT, - RA: Send + Sync + 'static, - SubstrateClient : ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: BlockBuilderApi, -{ - type Block = Block; - type Error = client::error::Error; - - fn build_block) -> ()>( - &self, - at: &BlockId, - inherent_data: InherentData, - inherent_digests: DigestFor, - mut build_ctx: F, - ) -> Result { - - let mut block_builder = self.new_block_at(at, inherent_digests)?; - - let runtime_api = self.runtime_api(); - // We don't check the API versions any further here since the dispatch compatibility - // check should be enough. - runtime_api.inherent_extrinsics_with_context(at, ExecutionContext::BlockConstruction, inherent_data)? - .into_iter().try_for_each(|i| block_builder.push(i))?; - - build_ctx(&mut block_builder); - - block_builder.bake().map_err(Into::into) - } -} - /// Proposer factory. pub struct ProposerFactory where A: txpool::ChainApi { /// The client instance. @@ -121,19 +45,23 @@ pub struct ProposerFactory where A: txpool::ChainApi { pub transaction_pool: Arc>, } -impl consensus_common::Environment<::Block> for ProposerFactory where - C: AuthoringApi, - ::Api: BlockBuilderApi<::Block>, - A: txpool::ChainApi::Block>, - client::error::Error: From<::Error>, - Proposer<::Block, C, A>: consensus_common::Proposer<::Block>, +impl consensus_common::Environment for +ProposerFactory, A> +where + A: txpool::ChainApi, + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, + RA: Send + Sync + 'static, + SubstrateClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilderApi, { - type Proposer = Proposer<::Block, C, A>; + type Proposer = Proposer, A>; type Error = error::Error; fn init( - &self, - parent_header: &<::Block as BlockT>::Header, + &mut self, + parent_header: &::Header, ) -> Result { let parent_hash = parent_header.hash(); @@ -164,103 +92,115 @@ pub struct Proposer { now: Box time::Instant>, } -impl consensus_common::Proposer<::Block> for Proposer where - Block: BlockT, - C: AuthoringApi, - ::Api: BlockBuilderApi, +impl consensus_common::Proposer for +Proposer, A> +where A: txpool::ChainApi, - client::error::Error: From<::Error> + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, + RA: Send + Sync + 'static, + SubstrateClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilderApi, { - type Create = Result<::Block, error::Error>; + type Create = futures::future::Ready>; type Error = error::Error; fn propose( - &self, + &mut self, inherent_data: InherentData, inherent_digests: DigestFor, max_duration: time::Duration, - ) -> Result<::Block, error::Error> - { + ) -> Self::Create { // leave some time for evaluation and block finalization (33%) let deadline = (self.now)() + max_duration - max_duration / 3; - self.propose_with(inherent_data, inherent_digests, deadline) + futures::future::ready(self.propose_with(inherent_data, inherent_digests, deadline)) } } -impl Proposer where - Block: BlockT, - C: AuthoringApi, - ::Api: BlockBuilderApi, +impl Proposer, A> where A: txpool::ChainApi, - client::error::Error: From<::Error>, + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, + RA: Send + Sync + 'static, + SubstrateClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilderApi, { fn propose_with( &self, inherent_data: InherentData, inherent_digests: DigestFor, deadline: time::Instant, - ) -> Result<::Block, error::Error> - { - use runtime_primitives::traits::BlakeTwo256; - + ) -> Result { /// If the block is full we will attempt to push at most /// this number of transactions before quitting for real. /// It allows us to increase block utilization. const MAX_SKIPPED_TRANSACTIONS: usize = 8; - let block = self.client.build_block( - &self.parent_id, - inherent_data, - inherent_digests.clone(), - |block_builder| { - // proceed with transactions - let mut is_first = true; - let mut skipped = 0; - let mut unqueue_invalid = Vec::new(); - let pending_iterator = self.transaction_pool.ready(); - - debug!("Attempting to push transactions from the pool."); - for pending in pending_iterator { - if (self.now)() > deadline { - debug!("Consensus deadline reached when pushing block transactions, proceeding with proposing."); + let mut block_builder = self.client.new_block_at(&self.parent_id, inherent_digests)?; + + // We don't check the API versions any further here since the dispatch compatibility + // check should be enough. + for extrinsic in self.client.runtime_api() + .inherent_extrinsics_with_context( + &self.parent_id, + ExecutionContext::BlockConstruction, + inherent_data + )? + { + block_builder.push(extrinsic)?; + } + + // proceed with transactions + let mut is_first = true; + let mut skipped = 0; + let mut unqueue_invalid = Vec::new(); + let pending_iterator = self.transaction_pool.ready(); + + debug!("Attempting to push transactions from the pool."); + for pending in pending_iterator { + if (self.now)() > deadline { + debug!("Consensus deadline reached when pushing block transactions, proceeding with proposing."); + break; + } + + trace!("[{:?}] Pushing to the block.", pending.hash); + match client::block_builder::BlockBuilder::push(&mut block_builder, pending.data.clone()) { + Ok(()) => { + debug!("[{:?}] Pushed to the block.", pending.hash); + } + Err(error::Error::ApplyExtrinsicFailed(ApplyError::FullBlock)) => { + if is_first { + debug!("[{:?}] Invalid transaction: FullBlock on empty block", pending.hash); + unqueue_invalid.push(pending.hash.clone()); + } else if skipped < MAX_SKIPPED_TRANSACTIONS { + skipped += 1; + debug!( + "Block seems full, but will try {} more transactions before quitting.", + MAX_SKIPPED_TRANSACTIONS - skipped + ); + } else { + debug!("Block is full, proceed with proposing."); break; } + } + Err(e) => { + debug!("[{:?}] Invalid transaction: {}", pending.hash, e); + unqueue_invalid.push(pending.hash.clone()); + } + } - trace!("[{:?}] Pushing to the block.", pending.hash); - match block_builder.push_extrinsic(pending.data.clone()) { - Ok(()) => { - debug!("[{:?}] Pushed to the block.", pending.hash); - } - Err(error::Error::ApplyExtrinsicFailed(ApplyError::FullBlock)) => { - if is_first { - debug!("[{:?}] Invalid transaction: FullBlock on empty block", pending.hash); - unqueue_invalid.push(pending.hash.clone()); - } else if skipped < MAX_SKIPPED_TRANSACTIONS { - skipped += 1; - debug!( - "Block seems full, but will try {} more transactions before quitting.", - MAX_SKIPPED_TRANSACTIONS - skipped - ); - } else { - debug!("Block is full, proceed with proposing."); - break; - } - } - Err(e) => { - debug!("[{:?}] Invalid transaction: {}", pending.hash, e); - unqueue_invalid.push(pending.hash.clone()); - } - } + is_first = false; + } - is_first = false; - } + self.transaction_pool.remove_invalid(&unqueue_invalid); - self.transaction_pool.remove_invalid(&unqueue_invalid); - })?; + let block = block_builder.bake()?; info!("Prepared block for proposing at {} [hash: {:?}; parent_hash: {}; extrinsics: [{}]]", block.header().number(), - <::Block as BlockT>::Hash::from(block.header().hash()), + ::Hash::from(block.header().hash()), block.header().parent_hash(), block.extrinsics() .iter() @@ -270,19 +210,18 @@ impl Proposer where ); telemetry!(CONSENSUS_INFO; "prepared_block_for_proposing"; "number" => ?block.header().number(), - "hash" => ?<::Block as BlockT>::Hash::from(block.header().hash()), + "hash" => ?::Hash::from(block.header().hash()), ); - let substrate_block = Decode::decode(&mut block.encode().as_slice()) - .expect("blocks are defined to serialize to substrate blocks correctly; qed"); + if Decode::decode(&mut block.encode().as_slice()).as_ref() != Ok(&block) { + error!("Failed to verify block encoding/decoding"); + } - assert!(evaluation::evaluate_initial( - &substrate_block, - &self.parent_hash, - self.parent_number, - ).is_ok()); + if let Err(err) = evaluation::evaluate_initial(&block, &self.parent_hash, self.parent_number) { + error!("Failed to evaluate authored block: {:?}", err); + } - Ok(substrate_block) + Ok(block) } } @@ -312,7 +251,7 @@ mod tests { txpool.submit_at(&BlockId::number(0), vec![extrinsic(0), extrinsic(1)]).unwrap(); - let proposer_factory = ProposerFactory { + let mut proposer_factory = ProposerFactory { client: client.clone(), transaction_pool: txpool.clone(), }; @@ -328,7 +267,8 @@ mod tests { cell.replace(new) }); let deadline = time::Duration::from_secs(3); - let block = proposer.propose(Default::default(), Default::default(), deadline).unwrap(); + let block = futures::executor::block_on(proposer.propose(Default::default(), Default::default(), deadline)) + .unwrap(); // then // block should have some extrinsics although we have some more in the pool. diff --git a/core/basic-authorship/src/lib.rs b/core/basic-authorship/src/lib.rs index 88a55c3bac4fa22bb21e42e9c66398a6e286b575..71c9e2792248fa260980c87400bb6130e1a898fe 100644 --- a/core/basic-authorship/src/lib.rs +++ b/core/basic-authorship/src/lib.rs @@ -15,9 +15,44 @@ // along with Substrate. If not, see . //! Basic implementation of block-authoring logic. - -#![warn(unused_extern_crates)] +//! +//! # Example +//! +//! ``` +//! # use substrate_basic_authorship::ProposerFactory; +//! # use consensus_common::{Environment, Proposer}; +//! # use sr_primitives::generic::BlockId; +//! # use std::{sync::Arc, time::Duration}; +//! # use test_client::{self, runtime::{Extrinsic, Transfer}, AccountKeyring}; +//! # use transaction_pool::txpool::{self, Pool as TransactionPool}; +//! # let client = Arc::new(test_client::new()); +//! # let chain_api = transaction_pool::ChainApi::new(client.clone()); +//! # let txpool = Arc::new(TransactionPool::new(Default::default(), chain_api)); +//! // The first step is to create a `ProposerFactory`. +//! let mut proposer_factory = ProposerFactory { +//! client: client.clone(), +//! transaction_pool: txpool.clone(), +//! }; +//! +//! // From this factory, we create a `Proposer`. +//! let mut proposer = proposer_factory.init( +//! &client.header(&BlockId::number(0)).unwrap().unwrap(), +//! ).unwrap(); +//! +//! // This `Proposer` allows us to create a block proposition. +//! // The proposer will grab transactions from the transaction pool, and put them into the block. +//! let future = proposer.propose( +//! Default::default(), +//! Default::default(), +//! Duration::from_secs(2) +//! ); +//! +//! // We wait until the proposition is performed. +//! let block = futures::executor::block_on(future).unwrap(); +//! println!("Generated block: {:?}", block); +//! ``` +//! mod basic_authorship; -pub use crate::basic_authorship::{ProposerFactory, BlockBuilder, AuthoringApi, Proposer}; +pub use crate::basic_authorship::{ProposerFactory, Proposer}; diff --git a/core/cli/Cargo.toml b/core/cli/Cargo.toml index bf583a3b7dc2e3b2fefb117f3a03d87c8791038f..a5af7362268f94d413795cb85106fdabdf40739a 100644 --- a/core/cli/Cargo.toml +++ b/core/cli/Cargo.toml @@ -18,14 +18,14 @@ lazy_static = "1.3" app_dirs = "1.2" tokio = "0.1.7" futures = "0.1.17" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17", features = ["compat"] } fdlimit = "0.1" exit-future = "0.1" serde_json = "1.0" panic-handler = { package = "substrate-panic-handler", path = "../../core/panic-handler" } client = { package = "substrate-client", path = "../../core/client" } network = { package = "substrate-network", path = "../../core/network" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } +sr-primitives = { path = "../../core/sr-primitives" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } service = { package = "substrate-service", path = "../../core/service" } state-machine = { package = "substrate-state-machine", path = "../../core/state-machine" } diff --git a/core/cli/src/error.rs b/core/cli/src/error.rs index b052a29710d7fce5f737b3f64b377f7b015d3bbc..600e73d44fe73294b95246c05186295d7c40fb79 100644 --- a/core/cli/src/error.rs +++ b/core/cli/src/error.rs @@ -36,7 +36,17 @@ pub enum Error { Input(String), /// Invalid listen multiaddress #[display(fmt="Invalid listen multiaddress")] - InvalidListenMultiaddress + InvalidListenMultiaddress, + /// Other uncategorized error. + Other(String), +} + +/// Must be implemented explicitly because `derive_more` won't generate this +/// case due to conflicting derive for `Other(String)`. +impl std::convert::From for Error { + fn from(s: String) -> Error { + Error::Input(s) + } } impl std::error::Error for Error { @@ -48,6 +58,7 @@ impl std::error::Error for Error { Error::Client(ref err) => Some(err), Error::Input(_) => None, Error::InvalidListenMultiaddress => None, + Error::Other(_) => None, } } } diff --git a/core/cli/src/execution_strategy.rs b/core/cli/src/execution_strategy.rs new file mode 100644 index 0000000000000000000000000000000000000000..bd3030906ec09fdea7d3707d0387926055cce96f --- /dev/null +++ b/core/cli/src/execution_strategy.rs @@ -0,0 +1,35 @@ +// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +#![allow(missing_docs)] + +use structopt::clap::{arg_enum, _clap_count_exprs}; + +arg_enum! { + /// How to execute blocks + #[derive(Debug, Clone, Copy)] + pub enum ExecutionStrategy { + // Execute with native build (if available, WebAssembly otherwise). + Native, + // Only execute with the WebAssembly build. + Wasm, + // Execute with both native (where available) and WebAssembly builds. + Both, + // Execute with the native build if possible; if it fails, then execute with WebAssembly. + NativeElseWasm, + } +} + diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index d6bbf4831d8dcf99567601387d49bab384e6b617..b5a2f03d795461a75e2ad0f02084875fed395bcb 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -16,19 +16,15 @@ //! Console informant. Prints sync progress and block events. Runs on the calling thread. -use ansi_term::Colour; -use std::fmt; -use std::time; +use client::{backend::Backend, BlockchainEvents}; use futures::{Future, Stream}; use futures03::{StreamExt as _, TryStreamExt as _}; +use log::{info, warn}; +use sr_primitives::{generic::BlockId, traits::Header}; use service::{Service, Components}; use tokio::runtime::TaskExecutor; -use network::SyncState; -use client::{backend::Backend, BlockchainEvents}; -use log::{info, warn}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Header, SaturatedConversion}; +mod display; /// Spawn informant on the event loop #[deprecated(note = "Please use informant::build instead, and then create the task manually")] @@ -42,50 +38,25 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe pub fn build(service: &Service) -> impl Future where C: Components { let client = service.client(); - let mut last_number = None; - let mut last_update = time::Instant::now(); - let display_notifications = service.network_status().for_each(move |(net_status, _)| { + let mut display = display::InformantDisplay::new(); + let display_notifications = service.network_status().for_each(move |(net_status, _)| { let info = client.info(); - let best_number = info.chain.best_number.saturated_into::(); - let best_hash = info.chain.best_hash; - let speed = move || speed(best_number, last_number, last_update); - last_update = time::Instant::now(); - let (status, target) = match (net_status.sync_state, net_status.best_seen_block) { - (SyncState::Idle, _) => ("Idle".into(), "".into()), - (SyncState::Downloading, None) => (format!("Syncing{}", speed()), "".into()), - (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed()), format!(", target=#{}", n)), - }; - last_number = Some(best_number); - let finalized_number: u64 = info.chain.finalized_number.saturated_into::(); - info!( - target: "substrate", - "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", - Colour::White.bold().paint(&status), - target, - Colour::White.bold().paint(format!("{}", net_status.num_connected_peers)), - Colour::White.paint(format!("{}", best_number)), - best_hash, - Colour::White.paint(format!("{}", finalized_number)), - info.chain.finalized_hash, - TransferRateFormat(net_status.average_download_per_sec), - TransferRateFormat(net_status.average_upload_per_sec), - ); - + display.display(&info, net_status); Ok(()) }); let client = service.client(); - let mut last = { + let mut last_best = { let info = client.info(); Some((info.chain.best_number, info.chain.best_hash)) }; let display_block_import = client.import_notification_stream().map(|v| Ok::<_, ()>(v)).compat().for_each(move |n| { // detect and log reorganizations. - if let Some((ref last_num, ref last_hash)) = last { - if n.header.parent_hash() != last_hash { + if let Some((ref last_num, ref last_hash)) = last_best { + if n.header.parent_hash() != last_hash && n.is_new_best { let tree_route = ::client::blockchain::tree_route( #[allow(deprecated)] client.backend().blockchain(), @@ -106,7 +77,9 @@ where C: Components { } } - last = Some((n.header.number().clone(), n.hash.clone())); + if n.is_new_best { + last_best = Some((n.header.number().clone(), n.hash.clone())); + } info!(target: "substrate", "Imported #{} ({})", n.header.number(), n.hash); Ok(()) @@ -115,42 +88,3 @@ where C: Components { display_notifications.join(display_block_import) .map(|((), ())| ()) } - -fn speed(best_number: u64, last_number: Option, last_update: time::Instant) -> String { - let since_last_millis = last_update.elapsed().as_secs() * 1000; - let since_last_subsec_millis = last_update.elapsed().subsec_millis() as u64; - let speed = last_number - .and_then(|num| - (best_number.saturating_sub(num) * 10_000).checked_div(since_last_millis + since_last_subsec_millis)) - .map_or(0.0, |s| s as f64); - - if speed < 1.0 { - "".into() - } else { - format!(" {:4.1} bps", speed / 10.0) - } -} - -/// Contains a number of bytes per second. Implements `fmt::Display` and shows this number of bytes -/// per second in a nice way. -struct TransferRateFormat(u64); -impl fmt::Display for TransferRateFormat { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // Special case 0. - if self.0 == 0 { - return write!(f, "0") - } - - // Under 0.1 kiB, display plain bytes. - if self.0 < 100 { - return write!(f, "{} B/s", self.0) - } - - // Under 1.0 MiB/sec, display the value in kiB/sec. - if self.0 < 1024 * 1024 { - return write!(f, "{:.1}kiB/s", self.0 as f64 / 1024.0) - } - - write!(f, "{:.1}MiB/s", self.0 as f64 / (1024.0 * 1024.0)) - } -} diff --git a/core/cli/src/informant/display.rs b/core/cli/src/informant/display.rs new file mode 100644 index 0000000000000000000000000000000000000000..c7cf9bfc930b91c71eef5f10f047ad4cd62c98be --- /dev/null +++ b/core/cli/src/informant/display.rs @@ -0,0 +1,149 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use ansi_term::Colour; +use client::ClientInfo; +use log::info; +use network::SyncState; +use sr_primitives::traits::{Block as BlockT, CheckedDiv, NumberFor, Zero, Saturating}; +use service::NetworkStatus; +use std::{convert::{TryFrom, TryInto}, fmt, time}; + +/// State of the informant display system. +/// +/// This is the system that handles the line that gets regularly printed and that looks something +/// like: +/// +/// > Syncing 5.4 bps, target=#531028 (4 peers), best: #90683 (0x4ca8…51b8), +/// > finalized #360 (0x6f24…a38b), ⬇ 5.5kiB/s ⬆ 0.9kiB/s +/// +/// # Usage +/// +/// Call `InformantDisplay::new` to initialize the state, then regularly call `display` with the +/// information to display. +/// +pub struct InformantDisplay { + /// Head of chain block number from the last time `display` has been called. + /// `None` if `display` has never been called. + last_number: Option>, + /// The last time `display` or `new` has been called. + last_update: time::Instant, +} + +impl InformantDisplay { + /// Builds a new informant display system. + pub fn new() -> InformantDisplay { + InformantDisplay { + last_number: None, + last_update: time::Instant::now(), + } + } + + /// Displays the informant by calling `info!`. + pub fn display(&mut self, info: &ClientInfo, net_status: NetworkStatus) { + let best_number = info.chain.best_number; + let best_hash = info.chain.best_hash; + let speed = speed::(best_number, self.last_number, self.last_update); + self.last_update = time::Instant::now(); + self.last_number = Some(best_number); + + let (status, target) = match (net_status.sync_state, net_status.best_seen_block) { + (SyncState::Idle, _) => ("Idle".into(), "".into()), + (SyncState::Downloading, None) => (format!("Syncing{}", speed), "".into()), + (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed), format!(", target=#{}", n)), + }; + + info!( + target: "substrate", + "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", + Colour::White.bold().paint(&status), + target, + Colour::White.bold().paint(format!("{}", net_status.num_connected_peers)), + Colour::White.paint(format!("{}", best_number)), + best_hash, + Colour::White.paint(format!("{}", info.chain.finalized_number)), + info.chain.finalized_hash, + TransferRateFormat(net_status.average_download_per_sec), + TransferRateFormat(net_status.average_upload_per_sec), + ); + } +} + +/// Calculates `(best_number - last_number) / (now - last_update)` and returns a `String` +/// representing the speed of import. +fn speed( + best_number: NumberFor, + last_number: Option>, + last_update: time::Instant +) -> String { + // Number of milliseconds elapsed since last time. + let elapsed_ms = { + let elapsed = last_update.elapsed(); + let since_last_millis = elapsed.as_secs() * 1000; + let since_last_subsec_millis = elapsed.subsec_millis() as u64; + since_last_millis + since_last_subsec_millis + }; + + // Number of blocks that have been imported since last time. + let diff = match last_number { + None => return String::new(), + Some(n) => best_number.saturating_sub(n) + }; + + if let Ok(diff) = TryInto::::try_into(diff) { + // If the number of blocks can be converted to a regular integer, then it's easy: just + // do the math and turn it into a `f64`. + let speed = diff.saturating_mul(10_000).checked_div(u128::from(elapsed_ms)) + .map_or(0.0, |s| s as f64) / 10.0; + format!(" {:4.1} bps", speed) + + } else { + // If the number of blocks can't be converted to a regular integer, then we need a more + // algebraic approach and we stay within the realm of integers. + let one_thousand = NumberFor::::from(1_000); + let elapsed = NumberFor::::from( + >::try_from(elapsed_ms).unwrap_or(u32::max_value()) + ); + + let speed = diff.saturating_mul(one_thousand).checked_div(&elapsed) + .unwrap_or_else(Zero::zero); + format!(" {} bps", speed) + } +} + +/// Contains a number of bytes per second. Implements `fmt::Display` and shows this number of bytes +/// per second in a nice way. +struct TransferRateFormat(u64); +impl fmt::Display for TransferRateFormat { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // Special case 0. + if self.0 == 0 { + return write!(f, "0") + } + + // Under 0.1 kiB, display plain bytes. + if self.0 < 100 { + return write!(f, "{} B/s", self.0) + } + + // Under 1.0 MiB/sec, display the value in kiB/sec. + if self.0 < 1024 * 1024 { + return write!(f, "{:.1}kiB/s", self.0 as f64 / 1024.0) + } + + write!(f, "{:.1}MiB/s", self.0 as f64 / (1024.0 * 1024.0)) + } +} diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index cc31af184ed9ce1288708243f82687de34f94b65..ef5290413166d6a247d53f7ecf9c39f4b798b7ff 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -22,11 +22,13 @@ #[macro_use] mod traits; mod params; +mod execution_strategy; pub mod error; pub mod informant; use client::ExecutionStrategies; use service::{ + config::Configuration, ServiceFactory, FactoryFullConfiguration, RuntimeGenesis, FactoryGenesis, PruningMode, ChainSpec, }; @@ -37,8 +39,8 @@ use network::{ use primitives::H256; use std::{ - io::{Write, Read, stdin, stdout, ErrorKind}, iter, fs::{self, File}, net::{Ipv4Addr, SocketAddr}, - path::{Path, PathBuf}, str::FromStr, + io::{Write, Read, Seek, Cursor, stdin, stdout, ErrorKind}, iter, fs::{self, File}, + net::{Ipv4Addr, SocketAddr}, path::{Path, PathBuf}, str::FromStr, }; use names::{Generator, Name}; @@ -51,7 +53,7 @@ use params::{ NetworkConfigurationParams, MergeParameters, TransactionPoolParams, NodeKeyParams, NodeKeyType, Cors, }; -pub use params::{NoCustom, CoreParams, SharedParams}; +pub use params::{NoCustom, CoreParams, SharedParams, ExecutionStrategy as ExecutionStrategyParam}; pub use traits::{GetLogFilter, AugmentClap}; use app_dirs::{AppInfo, AppDataType}; use log::info; @@ -165,38 +167,29 @@ fn is_node_name_valid(_name: &str) -> Result<(), &str> { Ok(()) } -/// Parse command line interface arguments and executes the desired command. +/// Parse command line interface arguments and prepares the command for execution. /// -/// # Return value -/// -/// A result that indicates if any error occurred. -/// If no error occurred and a custom subcommand was found, the subcommand is returned. -/// The user needs to handle this subcommand on its own. +/// Before returning, this function performs various initializations, such as initializing the +/// panic handler and the logger, or increasing the limit for file descriptors. /// /// # Remarks /// /// `CC` is a custom subcommand. This needs to be an `enum`! If no custom subcommand is required, /// `NoCustom` can be used as type here. +/// /// `RP` are custom parameters for the run command. This needs to be a `struct`! The custom /// parameters are visible to the user as if they were normal run command parameters. If no custom /// parameters are required, `NoCustom` can be used as type here. -pub fn parse_and_execute<'a, F, CC, RP, S, RS, E, I, T>( - spec_factory: S, - version: &VersionInfo, +pub fn parse_and_prepare<'a, CC, RP, I>( + version: &'a VersionInfo, impl_name: &'static str, args: I, - exit: E, - run_service: RS, -) -> error::Result> +) -> ParseAndPrepare<'a, CC, RP> where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, CC: StructOpt + Clone + GetLogFilter, RP: StructOpt + Clone + AugmentClap, - E: IntoExit, - RS: FnOnce(E, RunCmd, RP, FactoryFullConfiguration) -> Result<(), String>, - I: IntoIterator, - T: Into + Clone, + I: IntoIterator, + ::Item: Into + Clone, { panic_handler::set(version.support_url); @@ -220,23 +213,294 @@ where fdlimit::raise_fd_limit(); match cli_args { - params::CoreParams::Run(params) => run_node::( - params, spec_factory, exit, run_service, impl_name, version, - ).map(|_| None), - params::CoreParams::BuildSpec(params) => - build_spec::(params, spec_factory, version).map(|_| None), - params::CoreParams::ExportBlocks(params) => - export_blocks::(params, spec_factory, exit, version).map(|_| None), - params::CoreParams::ImportBlocks(params) => - import_blocks::(params, spec_factory, exit, version).map(|_| None), - params::CoreParams::PurgeChain(params) => - purge_chain::(params, spec_factory, version).map(|_| None), - params::CoreParams::Revert(params) => - revert_chain::(params, spec_factory, version).map(|_| None), - params::CoreParams::Custom(params) => Ok(Some(params)), + params::CoreParams::Run(params) => ParseAndPrepare::Run( + ParseAndPrepareRun { params, impl_name, version } + ), + params::CoreParams::BuildSpec(params) => ParseAndPrepare::BuildSpec( + ParseAndPrepareBuildSpec { params, version } + ), + params::CoreParams::ExportBlocks(params) => ParseAndPrepare::ExportBlocks( + ParseAndPrepareExport { params, version } + ), + params::CoreParams::ImportBlocks(params) => ParseAndPrepare::ImportBlocks( + ParseAndPrepareImport { params, version } + ), + params::CoreParams::PurgeChain(params) => ParseAndPrepare::PurgeChain( + ParseAndPreparePurge { params, version } + ), + params::CoreParams::Revert(params) => ParseAndPrepare::RevertChain( + ParseAndPrepareRevert { params, version } + ), + params::CoreParams::Custom(params) => ParseAndPrepare::CustomCommand(params), } } +/// Output of calling `parse_and_prepare`. +#[must_use] +pub enum ParseAndPrepare<'a, CC, RP> { + /// Command ready to run the main client. + Run(ParseAndPrepareRun<'a, RP>), + /// Command ready to build chain specs. + BuildSpec(ParseAndPrepareBuildSpec<'a>), + /// Command ready to export the chain. + ExportBlocks(ParseAndPrepareExport<'a>), + /// Command ready to import the chain. + ImportBlocks(ParseAndPrepareImport<'a>), + /// Command ready to purge the chain. + PurgeChain(ParseAndPreparePurge<'a>), + /// Command ready to revert the chain. + RevertChain(ParseAndPrepareRevert<'a>), + /// An additional custom command passed to `parse_and_prepare`. + CustomCommand(CC), +} + +/// Command ready to run the main client. +pub struct ParseAndPrepareRun<'a, RP> { + params: MergeParameters, + impl_name: &'static str, + version: &'a VersionInfo, +} + +impl<'a, RP> ParseAndPrepareRun<'a, RP> { + /// Runs the command and runs the main client. + pub fn run( + self, + spec_factory: S, + exit: E, + run_service: RS, + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>, String>, + RP: StructOpt + Clone, + C: Default, + G: RuntimeGenesis, + E: IntoExit, + RS: FnOnce(E, RunCmd, RP, Configuration) -> Result<(), String> + { + let config = create_run_node_config(self.params.left.clone(), spec_factory, self.impl_name, self.version)?; + + run_service(exit, self.params.left, self.params.right, config).map_err(Into::into) + } +} + +/// Command ready to build chain specs. +pub struct ParseAndPrepareBuildSpec<'a> { + params: BuildSpecCmd, + version: &'a VersionInfo, +} + +impl<'a> ParseAndPrepareBuildSpec<'a> { + /// Runs the command and build the chain specs. + pub fn run( + self, + spec_factory: S + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>, String>, + G: RuntimeGenesis + { + info!("Building chain spec"); + let raw_output = self.params.raw; + let mut spec = load_spec(&self.params.shared_params, spec_factory)?; + with_default_boot_node(&mut spec, self.params, self.version)?; + let json = service::chain_ops::build_spec(spec, raw_output)?; + + print!("{}", json); + + Ok(()) + } +} + +/// Command ready to export the chain. +pub struct ParseAndPrepareExport<'a> { + params: ExportBlocksCmd, + version: &'a VersionInfo, +} + +impl<'a> ParseAndPrepareExport<'a> { + /// Runs the command and exports from the chain. + pub fn run( + self, + spec_factory: S, + exit: E, + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>>, String>, + F: ServiceFactory, + E: IntoExit + { + let config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + + info!("DB path: {}", config.database_path.display()); + let from = self.params.from.unwrap_or(1); + let to = self.params.to; + let json = self.params.json; + + let file: Box = match self.params.output { + Some(filename) => Box::new(File::create(filename)?), + None => Box::new(stdout()), + }; + + service::chain_ops::export_blocks::( + config, exit.into_exit(), file, from.into(), to.map(Into::into), json + ).map_err(Into::into) + } +} + +/// Command ready to import the chain. +pub struct ParseAndPrepareImport<'a> { + params: ImportBlocksCmd, + version: &'a VersionInfo, +} + +impl<'a> ParseAndPrepareImport<'a> { + /// Runs the command and imports to the chain. + pub fn run( + self, + spec_factory: S, + exit: E, + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>>, String>, + F: ServiceFactory, + E: IntoExit + { + let mut config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + config.execution_strategies = ExecutionStrategies { + importing: self.params.execution.into(), + other: self.params.execution.into(), + ..Default::default() + }; + + let file: Box = match self.params.input { + Some(filename) => Box::new(File::open(filename)?), + None => { + let mut buffer = Vec::new(); + stdin().read_to_end(&mut buffer)?; + Box::new(Cursor::new(buffer)) + }, + }; + + let fut = service::chain_ops::import_blocks::(config, exit.into_exit(), file)?; + tokio::run(fut); + Ok(()) + } +} + +/// Command ready to purge the chain. +pub struct ParseAndPreparePurge<'a> { + params: PurgeChainCmd, + version: &'a VersionInfo, +} + +impl<'a> ParseAndPreparePurge<'a> { + /// Runs the command and purges the chain. + pub fn run( + self, + spec_factory: S + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>, String>, + G: RuntimeGenesis + { + let config = create_config_with_db_path::<(), _, _>(spec_factory, &self.params.shared_params, self.version)?; + let db_path = config.database_path; + + if !self.params.yes { + print!("Are you sure to remove {:?}? (y/n)", &db_path); + stdout().flush().expect("failed to flush stdout"); + + let mut input = String::new(); + stdin().read_line(&mut input)?; + let input = input.trim(); + + match input.chars().nth(0) { + Some('y') | Some('Y') => {}, + _ => { + println!("Aborted"); + return Ok(()); + }, + } + } + + match fs::remove_dir_all(&db_path) { + Result::Ok(_) => { + println!("{:?} removed.", &db_path); + Ok(()) + }, + Result::Err(ref err) if err.kind() == ErrorKind::NotFound => { + println!("{:?} did not exist.", &db_path); + Ok(()) + }, + Result::Err(err) => Result::Err(err.into()) + } + } +} + +/// Command ready to revert the chain. +pub struct ParseAndPrepareRevert<'a> { + params: RevertCmd, + version: &'a VersionInfo, +} + +impl<'a> ParseAndPrepareRevert<'a> { + /// Runs the command and reverts the chain. + pub fn run( + self, + spec_factory: S + ) -> error::Result<()> + where S: FnOnce(&str) -> Result>>, String>, + F: ServiceFactory { + let config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + let blocks = self.params.num; + Ok(service::chain_ops::revert_chain::(config, blocks.into())?) + } +} + +/// Parse command line interface arguments and executes the desired command. +/// +/// # Return value +/// +/// A result that indicates if any error occurred. +/// If no error occurred and a custom subcommand was found, the subcommand is returned. +/// The user needs to handle this subcommand on its own. +/// +/// # Remarks +/// +/// `CC` is a custom subcommand. This needs to be an `enum`! If no custom subcommand is required, +/// `NoCustom` can be used as type here. +/// `RP` are custom parameters for the run command. This needs to be a `struct`! The custom +/// parameters are visible to the user as if they were normal run command parameters. If no custom +/// parameters are required, `NoCustom` can be used as type here. +#[deprecated( + note = "Use parse_and_prepare instead; see the source code of parse_and_execute for how to transition" +)] +pub fn parse_and_execute<'a, F, CC, RP, S, RS, E, I, T>( + spec_factory: S, + version: &VersionInfo, + impl_name: &'static str, + args: I, + exit: E, + run_service: RS, +) -> error::Result> +where + F: ServiceFactory, + S: FnOnce(&str) -> Result>>, String>, + CC: StructOpt + Clone + GetLogFilter, + RP: StructOpt + Clone + AugmentClap, + E: IntoExit, + RS: FnOnce(E, RunCmd, RP, FactoryFullConfiguration) -> Result<(), String>, + I: IntoIterator, + T: Into + Clone, +{ + match parse_and_prepare::(version, impl_name, args) { + ParseAndPrepare::Run(cmd) => cmd.run(spec_factory, exit, run_service), + ParseAndPrepare::BuildSpec(cmd) => cmd.run(spec_factory), + ParseAndPrepare::ExportBlocks(cmd) => cmd.run::(spec_factory, exit), + ParseAndPrepare::ImportBlocks(cmd) => cmd.run::(spec_factory, exit), + ParseAndPrepare::PurgeChain(cmd) => cmd.run(spec_factory), + ParseAndPrepare::RevertChain(cmd) => cmd.run::(spec_factory), + ParseAndPrepare::CustomCommand(cmd) => return Ok(Some(cmd)) + }?; + + Ok(None) +} + /// Create a `NodeKeyConfig` from the given `NodeKeyParams` in the context /// of an optional network config storage directory. fn node_key_config

(params: NodeKeyParams, net_config_dir: &Option

) @@ -292,8 +556,8 @@ fn parse_ed25519_secret(hex: &String) -> error::Result( - options: &mut FactoryFullConfiguration, +fn fill_transaction_pool_configuration( + options: &mut Configuration, params: TransactionPoolParams, ) -> error::Result<()> { // ready queue @@ -366,18 +630,36 @@ fn input_keystore_password() -> Result { .map_err(|e| format!("{:?}", e)) } -fn create_run_node_config( +/// Fill the password field of the given config instance. +fn fill_config_keystore_password( + config: &mut service::Configuration, + cli: &RunCmd, +) -> Result<(), String> { + config.keystore_password = if cli.password_interactive { + Some(input_keystore_password()?.into()) + } else if let Some(ref file) = cli.password_filename { + Some(fs::read_to_string(file).map_err(|e| format!("{}", e))?.into()) + } else if let Some(ref password) = cli.password { + Some(password.clone().into()) + } else { + None + }; + + Ok(()) +} + +fn create_run_node_config( cli: RunCmd, spec_factory: S, impl_name: &'static str, version: &VersionInfo -) -> error::Result> +) -> error::Result> where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, + C: Default, + G: RuntimeGenesis, + S: FnOnce(&str) -> Result>, String>, { let spec = load_spec(&cli.shared_params, spec_factory)?; let mut config = service::Configuration::default_with_spec(spec.clone()); - if cli.interactive_password { - config.password = input_keystore_password()?.into() - } + + fill_config_keystore_password(&mut config, &cli)?; config.impl_name = impl_name; config.impl_commit = version.commit; @@ -401,7 +683,9 @@ where let base_path = base_path(&cli.shared_params, version); - config.keystore_path = cli.keystore_path.or_else(|| Some(keystore_path(&base_path, config.chain_spec.id()))); + config.keystore_path = cli.keystore_path.unwrap_or_else( + || keystore_path(&base_path, config.chain_spec.id()) + ); config.database_path = db_path(&base_path, config.chain_spec.id()); config.database_cache_size = cli.database_cache_size; @@ -414,10 +698,12 @@ where ), }; + let is_dev = cli.shared_params.dev; + let role = if cli.light { service::Roles::LIGHT - } else if cli.validator || cli.shared_params.dev { + } else if cli.validator || is_dev || cli.keyring.account.is_some() { service::Roles::AUTHORITY } else { service::Roles::FULL @@ -442,10 +728,6 @@ where config.roles = role; config.disable_grandpa = cli.no_grandpa; - config.grandpa_voter = cli.grandpa_voter; - - - let is_dev = cli.shared_params.dev; let client_id = config.client_id(); fill_network_configuration( @@ -457,32 +739,23 @@ where is_dev, )?; - fill_transaction_pool_configuration::( - &mut config, - cli.pool_config, - )?; + fill_transaction_pool_configuration(&mut config, cli.pool_config)?; - if let Some(key) = cli.key { - config.keys.push(key); - } - - if cli.shared_params.dev && cli.keyring.account.is_none() { - config.keys.push("//Alice".into()); - } - - if let Some(account) = cli.keyring.account { - config.keys.push(format!("//{}", account)); - } + config.dev_key_seed = cli.keyring.account + .map(|a| format!("//{}", a)).or_else(|| { + if is_dev { + Some("//Alice".into()) + } else { + None + } + }); let rpc_interface: &str = if cli.rpc_external { "0.0.0.0" } else { "127.0.0.1" }; let ws_interface: &str = if cli.ws_external { "0.0.0.0" } else { "127.0.0.1" }; - config.rpc_http = Some( - parse_address(&format!("{}:{}", rpc_interface, 9933), cli.rpc_port)? - ); - config.rpc_ws = Some( - parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)? - ); + config.rpc_http = Some(parse_address(&format!("{}:{}", rpc_interface, 9933), cli.rpc_port)?); + config.rpc_ws = Some(parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)?); + config.rpc_ws_max_connections = cli.ws_max_connections; config.rpc_cors = cli.rpc_cors.unwrap_or_else(|| if is_dev { log::warn!("Running in --dev mode, RPC CORS has been disabled."); @@ -511,26 +784,6 @@ where Ok(config) } -fn run_node( - cli: MergeParameters, - spec_factory: S, - exit: E, - run_service: RS, - impl_name: &'static str, - version: &VersionInfo, -) -> error::Result<()> -where - RP: StructOpt + Clone, - F: ServiceFactory, - E: IntoExit, - S: FnOnce(&str) -> Result>>, String>, - RS: FnOnce(E, RunCmd, RP, FactoryFullConfiguration) -> Result<(), String>, - { - let config = create_run_node_config::(cli.left.clone(), spec_factory, impl_name, version)?; - - run_service(exit, cli.left, cli.right, config).map_err(Into::into) -} - // // IANA unassigned port ranges that we could use: // 6717-6766 Unassigned @@ -539,13 +792,13 @@ where // 9803-9874 Unassigned // 9926-9949 Unassigned -fn with_default_boot_node( - spec: &mut ChainSpec>, +fn with_default_boot_node( + spec: &mut ChainSpec, cli: BuildSpecCmd, version: &VersionInfo, ) -> error::Result<()> where - F: ServiceFactory + G: RuntimeGenesis { if spec.boot_nodes().is_empty() { let base_path = base_path(&cli.shared_params, version); @@ -563,33 +816,14 @@ where Ok(()) } -fn build_spec( - cli: BuildSpecCmd, - spec_factory: S, - version: &VersionInfo, -) -> error::Result<()> -where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, -{ - info!("Building chain spec"); - let raw_output = cli.raw; - let mut spec = load_spec(&cli.shared_params, spec_factory)?; - with_default_boot_node::(&mut spec, cli, version)?; - let json = service::chain_ops::build_spec::>(spec, raw_output)?; - - print!("{}", json); - - Ok(()) -} - /// Creates a configuration including the database path. -pub fn create_config_with_db_path( +pub fn create_config_with_db_path( spec_factory: S, cli: &SharedParams, version: &VersionInfo, -) -> error::Result> +) -> error::Result> where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, + C: Default, + G: RuntimeGenesis, + S: FnOnce(&str) -> Result>, String>, { let spec = load_spec(cli, spec_factory)?; let base_path = base_path(cli, version); @@ -600,112 +834,10 @@ where Ok(config) } -fn export_blocks( - cli: ExportBlocksCmd, - spec_factory: S, - exit: E, - version: &VersionInfo, -) -> error::Result<()> -where - F: ServiceFactory, - E: IntoExit, - S: FnOnce(&str) -> Result>>, String>, -{ - let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; - - info!("DB path: {}", config.database_path.display()); - let from = cli.from.unwrap_or(1); - let to = cli.to; - let json = cli.json; - - let file: Box = match cli.output { - Some(filename) => Box::new(File::create(filename)?), - None => Box::new(stdout()), - }; - - service::chain_ops::export_blocks::( - config, exit.into_exit(), file, from.into(), to.map(Into::into), json - ).map_err(Into::into) -} - -fn import_blocks( - cli: ImportBlocksCmd, - spec_factory: S, - exit: E, - version: &VersionInfo, -) -> error::Result<()> -where - F: ServiceFactory, - E: IntoExit, - S: FnOnce(&str) -> Result>>, String>, -{ - let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; - - let file: Box = match cli.input { - Some(filename) => Box::new(File::open(filename)?), - None => Box::new(stdin()), - }; - - let fut = service::chain_ops::import_blocks::(config, exit.into_exit(), file)?; - tokio::run(fut); - Ok(()) -} - -fn revert_chain( - cli: RevertCmd, - spec_factory: S, - version: &VersionInfo, -) -> error::Result<()> -where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, -{ - let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; - let blocks = cli.num; - Ok(service::chain_ops::revert_chain::(config, blocks.into())?) -} - -fn purge_chain( - cli: PurgeChainCmd, - spec_factory: S, - version: &VersionInfo, -) -> error::Result<()> -where - F: ServiceFactory, - S: FnOnce(&str) -> Result>>, String>, -{ - let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; - let db_path = config.database_path; - - if cli.yes == false { - print!("Are you sure to remove {:?}? (y/n)", &db_path); - stdout().flush().expect("failed to flush stdout"); - - let mut input = String::new(); - stdin().read_line(&mut input)?; - let input = input.trim(); - - match input.chars().nth(0) { - Some('y') | Some('Y') => {}, - _ => { - println!("Aborted"); - return Ok(()); - }, - } - } +/// Internal trait used to cast to a dynamic type that implements Read and Seek. +trait ReadPlusSeek: Read + Seek {} - match fs::remove_dir_all(&db_path) { - Result::Ok(_) => { - println!("{:?} removed.", &db_path); - Ok(()) - }, - Result::Err(ref err) if err.kind() == ErrorKind::NotFound => { - println!("{:?} did not exist.", &db_path); - Ok(()) - }, - Result::Err(err) => Result::Err(err.into()) - } -} +impl ReadPlusSeek for T {} fn parse_address( address: &str, diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 78899ccd4cb010b6dc293fa0844738ecd48d23a1..b17fc114c4f07fbeaa8b30fbe372f7bb13fad287 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -20,6 +20,8 @@ use std::path::PathBuf; use structopt::{StructOpt, clap::{arg_enum, _clap_count_exprs, App, AppSettings, SubCommand, Arg}}; use client; +pub use crate::execution_strategy::ExecutionStrategy; + /// Auxiliary macro to implement `GetLogFilter` for all types that have the `shared_params` field. macro_rules! impl_get_log_filter { ( $type:ident ) => { @@ -31,17 +33,6 @@ macro_rules! impl_get_log_filter { } } -arg_enum! { - /// How to execute blocks - #[derive(Debug, Clone, Copy)] - pub enum ExecutionStrategy { - Native, - Wasm, - Both, - NativeElseWasm, - } -} - impl Into for ExecutionStrategy { fn into(self) -> client::ExecutionStrategy { match self { @@ -54,7 +45,8 @@ impl Into for ExecutionStrategy { } arg_enum! { - /// How to execute blocks + /// Whether off-chain workers are enabled. + #[allow(missing_docs)] #[derive(Debug, Clone)] pub enum OffchainWorkerEnabled { Always, @@ -305,27 +297,14 @@ pub struct ExecutionStrategies { /// The `run` command used to run a node. #[derive(Debug, StructOpt, Clone)] pub struct RunCmd { - /// Specify custom keystore path - #[structopt(long = "keystore-path", value_name = "PATH", parse(from_os_str))] - pub keystore_path: Option, - - /// Specify additional key seed - #[structopt(long = "key", value_name = "STRING")] - pub key: Option, - /// Enable validator mode #[structopt(long = "validator")] pub validator: bool, - /// Disable GRANDPA when running in validator mode + /// Disable GRANDPA voter when running in validator mode, otherwise disables the GRANDPA observer #[structopt(long = "no-grandpa")] pub no_grandpa: bool, - /// Run GRANDPA voter even when no additional key seed via `--key` is specified. This can for example be of interest - /// when running a sentry node in front of a validator, thus needing to forward GRANDPA gossip messages. - #[structopt(long = "grandpa-voter")] - pub grandpa_voter: bool, - /// Experimental: Run in light client mode #[structopt(long = "light")] pub light: bool, @@ -421,9 +400,32 @@ pub struct RunCmd { #[structopt(long = "force-authoring")] pub force_authoring: bool, - /// Interactive password for validator key. - #[structopt(short = "i")] - pub interactive_password: bool, + /// Specify custom keystore path. + #[structopt(long = "keystore-path", value_name = "PATH", parse(from_os_str))] + pub keystore_path: Option, + + /// Use interactive shell for entering the password used by the keystore. + #[structopt( + long = "password-interactive", + raw(conflicts_with_all = "&[ \"password\", \"password_filename\" ]") + )] + pub password_interactive: bool, + + /// Password used by the keystore. + #[structopt( + long = "password", + raw(conflicts_with_all = "&[ \"password_interactive\", \"password_filename\" ]") + )] + pub password: Option, + + /// File that contains the password used by the keystore. + #[structopt( + long = "password-filename", + value_name = "PATH", + parse(from_os_str), + raw(conflicts_with_all = "&[ \"password_interactive\", \"password\" ]") + )] + pub password_filename: Option } /// Stores all required Cli values for a keyring test account. @@ -431,18 +433,18 @@ struct KeyringTestAccountCliValues { help: String, conflicts_with: Vec, name: String, - variant: keyring::AuthorityKeyring, + variant: keyring::Sr25519Keyring, } lazy_static::lazy_static! { /// The Cli values for all test accounts. static ref TEST_ACCOUNTS_CLI_VALUES: Vec = { - keyring::AuthorityKeyring::iter().map(|a| { + keyring::Sr25519Keyring::iter().map(|a| { let help = format!("Shortcut for `--key //{} --name {}`.", a, a); - let conflicts_with = keyring::AuthorityKeyring::iter() + let conflicts_with = keyring::Sr25519Keyring::iter() .filter(|b| a != *b) .map(|b| b.to_string().to_lowercase()) - .chain(["name", "key"].iter().map(ToString::to_string)) + .chain(std::iter::once("name".to_string())) .collect::>(); let name = a.to_string().to_lowercase(); @@ -459,7 +461,7 @@ lazy_static::lazy_static! { /// Wrapper for exposing the keyring test accounts into the Cli. #[derive(Debug, Clone)] pub struct Keyring { - pub account: Option, + pub account: Option, } impl StructOpt for Keyring { @@ -610,6 +612,18 @@ pub struct ImportBlocksCmd { #[allow(missing_docs)] #[structopt(flatten)] pub shared_params: SharedParams, + + /// The means of execution used when calling into the runtime while importing blocks. + #[structopt( + long = "execution", + value_name = "STRATEGY", + raw( + possible_values = "&ExecutionStrategy::variants()", + case_insensitive = "true", + default_value = r#""NativeElseWasm""# + ) + )] + pub execution: ExecutionStrategy, } impl_get_log_filter!(ImportBlocksCmd); diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index f140b2f343f740721f2c427986ad4e6c24713e08..d917427a509f1cb3ba54038e2625db6ffa138d8a 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -8,26 +8,27 @@ edition = "2018" derive_more = { version = "0.14.0", optional = true } fnv = { version = "1.0", optional = true } log = { version = "0.4", optional = true } -parking_lot = { version = "0.8.0", optional = true } +parking_lot = { version = "0.9.0", optional = true } hex = { package = "hex-literal", version = "0.2", optional = true } -futures-preview = { version = "0.3.0-alpha.17", optional = true } +futures-preview = { version = "=0.3.0-alpha.17", optional = true } consensus = { package = "substrate-consensus-common", path = "../consensus/common", optional = true } executor = { package = "substrate-executor", path = "../executor", optional = true } state-machine = { package = "substrate-state-machine", path = "../state-machine", optional = true } keyring = { package = "substrate-keyring", path = "../keyring", optional = true } trie = { package = "substrate-trie", path = "../trie", optional = true } substrate-telemetry = { path = "../telemetry", optional = true } -hash-db = { version = "0.14.0", default-features = false } +hash-db = { version = "0.15.0", default-features = false } kvdb = { git = "https://github.com/paritytech/parity-common", optional = true, rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } -runtime-primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } +sr-primitives = { path = "../sr-primitives", default-features = false } runtime-version = { package = "sr-version", path = "../sr-version", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } inherents = { package = "substrate-inherents", path = "../inherents", default-features = false } sr-api-macros = { path = "../sr-api-macros" } [dev-dependencies] +env_logger = "0.6" test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } @@ -35,10 +36,10 @@ kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b031 default = ["std"] std = [ "rstd/std", - "parity-codec/std", + "codec/std", "primitives/std", "inherents/std", - "runtime-primitives/std", + "sr-primitives/std", "runtime-version/std", "hash-db/std", "consensus", diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 899c85998a55447f772a23e11c7453addc5971ba..b7bc835ef012a6494168a5e22849ad4955546d58 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -5,19 +5,19 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.8" +parking_lot = "0.9.0" log = "0.4" kvdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } # FIXME replace with release as soon as our rocksdb changes are released upstream https://github.com/paritytech/parity-common/issues/88 kvdb-rocksdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d", optional = true } kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } linked-hash-map = "0.5" -hash-db = { version = "0.14.0" } +hash-db = { version = "0.15.0" } primitives = { package = "substrate-primitives", path = "../../primitives" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } client = { package = "substrate-client", path = "../../client" } state-machine = { package = "substrate-state-machine", path = "../../state-machine" } -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } executor = { package = "substrate-executor", path = "../../executor" } state_db = { package = "substrate-state-db", path = "../../state-db" } trie = { package = "substrate-trie", path = "../../trie" } diff --git a/core/client/db/src/cache/list_cache.rs b/core/client/db/src/cache/list_cache.rs index 727375244d6cee12f2386683a2c13eefcc0132ad..9e54fdbb62e142a4b0a13b6f7e49147b242fcc94 100644 --- a/core/client/db/src/cache/list_cache.rs +++ b/core/client/db/src/cache/list_cache.rs @@ -44,7 +44,7 @@ use std::collections::BTreeSet; use log::warn; use client::error::{Error as ClientError, Result as ClientResult}; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Block as BlockT, NumberFor, Zero, Bounded, CheckedSub }; @@ -544,7 +544,7 @@ pub fn destroy_fork, Tx: Stor /// Blockchain related functions. mod chain { - use runtime_primitives::traits::Header as HeaderT; + use sr_primitives::traits::Header as HeaderT; use super::*; /// Is the block1 connected both ends of the range. @@ -618,8 +618,8 @@ fn read_forks>( #[cfg(test)] pub mod tests { use test_client::runtime::H256; - use runtime_primitives::testing::{Header, Block as RawBlock, ExtrinsicWrapper}; - use runtime_primitives::traits::Header as HeaderT; + use sr_primitives::testing::{Header, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::traits::Header as HeaderT; use crate::cache::list_storage::tests::{DummyStorage, FaultyStorage, DummyTransaction}; use super::*; diff --git a/core/client/db/src/cache/list_entry.rs b/core/client/db/src/cache/list_entry.rs index 3305b909d2b2ce088ffd1cf8c10c7f0e987f2469..6de369ecf56d2864f52e930d0b9b9a0ff1bbb38e 100644 --- a/core/client/db/src/cache/list_entry.rs +++ b/core/client/db/src/cache/list_entry.rs @@ -17,8 +17,8 @@ //! List-cache storage entries. use client::error::Result as ClientResult; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; -use parity_codec::{Encode, Decode}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; +use codec::{Encode, Decode}; use crate::cache::{CacheItemT, ComplexBlockId}; use crate::cache::list_storage::{Storage}; diff --git a/core/client/db/src/cache/list_storage.rs b/core/client/db/src/cache/list_storage.rs index af0b74066c213dc93064a966342c677367568046..a7bfc4dd5856f63934409f6b0abf631e582d8a62 100644 --- a/core/client/db/src/cache/list_storage.rs +++ b/core/client/db/src/cache/list_storage.rs @@ -21,9 +21,9 @@ use std::sync::Arc; use kvdb::{KeyValueDB, DBTransaction}; use client::error::{Error as ClientError, Result as ClientResult}; -use parity_codec::{Encode, Decode}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use codec::{Encode, Decode}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; use crate::utils::{self, db_err, meta_keys}; use crate::cache::{CacheItemT, ComplexBlockId}; @@ -151,7 +151,7 @@ impl Storage for DbStorage { .map_err(db_err) .and_then(|entry| match entry { Some(entry) => StorageEntry::::decode(&mut &entry[..]) - .ok_or_else(|| ClientError::Backend("Failed to decode cache entry".into())) + .map_err(|_| ClientError::Backend("Failed to decode cache entry".into())) .map(Some), None => Ok(None), }) @@ -236,9 +236,9 @@ mod meta { pub fn decode(encoded: &[u8]) -> ClientResult> { let input = &mut &*encoded; let finalized: Option> = Decode::decode(input) - .ok_or_else(|| ClientError::from(ClientError::Backend("Error decoding cache meta".into())))?; + .map_err(|_| ClientError::from(ClientError::Backend("Error decoding cache meta".into())))?; let unfinalized: Vec> = Decode::decode(input) - .ok_or_else(|| ClientError::from(ClientError::Backend("Error decoding cache meta".into())))?; + .map_err(|_| ClientError::from(ClientError::Backend("Error decoding cache meta".into())))?; Ok(Metadata { finalized, unfinalized }) } diff --git a/core/client/db/src/cache/mod.rs b/core/client/db/src/cache/mod.rs index 1c112c9036f8272df799f685dcd1af927c1bd24a..4d452b37d965d281546bb3a34fff329356edbe5d 100644 --- a/core/client/db/src/cache/mod.rs +++ b/core/client/db/src/cache/mod.rs @@ -23,9 +23,9 @@ use kvdb::{KeyValueDB, DBTransaction}; use client::blockchain::Cache as BlockchainCache; use client::error::Result as ClientResult; -use parity_codec::{Encode, Decode}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; +use codec::{Encode, Decode}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; use consensus_common::well_known_cache_keys::Id as CacheKeyId; use crate::utils::{self, COLUMN_META, db_err}; diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index eebd69d88dd2abdbd50f61ff10bcd352584f9b23..927359ecdf70e9648c44c96f5863d5561c7825df 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -42,18 +42,18 @@ use client::backend::NewBlockState; use client::blockchain::HeaderBackend; use client::ExecutionStrategies; use client::backend::{StorageCollection, ChildStorageCollection}; -use parity_codec::{Decode, Encode}; -use hash_db::Hasher; +use codec::{Decode, Encode}; +use hash_db::{Hasher, Prefix}; use kvdb::{KeyValueDB, DBTransaction}; use trie::{MemoryDB, PrefixedMemoryDB, prefixed_key}; use parking_lot::{Mutex, RwLock}; use primitives::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash}; use primitives::storage::well_known_keys; -use runtime_primitives::{ +use sr_primitives::{ generic::{BlockId, DigestItem}, Justification, StorageOverlay, ChildrenStorageOverlay, BuildStorage }; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, NumberFor, Zero, One, SaturatedConversion }; use state_machine::backend::Backend as StateBackend; @@ -92,9 +92,6 @@ pub struct RefTrackingState { impl RefTrackingState { fn new(state: DbState, storage: Arc>, parent_hash: Option) -> RefTrackingState { - if let Some(hash) = &parent_hash { - storage.state_db.pin(hash); - } RefTrackingState { state, parent_hash, @@ -144,6 +141,10 @@ impl StateBackend for RefTrackingState { self.state.for_keys_in_child_storage(storage_key, f) } + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + self.state.for_child_keys_with_prefix(storage_key, prefix, f) + } + fn storage_root(&self, delta: I) -> (H256, Self::Transaction) where I: IntoIterator, Option>)> @@ -195,6 +196,7 @@ pub fn new_client( executor: E, genesis_storage: S, execution_strategies: ExecutionStrategies, + keystore: Option, ) -> Result< client::Client, client::LocalCallExecutor, E>, Block, RA>, client::error::Error @@ -205,7 +207,7 @@ pub fn new_client( S: BuildStorage, { let backend = Arc::new(Backend::new(settings, CANONICALIZATION_DELAY)?); - let executor = client::LocalCallExecutor::new(backend.clone(), executor); + let executor = client::LocalCallExecutor::new(backend.clone(), executor, keystore); Ok(client::Client::new(backend, executor, genesis_storage, execution_strategies)?) } @@ -338,8 +340,10 @@ impl client::blockchain::Backend for BlockchainDb { fn body(&self, id: BlockId) -> Result>, client::error::Error> { match read_db(&*self.db, columns::KEY_LOOKUP, columns::BODY, id)? { Some(body) => match Decode::decode(&mut &body[..]) { - Some(body) => Ok(Some(body)), - None => return Err(client::error::Error::Backend("Error decoding body".into())), + Ok(body) => Ok(Some(body)), + Err(err) => return Err(client::error::Error::Backend( + format!("Error decoding body: {}", err) + )), } None => Ok(None), } @@ -348,8 +352,10 @@ impl client::blockchain::Backend for BlockchainDb { fn justification(&self, id: BlockId) -> Result, client::error::Error> { match read_db(&*self.db, columns::KEY_LOOKUP, columns::JUSTIFICATION, id)? { Some(justification) => match Decode::decode(&mut &justification[..]) { - Some(justification) => Ok(Some(justification)), - None => return Err(client::error::Error::Backend("Error decoding justification".into())), + Ok(justification) => Ok(Some(justification)), + Err(err) => return Err(client::error::Error::Backend( + format!("Error decoding justification: {}", err) + )), } None => Ok(None), } @@ -507,7 +513,7 @@ struct StorageDb { } impl state_machine::Storage for StorageDb { - fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H256, prefix: Prefix) -> Result, String> { let key = prefixed_key::(key, prefix); self.state_db.get(&key, self).map(|r| r.map(|v| DBValue::from_slice(&v))) .map_err(|e| format!("Database backend error: {:?}", e)) @@ -535,7 +541,7 @@ impl DbGenesisStorage { } impl state_machine::Storage for DbGenesisStorage { - fn get(&self, _key: &H256, _prefix: &[u8]) -> Result, String> { + fn get(&self, _key: &H256, _prefix: Prefix) -> Result, String> { Ok(None) } } @@ -675,7 +681,7 @@ impl state_machine::ChangesTrieStorage> where Block: BlockT, { - fn get(&self, key: &H256, _prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H256, _prefix: Prefix) -> Result, String> { self.db.get(columns::CHANGES_TRIE, &key[..]) .map_err(|err| format!("{}", err)) } @@ -838,7 +844,7 @@ impl> Backend { let changes_trie_config = self .state_at(BlockId::Hash(block))? .storage(well_known_keys::CHANGES_TRIE_CONFIG)? - .and_then(|v| Decode::decode(&mut &*v)); + .and_then(|v| Decode::decode(&mut &*v).ok()); *cached_changes_trie_config = Some(changes_trie_config.clone()); Ok(changes_trie_config) }, @@ -883,7 +889,7 @@ impl> Backend { transaction, columns::KEY_LOOKUP, r.number - ); + )?; } // canonicalize: set the number lookup to map to this block's hash. @@ -894,18 +900,18 @@ impl> Backend { columns::KEY_LOOKUP, e.number, e.hash - ); + )?; } } - let lookup_key = utils::number_and_hash_to_lookup_key(best_to.0, &best_to.1); + let lookup_key = utils::number_and_hash_to_lookup_key(best_to.0, &best_to.1)?; transaction.put(columns::META, meta_keys::BEST_BLOCK, &lookup_key); utils::insert_number_to_key_mapping( transaction, columns::KEY_LOOKUP, best_to.0, best_to.1, - ); + )?; Ok((enacted, retracted)) } @@ -946,7 +952,7 @@ impl> Backend { if let Some(justification) = justification { transaction.put( columns::JUSTIFICATION, - &utils::number_and_hash_to_lookup_key(number, hash), + &utils::number_and_hash_to_lookup_key(number, hash)?, &justification.encode(), ); } @@ -1021,7 +1027,7 @@ impl> Backend { let number = pending_block.header.number().clone(); // blocks are keyed by number + hash. - let lookup_key = utils::number_and_hash_to_lookup_key(number, hash); + let lookup_key = utils::number_and_hash_to_lookup_key(number, hash)?; let (enacted, retracted) = if pending_block.leaf_state.is_best() { self.set_head_with_transaction(&mut transaction, parent_hash, (number, hash))? @@ -1034,7 +1040,7 @@ impl> Backend { columns::KEY_LOOKUP, number, hash, - ); + )?; transaction.put(columns::HEADER, &lookup_key, &pending_block.header.encode()); if let Some(body) = pending_block.body { @@ -1108,21 +1114,24 @@ impl> Backend { None }; - if let Some(set_head) = operation.set_head { + let cache_update = if let Some(set_head) = operation.set_head { if let Some(header) = ::client::blockchain::HeaderBackend::header(&self.blockchain, set_head)? { let number = header.number(); let hash = header.hash(); - self.set_head_with_transaction( + let (enacted, retracted) = self.set_head_with_transaction( &mut transaction, hash.clone(), (number.clone(), hash.clone()) )?; meta_updates.push((hash, *number, true, false)); + Some((enacted, retracted)) } else { return Err(client::error::Error::UnknownBlock(format!("Cannot set head {:?}", set_head))) } - } + } else { + None + }; let write_result = self.storage.db.write(transaction).map_err(db_err); @@ -1152,6 +1161,10 @@ impl> Backend { ); } + if let Some((enacted, retracted)) = cache_update { + self.shared_cache.lock().sync(&enacted, &retracted); + } + for (hash, number, is_best, is_finalized) in meta_updates { self.blockchain.update_meta(hash, number, is_best, is_finalized); } @@ -1177,7 +1190,7 @@ impl> Backend { if self.storage.state_db.best_canonical().map(|c| f_num.saturated_into::() > c).unwrap_or(true) { let parent_hash = f_header.parent_hash().clone(); - let lookup_key = utils::number_and_hash_to_lookup_key(f_num, f_hash.clone()); + let lookup_key = utils::number_and_hash_to_lookup_key(f_num, f_hash.clone())?; transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); let commit = self.storage.state_db.canonicalize_block(&f_hash) @@ -1344,7 +1357,7 @@ impl client::backend::Backend for Backend whe let hash = self.blockchain.hash(best)?.ok_or_else( || client::error::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; - let key = utils::number_and_hash_to_lookup_key(best.clone(), &hash); + let key = utils::number_and_hash_to_lookup_key(best.clone(), &hash)?; transaction.put(columns::META, meta_keys::BEST_BLOCK, &key); transaction.delete(columns::KEY_LOOKUP, removed.hash().as_ref()); children::remove_children(&mut transaction, columns::META, meta_keys::CHILDREN_PREFIX, hash); @@ -1385,7 +1398,7 @@ impl client::backend::Backend for Backend whe match self.blockchain.header(block) { Ok(Some(ref hdr)) => { let hash = hdr.hash(); - if !self.storage.state_db.is_pruned(&hash, (*hdr.number()).saturated_into::()) { + if let Ok(()) = self.storage.state_db.pin(&hash) { let root = H256::from_slice(hdr.state_root().as_ref()); let db_state = DbState::new(self.storage.clone(), root); let state = RefTrackingState::new(db_state, self.storage.clone(), Some(hash.clone())); @@ -1421,14 +1434,14 @@ where Block: BlockT {} #[cfg(test)] mod tests { - use hash_db::HashDB; + use hash_db::{HashDB, EMPTY_PREFIX}; use super::*; use crate::columns; use client::backend::Backend as BTrait; use client::blockchain::Backend as BLBTrait; use client::backend::BlockImportOperation as Op; - use runtime_primitives::testing::{Header, Block as RawBlock, ExtrinsicWrapper}; - use runtime_primitives::traits::{Hash, BlakeTwo256}; + use sr_primitives::testing::{Header, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::traits::{Hash, BlakeTwo256}; use state_machine::{TrieMut, TrieDBMut, ChangesTrieRootsStorage, ChangesTrieStorage}; use test_client; @@ -1457,7 +1470,7 @@ mod tests { changes: Vec<(Vec, Vec)>, extrinsics_root: H256, ) -> H256 { - use runtime_primitives::testing::Digest; + use sr_primitives::testing::Digest; let (changes_root, changes_trie_update) = prepare_changes(changes); let digest = Digest { @@ -1647,7 +1660,7 @@ mod tests { op.reset_storage(storage.iter().cloned().collect(), Default::default()).unwrap(); - key = op.db_updates.insert(&[], b"hello"); + key = op.db_updates.insert(EMPTY_PREFIX, b"hello"); op.set_block_data( header, Some(vec![]), @@ -1656,8 +1669,10 @@ mod tests { ).unwrap(); backend.commit_operation(op).unwrap(); - - assert_eq!(backend.storage.db.get(columns::STATE, key.as_bytes()).unwrap().unwrap(), &b"hello"[..]); + assert_eq!(backend.storage.db.get( + columns::STATE, + &trie::prefixed_key::(&key, EMPTY_PREFIX) + ).unwrap().unwrap(), &b"hello"[..]); hash }; @@ -1681,8 +1696,8 @@ mod tests { ).0.into(); let hash = header.hash(); - op.db_updates.insert(&[], b"hello"); - op.db_updates.remove(&key, &[]); + op.db_updates.insert(EMPTY_PREFIX, b"hello"); + op.db_updates.remove(&key, EMPTY_PREFIX); op.set_block_data( header, Some(vec![]), @@ -1691,8 +1706,10 @@ mod tests { ).unwrap(); backend.commit_operation(op).unwrap(); - - assert_eq!(backend.storage.db.get(columns::STATE, key.as_bytes()).unwrap().unwrap(), &b"hello"[..]); + assert_eq!(backend.storage.db.get( + columns::STATE, + &trie::prefixed_key::(&key, EMPTY_PREFIX) + ).unwrap().unwrap(), &b"hello"[..]); hash }; @@ -1716,7 +1733,7 @@ mod tests { ).0.into(); let hash = header.hash(); - op.db_updates.remove(&key, &[]); + op.db_updates.remove(&key, EMPTY_PREFIX); op.set_block_data( header, Some(vec![]), @@ -1726,7 +1743,11 @@ mod tests { backend.commit_operation(op).unwrap(); - assert!(backend.storage.db.get(columns::STATE, key.as_bytes()).unwrap().is_some()); + + assert!(backend.storage.db.get( + columns::STATE, + &trie::prefixed_key::(&key, EMPTY_PREFIX) + ).unwrap().is_some()); hash }; @@ -1757,14 +1778,19 @@ mod tests { ).unwrap(); backend.commit_operation(op).unwrap(); - - assert!(backend.storage.db.get(columns::STATE, key.as_bytes()).unwrap().is_none()); + assert!(backend.storage.db.get( + columns::STATE, + &trie::prefixed_key::(&key, EMPTY_PREFIX) + ).unwrap().is_none()); } backend.finalize_block(BlockId::Number(1), None).unwrap(); backend.finalize_block(BlockId::Number(2), None).unwrap(); backend.finalize_block(BlockId::Number(3), None).unwrap(); - assert!(backend.storage.db.get(columns::STATE, key.as_bytes()).unwrap().is_none()); + assert!(backend.storage.db.get( + columns::STATE, + &trie::prefixed_key::(&key, EMPTY_PREFIX) + ).unwrap().is_none()); } #[test] @@ -1782,7 +1808,7 @@ mod tests { assert_eq!(backend.changes_tries_storage.root(&anchor, block), Ok(Some(changes_root))); for (key, (val, _)) in changes_trie_update.drain() { - assert_eq!(backend.changes_trie_storage().unwrap().get(&key, &[]), Ok(Some(val))); + assert_eq!(backend.changes_trie_storage().unwrap().get(&key, EMPTY_PREFIX), Ok(Some(val))); } }; @@ -1908,23 +1934,23 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(&config, &mut tx, Default::default(), 12); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root1, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root3, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root4, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root5, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root6, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root7, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root8, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root1, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root2, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root3, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root4, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root5, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root6, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root7, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root8, EMPTY_PREFIX).unwrap().is_some()); // now simulate finalization of block#16, causing prune of tries at #5..#8 let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(&config, &mut tx, Default::default(), 16); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root5, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root6, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root7, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root8, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root5, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root6, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root7, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root8, EMPTY_PREFIX).unwrap().is_none()); // now "change" pruning mode to archive && simulate finalization of block#20 // => no changes tries are pruned, because we never prune in archive mode @@ -1932,10 +1958,10 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(&config, &mut tx, Default::default(), 20); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root9, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root10, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root11, &[]).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root12, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root9, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root10, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root11, EMPTY_PREFIX).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root12, EMPTY_PREFIX).unwrap().is_some()); } #[test] @@ -1974,15 +2000,15 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(&config, &mut tx, block5, 5); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root1, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root1, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root2, EMPTY_PREFIX).unwrap().is_some()); // now simulate finalization of block#6, causing prune of tries at #2 let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(&config, &mut tx, block6, 6); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root3, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root2, EMPTY_PREFIX).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root3, EMPTY_PREFIX).unwrap().is_some()); } #[test] diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index 7d2f1e62d311f9ad89b942b3ff6e311b2c7f4208..3e60e9e7a1c41a9f492fbd9ec2fcaa31aa352e28 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -26,13 +26,12 @@ use client::backend::{AuxStore, NewBlockState}; use client::blockchain::{BlockStatus, Cache as BlockchainCache, HeaderBackend as BlockchainHeaderBackend, Info as BlockchainInfo}; use client::cht; -use client::leaves::{LeafSet, FinalizationDisplaced}; use client::error::{Error as ClientError, Result as ClientResult}; use client::light::blockchain::Storage as LightBlockchainStorage; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use primitives::Blake2Hasher; -use runtime_primitives::generic::{DigestItem, BlockId}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor}; +use sr_primitives::generic::{DigestItem, BlockId}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor}; use consensus_common::well_known_cache_keys; use crate::cache::{DbCacheSync, DbCache, ComplexBlockId, EntryType as CacheEntryType}; use crate::utils::{self, meta_keys, Meta, db_err, read_db, block_id_to_lookup_key, read_meta}; @@ -54,11 +53,10 @@ const HEADER_CHT_PREFIX: u8 = 0; const CHANGES_TRIE_CHT_PREFIX: u8 = 1; /// Light blockchain storage. Stores most recent headers + CHTs for older headers. -/// Locks order: meta, leaves, cache. +/// Locks order: meta, cache. pub struct LightStorage { db: Arc, meta: RwLock, Block::Hash>>, - leaves: RwLock>>, cache: Arc>, } @@ -96,7 +94,6 @@ impl LightStorage fn from_kvdb(db: Arc) -> ClientResult { let meta = read_meta::(&*db, columns::META, columns::HEADER)?; - let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?; let cache = DbCache::new( db.clone(), columns::KEY_LOOKUP, @@ -110,7 +107,6 @@ impl LightStorage db, meta: RwLock::new(meta), cache: Arc::new(DbCacheSync(RwLock::new(cache))), - leaves: RwLock::new(leaves), }) } @@ -211,7 +207,7 @@ impl LightStorage { /// should be the parent of `best_to`. In the case where we set an existing block /// to be best, `route_to` should equal to `best_to`. fn set_head_with_transaction(&self, transaction: &mut DBTransaction, route_to: Block::Hash, best_to: (NumberFor, Block::Hash)) -> Result<(), client::error::Error> { - let lookup_key = utils::number_and_hash_to_lookup_key(best_to.0, &best_to.1); + let lookup_key = utils::number_and_hash_to_lookup_key(best_to.0, &best_to.1)?; // handle reorg. let meta = self.meta.read(); @@ -234,7 +230,7 @@ impl LightStorage { transaction, columns::KEY_LOOKUP, retracted.number - ); + )?; } for enacted in tree_route.enacted() { @@ -243,7 +239,7 @@ impl LightStorage { columns::KEY_LOOKUP, enacted.number, enacted.hash - ); + )?; } } @@ -253,7 +249,7 @@ impl LightStorage { columns::KEY_LOOKUP, best_to.0, best_to.1, - ); + )?; Ok(()) } @@ -264,7 +260,6 @@ impl LightStorage { transaction: &mut DBTransaction, header: &Block::Header, hash: Block::Hash, - displaced: &mut Option>>, ) -> ClientResult<()> { let meta = self.meta.read(); if &meta.finalized_hash != header.parent_hash() { @@ -274,7 +269,7 @@ impl LightStorage { ).into()) } - let lookup_key = utils::number_and_hash_to_lookup_key(header.number().clone(), hash); + let lookup_key = utils::number_and_hash_to_lookup_key(header.number().clone(), hash)?; transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); // build new CHT(s) if required @@ -293,7 +288,7 @@ impl LightStorage { )?; transaction.put( columns::CHT, - &cht_key(HEADER_CHT_PREFIX, new_cht_start), + &cht_key(HEADER_CHT_PREFIX, new_cht_start)?, new_header_cht_root.as_ref() ); @@ -311,7 +306,7 @@ impl LightStorage { )?; transaction.put( columns::CHT, - &cht_key(CHANGES_TRIE_CHT_PREFIX, new_cht_start), + &cht_key(CHANGES_TRIE_CHT_PREFIX, new_cht_start)?, new_changes_trie_cht_root.as_ref() ); } @@ -331,19 +326,13 @@ impl LightStorage { columns::KEY_LOOKUP, prune_block, hash - ); + )?; transaction.delete(columns::HEADER, &lookup_key); } prune_block += One::one(); } } - let new_displaced = self.leaves.write().finalize_height(header.number().clone()); - match displaced { - x @ &mut None => *x = Some(new_displaced), - &mut Some(ref mut displaced) => displaced.merge(new_displaced), - } - Ok(()) } @@ -358,9 +347,9 @@ impl LightStorage { let cht_number = cht::block_to_cht_number(cht_size, block).ok_or_else(no_cht_for_block)?; let cht_start = cht::start_number(cht_size, cht_number); - self.db.get(columns::CHT, &cht_key(cht_type, cht_start)).map_err(db_err)? + self.db.get(columns::CHT, &cht_key(cht_type, cht_start)?).map_err(db_err)? .ok_or_else(no_cht_for_block) - .and_then(|hash| Block::Hash::decode(&mut &*hash).ok_or_else(no_cht_for_block)) + .and_then(|hash| Block::Hash::decode(&mut &*hash).map_err(|_| no_cht_for_block())) } } @@ -399,7 +388,6 @@ impl LightBlockchainStorage for LightStorage leaf_state: NewBlockState, aux_ops: Vec<(Vec, Option>)>, ) -> ClientResult<()> { - let mut finalization_displaced_leaves = None; let mut transaction = DBTransaction::new(); let hash = header.hash(); @@ -414,7 +402,7 @@ impl LightBlockchainStorage for LightStorage } // blocks are keyed by number + hash. - let lookup_key = utils::number_and_hash_to_lookup_key(number, &hash); + let lookup_key = utils::number_and_hash_to_lookup_key(number, &hash)?; if leaf_state.is_best() { self.set_head_with_transaction(&mut transaction, parent_hash, (number, hash))?; @@ -425,7 +413,7 @@ impl LightBlockchainStorage for LightStorage columns::KEY_LOOKUP, number, hash, - ); + )?; transaction.put(columns::HEADER, &lookup_key, &header.encode()); let is_genesis = number.is_zero(); @@ -445,14 +433,10 @@ impl LightBlockchainStorage for LightStorage &mut transaction, &header, hash, - &mut finalization_displaced_leaves, )?; } { - let mut leaves = self.leaves.write(); - let displaced_leaf = leaves.import(hash, number, parent_hash); - let mut cache = self.cache.0.write(); let cache_ops = cache.transaction(&mut transaction) .on_block_insert( @@ -464,23 +448,7 @@ impl LightBlockchainStorage for LightStorage .into_ops(); debug!("Light DB Commit {:?} ({})", hash, number); - let write_result = self.db.write(transaction).map_err(db_err); - if let Err(e) = write_result { - let mut leaves = self.leaves.write(); - let mut undo = leaves.undo(); - - // revert leaves set update if there was one. - if let Some(displaced_leaf) = displaced_leaf { - undo.undo_import(displaced_leaf); - } - - if let Some(finalization_displaced) = finalization_displaced_leaves { - undo.undo_finalization(finalization_displaced); - } - - return Err(e); - } - + self.db.write(transaction).map_err(db_err)?; cache.commit(cache_ops); } @@ -522,11 +490,10 @@ impl LightBlockchainStorage for LightStorage fn finalize_header(&self, id: BlockId) -> ClientResult<()> { if let Some(header) = self.header(id)? { - let mut displaced = None; let mut transaction = DBTransaction::new(); let hash = header.hash(); let number = *header.number(); - self.note_finalized(&mut transaction, &header, hash.clone(), &mut displaced)?; + self.note_finalized(&mut transaction, &header, hash.clone())?; { let mut cache = self.cache.0.write(); let cache_ops = cache.transaction(&mut transaction) @@ -536,12 +503,7 @@ impl LightBlockchainStorage for LightStorage )? .into_ops(); - if let Err(e) = self.db.write(transaction).map_err(db_err) { - if let Some(displaced) = displaced { - self.leaves.write().undo().undo_finalization(displaced); - } - return Err(e); - } + self.db.write(transaction).map_err(db_err)?; cache.commit(cache_ops); } self.update_meta(hash, header.number().clone(), false, true); @@ -562,17 +524,17 @@ impl LightBlockchainStorage for LightStorage } /// Build the key for inserting header-CHT at given block. -fn cht_key>(cht_type: u8, block: N) -> [u8; 5] { +fn cht_key>(cht_type: u8, block: N) -> ClientResult<[u8; 5]> { let mut key = [cht_type; 5]; - key[1..].copy_from_slice(&utils::number_index_key(block)); - key + key[1..].copy_from_slice(&utils::number_index_key(block)?); + Ok(key) } #[cfg(test)] pub(crate) mod tests { use client::cht; - use runtime_primitives::generic::DigestItem; - use runtime_primitives::testing::{H256 as Hash, Header, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::generic::DigestItem; + use sr_primitives::testing::{H256 as Hash, Header, Block as RawBlock, ExtrinsicWrapper}; use super::*; type Block = RawBlock>; @@ -887,7 +849,8 @@ pub(crate) mod tests { } fn get_authorities(cache: &dyn BlockchainCache, at: BlockId) -> Option> { - cache.get_at(&well_known_cache_keys::AUTHORITIES, &at).and_then(|val| Decode::decode(&mut &val[..])) + cache.get_at(&well_known_cache_keys::AUTHORITIES, &at) + .and_then(|val| Decode::decode(&mut &val[..]).ok()) } let auth1 = || AuthorityId::from_raw([1u8; 32]); @@ -1065,30 +1028,6 @@ pub(crate) mod tests { assert_eq!(db.get_aux(&[3]).unwrap(), Some(vec![103])); } - #[test] - fn test_leaves_pruned_on_finality() { - let db = LightStorage::::new_test(); - let block0 = insert_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); - - let block1_a = insert_block(&db, HashMap::new(), || default_header(&block0, 1)); - let block1_b = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block0, 1, [1; 32].into())); - let block1_c = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block0, 1, [2; 32].into())); - - assert_eq!(db.leaves.read().hashes(), vec![block1_a, block1_b, block1_c]); - - let block2_a = insert_block(&db, HashMap::new(), || default_header(&block1_a, 2)); - let block2_b = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block1_b, 2, [1; 32].into())); - let block2_c = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block1_b, 2, [2; 32].into())); - - assert_eq!(db.leaves.read().hashes(), vec![block2_a, block2_b, block2_c, block1_c]); - - db.finalize_header(BlockId::hash(block1_a)).unwrap(); - db.finalize_header(BlockId::hash(block2_a)).unwrap(); - - // leaves at same height stay. Leaves at lower heights pruned. - assert_eq!(db.leaves.read().hashes(), vec![block2_a, block2_b, block2_c]); - } - #[test] fn cache_can_be_initialized_after_genesis_inserted() { let db = LightStorage::::new_test(); diff --git a/core/client/db/src/offchain.rs b/core/client/db/src/offchain.rs index 3cefdbf47a2888a0b2464e2508a7ea4eab146caf..0640fb6c29bd686711e8da3a563a3b18b754de5a 100644 --- a/core/client/db/src/offchain.rs +++ b/core/client/db/src/offchain.rs @@ -28,7 +28,7 @@ use parking_lot::Mutex; /// Offchain local storage #[derive(Clone)] pub struct LocalStorage { - db: Arc, + db: Arc, locks: Arc, Arc>>>>, } @@ -48,7 +48,7 @@ impl LocalStorage { } /// Create offchain local storage with given `KeyValueDB` backend. - pub fn new(db: Arc) -> Self { + pub fn new(db: Arc) -> Self { Self { db, locks: Default::default(), diff --git a/core/client/db/src/storage_cache.rs b/core/client/db/src/storage_cache.rs index 7df1472ece0387e0cbf22c079a05f9bb1afc10ae..8b3e81212ed0a1d7c8bced455ccb054f3a411bd7 100644 --- a/core/client/db/src/storage_cache.rs +++ b/core/client/db/src/storage_cache.rs @@ -21,7 +21,7 @@ use std::sync::Arc; use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard}; use linked_hash_map::{LinkedHashMap, Entry}; use hash_db::Hasher; -use runtime_primitives::traits::{Block as BlockT, Header}; +use sr_primitives::traits::{Block as BlockT, Header}; use state_machine::{backend::Backend as StateBackend, TrieBackend}; use log::trace; use super::{StorageCollection, ChildStorageCollection}; @@ -105,7 +105,7 @@ impl LRUMap { // TODO assert k v size fit into limit?? to avoid insert remove? match lmap.entry(k) { Entry::Occupied(mut entry) => { - // note that in this case we are not running pure lru as + // note that in this case we are not running pure lru as // it would require to remove first *storage_used_size -= entry.get().estimate_size(); entry.insert(v); @@ -143,7 +143,7 @@ impl LRUMap { } } - + impl Cache { /// Returns the used memory size of the storage cache in bytes. pub fn used_storage_cache_size(&self) -> usize { @@ -151,6 +151,65 @@ impl Cache { + self.lru_child_storage.used_size() // ignore small hashes storage and self.lru_hashes.used_size() } + + /// Synchronize the shared cache with the best block state. + /// This function updates the shared cache by removing entries + /// that are invalidated by chain reorganization. It should be + /// be called when chain reorg happens without importing a new block. + pub fn sync(&mut self, enacted: &[B::Hash], retracted: &[B::Hash]) { + trace!("Syncing shared cache, enacted = {:?}, retracted = {:?}", enacted, retracted); + + // Purge changes from re-enacted and retracted blocks. + // Filter out commiting block if any. + let mut clear = false; + for block in enacted { + clear = clear || { + if let Some(ref mut m) = self.modifications.iter_mut().find(|m| &m.hash == block) { + trace!("Reverting enacted block {:?}", block); + m.is_canon = true; + for a in &m.storage { + trace!("Reverting enacted key {:?}", a); + self.lru_storage.remove(a); + } + for a in &m.child_storage { + trace!("Reverting enacted child key {:?}", a); + self.lru_child_storage.remove(a); + } + false + } else { + true + } + }; + } + + for block in retracted { + clear = clear || { + if let Some(ref mut m) = self.modifications.iter_mut().find(|m| &m.hash == block) { + trace!("Retracting block {:?}", block); + m.is_canon = false; + for a in &m.storage { + trace!("Retracted key {:?}", a); + self.lru_storage.remove(a); + } + for a in &m.child_storage { + trace!("Retracted child key {:?}", a); + self.lru_child_storage.remove(a); + } + false + } else { + true + } + }; + } + if clear { + // We don't know anything about the block; clear everything + trace!("Wiping cache"); + self.lru_storage.clear(); + self.lru_child_storage.clear(); + self.lru_hashes.clear(); + self.modifications.clear(); + } + } } pub type SharedCache = Arc>>; @@ -247,58 +306,12 @@ impl CacheChanges { let is_best = is_best(); trace!("Syncing cache, id = (#{:?}, {:?}), parent={:?}, best={}", commit_number, commit_hash, self.parent_hash, is_best); let cache = &mut *cache; - - // Purge changes from re-enacted and retracted blocks. - // Filter out commiting block if any. - let mut clear = false; - for block in enacted.iter().filter(|h| commit_hash.as_ref().map_or(true, |p| *h != p)) { - clear = clear || { - if let Some(ref mut m) = cache.modifications.iter_mut().find(|m| &m.hash == block) { - trace!("Reverting enacted block {:?}", block); - m.is_canon = true; - for a in &m.storage { - trace!("Reverting enacted key {:?}", a); - cache.lru_storage.remove(a); - } - for a in &m.child_storage { - trace!("Reverting enacted child key {:?}", a); - cache.lru_child_storage.remove(a); - } - false - } else { - true - } - }; - } - - for block in retracted { - clear = clear || { - if let Some(ref mut m) = cache.modifications.iter_mut().find(|m| &m.hash == block) { - trace!("Retracting block {:?}", block); - m.is_canon = false; - for a in &m.storage { - trace!("Retracted key {:?}", a); - cache.lru_storage.remove(a); - } - for a in &m.child_storage { - trace!("Retracted child key {:?}", a); - cache.lru_child_storage.remove(a); - } - false - } else { - true - } - }; - } - if clear { - // We don't know anything about the block; clear everything - trace!("Wiping cache"); - cache.lru_storage.clear(); - cache.lru_child_storage.clear(); - cache.lru_hashes.clear(); - cache.modifications.clear(); - } - + let enacted: Vec<_> = enacted + .iter() + .filter(|h| commit_hash.as_ref().map_or(true, |p| *h != p)) + .cloned() + .collect(); + cache.sync(&enacted, retracted); // Propagate cache only if committing on top of the latest canonical state // blocks are ordered by number and only one block with a given number is marked as canonical // (contributed to canonical state cache) @@ -527,6 +540,10 @@ impl, B: BlockT> StateBackend for CachingState< self.state.for_keys_in_child_storage(storage_key, f) } + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + self.state.for_child_keys_with_prefix(storage_key, prefix, f) + } + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)>, @@ -563,7 +580,7 @@ impl, B: BlockT> StateBackend for CachingState< #[cfg(test)] mod tests { use super::*; - use runtime_primitives::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; use state_machine::backend::InMemory; use primitives::Blake2Hasher; diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index 39862dba8575090a8d03bd2ac71ca8b8da004bcd..70f0ff20588bc58a82dfb0d021f1c9ee76fe0781 100644 --- a/core/client/db/src/utils.rs +++ b/core/client/db/src/utils.rs @@ -27,12 +27,12 @@ use kvdb_rocksdb::{Database, DatabaseConfig}; use log::debug; use client; -use parity_codec::Decode; +use codec::Decode; use trie::DBValue; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ - Block as BlockT, Header as HeaderT, Zero, UniqueSaturatedFrom, - UniqueSaturatedInto, CheckedConversion +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ + Block as BlockT, Header as HeaderT, Zero, + UniqueSaturatedFrom, UniqueSaturatedInto, }; #[cfg(feature = "kvdb-rocksdb")] use crate::DatabaseSettings; @@ -84,25 +84,31 @@ pub type NumberIndexKey = [u8; 4]; /// /// In the current database schema, this kind of key is only used for /// lookups into an index, NOT for storing header data or others. -pub fn number_index_key>(n: N) -> NumberIndexKey { - let n = n.checked_into::().unwrap(); - [ +pub fn number_index_key>(n: N) -> client::error::Result { + let n = n.try_into().map_err(|_| + client::error::Error::Backend("Block number cannot be converted to u32".into()) + )?; + + Ok([ (n >> 24) as u8, ((n >> 16) & 0xff) as u8, ((n >> 8) & 0xff) as u8, (n & 0xff) as u8 - ] + ]) } /// Convert number and hash into long lookup key for blocks that are /// not in the canonical chain. -pub fn number_and_hash_to_lookup_key(number: N, hash: H) -> Vec where +pub fn number_and_hash_to_lookup_key( + number: N, + hash: H, +) -> client::error::Result> where N: TryInto, - H: AsRef<[u8]> + H: AsRef<[u8]>, { - let mut lookup_key = number_index_key(number).to_vec(); + let mut lookup_key = number_index_key(number)?.to_vec(); lookup_key.extend_from_slice(hash.as_ref()); - lookup_key + Ok(lookup_key) } /// Convert block lookup key into block number. @@ -124,8 +130,9 @@ pub fn remove_number_to_key_mapping>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, -) { - transaction.delete(key_lookup_col, number_index_key(number).as_ref()) +) -> client::error::Result<()> { + transaction.delete(key_lookup_col, number_index_key(number)?.as_ref()); + Ok(()) } /// Remove key mappings. @@ -134,9 +141,10 @@ pub fn remove_key_mappings, H: AsRef<[u8]>>( key_lookup_col: Option, number: N, hash: H, -) { - remove_number_to_key_mapping(transaction, key_lookup_col, number); +) -> client::error::Result<()> { + remove_number_to_key_mapping(transaction, key_lookup_col, number)?; transaction.delete(key_lookup_col, hash.as_ref()); + Ok(()) } /// Place a number mapping into the database. This maps number to current perceived @@ -146,12 +154,13 @@ pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( key_lookup_col: Option, number: N, hash: H, -) { +) -> client::error::Result<()> { transaction.put_vec( key_lookup_col, - number_index_key(number.clone()).as_ref(), - number_and_hash_to_lookup_key(number, hash), - ) + number_index_key(number.clone())?.as_ref(), + number_and_hash_to_lookup_key(number, hash)?, + ); + Ok(()) } /// Insert a hash to key mapping in the database. @@ -160,12 +169,13 @@ pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( key_lookup_col: Option, number: N, hash: H, -) { +) -> client::error::Result<()> { transaction.put_vec( key_lookup_col, hash.clone().as_ref(), - number_and_hash_to_lookup_key(number, hash), - ) + number_and_hash_to_lookup_key(number, hash)?, + ); + Ok(()) } /// Convert block id to block lookup key. @@ -177,12 +187,12 @@ pub fn block_id_to_lookup_key( id: BlockId ) -> Result>, client::error::Error> where Block: BlockT, - ::runtime_primitives::traits::NumberFor: UniqueSaturatedFrom + UniqueSaturatedInto, + ::sr_primitives::traits::NumberFor: UniqueSaturatedFrom + UniqueSaturatedInto, { let res = match id { BlockId::Number(n) => db.get( key_lookup_col, - number_index_key(n).as_ref(), + number_index_key(n)?.as_ref(), ), BlockId::Hash(h) => db.get(key_lookup_col, h.as_ref()), }; @@ -250,8 +260,8 @@ pub fn read_header( ) -> client::error::Result> { match read_db(db, col_index, col, id)? { Some(header) => match Block::Header::decode(&mut &header[..]) { - Some(header) => Ok(Some(header)), - None => return Err( + Ok(header) => Ok(Some(header)), + Err(_) => return Err( client::error::Error::Backend("Error decoding header".into()) ), } @@ -280,8 +290,10 @@ pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: { let genesis_hash: Block::Hash = match db.get(col_meta, meta_keys::GENESIS_HASH).map_err(db_err)? { Some(h) => match Decode::decode(&mut &h[..]) { - Some(h) => h, - None => return Err(client::error::Error::Backend("Error decoding genesis hash".into())), + Ok(h) => h, + Err(err) => return Err(client::error::Error::Backend( + format!("Error decoding genesis hash: {}", err) + )), }, None => return Ok(Meta { best_hash: Default::default(), @@ -295,7 +307,7 @@ pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: let load_meta_block = |desc, key| -> Result<_, client::error::Error> { if let Some(Some(header)) = db.get(col_meta, key).and_then(|id| match id { - Some(id) => db.get(col_header, &id).map(|h| h.map(|b| Block::Header::decode(&mut &b[..]))), + Some(id) => db.get(col_header, &id).map(|h| h.map(|b| Block::Header::decode(&mut &b[..]).ok())), None => Ok(None), }).map_err(db_err)? { @@ -318,3 +330,19 @@ pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: genesis_hash, }) } + +#[cfg(test)] +mod tests { + use super::*; + use sr_primitives::testing::{Block as RawBlock, ExtrinsicWrapper}; + type Block = RawBlock>; + + #[test] + fn number_index_key_doesnt_panic() { + let id = BlockId::::Number(72340207214430721); + match id { + BlockId::Number(n) => number_index_key(n).expect_err("number should overflow u32"), + _ => unreachable!(), + }; + } +} diff --git a/core/client/src/backend.rs b/core/client/src/backend.rs index 79bc1b475b4140af2846f7067ed32b7053ec19d7..24b48c9b8618c730bc026df3a16b50a3d97f6e80 100644 --- a/core/client/src/backend.rs +++ b/core/client/src/backend.rs @@ -19,8 +19,8 @@ use std::collections::HashMap; use crate::error; use primitives::ChangesTrieConfiguration; -use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; use state_machine::backend::Backend as StateBackend; use state_machine::ChangesTrieStorage as StateChangesTrieStorage; use consensus::well_known_cache_keys; diff --git a/core/client/src/block_builder/api.rs b/core/client/src/block_builder/api.rs index 44663a70949fe9e06663c442006c7dbba55b8f98..5bf742a4560d40ce4c4d3b46f029ce4408e2c75d 100644 --- a/core/client/src/block_builder/api.rs +++ b/core/client/src/block_builder/api.rs @@ -16,7 +16,7 @@ //! The runtime api for building blocks. -use runtime_primitives::{traits::Block as BlockT, ApplyResult}; +use sr_primitives::{traits::Block as BlockT, ApplyResult}; use rstd::vec::Vec; use sr_api_macros::decl_runtime_apis; pub use inherents::{InherentData, CheckInherentsResult}; diff --git a/core/client/src/block_builder/block_builder.rs b/core/client/src/block_builder/block_builder.rs index 882791f95a79ac43305c3334d0af325883f01c29..75b3385e95d231eb033858c70228d2641605b4c4 100644 --- a/core/client/src/block_builder/block_builder.rs +++ b/core/client/src/block_builder/block_builder.rs @@ -16,10 +16,10 @@ use super::api::BlockBuilder as BlockBuilderApi; use std::vec::Vec; -use parity_codec::Encode; -use runtime_primitives::ApplyOutcome; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ +use codec::Encode; +use sr_primitives::ApplyOutcome; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ Header as HeaderT, Hash, Block as BlockT, One, HashFor, ProvideRuntimeApi, ApiRef, DigestFor, }; use primitives::{H256, ExecutionContext}; diff --git a/core/client/src/blockchain.rs b/core/client/src/blockchain.rs index 77c205113878ca2f7891f8110eed08e3eb52b354..2bf61df704da9de3202d5f1a72ed362c4475e72c 100644 --- a/core/client/src/blockchain.rs +++ b/core/client/src/blockchain.rs @@ -18,9 +18,9 @@ use std::sync::Arc; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::Justification; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use sr_primitives::generic::BlockId; +use sr_primitives::Justification; use consensus::well_known_cache_keys; use crate::error::{Error, Result}; @@ -196,7 +196,7 @@ pub fn tree_route>( from: BlockId, to: BlockId, ) -> Result> { - use runtime_primitives::traits::Header; + use sr_primitives::traits::Header; let load_header = |id: BlockId| { match backend.header(id) { diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index c107e6f2bbd4a91f6b874fb56d3b3331d9a6e86d..e82bd9a22c91e5d9f2c8f1b53b84d054f92f7ccb 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -15,8 +15,8 @@ // along with Substrate. If not, see . use std::{sync::Arc, cmp::Ord, panic::UnwindSafe, result, cell::RefCell, rc::Rc}; -use parity_codec::{Encode, Decode}; -use runtime_primitives::{ +use codec::{Encode, Decode}; +use sr_primitives::{ generic::BlockId, traits::Block as BlockT, }; use state_machine::{ @@ -83,6 +83,7 @@ where native_call: Option, side_effects_handler: Option<&mut O>, proof_recorder: &Option>>>, + enable_keystore: bool, ) -> error::Result> where ExecutionManager: Clone; /// Extract RuntimeVersion of given block @@ -150,14 +151,20 @@ where pub struct LocalCallExecutor { backend: Arc, executor: E, + keystore: Option, } impl LocalCallExecutor { /// Creates new instance of local call executor. - pub fn new(backend: Arc, executor: E) -> Self { + pub fn new( + backend: Arc, + executor: E, + keystore: Option, + ) -> Self { LocalCallExecutor { backend, executor, + keystore, } } } @@ -167,6 +174,7 @@ impl Clone for LocalCallExecutor where E: Clone { LocalCallExecutor { backend: self.backend.clone(), executor: self.executor.clone(), + keystore: self.keystore.clone(), } } } @@ -197,6 +205,7 @@ where &self.executor, method, call_data, + self.keystore.clone(), ).execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( strategy.get_manager(), false, @@ -229,6 +238,7 @@ where native_call: Option, side_effects_handler: Option<&mut O>, recorder: &Option>>>, + enable_keystore: bool, ) -> Result, error::Error> where ExecutionManager: Clone { match initialize_block { InitializeBlock::Do(ref init_block) @@ -239,9 +249,15 @@ where _ => {}, } + let keystore = if enable_keystore { + self.keystore.clone() + } else { + None + }; + let mut state = self.backend.state_at(*at)?; - match recorder { + let result = match recorder { Some(recorder) => { let trie_state = state.as_trie_backend() .ok_or_else(|| @@ -262,6 +278,7 @@ where &self.executor, method, call_data, + keystore, ) .execute_using_consensus_failure_handler( execution_manager, @@ -279,6 +296,7 @@ where &self.executor, method, call_data, + keystore, ) .execute_using_consensus_failure_handler( execution_manager, @@ -286,15 +304,25 @@ where native_call, ) .map(|(result, _, _)| result) - .map_err(Into::into) - } + }?; + self.backend.destroy_state(state)?; + Ok(result) } fn runtime_version(&self, id: &BlockId) -> error::Result { let mut overlay = OverlayedChanges::default(); let state = self.backend.state_at(*id)?; - let mut ext = Ext::new(&mut overlay, &state, self.backend.changes_trie_storage(), NeverOffchainExt::new()); - self.executor.runtime_version(&mut ext).ok_or(error::Error::VersionInvalid.into()) + + let mut ext = Ext::new( + &mut overlay, + &state, + self.backend.changes_trie_storage(), + NeverOffchainExt::new(), + None, + ); + let version = self.executor.runtime_version(&mut ext); + self.backend.destroy_state(state)?; + version.ok_or(error::Error::VersionInvalid.into()) } fn call_at_state< @@ -327,6 +355,7 @@ where &self.executor, method, call_data, + self.keystore.clone(), ).execute_using_consensus_failure_handler( manager, true, @@ -353,6 +382,7 @@ where &self.executor, method, call_data, + self.keystore.clone(), ) .map_err(Into::into) } diff --git a/core/client/src/children.rs b/core/client/src/children.rs index 4423ad8939467e911382a7d286387e4f9bcf683f..3128f860869ce3e07d13eaabdd0d241b02611fee 100644 --- a/core/client/src/children.rs +++ b/core/client/src/children.rs @@ -17,7 +17,7 @@ //! Functionality for reading and storing children hashes from db. use kvdb::{KeyValueDB, DBTransaction}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use crate::error; use std::hash::Hash; @@ -41,8 +41,8 @@ pub fn read_children< }; let children: Vec = match Decode::decode(&mut &raw_val[..]) { - Some(children) => children, - None => return Err(error::Error::Backend("Error decoding children".into())), + Ok(children) => children, + Err(_) => return Err(error::Error::Backend("Error decoding children".into())), }; Ok(children) diff --git a/core/client/src/cht.rs b/core/client/src/cht.rs index fc8920327e90b64b58542ca62161f4f9af2b5c77..37462851a96781957a40dcd7599b2c9e312766ff 100644 --- a/core/client/src/cht.rs +++ b/core/client/src/cht.rs @@ -26,11 +26,11 @@ use std::collections::HashSet; use hash_db; -use parity_codec::Encode; +use codec::Encode; use trie; use primitives::{H256, convert_hash}; -use runtime_primitives::traits::{Header as HeaderT, SimpleArithmetic, Zero, One}; +use sr_primitives::traits::{Header as HeaderT, SimpleArithmetic, Zero, One}; use state_machine::backend::InMemory as InMemoryState; use state_machine::{MemoryDB, TrieBackend, Backend as StateBackend, prove_read_on_trie_backend, read_proof_check, read_proof_check_on_proving_backend}; @@ -78,7 +78,8 @@ pub fn compute_root( Hasher::Out: Ord, I: IntoIterator>>, { - Ok(trie::trie_root::( + use trie::TrieConfiguration; + Ok(trie::trie_types::Layout::::trie_root( build_pairs::(cht_size, cht_num, hashes)? )) } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 5122cbac032624b7ada891e8a9f975130afee77f..0360c532d278c9c5c8c1d1f1c43160cea6d3ec43 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -20,67 +20,59 @@ use std::{ marker::PhantomData, collections::{HashSet, BTreeMap, HashMap}, sync::Arc, panic::UnwindSafe, result, cell::RefCell, rc::Rc, }; -use crate::error::Error; +use log::{info, trace, warn}; use futures::channel::mpsc; use parking_lot::{Mutex, RwLock}; -use primitives::NativeOrEncoded; -use runtime_primitives::{ - Justification, - generic::{BlockId, SignedBlock}, -}; -use consensus::{ - Error as ConsensusError, ImportBlock, - ImportResult, BlockOrigin, ForkChoiceStrategy, - well_known_cache_keys::Id as CacheKeyId, - SelectChain, self, -}; -use runtime_primitives::traits::{ - Block as BlockT, Header as HeaderT, Zero, NumberFor, CurrentHeight, - BlockNumberToHash, ApiRef, ProvideRuntimeApi, - SaturatedConversion, One, DigestFor, -}; -use runtime_primitives::generic::DigestItem; -use runtime_primitives::BuildStorage; -use crate::runtime_api::{ - CallRuntimeAt, ConstructRuntimeApi, Core as CoreApi, ProofRecorder, - InitializeBlock, -}; +use codec::{Encode, Decode}; +use hash_db::{Hasher, Prefix}; use primitives::{ Blake2Hasher, H256, ChangesTrieConfiguration, convert_hash, - NeverNativeValue, ExecutionContext + NeverNativeValue, ExecutionContext, + storage::{StorageKey, StorageData, well_known_keys}, NativeOrEncoded +}; +use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; +use sr_primitives::{ + Justification, BuildStorage, + generic::{BlockId, SignedBlock, DigestItem}, + traits::{ + Block as BlockT, Header as HeaderT, Zero, NumberFor, + ApiRef, ProvideRuntimeApi, SaturatedConversion, One, DigestFor, + }, }; -use primitives::storage::{StorageKey, StorageData}; -use primitives::storage::well_known_keys; -use parity_codec::{Encode, Decode}; use state_machine::{ DBValue, Backend as StateBackend, CodeExecutor, ChangesTrieAnchorBlockId, ExecutionStrategy, ExecutionManager, prove_read, prove_child_read, ChangesTrieRootsStorage, ChangesTrieStorage, key_changes, key_changes_proof, OverlayedChanges, NeverOffchainExt, }; -use hash_db::Hasher; - -use crate::backend::{ - self, BlockImportOperation, PrunableStateChangesTrieStorage, - StorageCollection, ChildStorageCollection -}; -use crate::blockchain::{ - self, Info as ChainInfo, Backend as ChainBackend, - HeaderBackend as ChainHeaderBackend, ProvideCache, Cache, -}; -use crate::call_executor::{CallExecutor, LocalCallExecutor}; use executor::{RuntimeVersion, RuntimeInfo}; -use crate::notifications::{StorageNotifications, StorageEventStream}; -use crate::light::{call_executor::prove_execution, fetcher::ChangesProof}; -use crate::cht; -use crate::error; -use crate::in_mem; -use crate::block_builder::{self, api::BlockBuilder as BlockBuilderAPI}; -use crate::genesis; -use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; - -use log::{info, trace, warn}; +use consensus::{ + Error as ConsensusError, BlockImportParams, + ImportResult, BlockOrigin, ForkChoiceStrategy, + well_known_cache_keys::Id as CacheKeyId, + SelectChain, self, +}; +use crate::{ + runtime_api::{ + CallRuntimeAt, ConstructRuntimeApi, Core as CoreApi, ProofRecorder, + InitializeBlock, + }, + backend::{ + self, BlockImportOperation, PrunableStateChangesTrieStorage, + StorageCollection, ChildStorageCollection + }, + blockchain::{ + self, Info as ChainInfo, Backend as ChainBackend, + HeaderBackend as ChainHeaderBackend, ProvideCache, Cache, + }, + call_executor::{CallExecutor, LocalCallExecutor}, + notifications::{StorageNotifications, StorageEventStream}, + light::{call_executor::prove_execution, fetcher::ChangesProof}, + block_builder::{self, api::BlockBuilder as BlockBuilderAPI}, + error::Error, + cht, error, in_mem, genesis +}; /// Type that implements `futures::Stream` of block import events. pub type ImportNotifications = mpsc::UnboundedReceiver>; @@ -178,6 +170,13 @@ pub trait BlockBody { ) -> error::Result::Extrinsic>>>; } +/// Provide a list of potential uncle headers for a given block. +pub trait ProvideUncles { + /// Gets the uncles of the block with `target_hash` going back `max_generation` ancestors. + fn uncles(&self, target_hash: Block::Hash, max_generation: NumberFor) + -> error::Result>; +} + /// Client info #[derive(Debug)] pub struct ClientInfo { @@ -261,6 +260,7 @@ impl PrePostHeader { pub fn new_in_mem( executor: E, genesis_storage: S, + keystore: Option, ) -> error::Result, LocalCallExecutor, E>, @@ -271,7 +271,7 @@ pub fn new_in_mem( S: BuildStorage, Block: BlockT, { - new_with_backend(Arc::new(in_mem::Backend::new()), executor, genesis_storage) + new_with_backend(Arc::new(in_mem::Backend::new()), executor, genesis_storage, keystore) } /// Create a client with the explicitly provided backend. @@ -280,6 +280,7 @@ pub fn new_with_backend( backend: Arc, executor: E, build_genesis_storage: S, + keystore: Option, ) -> error::Result, Block, RA>> where E: CodeExecutor + RuntimeInfo, @@ -287,10 +288,24 @@ pub fn new_with_backend( Block: BlockT, B: backend::LocalBackend { - let call_executor = LocalCallExecutor::new(backend.clone(), executor); + let call_executor = LocalCallExecutor::new(backend.clone(), executor, keystore); Client::new(backend, call_executor, build_genesis_storage, Default::default()) } +/// Figure out the block type for a given type (for now, just a `Client`). +pub trait BlockOf { + /// The type of the block. + type Type: BlockT; +} + +impl BlockOf for Client where + B: backend::Backend, + E: CallExecutor, + Block: BlockT, +{ + type Type = Block; +} + impl Client where B: backend::Backend, E: CallExecutor, @@ -363,7 +378,8 @@ impl Client where pub fn storage(&self, id: &BlockId, key: &StorageKey) -> error::Result> { Ok(self.state_at(id)? .storage(&key.0).map_err(|e| error::Error::from_state(Box::new(e)))? - .map(StorageData)) + .map(StorageData) + ) } /// Given a `BlockId` and a key, return the value under the hash in that block. @@ -615,7 +631,7 @@ impl Client where } impl<'a, Block: BlockT> ChangesTrieStorage> for AccessedRootsRecorder<'a, Block> { - fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H256, prefix: Prefix) -> Result, String> { self.storage.get(key, prefix) } } @@ -817,12 +833,12 @@ impl Client where pub fn apply_block( &self, operation: &mut ClientImportOperation, - import_block: ImportBlock, + import_block: BlockImportParams, new_cache: HashMap>, ) -> error::Result where E: CallExecutor + Send + Sync + Clone, { - let ImportBlock { + let BlockImportParams { origin, header, justification, @@ -1226,6 +1242,9 @@ impl Client where let last_best = self.backend.blockchain().info().best_hash; let to_finalize_hash = self.backend.blockchain().expect_block_hash_from_id(&id)?; self.apply_finality_with_block_hash(operation, to_finalize_hash, justification, last_best, notify) + }).map_err(|e| { + warn!("Block finalization error:\n{:?}", e); + e }) } @@ -1320,7 +1339,7 @@ impl Client where ancestor_hash = *current.parent_hash(); ancestor = load_header(ancestor_hash)?; } - + trace!("Collected {} uncles", uncles.len()); Ok(uncles) } @@ -1328,7 +1347,7 @@ impl Client where Ok(self.backend.state_at(BlockId::Number(self.backend.blockchain().info().best_number))? .storage(well_known_keys::CHANGES_TRIE_CONFIG) .map_err(|e| error::Error::from_state(Box::new(e)))? - .and_then(|c| Decode::decode(&mut &*c))) + .and_then(|c| Decode::decode(&mut &*c).ok())) } /// Prepare in-memory header that is used in execution environment. @@ -1344,6 +1363,20 @@ impl Client where } } +impl ProvideUncles for Client where + B: backend::Backend, + E: CallExecutor, + Block: BlockT, +{ + fn uncles(&self, target_hash: Block::Hash, max_generation: NumberFor) -> error::Result> { + Ok(Client::uncles(self, target_hash, max_generation)? + .into_iter() + .filter_map(|hash| Client::header(self, &BlockId::Hash(hash)).unwrap_or(None)) + .collect() + ) + } +} + impl ChainHeaderBackend for Client where B: backend::Backend, E: CallExecutor + Send + Sync, @@ -1415,6 +1448,8 @@ impl CallRuntimeAt for Client where context: ExecutionContext, recorder: &Option>>>, ) -> error::Result> { + let enable_keystore = context.enable_keystore(); + let manager = match context { ExecutionContext::BlockConstruction => self.execution_strategies.block_construction.get_manager(), @@ -1444,6 +1479,7 @@ impl CallRuntimeAt for Client where native_call, offchain_extensions.as_mut(), recorder, + enable_keystore, ) } @@ -1460,15 +1496,18 @@ impl<'a, B, E, Block, RA> consensus::BlockImport for &'a Client, + import_block: BlockImportParams, new_cache: HashMap>, ) -> Result { self.lock_import_and_run(|operation| { self.apply_block(operation, import_block, new_cache) - }).map_err(|e| ConsensusError::ClientImport(e.to_string()).into()) + }).map_err(|e| { + warn!("Block import error:\n{:?}", e); + ConsensusError::ClientImport(e.to_string()).into() + }) } /// Check block preconditions. @@ -1506,7 +1545,7 @@ impl consensus::BlockImport for Client fn import_block( &mut self, - import_block: ImportBlock, + import_block: BlockImportParams, new_cache: HashMap>, ) -> Result { (&*self).import_block(import_block, new_cache) @@ -1521,30 +1560,6 @@ impl consensus::BlockImport for Client } } -impl CurrentHeight for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, -{ - type BlockNumber = ::Number; - fn current_height(&self) -> Self::BlockNumber { - self.backend.blockchain().info().best_number - } -} - -impl BlockNumberToHash for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, -{ - type BlockNumber = ::Number; - type Hash = Block::Hash; - fn block_number_to_hash(&self, n: Self::BlockNumber) -> Option { - self.block_hash(n).unwrap_or(None) - } -} - - impl BlockchainEvents for Client where E: CallExecutor, @@ -1799,12 +1814,59 @@ impl backend::AuxStore for Client crate::backend::AuxStore::get_aux(&*self.backend, key) } } + +/// Utility methods for the client. +pub mod utils { + use super::*; + use crate::{backend::Backend, blockchain, error}; + use primitives::H256; + + /// Returns a function for checking block ancestry, the returned function will + /// return `true` if the given hash (second parameter) is a descendent of the + /// base (first parameter). If the `current` parameter is defined, it should + /// represent the current block `hash` and its `parent hash`, if given the + /// function that's returned will assume that `hash` isn't part of the local DB + /// yet, and all searches in the DB will instead reference the parent. + pub fn is_descendent_of<'a, B, E, Block: BlockT, RA>( + client: &'a Client, + current: Option<(&'a H256, &'a H256)>, + ) -> impl Fn(&H256, &H256) -> Result + 'a + where B: Backend, + E: CallExecutor + Send + Sync, + { + move |base, hash| { + if base == hash { return Ok(false); } + + let mut hash = hash; + if let Some((current_hash, current_parent_hash)) = current { + if base == current_hash { return Ok(false); } + if hash == current_hash { + if base == current_parent_hash { + return Ok(true); + } else { + hash = current_parent_hash; + } + } + } + + let tree_route = blockchain::tree_route( + #[allow(deprecated)] + client.backend().blockchain(), + BlockId::Hash(*hash), + BlockId::Hash(*base), + )?; + + Ok(tree_route.common_block().hash == *base) + } + } +} + #[cfg(test)] pub(crate) mod tests { use std::collections::HashMap; use super::*; use primitives::blake2_256; - use runtime_primitives::DigestItem; + use sr_primitives::DigestItem; use consensus::{BlockOrigin, SelectChain}; use test_client::{ prelude::*, @@ -2633,4 +2695,99 @@ pub(crate) mod tests { b3.hash(), ); } + + #[test] + fn get_header_by_block_number_doesnt_panic() { + let client = test_client::new(); + + // backend uses u32 for block numbers, make sure we don't panic when + // trying to convert + let id = BlockId::::Number(72340207214430721); + client.header(&id).expect_err("invalid block number overflows u32"); + } + + #[test] + fn state_reverted_on_reorg() { + let _ = env_logger::try_init(); + let client = test_client::new(); + + let current_balance = || + client.runtime_api().balance_of( + &BlockId::number(client.info().chain.best_number), AccountKeyring::Alice.into() + ).unwrap(); + + // G -> A1 -> A2 + // \ + // -> B1 + let mut a1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + a1.push_transfer(Transfer { + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Bob.into(), + amount: 10, + nonce: 0, + }).unwrap(); + let a1 = a1.bake().unwrap(); + client.import(BlockOrigin::Own, a1.clone()).unwrap(); + + let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + b1.push_transfer(Transfer { + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), + amount: 50, + nonce: 0, + }).unwrap(); + let b1 = b1.bake().unwrap(); + // Reorg to B1 + client.import_as_best(BlockOrigin::Own, b1.clone()).unwrap(); + + assert_eq!(950, current_balance()); + let mut a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); + a2.push_transfer(Transfer { + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Charlie.into(), + amount: 10, + nonce: 1, + }).unwrap(); + // Re-org to A2 + client.import_as_best(BlockOrigin::Own, a2.bake().unwrap()).unwrap(); + assert_eq!(980, current_balance()); + } + + #[test] + fn state_reverted_on_set_head() { + let _ = env_logger::try_init(); + let client = test_client::new(); + + let current_balance = || + client.runtime_api().balance_of( + &BlockId::number(client.info().chain.best_number), AccountKeyring::Alice.into() + ).unwrap(); + + // G -> A1 + // \ + // -> B1 + let mut a1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + a1.push_transfer(Transfer { + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Bob.into(), + amount: 10, + nonce: 0, + }).unwrap(); + let a1 = a1.bake().unwrap(); + client.import(BlockOrigin::Own, a1.clone()).unwrap(); + + let mut b1 = client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); + b1.push_transfer(Transfer { + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), + amount: 50, + nonce: 0, + }).unwrap(); + let b1 = b1.bake().unwrap(); + client.import(BlockOrigin::Own, b1.clone()).unwrap(); + assert_eq!(990, current_balance()); + // Set B1 as new best + client.set_head(BlockId::hash(b1.hash())).unwrap(); + assert_eq!(950, current_balance()); + } } diff --git a/core/client/src/error.rs b/core/client/src/error.rs index 2de5a427819219ac910c19fb839e5b68b44122cf..6f087df9de3721046e772e87183fa8e402c68222 100644 --- a/core/client/src/error.rs +++ b/core/client/src/error.rs @@ -18,7 +18,7 @@ use std::{self, error, result}; use state_machine; -use runtime_primitives::ApplyError; +use sr_primitives::ApplyError; use consensus; use derive_more::{Display, From}; @@ -74,11 +74,11 @@ pub enum Error { #[display(fmt = "Remote data fetch has been failed")] RemoteFetchFailed, /// Error decoding call result. - #[display(fmt = "Error decoding call result of {}", _0)] - CallResultDecode(&'static str), + #[display(fmt = "Error decoding call result of {}: {}", _0, _1)] + CallResultDecode(&'static str, codec::Error), /// Error converting a parameter between runtime and node. #[display(fmt = "Error converting `{}` between runtime and node", _0)] - RuntimeParamConversion(&'static str), + RuntimeParamConversion(String), /// Changes tries are not supported. #[display(fmt = "Changes tries are not supported by the runtime")] ChangesTriesNotSupported, diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index 8843ec84bc763e2f87c5c1bd360f121f956588db..3ac93f4f577b65540a9f0b253c6ec8b10219f389 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -16,7 +16,7 @@ //! Tool for creating the genesis block. -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, Zero}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, Zero}; /// Create a genesis block, given the initial storage. pub fn construct_genesis_block< @@ -39,17 +39,15 @@ pub fn construct_genesis_block< #[cfg(test)] mod tests { - use super::*; - use parity_codec::{Encode, Decode, Joiner}; - use executor::{NativeExecutionDispatch, native_executor_instance}; + use codec::{Encode, Decode, Joiner}; + use executor::native_executor_instance; use state_machine::{self, OverlayedChanges, ExecutionStrategy, InMemoryChangesTrieStorage}; use state_machine::backend::InMemory; use test_client::{ - runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}, + runtime::genesismap::{GenesisConfig, insert_genesis_block}, runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest}, - AccountKeyring, AuthorityKeyring + AccountKeyring, Sr25519Keyring, }; - use runtime_primitives::traits::BlakeTwo256; use primitives::Blake2Hasher; use hex::*; @@ -61,7 +59,7 @@ mod tests { ); fn executor() -> executor::NativeExecutor { - NativeExecutionDispatch::new(None) + executor::NativeExecutor::new(None) } fn construct_block( @@ -71,11 +69,12 @@ mod tests { state_root: Hash, txs: Vec ) -> (Vec, Hash) { - use trie::ordered_trie_root; + use trie::{TrieConfiguration, trie_types::Layout}; let transactions = txs.into_iter().map(|tx| tx.into_signed_tx()).collect::>(); - let extrinsics_root = ordered_trie_root::(transactions.iter().map(Encode::encode)).into(); + let iter = transactions.iter().map(Encode::encode); + let extrinsics_root = Layout::::ordered_trie_root(iter).into(); let mut header = Header { parent_hash, @@ -95,6 +94,7 @@ mod tests { &executor(), "Core_initialize_block", &header.encode(), + None, ).execute( ExecutionStrategy::NativeElseWasm, ).unwrap(); @@ -108,6 +108,7 @@ mod tests { &executor(), "BlockBuilder_apply_extrinsic", &tx.encode(), + None, ).execute( ExecutionStrategy::NativeElseWasm, ).unwrap(); @@ -121,6 +122,7 @@ mod tests { &executor(), "BlockBuilder_finalize_block", &[], + None, ).execute( ExecutionStrategy::NativeElseWasm, ).unwrap(); @@ -147,14 +149,12 @@ mod tests { #[test] fn construct_genesis_should_work_with_native() { let mut storage = GenesisConfig::new(false, - vec![AuthorityKeyring::One.into(), AuthorityKeyring::Two.into()], + vec![Sr25519Keyring::One.public().into(), Sr25519Keyring::Two.public().into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], - 1000 + 1000, + None, ).genesis_map(); - let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); - let block = construct_genesis_block::(state_root); - let genesis_hash = block.header.hash(); - storage.extend(additional_storage_with_genesis(&block).into_iter()); + let genesis_hash = insert_genesis_block(&mut storage); let backend = InMemory::from(storage); let (b1data, _b1hash) = block1(genesis_hash, &backend); @@ -168,6 +168,7 @@ mod tests { &executor(), "Core_execute_block", &b1data, + None, ).execute( ExecutionStrategy::NativeElseWasm, ).unwrap(); @@ -176,14 +177,12 @@ mod tests { #[test] fn construct_genesis_should_work_with_wasm() { let mut storage = GenesisConfig::new(false, - vec![AuthorityKeyring::One.into(), AuthorityKeyring::Two.into()], + vec![Sr25519Keyring::One.public().into(), Sr25519Keyring::Two.public().into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], - 1000 + 1000, + None, ).genesis_map(); - let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); - let block = construct_genesis_block::(state_root); - let genesis_hash = block.header.hash(); - storage.extend(additional_storage_with_genesis(&block).into_iter()); + let genesis_hash = insert_genesis_block(&mut storage); let backend = InMemory::from(storage); let (b1data, _b1hash) = block1(genesis_hash, &backend); @@ -197,6 +196,7 @@ mod tests { &executor(), "Core_execute_block", &b1data, + None, ).execute( ExecutionStrategy::AlwaysWasm, ).unwrap(); @@ -205,14 +205,12 @@ mod tests { #[test] fn construct_genesis_with_bad_transaction_should_panic() { let mut storage = GenesisConfig::new(false, - vec![AuthorityKeyring::One.into(), AuthorityKeyring::Two.into()], + vec![Sr25519Keyring::One.public().into(), Sr25519Keyring::Two.public().into()], vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], - 68 + 68, + None, ).genesis_map(); - let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); - let block = construct_genesis_block::(state_root); - let genesis_hash = block.header.hash(); - storage.extend(additional_storage_with_genesis(&block).into_iter()); + let genesis_hash = insert_genesis_block(&mut storage); let backend = InMemory::from(storage); let (b1data, _b1hash) = block1(genesis_hash, &backend); @@ -223,9 +221,10 @@ mod tests { Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, - &Executor::new(None), + &executor(), "Core_execute_block", &b1data, + None, ).execute( ExecutionStrategy::NativeElseWasm, ); diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index 8a229470be1b1363940eccb06243023214b64817..c43c4e3197eece80a6b8671f38c8d786bfd29f84 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -20,12 +20,12 @@ use std::collections::HashMap; use std::sync::Arc; use parking_lot::{RwLock, Mutex}; use primitives::{ChangesTrieConfiguration, storage::well_known_keys}; -use runtime_primitives::generic::{BlockId, DigestItem}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor}; -use runtime_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; +use sr_primitives::generic::{BlockId, DigestItem}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor}; +use sr_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::backend::{Backend as StateBackend, InMemory}; use state_machine::{self, InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId}; -use hash_db::Hasher; +use hash_db::{Hasher, Prefix}; use trie::MemoryDB; use consensus::well_known_cache_keys::Id as CacheKeyId; @@ -532,7 +532,10 @@ where } } -/// In-memory backend. Keeps all states and blocks in memory. Useful for testing. +/// In-memory backend. Keeps all states and blocks in memory. +/// +/// > **Warning**: Doesn't support all the features necessary for a proper database. Only use this +/// > struct for testing purposes. Do **NOT** use in production. pub struct Backend where Block: BlockT, @@ -755,8 +758,8 @@ impl state_machine::ChangesTrieStorage> for Change Block: BlockT, H: Hasher, { - fn get(&self, _key: &H::Out, _prefix: &[u8]) -> Result, String> { - Err("Dummy implementation".into()) + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { + self.0.get(key, prefix) } } diff --git a/core/client/src/leaves.rs b/core/client/src/leaves.rs index b0e49ead80d40e04bf829c8719fd0f40d3d11fa5..825c1bf7c0bb50ff965ad15f0280723241f806b1 100644 --- a/core/client/src/leaves.rs +++ b/core/client/src/leaves.rs @@ -19,8 +19,8 @@ use std::collections::BTreeMap; use std::cmp::Reverse; use kvdb::{KeyValueDB, DBTransaction}; -use runtime_primitives::traits::SimpleArithmetic; -use parity_codec::{Encode, Decode}; +use sr_primitives::traits::SimpleArithmetic; +use codec::{Encode, Decode}; use crate::error; #[derive(Debug, Clone, PartialEq, Eq)] @@ -84,12 +84,12 @@ impl LeafSet where if !key.starts_with(prefix) { break } let raw_hash = &mut &key[prefix.len()..]; let hash = match Decode::decode(raw_hash) { - Some(hash) => hash, - None => return Err(error::Error::Backend("Error decoding hash".into())), + Ok(hash) => hash, + Err(_) => return Err(error::Error::Backend("Error decoding hash".into())), }; let number = match Decode::decode(&mut &value[..]) { - Some(number) => number, - None => return Err(error::Error::Backend("Error decoding number".into())), + Ok(number) => number, + Err(_) => return Err(error::Error::Backend("Error decoding number".into())), }; storage.entry(Reverse(number)).or_insert_with(Vec::new).push(hash); } diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index 67cfdd4a64d82fada5b97647c860df0045268417..99cbecbe894a82184d9c3338a1004fc9a83565a4 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -15,6 +15,62 @@ // along with Substrate. If not, see . //! Substrate Client and associated logic. +//! +//! The [`Client`] is one of the most important components of Substrate. It mainly comprises two +//! parts: +//! +//! - A database containing the blocks and chain state, generally referred to as +//! the [`Backend`](backend::Backend). +//! - A runtime environment, generally referred to as the [`Executor`](CallExecutor). +//! +//! # Initialization +//! +//! Creating a [`Client`] is done by calling the `new` method and passing to it a +//! [`Backend`](backend::Backend) and an [`Executor`](CallExecutor). +//! +//! The former is typically provided by the `substrate-client-db` crate. +//! +//! The latter typically requires passing one of: +//! +//! - A [`LocalCallExecutor`] running the runtime locally. +//! - A [`RemoteCallExecutor`](light::call_executor::RemoteCallExecutor) that will ask a +//! third-party to perform the executions. +//! - A [`RemoteOrLocalCallExecutor`](light::call_executor::RemoteOrLocalCallExecutor), combination +//! of the two. +//! +//! Additionally, the fourth generic parameter of the `Client` is a marker type representing +//! the ways in which the runtime can interface with the outside. Any code that builds a `Client` +//! is responsible for putting the right marker. +//! +//! ## Example +//! +//! ``` +//! use std::sync::Arc; +//! use substrate_client::{Client, in_mem::Backend, LocalCallExecutor}; +//! use primitives::Blake2Hasher; +//! use sr_primitives::{StorageOverlay, ChildrenStorageOverlay}; +//! use executor::NativeExecutor; +//! +//! // In this example, we're using the `Block` and `RuntimeApi` types from the +//! // `substrate-test-runtime-client` crate. These types are automatically generated when +//! // compiling a runtime. In a typical use-case, these types would have been to be generated +//! // from your runtime. +//! use test_client::{LocalExecutor, runtime::Block, runtime::RuntimeApi}; +//! +//! let backend = Arc::new(Backend::::new()); +//! let client = Client::<_, _, _, RuntimeApi>::new( +//! backend.clone(), +//! LocalCallExecutor::new( +//! backend.clone(), +//! NativeExecutor::::new(None), +//! None, +//! ), +//! // This parameter provides the storage for the chain genesis. +//! <(StorageOverlay, ChildrenStorageOverlay)>::default(), +//! Default::default() +//! ); +//! ``` +//! #![cfg_attr(not(feature = "std"), no_std)] #![warn(missing_docs)] @@ -59,7 +115,8 @@ pub use crate::client::{ new_in_mem, BlockBody, BlockStatus, ImportNotifications, FinalityNotifications, BlockchainEvents, BlockImportNotification, Client, ClientInfo, ExecutionStrategies, FinalityNotification, - LongestChain, + LongestChain, BlockOf, ProvideUncles, + utils, }; #[cfg(feature = "std")] pub use crate::notifications::{StorageEventStream, StorageChangeSet}; diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index 6f6bde2418373c85f17d18e08cb1482a8daaa114..888c9d2033f6764ab32fd64b6adc3b4890e6f2a9 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -21,9 +21,9 @@ use std::collections::HashMap; use std::sync::{Arc, Weak}; use parking_lot::{RwLock, Mutex}; -use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; +use sr_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::{Backend as StateBackend, TrieBackend, backend::InMemory as InMemoryState}; -use runtime_primitives::traits::{Block as BlockT, NumberFor, Zero, Header}; +use sr_primitives::traits::{Block as BlockT, NumberFor, Zero, Header}; use crate::in_mem::{self, check_genesis_storage}; use crate::backend::{ AuxStore, Backend as ClientBackend, BlockImportOperation, RemoteBackend, NewBlockState, @@ -381,6 +381,15 @@ where // whole state is not available on light node } + fn for_child_keys_with_prefix( + &self, + _storage_key: &[u8], + _prefix: &[u8], + _action: A, + ) { + // whole state is not available on light node + } + fn storage_root(&self, _delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)> @@ -456,6 +465,20 @@ where } } + fn for_child_keys_with_prefix( + &self, + storage_key: &[u8], + prefix: &[u8], + action: A, + ) { + match *self { + OnDemandOrGenesisState::OnDemand(ref state) => + StateBackend::::for_child_keys_with_prefix(state, storage_key, prefix, action), + OnDemandOrGenesisState::Genesis(ref state) => + state.for_child_keys_with_prefix(storage_key, prefix, action), + } + } + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)> diff --git a/core/client/src/light/blockchain.rs b/core/client/src/light/blockchain.rs index 6bd4c787d50bd8d2fc0bc19b9fe76c131cacd4fe..a2c2fe72baf93e56ba82061fff2152aee2993b47 100644 --- a/core/client/src/light/blockchain.rs +++ b/core/client/src/light/blockchain.rs @@ -20,8 +20,8 @@ use std::{sync::{Weak, Arc}, collections::HashMap}; use parking_lot::Mutex; -use runtime_primitives::{Justification, generic::BlockId}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; +use sr_primitives::{Justification, generic::BlockId}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; use consensus::well_known_cache_keys; use crate::backend::{AuxStore, NewBlockState}; diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index faa7c10def0702b2f52735704113e16168b3d2d6..2367aaf806510c0f1365652a4c56fbd54398f2b1 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -22,10 +22,10 @@ use std::{ marker::PhantomData, cell::RefCell, rc::Rc, }; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use primitives::{offchain, H256, Blake2Hasher, convert_hash, NativeOrEncoded}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{One, Block as BlockT, Header as HeaderT}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{One, Block as BlockT, Header as HeaderT}; use state_machine::{ self, Backend as StateBackend, CodeExecutor, OverlayedChanges, ExecutionStrategy, create_proof_check_backend, @@ -94,8 +94,8 @@ where call_data: &[u8], _strategy: ExecutionStrategy, _side_effects_handler: Option<&mut O>, - ) - -> ClientResult> { + ) -> ClientResult> + { let block_hash = self.blockchain.expect_block_hash_from_id(id)?; let block_header = self.blockchain.expect_header(id.clone())?; @@ -130,6 +130,7 @@ where _native_call: Option, side_effects_handler: Option<&mut O>, _recorder: &Option>>>, + _enable_keystore: bool, ) -> ClientResult> where ExecutionManager: Clone { let block_initialized = match initialize_block { InitializeBlock::Do(ref init_block) => { @@ -143,13 +144,25 @@ where return Err(ClientError::NotAvailableOnLightClient.into()); } - self.call(at, method, call_data, (&execution_manager).into(), side_effects_handler).map(NativeOrEncoded::Encoded) + self.call( + at, + method, + call_data, + (&execution_manager).into(), + side_effects_handler, + ).map(NativeOrEncoded::Encoded) } fn runtime_version(&self, id: &BlockId) -> ClientResult { - let call_result = self.call(id, "Core_version", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new())?; + let call_result = self.call( + id, + "Core_version", + &[], + ExecutionStrategy::NativeElseWasm, + NeverOffchainExt::new() + )?; RuntimeVersion::decode(&mut call_result.as_slice()) - .ok_or_else(|| ClientError::VersionInvalid.into()) + .map_err(|_| ClientError::VersionInvalid.into()) } fn call_at_state< @@ -270,6 +283,7 @@ impl CallExecutor for native_call: Option, side_effects_handler: Option<&mut O>, recorder: &Option>>>, + enable_keystore: bool, ) -> ClientResult> where ExecutionManager: Clone { // there's no actual way/need to specify native/wasm execution strategy on light node // => we can safely ignore passed values @@ -296,6 +310,7 @@ impl CallExecutor for native_call, side_effects_handler, recorder, + enable_keystore, ).map_err(|e| ClientError::Execution(Box::new(e.to_string()))), false => CallExecutor::contextual_call::< _, @@ -318,6 +333,7 @@ impl CallExecutor for native_call, side_effects_handler, recorder, + enable_keystore, ).map_err(|e| ClientError::Execution(Box::new(e.to_string()))), } } @@ -463,6 +479,7 @@ pub fn check_execution_proof( executor, "Core_initialize_block", &next_block.encode(), + None, )?; // execute method @@ -472,6 +489,7 @@ pub fn check_execution_proof( executor, &request.method, &request.call_data, + None, )?; Ok(local_result) @@ -481,7 +499,7 @@ pub fn check_execution_proof( mod tests { use consensus::BlockOrigin; use test_client::{self, runtime::Header, ClientExt, TestClient}; - use executor::NativeExecutionDispatch; + use executor::NativeExecutor; use crate::backend::{Backend, NewBlockState}; use crate::in_mem::Backend as InMemBackend; use crate::light::fetcher::tests::OkCallFetcher; @@ -502,7 +520,7 @@ mod tests { ).unwrap(); // check remote execution proof locally - let local_executor = test_client::LocalExecutor::new(None); + let local_executor = NativeExecutor::::new(None); let local_result = check_execution_proof(&local_executor, &RemoteCallRequest { block: test_client::runtime::Hash::default(), header: test_client::runtime::Header { diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index dd718001cd265e431e6ef84f570c8fb9f6c7c33e..22d3e8fdb7d4edfcd2c3163eaf09d7f5fcd1b802 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -21,10 +21,10 @@ use std::collections::BTreeMap; use std::marker::PhantomData; use std::future::Future; -use hash_db::{HashDB, Hasher}; -use parity_codec::{Decode, Encode}; +use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; +use codec::{Decode, Encode}; use primitives::{ChangesTrieConfiguration, convert_hash}; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, Hash, HashFor, NumberFor, SimpleArithmetic, CheckedConversion, }; @@ -333,7 +333,7 @@ impl, F> LightDataChecker FetchChecker for LightDataChecker, body: Vec ) -> ClientResult> { - // TODO: #2621 let extrinsics_root = HashFor::::ordered_trie_root(body.iter().map(Encode::encode)); if *request.header.extrinsics_root() == extrinsics_root { @@ -486,9 +485,9 @@ impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a pub mod tests { use futures::future::Ready; use parking_lot::Mutex; - use parity_codec::Decode; + use codec::Decode; use crate::client::tests::prepare_client_with_key_changes; - use executor::{self, NativeExecutionDispatch}; + use executor::{self, NativeExecutor}; use crate::error::Error as ClientError; use test_client::{ self, ClientExt, blockchain::HeaderBackend, AccountKeyring, @@ -502,7 +501,7 @@ pub mod tests { use crate::light::blockchain::tests::{DummyStorage, DummyBlockchain}; use primitives::{blake2_256, Blake2Hasher, H256}; use primitives::storage::{well_known_keys, StorageKey}; - use runtime_primitives::generic::BlockId; + use sr_primitives::generic::BlockId; use state_machine::Backend; use super::*; @@ -566,7 +565,7 @@ pub mod tests { // 'fetch' read proof from remote node let heap_pages = remote_client.storage(&remote_block_id, &StorageKey(well_known_keys::HEAP_PAGES.to_vec())) .unwrap() - .and_then(|v| Decode::decode(&mut &v.0[..])).unwrap(); + .and_then(|v| Decode::decode(&mut &v.0[..]).ok()).unwrap(); let remote_read_proof = remote_client.read_proof(&remote_block_id, well_known_keys::HEAP_PAGES).unwrap(); // check remote read proof locally @@ -578,7 +577,7 @@ pub mod tests { None, crate::backend::NewBlockState::Final, ).unwrap(); - let local_executor = test_client::LocalExecutor::new(None); + let local_executor = NativeExecutor::::new(None); let local_checker = LightDataChecker::new(Arc::new(DummyBlockchain::new(DummyStorage::new())), local_executor); (local_checker, remote_block_header, remote_read_proof, heap_pages) } @@ -604,14 +603,15 @@ pub mod tests { if insert_cht { local_storage.insert_cht_root(1, local_cht_root); } - let local_executor = test_client::LocalExecutor::new(None); + let local_executor = NativeExecutor::::new(None); let local_checker = LightDataChecker::new(Arc::new(DummyBlockchain::new(DummyStorage::new())), local_executor); (local_checker, local_cht_root, remote_block_header, remote_header_proof) } fn header_with_computed_extrinsics_root(extrinsics: Vec) -> Header { - let extrinsics_root = - trie::ordered_trie_root::(extrinsics.iter().map(Encode::encode)); + use trie::{TrieConfiguration, trie_types::Layout}; + let iter = extrinsics.iter().map(Encode::encode); + let extrinsics_root = Layout::::ordered_trie_root(iter); // only care about `extrinsics_root` Header::new(0, extrinsics_root, H256::zero(), H256::zero(), Default::default()) @@ -665,7 +665,7 @@ pub mod tests { let (remote_client, local_roots, test_cases) = prepare_client_with_key_changes(); let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(DummyStorage::new())), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); let local_checker = &local_checker as &dyn FetchChecker; let max = remote_client.info().chain.best_number; @@ -733,7 +733,7 @@ pub mod tests { local_storage.changes_tries_cht_roots.insert(0, local_cht_root); let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(local_storage)), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); // check proof on local client @@ -761,7 +761,7 @@ pub mod tests { let (remote_client, local_roots, test_cases) = prepare_client_with_key_changes(); let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(DummyStorage::new())), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); let local_checker = &local_checker as &dyn FetchChecker; let max = remote_client.info().chain.best_number; @@ -842,7 +842,7 @@ pub mod tests { // fails when changes trie CHT is missing from the local db let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(DummyStorage::new())), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); assert!(local_checker.check_changes_tries_proof(4, &remote_proof.roots, remote_proof.roots_proof.clone()).is_err()); @@ -852,7 +852,7 @@ pub mod tests { local_storage.changes_tries_cht_roots.insert(0, local_cht_root); let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(local_storage)), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); assert!(local_checker.check_changes_tries_proof(4, &remote_proof.roots, vec![]).is_err()); } @@ -866,7 +866,7 @@ pub mod tests { let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(DummyStorage::new())), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); let body_request = RemoteBodyRequest { @@ -889,7 +889,7 @@ pub mod tests { let local_checker = TestChecker::new( Arc::new(DummyBlockchain::new(DummyStorage::new())), - test_client::LocalExecutor::new(None) + NativeExecutor::::new(None) ); let body_request = RemoteBodyRequest { diff --git a/core/client/src/light/mod.rs b/core/client/src/light/mod.rs index 2cdcaf49907ac9c8d2abce6843ff0badb48492b0..89d3c60ddc3727f7fb67ef8b1c332b92ed12d4b3 100644 --- a/core/client/src/light/mod.rs +++ b/core/client/src/light/mod.rs @@ -25,8 +25,8 @@ use std::sync::Arc; use executor::RuntimeInfo; use primitives::{H256, Blake2Hasher}; -use runtime_primitives::BuildStorage; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::BuildStorage; +use sr_primitives::traits::Block as BlockT; use state_machine::CodeExecutor; use crate::call_executor::LocalCallExecutor; @@ -73,7 +73,7 @@ pub fn new_light( E: CodeExecutor + RuntimeInfo, { let remote_executor = RemoteCallExecutor::new(backend.blockchain().clone(), fetcher); - let local_executor = LocalCallExecutor::new(backend.clone(), code_executor); + let local_executor = LocalCallExecutor::new(backend.clone(), code_executor, None); let executor = RemoteOrLocalCallExecutor::new(backend.clone(), remote_executor, local_executor); Client::new(backend, executor, genesis_storage, Default::default()) } diff --git a/core/client/src/notifications.rs b/core/client/src/notifications.rs index bfd97df95c12d808663923550e50e568f7de6e2e..0ddc4c72cdb5530aba3570a2586a3132a353df24 100644 --- a/core/client/src/notifications.rs +++ b/core/client/src/notifications.rs @@ -24,7 +24,7 @@ use std::{ use fnv::{FnvHashSet, FnvHashMap}; use futures::channel::mpsc; use primitives::storage::{StorageKey, StorageData}; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; /// Storage change set #[derive(Debug)] @@ -307,7 +307,7 @@ impl StorageNotifications { #[cfg(test)] mod tests { - use runtime_primitives::testing::{H256 as Hash, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::testing::{H256 as Hash, Block as RawBlock, ExtrinsicWrapper}; use super::*; use std::iter::{empty, Empty}; diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index d14907f162bbfbc73267e1c6baf91b40c8fd41c2..ed5c9fad48dc3dc4968cd7a154d2d442445a36de 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -23,7 +23,7 @@ pub use state_machine::OverlayedChanges; #[cfg(feature = "std")] pub use primitives::NativeOrEncoded; #[doc(hidden)] -pub use runtime_primitives::{ +pub use sr_primitives::{ traits::{ Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, Header as HeaderT, ApiRef, RuntimeApiInfo, Hash as HashT, @@ -39,7 +39,7 @@ pub use rstd::{slice, mem}; #[cfg(feature = "std")] use rstd::result; #[doc(hidden)] -pub use parity_codec::{Encode, Decode}; +pub use codec::{Encode, Decode}; #[cfg(feature = "std")] use crate::error; use sr_api_macros::decl_runtime_apis; diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index 03ddf79be3418fde50053aa48fdf9ba1de15d51a..d6ce48841b8592514dffce78ee340202a175f3e9 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -6,8 +6,9 @@ description = "Aura consensus algorithm for substrate" edition = "2018" [dependencies] -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } primitives = { package = "substrate-primitives", path = "../../primitives" } +app-crypto = { package = "substrate-application-crypto", path = "../../application-crypto" } runtime_support = { package = "srml-support", path = "../../../srml/support" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } @@ -17,15 +18,16 @@ inherents = { package = "substrate-inherents", path = "../../inherents" } srml-aura = { path = "../../../srml/aura" } client = { package = "substrate-client", path = "../../client" } substrate-telemetry = { path = "../../telemetry" } +keystore = { package = "substrate-keystore", path = "../../keystore" } consensus_common = { package = "substrate-consensus-common", path = "../common" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } -futures = "0.1.17" -tokio-timer = "0.2.11" -parking_lot = "0.8.0" +sr-primitives = { path = "../../sr-primitives" } +futures-preview = { version = "=0.3.0-alpha.17", features = ["compat"] } +futures01 = { package = "futures", version = "0.1" } +futures-timer = "0.2.1" +parking_lot = "0.9.0" log = "0.4" [dev-dependencies] -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } keyring = { package = "substrate-keyring", path = "../../keyring" } substrate-executor = { path = "../../executor" } network = { package = "substrate-network", path = "../../network", features = ["test-helpers"]} @@ -33,3 +35,4 @@ service = { package = "substrate-service", path = "../../service" } test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } tokio = "0.1.7" env_logger = "0.6" +tempfile = "3.1" diff --git a/core/consensus/aura/primitives/Cargo.toml b/core/consensus/aura/primitives/Cargo.toml index bc51c90d8c7e0450c15fc62cb20a29382778c01c..ac2c2c791b2b1920f656a3f90bba926afbbaa1fd 100644 --- a/core/consensus/aura/primitives/Cargo.toml +++ b/core/consensus/aura/primitives/Cargo.toml @@ -6,18 +6,18 @@ description = "Primitives for Aura consensus" edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } substrate-client = { path = "../../../client", default-features = false } -substrate-primitives = { path = "../../../primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../../../application-crypto", default-features = false } rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } +sr-primitives = { path = "../../../sr-primitives", default-features = false } [features] default = ["std"] std = [ "rstd/std", - "parity-codec/std", - "runtime_primitives/std", + "codec/std", + "sr-primitives/std", "substrate-client/std", - "substrate-primitives/std", + "app-crypto/std", ] diff --git a/core/consensus/aura/primitives/src/lib.rs b/core/consensus/aura/primitives/src/lib.rs index 47b1399a677f420fcc18f5efad733d10d3cb82f0..070eb6c6a91a44d0c93e66d7317616a1a3ea4366 100644 --- a/core/consensus/aura/primitives/src/lib.rs +++ b/core/consensus/aura/primitives/src/lib.rs @@ -18,10 +18,44 @@ #![cfg_attr(not(feature = "std"), no_std)] -use parity_codec::{Encode, Decode, Codec}; +use codec::{Encode, Decode, Codec}; use substrate_client::decl_runtime_apis; use rstd::vec::Vec; -use runtime_primitives::ConsensusEngineId; +use sr_primitives::ConsensusEngineId; + +mod app_sr25519 { + use app_crypto::{app_crypto, key_types::AURA, sr25519}; + app_crypto!(sr25519, AURA); +} + +pub mod sr25519 { + /// An Aura authority keypair using S/R 25519 as its crypto. + #[cfg(feature = "std")] + pub type AuthorityPair = super::app_sr25519::Pair; + + /// An Aura authority signature using S/R 25519 as its crypto. + pub type AuthoritySignature = super::app_sr25519::Signature; + + /// An Aura authority identifier using S/R 25519 as its crypto. + pub type AuthorityId = super::app_sr25519::Public; +} + +mod app_ed25519 { + use app_crypto::{app_crypto, key_types::AURA, ed25519}; + app_crypto!(ed25519, AURA); +} + +pub mod ed25519 { + /// An Aura authority keypair using Ed25519 as its crypto. + #[cfg(feature = "std")] + pub type AuthorityPair = super::app_ed25519::Pair; + + /// An Aura authority signature using Ed25519 as its crypto. + pub type AuthoritySignature = super::app_ed25519::Signature; + + /// An Aura authority identifier using Ed25519 as its crypto. + pub type AuthorityId = super::app_ed25519::Public; +} /// The `ConsensusEngineId` of AuRa. pub const AURA_ENGINE_ID: ConsensusEngineId = [b'a', b'u', b'r', b'a']; diff --git a/core/consensus/aura/src/digest.rs b/core/consensus/aura/src/digest.rs index 1fe79324f4e504915412cc96e6b7e95b632eb23a..3baa18587bc7cc9c5a7df3728bed7176c3d4a952 100644 --- a/core/consensus/aura/src/digest.rs +++ b/core/consensus/aura/src/digest.rs @@ -21,8 +21,8 @@ use primitives::Pair; use aura_primitives::AURA_ENGINE_ID; -use runtime_primitives::generic::{DigestItem, OpaqueDigestItemId}; -use parity_codec::{Encode, Codec}; +use sr_primitives::generic::{DigestItem, OpaqueDigestItemId}; +use codec::{Encode, Codec}; use std::fmt::Debug; type Signature

=

::Signature; diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index b4dbd79308c65ea9e82eabfd922bf734f05c9036..74799837c4047db21259d85813b02b10b8d1bbab 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -28,33 +28,30 @@ //! //! NOTE: Aura itself is designed to be generic over the crypto used. #![forbid(missing_docs, unsafe_code)] -use std::{sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fmt::Debug}; +use std::{sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fmt::Debug, pin::Pin}; -use parity_codec::{Encode, Decode, Codec}; +use codec::{Encode, Decode, Codec}; use consensus_common::{self, BlockImport, Environment, Proposer, - ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, + ForkChoiceStrategy, BlockImportParams, BlockOrigin, Error as ConsensusError, SelectChain, well_known_cache_keys::{self, Id as CacheKeyId} }; use consensus_common::import_queue::{ Verifier, BasicQueue, BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport, }; use client::{ - block_builder::api::BlockBuilder as BlockBuilderApi, - blockchain::ProvideCache, - runtime_api::ApiExt, - error::Result as CResult, - backend::AuxStore, + block_builder::api::BlockBuilder as BlockBuilderApi, blockchain::ProvideCache, + runtime_api::ApiExt, error::Result as CResult, backend::AuxStore, BlockOf, }; -use runtime_primitives::{generic::{self, BlockId, OpaqueDigestItemId}, Justification}; -use runtime_primitives::traits::{Block as BlockT, Header, DigestItemFor, ProvideRuntimeApi, Zero, Member}; +use sr_primitives::{generic::{self, BlockId, OpaqueDigestItemId}, Justification}; +use sr_primitives::traits::{Block as BlockT, Header, DigestItemFor, ProvideRuntimeApi, Zero, Member}; -use primitives::Pair; +use primitives::crypto::Pair; use inherents::{InherentDataProviders, InherentData}; -use futures::{Future, IntoFuture, future}; +use futures::{prelude::*, future}; use parking_lot::Mutex; -use tokio_timer::Timeout; +use futures_timer::Delay; use log::{error, warn, debug, info, trace}; use srml_aura::{ @@ -66,6 +63,8 @@ use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS use slots::{CheckedHeader, SlotData, SlotWorker, SlotInfo, SlotCompatible}; use slots::{SignedDuration, check_equivocation}; +use keystore::KeyStorePtr; + pub use aura_primitives::*; pub use consensus_common::SyncOracle; pub use digest::CompatibleDigestItem; @@ -102,8 +101,10 @@ fn slot_author(slot_num: u64, authorities: &[AuthorityId

]) -> Option if authorities.is_empty() { return None } let idx = slot_num % (authorities.len() as u64); - assert!(idx <= usize::max_value() as u64, - "It is impossible to have a vector with length beyond the address space; qed"); + assert!( + idx <= usize::max_value() as u64, + "It is impossible to have a vector with length beyond the address space; qed", + ); let current_author = authorities.get(idx as usize) .expect("authorities not empty; index constrained to list length;\ @@ -128,24 +129,24 @@ impl SlotCompatible for AuraSlotCompatible { } } -/// Start the aura worker. The returned future should be run in a tokio runtime. +/// Start the aura worker. The returned future should be run in a futures executor. pub fn start_aura( slot_duration: SlotDuration, - local_key: Arc

, client: Arc, select_chain: SC, block_import: I, - env: Arc, + env: E, sync_oracle: SO, inherent_data_providers: InherentDataProviders, force_authoring: bool, -) -> Result, consensus_common::Error> where + keystore: Option, +) -> Result, consensus_common::Error> where B: BlockT, - C: ProvideRuntimeApi + ProvideCache + AuxStore + Send + Sync, + C: ProvideRuntimeApi + BlockOf + ProvideCache + AuxStore + Send + Sync, C::Api: AuraApi>, SC: SelectChain, E::Proposer: Proposer, - <>::Create as IntoFuture>::Future: Send + 'static, + >::Create: Unpin + Send + 'static, P: Pair + Send + Sync + 'static, P::Public: Hash + Member + Encode + Decode, P::Signature: Hash + Member + Encode + Decode, @@ -159,9 +160,10 @@ pub fn start_aura( client: client.clone(), block_import: Arc::new(Mutex::new(block_import)), env, - local_key, + keystore, sync_oracle: sync_oracle.clone(), force_authoring, + _key_type: PhantomData::

, }; register_aura_inherent_data_provider( &inherent_data_providers, @@ -174,25 +176,26 @@ pub fn start_aura( sync_oracle, inherent_data_providers, AuraSlotCompatible, - )) + ).map(|()| Ok::<(), ()>(())).compat()) } struct AuraWorker { client: Arc, block_import: Arc>, - env: Arc, - local_key: Arc

, + env: E, + keystore: Option, sync_oracle: SO, force_authoring: bool, + _key_type: PhantomData

, } impl SlotWorker for AuraWorker where B: BlockT, - C: ProvideRuntimeApi + ProvideCache + Sync, + C: ProvideRuntimeApi + BlockOf + ProvideCache + Sync, C::Api: AuraApi>, E: Environment, E::Proposer: Proposer, - <>::Create as IntoFuture>::Future: Send + 'static, + >::Create: Unpin + Send + 'static, H: Header, I: BlockImport + Send + Sync + 'static, P: Pair + Send + Sync + 'static, @@ -201,18 +204,15 @@ impl SlotWorker for AuraWorker w SO: SyncOracle + Send + Clone, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { - type OnSlot = Box + Send>; + type OnSlot = Pin> + Send>>; fn on_slot( - &self, + &mut self, chain_head: B::Header, slot_info: SlotInfo, ) -> Self::OnSlot { - let pair = self.local_key.clone(); - let public_key = self.local_key.public(); let client = self.client.clone(); let block_import = self.block_import.clone(); - let env = self.env.clone(); let (timestamp, slot_num, slot_duration) = (slot_info.timestamp, slot_info.number, slot_info.duration); @@ -220,54 +220,61 @@ impl SlotWorker for AuraWorker w let authorities = match authorities(client.as_ref(), &BlockId::Hash(chain_head.hash())) { Ok(authorities) => authorities, Err(e) => { - warn!( - "Unable to fetch authorities at block {:?}: {:?}", - chain_head.hash(), - e - ); - telemetry!(CONSENSUS_WARN; "aura.unable_fetching_authorities"; - "slot" => ?chain_head.hash(), "err" => ?e + warn!("Unable to fetch authorities at block {:?}: {:?}", chain_head.hash(), e); + + telemetry!( + CONSENSUS_WARN; "aura.unable_fetching_authorities"; + "slot" => ?chain_head.hash(), + "err" => ?e, ); - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); } }; if !self.force_authoring && self.sync_oracle.is_offline() && authorities.len() > 1 { debug!(target: "aura", "Skipping proposal slot. Waiting for the network."); - telemetry!(CONSENSUS_DEBUG; "aura.skipping_proposal_slot"; - "authorities_len" => authorities.len() + telemetry!( + CONSENSUS_DEBUG; + "aura.skipping_proposal_slot"; + "authorities_len" => authorities.len(), ); - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); } let maybe_author = slot_author::

(slot_num, &authorities); - let proposal_work = match maybe_author { - None => return Box::new(future::ok(())), - Some(author) => if author == &public_key { + let maybe_pair = maybe_author.and_then(|p| + self.keystore.as_ref().and_then(|k| + k.read().key_pair_by_type::

(&p, app_crypto::key_types::AURA).ok() + ) + ); + let proposal_work = match maybe_pair { + None => return Box::pin(future::ready(Ok(()))), + Some(pair) => { debug!( target: "aura", "Starting authorship at slot {}; timestamp = {}", slot_num, - timestamp + timestamp, ); telemetry!(CONSENSUS_DEBUG; "aura.starting_authorship"; - "slot_num" => slot_num, "timestamp" => timestamp + "slot_num" => slot_num, + "timestamp" => timestamp, ); // we are the slot author. make a block and sign it. - let proposer = match env.init(&chain_head) { + let mut proposer = match self.env.init(&chain_head) { Ok(p) => p, Err(e) => { warn!("Unable to author block in slot {:?}: {:?}", slot_num, e); telemetry!(CONSENSUS_WARN; "aura.unable_authoring_block"; "slot" => slot_num, "err" => ?e ); - return Box::new(future::ok(())) + return Box::pin(future::ready(Ok(()))) } }; let remaining_duration = slot_info.remaining_duration(); // deadline our production to approx. the end of the // slot - Timeout::new( + futures::future::select( proposer.propose( slot_info.inherent_data, generic::Digest { @@ -276,25 +283,26 @@ impl SlotWorker for AuraWorker w ], }, remaining_duration, - ).into_future(), - remaining_duration, - ) - } else { - return Box::new(future::ok(())); + ).map_err(|e| consensus_common::Error::ClientImport(format!("{:?}", e)).into()), + Delay::new(remaining_duration) + .map_err(|err| consensus_common::Error::FaultyTimer(err).into()) + ).map(|v| match v { + futures::future::Either::Left((v, _)) => v.map(|v| (v, pair)), + futures::future::Either::Right((Ok(_), _)) => + Err(consensus_common::Error::ClientImport("Timeout in the AuRa proposer".into())), + futures::future::Either::Right((Err(err), _)) => Err(err), + }) } }; - Box::new(proposal_work.map(move |b| { + Box::pin(proposal_work.map_ok(move |(b, pair)| { // minor hack since we don't have access to the timestamp // that is actually set by the proposer. let slot_after_building = SignedDuration::default().slot_now(slot_duration); if slot_after_building != slot_num { - info!( - "Discarding proposal for slot {}; block production took too long", - slot_num - ); + info!("Discarding proposal for slot {}; block production took too long", slot_num); telemetry!(CONSENSUS_INFO; "aura.discarding_proposal_took_too_long"; - "slot" => slot_num + "slot" => slot_num, ); return } @@ -305,7 +313,7 @@ impl SlotWorker for AuraWorker w error!(target: "aura", "FATAL ERROR: Invalid pre-digest: {}!", e); return } else { - trace!(target: "aura", "Got correct number of seals. Good!") + trace!(target: "aura", "Got correct number of seals. Good!") }; let header_num = header.number().clone(); @@ -317,7 +325,7 @@ impl SlotWorker for AuraWorker w let signature = pair.sign(header_hash.as_ref()); let signature_digest_item = as CompatibleDigestItem

>::aura_seal(signature); - let import_block: ImportBlock = ImportBlock { + let import_block: BlockImportParams = BlockImportParams { origin: BlockOrigin::Own, header, justification: None, @@ -336,24 +344,25 @@ impl SlotWorker for AuraWorker w telemetry!(CONSENSUS_INFO; "aura.pre_sealed_block"; "header_num" => ?header_num, "hash_now" => ?import_block.post_header().hash(), - "hash_previously" => ?header_hash + "hash_previously" => ?header_hash, ); if let Err(e) = block_import.lock().import_block(import_block, Default::default()) { - warn!(target: "aura", "Error with block built on {:?}: {:?}", - parent_hash, e); + warn!(target: "aura", "Error with block built on {:?}: {:?}", parent_hash, e); + telemetry!(CONSENSUS_WARN; "aura.err_with_block_built_on"; - "hash" => ?parent_hash, "err" => ?e + "hash" => ?parent_hash, "err" => ?e, ); } - }).map_err(|e| consensus_common::Error::ClientImport(format!("{:?}", e)).into())) + })) } } macro_rules! aura_err { ($($i: expr),+) => { - { debug!(target: "aura", $($i),+) - ; format!($($i),+) + { + debug!(target: "aura", $( $i ),+); + format!($( $i ),+) } }; } @@ -381,18 +390,21 @@ fn find_pre_digest(header: &B::Header) -> Result( +// FIXME #1018 needs misbehavior types. The `transaction_pool` parameter will be +// used to submit such misbehavior reports. +fn check_header( client: &C, slot_now: u64, mut header: B::Header, hash: B::Hash, authorities: &[AuthorityId

], + _transaction_pool: Option<&T>, ) -> Result)>, String> where DigestItemFor: CompatibleDigestItem

, P::Signature: Decode, C: client::backend::AuxStore, - P::Public: AsRef + Encode + Decode + PartialEq + Clone, + P::Public: Encode + Decode + PartialEq + Clone, + T: Send + Sync + 'static, { let seal = match header.digest_mut().pop() { Some(x) => x, @@ -442,13 +454,14 @@ fn check_header( } /// A verifier for Aura blocks. -pub struct AuraVerifier { +pub struct AuraVerifier { client: Arc, phantom: PhantomData

, inherent_data_providers: inherents::InherentDataProviders, + transaction_pool: Option>, } -impl AuraVerifier +impl AuraVerifier where P: Send + Sync + 'static { fn check_inherents( @@ -501,21 +514,22 @@ impl AuraVerifier } #[forbid(deprecated)] -impl Verifier for AuraVerifier where - C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore + ProvideCache, +impl Verifier for AuraVerifier where + C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore + ProvideCache + BlockOf, C::Api: BlockBuilderApi + AuraApi>, DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, - P::Public: Send + Sync + Hash + Eq + Clone + Decode + Encode + Debug + AsRef + 'static, + P::Public: Send + Sync + Hash + Eq + Clone + Decode + Encode + Debug + 'static, P::Signature: Encode + Decode, + T: Send + Sync + 'static, { fn verify( - &self, + &mut self, origin: BlockOrigin, header: B::Header, justification: Option, mut body: Option>, - ) -> Result<(ImportBlock, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { let mut inherent_data = self.inherent_data_providers.create_inherent_data().map_err(String::from)?; let (timestamp_now, slot_now, _) = AuraSlotCompatible.extract_timestamp_and_slot(&inherent_data) .map_err(|e| format!("Could not extract timestamp and slot: {:?}", e))?; @@ -527,12 +541,13 @@ impl Verifier for AuraVerifier where // we add one to allow for some small drift. // FIXME #1019 in the future, alter this queue to allow deferring of // headers - let checked_header = check_header::( + let checked_header = check_header::( &self.client, slot_now + 1, header, hash, &authorities[..], + self.transaction_pool.as_ref().map(|x| &**x), )?; match checked_header { CheckedHeader::Checked(pre_header, (slot_num, seal)) => { @@ -578,7 +593,7 @@ impl Verifier for AuraVerifier where _ => None, }); - let import_block = ImportBlock { + let import_block = BlockImportParams { origin, header: pre_header, post_digests: vec![seal], @@ -605,7 +620,7 @@ impl Verifier for AuraVerifier where fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where A: Codec, B: BlockT, - C: ProvideRuntimeApi + ProvideCache, + C: ProvideRuntimeApi + BlockOf + ProvideCache, C::Api: AuraApi, { // no cache => no initialization @@ -618,7 +633,7 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusErro let genesis_id = BlockId::Number(Zero::zero()); let genesis_authorities: Option> = cache .get_at(&well_known_cache_keys::AUTHORITIES, &genesis_id) - .and_then(|v| Decode::decode(&mut &v[..])); + .and_then(|v| Decode::decode(&mut &v[..]).ok()); if genesis_authorities.is_some() { return Ok(()); } @@ -639,14 +654,14 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusErro fn authorities(client: &C, at: &BlockId) -> Result, ConsensusError> where A: Codec, B: BlockT, - C: ProvideRuntimeApi + ProvideCache, + C: ProvideRuntimeApi + BlockOf + ProvideCache, C::Api: AuraApi, { client .cache() .and_then(|cache| cache .get_at(&well_known_cache_keys::AUTHORITIES, at) - .and_then(|v| Decode::decode(&mut &v[..])) + .and_then(|v| Decode::decode(&mut &v[..]).ok()) ) .or_else(|| AuraApi::authorities(&*client.runtime_api(), at).ok()) .ok_or_else(|| consensus_common::Error::InvalidAuthoritiesSet.into()) @@ -671,32 +686,33 @@ fn register_aura_inherent_data_provider( } /// Start an import queue for the Aura consensus algorithm. -pub fn import_queue( +pub fn import_queue( slot_duration: SlotDuration, block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, client: Arc, inherent_data_providers: InherentDataProviders, + transaction_pool: Option>, ) -> Result, consensus_common::Error> where B: BlockT, - C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore, + C: 'static + ProvideRuntimeApi + BlockOf + ProvideCache + Send + Sync + AuxStore, C::Api: BlockBuilderApi + AuraApi>, DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, - P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode + AsRef, + P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode, P::Signature: Encode + Decode, + T: Send + Sync + 'static, { register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; initialize_authorities_cache(&*client)?; - let verifier = Arc::new( - AuraVerifier { - client: client.clone(), - inherent_data_providers, - phantom: PhantomData, - } - ); + let verifier = AuraVerifier { + client: client.clone(), + inherent_data_providers, + phantom: PhantomData, + transaction_pool, + }; Ok(BasicQueue::new( verifier, block_import, @@ -708,19 +724,17 @@ pub fn import_queue( #[cfg(test)] mod tests { use super::*; - use futures::{Async, stream::Stream as _}; - use futures03::{StreamExt as _, TryStreamExt as _}; use consensus_common::NoNetwork as DummyOracle; use network::test::*; use network::test::{Block as TestBlock, PeersClient, PeersFullClient}; - use runtime_primitives::traits::{Block as BlockT, DigestFor}; + use sr_primitives::traits::{Block as BlockT, DigestFor}; use network::config::ProtocolConfig; use parking_lot::Mutex; use tokio::runtime::current_thread; use keyring::sr25519::Keyring; - use primitives::sr25519; use client::{LongestChain, BlockchainEvents}; use test_client; + use aura_primitives::sr25519::AuthorityPair; type Error = client::error::Error; @@ -738,7 +752,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &::Header) + fn init(&mut self, parent_header: &::Header) -> Result { Ok(DummyProposer(parent_header.number + 1, self.0.clone())) @@ -747,19 +761,20 @@ mod tests { impl Proposer for DummyProposer { type Error = Error; - type Create = Result; + type Create = future::Ready>; fn propose( - &self, + &mut self, _: InherentData, digests: DigestFor, _: Duration, - ) -> Result { - self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) + ) -> Self::Create { + let r = self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()); + future::ready(r) } } - const SLOT_DURATION: u64 = 1; + const SLOT_DURATION: u64 = 1000; pub struct AuraTestNet { peers: Vec>, @@ -767,7 +782,7 @@ mod tests { impl TestNetFactory for AuraTestNet { type Specialization = DummySpecialization; - type Verifier = AuraVerifier; + type Verifier = AuraVerifier; type PeerData = (); /// Create new test network with peers and given config. @@ -778,7 +793,7 @@ mod tests { } fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) - -> Arc + -> Self::Verifier { match client { PeersClient::Full(client) => { @@ -791,11 +806,12 @@ mod tests { ).expect("Registers aura inherent data provider"); assert_eq!(slot_duration.get(), SLOT_DURATION); - Arc::new(AuraVerifier { + AuraVerifier { client, inherent_data_providers, + transaction_pool: Default::default(), phantom: Default::default(), - }) + } }, PeersClient::Light(_) => unreachable!("No (yet) tests for light client + Aura"), } @@ -817,7 +833,7 @@ mod tests { #[test] #[allow(deprecated)] fn authoring_blocks() { - let _ = ::env_logger::try_init(); + let _ = env_logger::try_init(); let net = AuraTestNet::new(3); let peers = &[ @@ -830,18 +846,25 @@ mod tests { let mut import_notifications = Vec::new(); let mut runtime = current_thread::Runtime::new().unwrap(); + let mut keystore_paths = Vec::new(); for (peer_id, key) in peers { + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = keystore::Store::open(keystore_path.path(), None).expect("Creates keystore."); + + keystore.write().insert_ephemeral_from_seed::(&key.to_seed()) + .expect("Creates authority key"); + keystore_paths.push(keystore_path); + let client = net.lock().peer(*peer_id).client().as_full().expect("full clients are created").clone(); #[allow(deprecated)] let select_chain = LongestChain::new( client.backend().clone(), ); - let environ = Arc::new(DummyFactory(client.clone())); + let environ = DummyFactory(client.clone()); import_notifications.push( client.import_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) - .for_each(move |_| Ok(())) + .take_while(|n| future::ready(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) + .for_each(move |_| future::ready(())) ); let slot_duration = SlotDuration::get_or_compute(&*client) @@ -852,28 +875,28 @@ mod tests { &inherent_data_providers, slot_duration.get() ).expect("Registers aura inherent data provider"); - let aura = start_aura::<_, _, _, _, _, sr25519::Pair, _, _, _>( + let aura = start_aura::<_, _, _, _, _, AuthorityPair, _, _, _>( slot_duration, - Arc::new(key.clone().into()), client.clone(), select_chain, client, - environ.clone(), + environ, DummyOracle, inherent_data_providers, false, + Some(keystore), ).expect("Starts aura"); runtime.spawn(aura); } - // wait for all finalized on each. - let wait_for = ::futures::future::join_all(import_notifications) - .map(|_| ()) - .map_err(|_| ()); + runtime.spawn(futures01::future::poll_fn(move || { + net.lock().poll(); + Ok::<_, ()>(futures01::Async::NotReady::<()>) + })); - let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); - let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + runtime.block_on(future::join_all(import_notifications) + .map(|_| Ok::<(), ()>(())).compat()).unwrap(); } #[test] @@ -882,9 +905,9 @@ mod tests { assert_eq!(client.info().chain.best_number, 0); assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ - Keyring::Alice.into(), - Keyring::Bob.into(), - Keyring::Charlie.into() + Keyring::Alice.public().into(), + Keyring::Bob.public().into(), + Keyring::Charlie.public().into() ]); } } diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 29c706dd132c49b60d1b496012196a3e0d88afbd..9490887ba34bced36527613052f78164da18c1bb 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -6,29 +6,36 @@ description = "BABE consensus algorithm for substrate" edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } babe_primitives = { package = "substrate-consensus-babe-primitives", path = "primitives" } primitives = { package = "substrate-primitives", path = "../../primitives" } -runtime_support = { package = "srml-support", path = "../../../srml/support" } -runtime_version = { package = "sr-version", path = "../../sr-version" } -runtime_io = { package = "sr-io", path = "../../sr-io" } +app-crypto = { package = "substrate-application-crypto", path = "../../application-crypto" } +num-bigint = "0.2" +num-rational = "0.2" +num-traits = "0.2" +runtime-support = { package = "srml-support", path = "../../../srml/support" } +runtime-version = { package = "sr-version", path = "../../sr-version" } +runtime-io = { package = "sr-io", path = "../../sr-io" } inherents = { package = "substrate-inherents", path = "../../inherents" } substrate-telemetry = { path = "../../telemetry" } +keystore = { package = "substrate-keystore", path = "../../keystore" } srml-babe = { path = "../../../srml/babe" } client = { package = "substrate-client", path = "../../client" } -consensus_common = { package = "substrate-consensus-common", path = "../common" } +consensus-common = { package = "substrate-consensus-common", path = "../common" } +uncles = { package = "substrate-consensus-uncles", path = "../uncles" } slots = { package = "substrate-consensus-slots", path = "../slots" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } -futures = "0.1.26" -tokio-timer = "0.2.11" -parking_lot = "0.8.0" +sr-primitives = { path = "../../sr-primitives" } +fork-tree = { path = "../../utils/fork-tree" } +futures-preview = { version = "=0.3.0-alpha.17", features = ["compat"] } +futures01 = { package = "futures", version = "0.1" } +futures-timer = "0.2.1" +parking_lot = "0.9.0" log = "0.4.6" -schnorrkel = "0.1.1" +schnorrkel = { version = "0.8.4", features = ["preaudit_deprecated"] } rand = "0.6.5" merlin = "1.0.3" [dev-dependencies] -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } keyring = { package = "substrate-keyring", path = "../../keyring" } substrate-executor = { path = "../../executor" } network = { package = "substrate-network", path = "../../network", features = ["test-helpers"]} @@ -36,3 +43,7 @@ service = { package = "substrate-service", path = "../../service" } test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } tokio = "0.1.18" env_logger = "0.6.1" +tempfile = "3.1" + +[features] +test-helpers = [] diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index a41fdeac5acf7bf7d82f26ee036862671bb3a0dc..5f7fbe4fd812944ad992fd73b26b08e5bc35f49e 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -8,17 +8,20 @@ edition = "2018" [dependencies] substrate-client = { path = "../../../client", default-features = false } rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } -substrate-primitives = { path = "../../../primitives", default-features = false } +sr-primitives = { path = "../../../sr-primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../../../application-crypto", default-features = false } slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } -parity-codec = { version = "4.1.1", default-features = false } +schnorrkel = { version = "0.8.4", features = ["preaudit_deprecated"], optional = true } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } [features] default = ["std"] std = [ "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", "substrate-client/std", - "parity-codec/std", + "codec/std", + "schnorrkel", "slots", + "app-crypto/std", ] diff --git a/core/consensus/babe/primitives/src/digest.rs b/core/consensus/babe/primitives/src/digest.rs new file mode 100644 index 0000000000000000000000000000000000000000..3b6e3221bd8a87ab5aa1fe399c4ba5e8edb44e5e --- /dev/null +++ b/core/consensus/babe/primitives/src/digest.rs @@ -0,0 +1,177 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Private implementation details of BABE digests. + +#[cfg(feature = "std")] +use super::AuthoritySignature; +#[cfg(feature = "std")] +use super::{BABE_ENGINE_ID, Epoch}; +#[cfg(not(feature = "std"))] +use super::{VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}; +use super::SlotNumber; +#[cfg(feature = "std")] +use sr_primitives::{DigestItem, generic::OpaqueDigestItemId}; +#[cfg(feature = "std")] +use std::fmt::Debug; +use codec::{Decode, Encode}; +#[cfg(feature = "std")] +use codec::{Codec, Input, Error}; +#[cfg(feature = "std")] +use schnorrkel::{ + SignatureError, errors::MultiSignatureStage, + vrf::{VRFProof, VRFOutput, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH} +}; + +/// A BABE pre-digest +#[cfg(feature = "std")] +#[derive(Clone, Debug)] +pub struct BabePreDigest { + /// VRF output + pub vrf_output: VRFOutput, + /// VRF proof + pub vrf_proof: VRFProof, + /// Authority index + pub authority_index: super::AuthorityIndex, + /// Slot number + pub slot_number: SlotNumber, +} + +/// The prefix used by BABE for its VRF keys. +pub const BABE_VRF_PREFIX: &'static [u8] = b"substrate-babe-vrf"; + +/// A raw version of `BabePreDigest`, usable on `no_std`. +#[derive(Copy, Clone, Encode, Decode)] +pub struct RawBabePreDigest { + /// Slot number + pub slot_number: SlotNumber, + /// Authority index + pub authority_index: super::AuthorityIndex, + /// VRF output + pub vrf_output: [u8; VRF_OUTPUT_LENGTH], + /// VRF proof + pub vrf_proof: [u8; VRF_PROOF_LENGTH], +} + +#[cfg(feature = "std")] +impl Encode for BabePreDigest { + fn encode(&self) -> Vec { + let tmp = RawBabePreDigest { + vrf_output: *self.vrf_output.as_bytes(), + vrf_proof: self.vrf_proof.to_bytes(), + authority_index: self.authority_index, + slot_number: self.slot_number, + }; + codec::Encode::encode(&tmp) + } +} + +#[cfg(feature = "std")] +impl codec::EncodeLike for BabePreDigest {} + +#[cfg(feature = "std")] +impl Decode for BabePreDigest { + fn decode(i: &mut R) -> Result { + let RawBabePreDigest { vrf_output, vrf_proof, authority_index, slot_number } = Decode::decode(i)?; + + // Verify (at compile time) that the sizes in babe_primitives are correct + let _: [u8; super::VRF_OUTPUT_LENGTH] = vrf_output; + let _: [u8; super::VRF_PROOF_LENGTH] = vrf_proof; + Ok(BabePreDigest { + vrf_proof: VRFProof::from_bytes(&vrf_proof) + .map_err(convert_error)?, + vrf_output: VRFOutput::from_bytes(&vrf_output) + .map_err(convert_error)?, + authority_index, + slot_number, + }) + } +} + +/// A digest item which is usable with BABE consensus. +#[cfg(feature = "std")] +pub trait CompatibleDigestItem: Sized { + /// Construct a digest item which contains a BABE pre-digest. + fn babe_pre_digest(seal: BabePreDigest) -> Self; + + /// If this item is an BABE pre-digest, return it. + fn as_babe_pre_digest(&self) -> Option; + + /// Construct a digest item which contains a BABE seal. + fn babe_seal(signature: AuthoritySignature) -> Self; + + /// If this item is a BABE signature, return the signature. + fn as_babe_seal(&self) -> Option; + + /// If this item is a BABE epoch, return it. + fn as_babe_epoch(&self) -> Option; +} + +#[cfg(feature = "std")] +impl CompatibleDigestItem for DigestItem where + Hash: Debug + Send + Sync + Eq + Clone + Codec + 'static +{ + fn babe_pre_digest(digest: BabePreDigest) -> Self { + DigestItem::PreRuntime(BABE_ENGINE_ID, digest.encode()) + } + + fn as_babe_pre_digest(&self) -> Option { + self.try_to(OpaqueDigestItemId::PreRuntime(&BABE_ENGINE_ID)) + } + + fn babe_seal(signature: AuthoritySignature) -> Self { + DigestItem::Seal(BABE_ENGINE_ID, signature.encode()) + } + + fn as_babe_seal(&self) -> Option { + self.try_to(OpaqueDigestItemId::Seal(&BABE_ENGINE_ID)) + } + + fn as_babe_epoch(&self) -> Option { + self.try_to(OpaqueDigestItemId::Consensus(&BABE_ENGINE_ID)) + } +} + +#[cfg(feature = "std")] +fn convert_error(e: SignatureError) -> codec::Error { + use SignatureError::*; + use MultiSignatureStage::*; + match e { + EquationFalse => "Signature error: `EquationFalse`".into(), + PointDecompressionError => "Signature error: `PointDecompressionError`".into(), + ScalarFormatError => "Signature error: `ScalarFormatError`".into(), + NotMarkedSchnorrkel => "Signature error: `NotMarkedSchnorrkel`".into(), + BytesLengthError { .. } => "Signature error: `BytesLengthError`".into(), + MuSigAbsent { musig_stage: Commitment } => + "Signature error: `MuSigAbsent` at stage `Commitment`".into(), + MuSigAbsent { musig_stage: Reveal } => + "Signature error: `MuSigAbsent` at stage `Reveal`".into(), + MuSigAbsent { musig_stage: Cosignature } => + "Signature error: `MuSigAbsent` at stage `Commitment`".into(), + MuSigInconsistent { musig_stage: Commitment, duplicate: true } => + "Signature error: `MuSigInconsistent` at stage `Commitment` on duplicate".into(), + MuSigInconsistent { musig_stage: Commitment, duplicate: false } => + "Signature error: `MuSigInconsistent` at stage `Commitment` on not duplicate".into(), + MuSigInconsistent { musig_stage: Reveal, duplicate: true } => + "Signature error: `MuSigInconsistent` at stage `Reveal` on duplicate".into(), + MuSigInconsistent { musig_stage: Reveal, duplicate: false } => + "Signature error: `MuSigInconsistent` at stage `Reveal` on not duplicate".into(), + MuSigInconsistent { musig_stage: Cosignature, duplicate: true } => + "Signature error: `MuSigInconsistent` at stage `Cosignature` on duplicate".into(), + MuSigInconsistent { musig_stage: Cosignature, duplicate: false } => + "Signature error: `MuSigInconsistent` at stage `Cosignature` on not duplicate".into(), + } +} diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index 655751b7633b68b9f5ac0ad769e9be70f56a814a..f4da908080c8b524112827ba935fde7d1c8f1ac5 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -15,18 +15,37 @@ // along with Substrate. If not, see . //! Primitives for BABE. -#![deny(warnings, unsafe_code, missing_docs)] +#![deny(warnings)] +#![forbid(unsafe_code, missing_docs, unused_variables, unused_imports)] #![cfg_attr(not(feature = "std"), no_std)] -use parity_codec::{Encode, Decode}; +mod digest; + +use codec::{Encode, Decode}; use rstd::vec::Vec; -use runtime_primitives::ConsensusEngineId; -use substrate_primitives::sr25519::Public; +use sr_primitives::ConsensusEngineId; use substrate_client::decl_runtime_apis; +#[cfg(feature = "std")] +pub use digest::{BabePreDigest, CompatibleDigestItem}; +pub use digest::{BABE_VRF_PREFIX, RawBabePreDigest}; + +mod app { + use app_crypto::{app_crypto, key_types::BABE, sr25519}; + app_crypto!(sr25519, BABE); +} + +/// A Babe authority keypair. Necessarily equivalent to the schnorrkel public key used in +/// the main Babe module. If that ever changes, then this must, too. +#[cfg(feature = "std")] +pub type AuthorityPair = app::Pair; + +/// A Babe authority signature. +pub type AuthoritySignature = app::Signature; + /// A Babe authority identifier. Necessarily equivalent to the schnorrkel public key used in /// the main Babe module. If that ever changes, then this must, too. -pub type AuthorityId = Public; +pub type AuthorityId = app::Public; /// The `ConsensusEngineId` of BABE. pub const BABE_ENGINE_ID: ConsensusEngineId = *b"BABE"; @@ -41,23 +60,41 @@ pub const VRF_PROOF_LENGTH: usize = 64; pub const PUBLIC_KEY_LENGTH: usize = 32; /// The index of an authority. -pub type AuthorityIndex = u64; +pub type AuthorityIndex = u32; /// A slot number. pub type SlotNumber = u64; /// The weight of an authority. -pub type Weight = u64; +// NOTE: we use a unique name for the weight to avoid conflicts with other +// `Weight` types, since the metadata isn't able to disambiguate. +pub type BabeWeight = u64; + +/// BABE epoch information +#[derive(Decode, Encode, Default, PartialEq, Eq, Clone)] +#[cfg_attr(any(feature = "std", test), derive(Debug))] +pub struct Epoch { + /// The epoch index + pub epoch_index: u64, + /// The starting slot of the epoch, + pub start_slot: u64, + /// The duration of this epoch + pub duration: SlotNumber, + /// The authorities and their weights + pub authorities: Vec<(AuthorityId, BabeWeight)>, + /// Randomness for this epoch + pub randomness: [u8; VRF_OUTPUT_LENGTH], +} /// An consensus log item for BABE. -#[derive(Decode, Encode)] +#[derive(Decode, Encode, Clone, PartialEq, Eq)] pub enum ConsensusLog { /// The epoch has changed. This provides information about the /// epoch _after_ next: what slot number it will start at, who are the authorities (and their weights) /// and the next epoch randomness. The information for the _next_ epoch should already /// be available. #[codec(index = "1")] - NextEpochData(SlotNumber, Vec<(AuthorityId, Weight)>, [u8; VRF_OUTPUT_LENGTH]), + NextEpochData(Epoch), /// Disable the authority with given index. #[codec(index = "2")] OnDisabled(AuthorityIndex), @@ -72,17 +109,13 @@ pub struct BabeConfiguration { /// Dynamic slot duration may be supported in the future. pub slot_duration: u64, - /// The expected block time in milliseconds for BABE. Currently, - /// only the value provided by this type at genesis will be used. - /// - /// Dynamic expected block time may be supported in the future. - pub expected_block_time: u64, - - /// The maximum permitted VRF output, or *threshold*, for BABE. Currently, - /// only the value provided by this type at genesis will be used. - /// - /// Dynamic thresholds may be supported in the future. - pub threshold: u64, + /// A constant value that is used in the threshold calculation formula. + /// Expressed as a fraction where the first member of the tuple is the + /// numerator and the second is the denominator. The fraction should + /// represent a value between 0 and 1. + /// In the threshold formula calculation, `1 - c` represents the probability + /// of a slot being empty. + pub c: (u64, u64), /// The minimum number of blocks that must be received before running the /// median algorithm to compute the offset between the on-chain time and the @@ -116,7 +149,7 @@ decl_runtime_apis! { /// Dynamic configuration may be supported in the future. fn startup_data() -> BabeConfiguration; - /// Get the current authorites for Babe. - fn authorities() -> Vec; + /// Get the current epoch data for Babe. + fn epoch() -> Epoch; } } diff --git a/core/consensus/babe/src/aux_schema.rs b/core/consensus/babe/src/aux_schema.rs new file mode 100644 index 0000000000000000000000000000000000000000..ac90b4ce52dc4357ab64f62e044ecde5004321c3 --- /dev/null +++ b/core/consensus/babe/src/aux_schema.rs @@ -0,0 +1,71 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Schema for BABE epoch changes in the aux-db. + +use log::info; +use codec::{Decode, Encode}; + +use client::backend::AuxStore; +use client::error::{Result as ClientResult, Error as ClientError}; +use sr_primitives::traits::Block as BlockT; + +use super::{EpochChanges, SharedEpochChanges}; + +const BABE_EPOCH_CHANGES: &[u8] = b"babe_epoch_changes"; + +fn load_decode(backend: &B, key: &[u8]) -> ClientResult> + where + B: AuxStore, + T: Decode, +{ + let corrupt = |e: codec::Error| { + ClientError::Backend(format!("BABE DB is corrupted. Decode error: {}", e.what())).into() + }; + match backend.get_aux(key)? { + None => Ok(None), + Some(t) => T::decode(&mut &t[..]).map(Some).map_err(corrupt) + } +} + +/// Load or initialize persistent epoch change data from backend. +pub(crate) fn load_epoch_changes( + backend: &B, +) -> ClientResult> { + let epoch_changes = load_decode::<_, EpochChanges>(backend, BABE_EPOCH_CHANGES)? + .map(Into::into) + .unwrap_or_else(|| { + info!(target: "babe", + "Creating empty BABE epoch changes on what appears to be first startup." + ); + SharedEpochChanges::new() + }); + + Ok(epoch_changes) +} + +/// Update the epoch changes on disk after a change. +pub(crate) fn write_epoch_changes( + epoch_changes: &EpochChanges, + write_aux: F, +) -> R where + F: FnOnce(&[(&'static [u8], &[u8])]) -> R, +{ + let encoded_epoch_changes = epoch_changes.encode(); + write_aux( + &[(BABE_EPOCH_CHANGES, encoded_epoch_changes.as_slice())], + ) +} diff --git a/core/consensus/babe/src/digest.rs b/core/consensus/babe/src/digest.rs deleted file mode 100644 index 37ba27a309eb28d4c62391453188d1b34a0046d2..0000000000000000000000000000000000000000 --- a/core/consensus/babe/src/digest.rs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Private implementation details of BABE digests. - -use primitives::sr25519::Signature; -use babe_primitives::{self, BABE_ENGINE_ID, SlotNumber}; -use runtime_primitives::{DigestItem, generic::OpaqueDigestItemId}; -use std::fmt::Debug; -use parity_codec::{Decode, Encode, Codec, Input}; -use schnorrkel::{vrf::{VRFProof, VRFOutput, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}}; - -/// A BABE pre-digest. It includes: -/// -/// * The public key of the author. -/// * The VRF proof. -/// * The VRF output. -/// * The slot number. -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct BabePreDigest { - pub(super) vrf_output: VRFOutput, - pub(super) proof: VRFProof, - pub(super) index: babe_primitives::AuthorityIndex, - pub(super) slot_num: SlotNumber, -} - -/// The prefix used by BABE for its VRF keys. -pub const BABE_VRF_PREFIX: &'static [u8] = b"substrate-babe-vrf"; - -type RawBabePreDigest = ( - [u8; VRF_OUTPUT_LENGTH], - [u8; VRF_PROOF_LENGTH], - u64, - u64, -); - -impl Encode for BabePreDigest { - fn encode(&self) -> Vec { - let tmp: RawBabePreDigest = ( - *self.vrf_output.as_bytes(), - self.proof.to_bytes(), - self.index, - self.slot_num, - ); - parity_codec::Encode::encode(&tmp) - } -} - -impl Decode for BabePreDigest { - fn decode(i: &mut R) -> Option { - let (output, proof, index, slot_num): RawBabePreDigest = Decode::decode(i)?; - - // Verify (at compile time) that the sizes in babe_primitives are correct - let _: [u8; babe_primitives::VRF_OUTPUT_LENGTH] = output; - let _: [u8; babe_primitives::VRF_PROOF_LENGTH] = proof; - Some(BabePreDigest { - proof: VRFProof::from_bytes(&proof).ok()?, - vrf_output: VRFOutput::from_bytes(&output).ok()?, - index, - slot_num, - }) - } -} - -/// A digest item which is usable with BABE consensus. -pub trait CompatibleDigestItem: Sized { - /// Construct a digest item which contains a BABE pre-digest. - fn babe_pre_digest(seal: BabePreDigest) -> Self; - - /// If this item is an BABE pre-digest, return it. - fn as_babe_pre_digest(&self) -> Option; - - /// Construct a digest item which contains a BABE seal. - fn babe_seal(signature: Signature) -> Self; - - /// If this item is a BABE signature, return the signature. - fn as_babe_seal(&self) -> Option; -} - -impl CompatibleDigestItem for DigestItem where - Hash: Debug + Send + Sync + Eq + Clone + Codec + 'static -{ - fn babe_pre_digest(digest: BabePreDigest) -> Self { - DigestItem::PreRuntime(BABE_ENGINE_ID, digest.encode()) - } - - fn as_babe_pre_digest(&self) -> Option { - self.try_to(OpaqueDigestItemId::PreRuntime(&BABE_ENGINE_ID)) - } - - fn babe_seal(signature: Signature) -> Self { - DigestItem::Seal(BABE_ENGINE_ID, signature.encode()) - } - - fn as_babe_seal(&self) -> Option { - self.try_to(OpaqueDigestItemId::Seal(&BABE_ENGINE_ID)) - } -} diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index e1279479d9fb69854d08043fcfac58a44f098500..e46594dd1e8761ec4cff8abf447e8d154b1926b5 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -17,34 +17,27 @@ //! # BABE consensus //! //! BABE (Blind Assignment for Blockchain Extension) consensus in Substrate. -//! -//! # Stability -//! -//! This crate is highly unstable and experimental. Breaking changes may -//! happen at any point. This crate is also missing features, such as banning -//! of malicious validators, that are essential for a production network. -#![forbid(unsafe_code, missing_docs, unused_must_use)] -#![cfg_attr(not(test), forbid(dead_code))] -extern crate core; -mod digest; -use digest::CompatibleDigestItem; -pub use digest::{BabePreDigest, BABE_VRF_PREFIX}; + +#![forbid(unsafe_code, missing_docs)] pub use babe_primitives::*; pub use consensus_common::SyncOracle; +use std::{collections::HashMap, sync::Arc, u64, fmt::{Debug, Display}, pin::Pin, time::{Instant, Duration}}; +use babe_primitives; +use consensus_common::ImportResult; use consensus_common::import_queue::{ - BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport, + BoxJustificationImport, BoxFinalityProofImport, }; use consensus_common::well_known_cache_keys::Id as CacheKeyId; -use runtime_primitives::{generic, generic::{BlockId, OpaqueDigestItemId}, Justification}; -use runtime_primitives::traits::{ - Block as BlockT, Header, DigestItemFor, ProvideRuntimeApi, +use sr_primitives::{generic, generic::{BlockId, OpaqueDigestItemId}, Justification}; +use sr_primitives::traits::{ + Block as BlockT, Header, DigestItemFor, NumberFor, ProvideRuntimeApi, SimpleBitOps, Zero, }; -use std::{sync::Arc, u64, fmt::{Debug, Display}, time::{Instant, Duration}}; +use keystore::KeyStorePtr; use runtime_support::serde::{Serialize, Deserialize}; -use parity_codec::{Decode, Encode}; -use parking_lot::Mutex; -use primitives::{Pair, Public, sr25519}; +use codec::{Decode, Encode}; +use parking_lot::{Mutex, MutexGuard}; +use primitives::{Blake2Hasher, H256, Pair, Public}; use merlin::Transcript; use inherents::{InherentDataProviders, InherentData}; use substrate_telemetry::{ @@ -62,7 +55,7 @@ use schnorrkel::{ }; use consensus_common::{ self, BlockImport, Environment, Proposer, - ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, + ForkChoiceStrategy, BlockImportParams, BlockOrigin, Error as ConsensusError, }; use srml_babe::{ BabeInherentData, @@ -72,19 +65,24 @@ use consensus_common::{SelectChain, well_known_cache_keys}; use consensus_common::import_queue::{Verifier, BasicQueue}; use client::{ block_builder::api::BlockBuilder as BlockBuilderApi, - blockchain::ProvideCache, - runtime_api::ApiExt, - error::Result as CResult, - backend::AuxStore, + blockchain::{self, HeaderBackend, ProvideCache}, BlockchainEvents, CallExecutor, Client, + runtime_api::ApiExt, error::Result as ClientResult, backend::{AuxStore, Backend}, + ProvideUncles, + utils::is_descendent_of, }; +use fork_tree::ForkTree; use slots::{CheckedHeader, check_equivocation}; -use futures::{Future, IntoFuture, future}; -use tokio_timer::Timeout; +use futures::{prelude::*, future}; +use futures01::Stream as _; +use futures_timer::Delay; use log::{error, warn, debug, info, trace}; use slots::{SlotWorker, SlotData, SlotInfo, SlotCompatible, SignedDuration}; -pub use babe_primitives::AuthorityId; +mod aux_schema; +#[cfg(test)] +mod tests; +pub use babe_primitives::{AuthorityId, AuthorityPair, AuthoritySignature}; /// A slot duration. Create with `get_or_compute`. // FIXME: Once Rust has higher-kinded types, the duplication between this @@ -95,7 +93,7 @@ pub struct Config(slots::SlotDuration); impl Config { /// Either fetch the slot duration from disk or compute it from the genesis /// state. - pub fn get_or_compute(client: &C) -> CResult + pub fn get_or_compute(client: &C) -> ClientResult where C: AuxStore + ProvideRuntimeApi, C::Api: BabeApi, { @@ -114,9 +112,9 @@ impl Config { self.0.slot_duration } - /// Retrieve the threshold for BABE - pub fn threshold(&self) -> u64 { - self.0.threshold + /// Retrieve the threshold calculation constant `c`. + pub fn c(&self) -> (u64, u64) { + self.0.c } } @@ -136,13 +134,12 @@ impl SlotCompatible for BabeLink { /// Parameters for BABE. pub struct BabeParams { - - /// The configuration for BABE. Includes the slot duration, threshold, and + /// The configuration for BABE. Includes the slot duration, threshold, and /// other parameters. pub config: Config, - /// The key of the node we are running on. - pub local_key: Arc, + /// The keystore that manages the keys of the node. + pub keystore: KeyStorePtr, /// The client to use pub client: Arc, @@ -154,7 +151,7 @@ pub struct BabeParams { pub block_import: I, /// The environment - pub env: Arc, + pub env: E, /// A sync oracle pub sync_oracle: SO, @@ -172,8 +169,8 @@ pub struct BabeParams { /// Start the babe worker. The returned future should be run in a tokio runtime. pub fn start_babe(BabeParams { config, - local_key, client, + keystore, select_chain, block_import, env, @@ -182,15 +179,15 @@ pub fn start_babe(BabeParams { force_authoring, time_source, }: BabeParams) -> Result< - impl Future, + impl futures01::Future, consensus_common::Error, > where B: BlockT, - C: ProvideRuntimeApi + ProvideCache, + C: ProvideRuntimeApi + ProvideCache + ProvideUncles + Send + Sync + 'static, C::Api: BabeApi, - SC: SelectChain, + SC: SelectChain + 'static, E::Proposer: Proposer, - <>::Create as IntoFuture>::Future: Send + 'static, + >::Create: Unpin + Send + 'static, H: Header, E: Environment, I: BlockImport + Send + Sync + 'static, @@ -201,30 +198,35 @@ pub fn start_babe(BabeParams { client: client.clone(), block_import: Arc::new(Mutex::new(block_import)), env, - local_key, sync_oracle: sync_oracle.clone(), force_authoring, - threshold: config.threshold(), + c: config.c(), + keystore, }; register_babe_inherent_data_provider(&inherent_data_providers, config.0.slot_duration())?; - Ok(slots::start_slot_worker::<_, _, _, _, _, _>( + uncles::register_uncles_inherent_data_provider( + client.clone(), + select_chain.clone(), + &inherent_data_providers, + )?; + Ok(slots::start_slot_worker( config.0, select_chain, worker, sync_oracle, inherent_data_providers, time_source, - )) + ).map(|()| Ok::<(), ()>(())).compat()) } struct BabeWorker { client: Arc, block_import: Arc>, - env: Arc, - local_key: Arc, + env: E, sync_oracle: SO, force_authoring: bool, - threshold: u64, + c: (u64, u64), + keystore: KeyStorePtr, } impl SlotWorker for BabeWorker where @@ -233,7 +235,7 @@ impl SlotWorker for BabeWorker w C::Api: BabeApi, E: Environment, E::Proposer: Proposer, - <>::Create as IntoFuture>::Future: Send + 'static, + >::Create: Unpin + Send + 'static, Hash: Debug + Eq + Copy + SimpleBitOps + Encode + Decode + Serialize + for<'de> Deserialize<'de> + Debug + Default + AsRef<[u8]> + AsMut<[u8]> + std::hash::Hash + Display + Send + Sync + 'static, @@ -242,22 +244,20 @@ impl SlotWorker for BabeWorker w SO: SyncOracle + Send + Clone, Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { - type OnSlot = Box + Send>; + type OnSlot = Pin> + Send>>; fn on_slot( - &self, + &mut self, chain_head: B::Header, slot_info: SlotInfo, ) -> Self::OnSlot { - let pair = self.local_key.clone(); let ref client = self.client; let block_import = self.block_import.clone(); - let ref env = self.env; - let (timestamp, slot_num, slot_duration) = + let (timestamp, slot_number, slot_duration) = (slot_info.timestamp, slot_info.number, slot_info.duration); - let authorities = match authorities(client.as_ref(), &BlockId::Hash(chain_head.hash())) { + let epoch = match epoch(client.as_ref(), &BlockId::Hash(chain_head.hash())) { Ok(authorities) => authorities, Err(e) => { error!( @@ -269,61 +269,67 @@ impl SlotWorker for BabeWorker w telemetry!(CONSENSUS_WARN; "babe.unable_fetching_authorities"; "slot" => ?chain_head.hash(), "err" => ?e ); - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); } }; + let Epoch { ref authorities, .. } = epoch; + + if authorities.is_empty() { + error!(target: "babe", "No authorities at block {:?}", chain_head.hash()); + } + if !self.force_authoring && self.sync_oracle.is_offline() && authorities.len() > 1 { debug!(target: "babe", "Skipping proposal slot. Waiting for the network."); telemetry!(CONSENSUS_DEBUG; "babe.skipping_proposal_slot"; "authorities_len" => authorities.len() ); - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); } - // FIXME replace the dummy empty slices with real data - // https://github.com/paritytech/substrate/issues/2435 - // https://github.com/paritytech/substrate/issues/2436 - let proposal_work = if let Some(((inout, proof, _batchable_proof), index)) = claim_slot( - &[0u8; 0], + let proposal_work = if let Some(claim) = claim_slot( slot_info.number, - &[0u8; 0], - 0, - &authorities, - &pair, - self.threshold, + epoch, + self.c, + &self.keystore, ) { + let ((inout, vrf_proof, _batchable_proof), authority_index, key) = claim; + debug!( target: "babe", "Starting authorship at slot {}; timestamp = {}", - slot_num, + slot_number, timestamp, ); telemetry!(CONSENSUS_DEBUG; "babe.starting_authorship"; - "slot_num" => slot_num, "timestamp" => timestamp + "slot_number" => slot_number, "timestamp" => timestamp ); // we are the slot author. make a block and sign it. - let proposer = match env.init(&chain_head) { + let mut proposer = match self.env.init(&chain_head) { Ok(p) => p, Err(e) => { - warn!(target: "babe", "Unable to author block in slot {:?}: {:?}", slot_num, e); + warn!(target: "babe", + "Unable to author block in slot {:?}: {:?}", + slot_number, + e, + ); telemetry!(CONSENSUS_WARN; "babe.unable_authoring_block"; - "slot" => slot_num, "err" => ?e + "slot" => slot_number, "err" => ?e ); - return Box::new(future::ok(())) + return Box::pin(future::ready(Ok(()))) } }; let inherent_digest = BabePreDigest { - proof, + vrf_proof, vrf_output: inout.to_output(), - index: index as u64, - slot_num, + authority_index: authority_index as u32, + slot_number, }; // deadline our production to approx. the end of the slot let remaining_duration = slot_info.remaining_duration(); - Timeout::new( + futures::future::select( proposer.propose( slot_info.inherent_data, generic::Digest { @@ -332,48 +338,46 @@ impl SlotWorker for BabeWorker w ], }, remaining_duration, - ).into_future(), - remaining_duration, - ) + ).map_err(|e| consensus_common::Error::ClientImport(format!("{:?}", e)).into()), + Delay::new(remaining_duration) + .map_err(|err| consensus_common::Error::FaultyTimer(err).into()) + ).map(|v| match v { + futures::future::Either::Left((v, _)) => v.map(|v| (v, key)), + futures::future::Either::Right((Ok(_), _)) => + Err(consensus_common::Error::ClientImport("Timeout in the BaBe proposer".into())), + futures::future::Either::Right((Err(err), _)) => Err(err), + }) } else { - return Box::new(future::ok(())); + return Box::pin(future::ready(Ok(()))); }; - Box::new(proposal_work.map(move |b| { + Box::pin(proposal_work.map_ok(move |(b, key)| { // minor hack since we don't have access to the timestamp // that is actually set by the proposer. let slot_after_building = SignedDuration::default().slot_now(slot_duration); - if slot_after_building != slot_num { + if slot_after_building != slot_number { info!( target: "babe", "Discarding proposal for slot {}; block production took too long", - slot_num + slot_number ); telemetry!(CONSENSUS_INFO; "babe.discarding_proposal_took_too_long"; - "slot" => slot_num + "slot" => slot_number ); - return + return; } let (header, body) = b.deconstruct(); - let pre_digest: Result = find_pre_digest::(&header); - if let Err(e) = pre_digest { - error!(target: "babe", "FATAL ERROR: Invalid pre-digest: {}!", e); - return - } else { - trace!(target: "babe", "Got correct number of seals. Good!") - }; - let header_num = header.number().clone(); let parent_hash = header.parent_hash().clone(); // sign the pre-sealed hash of the block and then // add it to a digest item. let header_hash = header.hash(); - let signature = pair.sign(header_hash.as_ref()); + let signature = key.sign(header_hash.as_ref()); let signature_digest_item = DigestItemFor::::babe_seal(signature); - let import_block: ImportBlock = ImportBlock { + let import_block = BlockImportParams:: { origin: BlockOrigin::Own, header, justification: None, @@ -390,6 +394,7 @@ impl SlotWorker for BabeWorker w import_block.post_header().hash(), header_hash, ); + telemetry!(CONSENSUS_INFO; "babe.pre_sealed_block"; "header_num" => ?header_num, "hash_now" => ?import_block.post_header().hash(), @@ -403,9 +408,6 @@ impl SlotWorker for BabeWorker w "hash" => ?parent_hash, "err" => ?e ); } - }).map_err(|e| { - warn!("Client import failed: {:?}", e); - consensus_common::Error::ClientImport(format!("{:?}", e)).into() })) } } @@ -418,14 +420,16 @@ macro_rules! babe_err { }; } +/// Extract the BABE pre digest from the given header. Pre-runtime digests are +/// mandatory, the function will return `Err` if none is found. fn find_pre_digest(header: &B::Header) -> Result where DigestItemFor: CompatibleDigestItem, { let mut pre_digest: Option<_> = None; for log in header.digest().logs() { - trace!(target: "babe", "Checking log {:?}", log); + trace!(target: "babe", "Checking log {:?}, looking for pre runtime digest", log); match (log.as_babe_pre_digest(), pre_digest.is_some()) { - (Some(_), true) => Err(babe_err!("Multiple BABE pre-runtime headers, rejecting!"))?, + (Some(_), true) => Err(babe_err!("Multiple BABE pre-runtime digests, rejecting!"))?, (None, _) => trace!(target: "babe", "Ignoring digest not meant for us"), (s, false) => pre_digest = s, } @@ -433,7 +437,25 @@ fn find_pre_digest(header: &B::Header) -> Result(header: &B::Header) -> Result, String> + where DigestItemFor: CompatibleDigestItem, +{ + let mut epoch_digest: Option<_> = None; + for log in header.digest().logs() { + trace!(target: "babe", "Checking log {:?}, looking for epoch change digest.", log); + let log = log.try_to::(OpaqueDigestItemId::Consensus(&BABE_ENGINE_ID)); + match (log, epoch_digest.is_some()) { + (Some(ConsensusLog::NextEpochData(_)), true) => Err(babe_err!("Multiple BABE epoch change digests, rejecting!"))?, + (Some(ConsensusLog::NextEpochData(epoch)), false) => epoch_digest = Some(epoch), + _ => trace!(target: "babe", "Ignoring digest not meant for us"), + } + } + + Ok(epoch_digest) +} + +/// Check a header has been signed by the right key. If the slot is too far in /// the future, an error will be returned. If successful, returns the pre-header /// and the digest item containing the seal. /// @@ -441,17 +463,21 @@ fn find_pre_digest(header: &B::Header) -> Result( +// FIXME #1018 needs misbehavior types. The `transaction_pool` parameter will be +// used to submit such misbehavior reports. +fn check_header( client: &C, slot_now: u64, mut header: B::Header, hash: B::Hash, - authorities: &[AuthorityId], - threshold: u64, -) -> Result, DigestItemFor)>, String> - where DigestItemFor: CompatibleDigestItem, + authorities: &[(AuthorityId, BabeWeight)], + randomness: [u8; 32], + epoch_index: u64, + c: (u64, u64), + _transaction_pool: Option<&T>, +) -> Result, DigestItemFor)>, String> where + DigestItemFor: CompatibleDigestItem, + T: Send + Sync + 'static, { trace!(target: "babe", "Checking header"); let seal = match header.digest_mut().pop() { @@ -464,31 +490,33 @@ fn check_header( })?; let pre_digest = find_pre_digest::(&header)?; - let BabePreDigest { slot_num, index, ref proof, ref vrf_output } = pre_digest; - if slot_num > slot_now { + let BabePreDigest { slot_number, authority_index, ref vrf_proof, ref vrf_output } = pre_digest; + + if slot_number > slot_now { header.digest_mut().push(seal); - Ok(CheckedHeader::Deferred(header, slot_num)) - } else if index > authorities.len() as u64 { + Ok(CheckedHeader::Deferred(header, slot_number)) + } else if authority_index > authorities.len() as u32 { Err(babe_err!("Slot author not found")) } else { - let (pre_hash, author): (_, &sr25519::Public) = (header.hash(), &authorities[index as usize]); + let (pre_hash, author) = (header.hash(), &authorities[authority_index as usize].0); - if sr25519::Pair::verify(&sig, pre_hash, author.clone()) { + if AuthorityPair::verify(&sig, pre_hash, &author) { let (inout, _batchable_proof) = { let transcript = make_transcript( - Default::default(), - slot_num, - Default::default(), - 0, + &randomness, + slot_number, + epoch_index, ); + schnorrkel::PublicKey::from_bytes(author.as_slice()).and_then(|p| { - p.vrf_verify(transcript, vrf_output, proof) + p.vrf_verify(transcript, vrf_output, vrf_proof) }).map_err(|s| { babe_err!("VRF verification failed: {:?}", s) })? }; + let threshold = calculate_threshold(c, authorities, authority_index as usize); if !check(&inout, threshold) { return Err(babe_err!("VRF verification of block by author {:?} failed: \ threshold {} exceeded", author, threshold)); @@ -497,14 +525,14 @@ fn check_header( if let Some(equivocation_proof) = check_equivocation( client, slot_now, - slot_num, + slot_number, &header, author, ).map_err(|e| e.to_string())? { info!( "Slot author {:?} is equivocating at slot {} with headers {:?} and {:?}", author, - slot_num, + slot_number, equivocation_proof.fst_header().hash(), equivocation_proof.snd_header().hash(), ); @@ -523,14 +551,15 @@ fn check_header( pub struct BabeLink(Arc, Vec<(Instant, u64)>)>>); /// A verifier for Babe blocks. -pub struct BabeVerifier { - client: Arc, +pub struct BabeVerifier { + api: Arc, inherent_data_providers: inherents::InherentDataProviders, config: Config, time_source: BabeLink, + transaction_pool: Option>, } -impl BabeVerifier { +impl BabeVerifier { fn check_inherents( &self, block: B, @@ -539,7 +568,7 @@ impl BabeVerifier { ) -> Result<(), String> where C: ProvideRuntimeApi, C::Api: BlockBuilderApi { - let inherent_res = self.client.runtime_api().check_inherents( + let inherent_res = self.api.runtime_api().check_inherents( &block_id, block, inherent_data, @@ -548,57 +577,70 @@ impl BabeVerifier { if !inherent_res.ok() { inherent_res .into_errors() - .try_for_each(|(i, e)| Err(self.inherent_data_providers.error_to_string(&i, &e))) + .try_for_each(|(i, e)| { + Err(self.inherent_data_providers.error_to_string(&i, &e)) + }) } else { Ok(()) } } } +#[allow(dead_code)] fn median_algorithm( median_required_blocks: u64, slot_duration: u64, - slot_num: u64, + slot_number: u64, slot_now: u64, time_source: &mut (Option, Vec<(Instant, u64)>), ) { let num_timestamps = time_source.1.len(); if num_timestamps as u64 >= median_required_blocks && median_required_blocks > 0 { let mut new_list: Vec<_> = time_source.1.iter().map(|&(t, sl)| { - let offset: u128 = u128::from(slot_duration) - .checked_mul(1_000_000u128) // self.config.get() returns *milliseconds* - .and_then(|x| x.checked_mul(u128::from(slot_num).saturating_sub(u128::from(sl)))) - .expect("we cannot have timespans long enough for this to overflow; qed"); - const NANOS_PER_SEC: u32 = 1_000_000_000; - let nanos = (offset % u128::from(NANOS_PER_SEC)) as u32; - let secs = (offset / u128::from(NANOS_PER_SEC)) as u64; - t + Duration::new(secs, nanos) - }).collect(); + let offset: u128 = u128::from(slot_duration) + .checked_mul(1_000_000u128) // self.config.get() returns *milliseconds* + .and_then(|x| { + x.checked_mul(u128::from(slot_number).saturating_sub(u128::from(sl))) + }) + .expect("we cannot have timespans long enough for this to overflow; qed"); + + const NANOS_PER_SEC: u32 = 1_000_000_000; + let nanos = (offset % u128::from(NANOS_PER_SEC)) as u32; + let secs = (offset / u128::from(NANOS_PER_SEC)) as u64; + + t + Duration::new(secs, nanos) + }).collect(); + // FIXME #2926: use a selection algorithm instead of a full sorting algorithm. new_list.sort_unstable(); + let &median = new_list .get(num_timestamps / 2) .expect("we have at least one timestamp, so this is a valid index; qed"); + + let now = Instant::now(); + if now >= median { + time_source.0.replace(now - median); + } + time_source.1.clear(); - // FIXME #2927: pass this to the block authoring logic somehow - time_source.0.replace(Instant::now() - median); } else { time_source.1.push((Instant::now(), slot_now)) } } -impl Verifier for BabeVerifier where +impl Verifier for BabeVerifier where C: ProvideRuntimeApi + Send + Sync + AuxStore + ProvideCache, C::Api: BlockBuilderApi + BabeApi, - DigestItemFor: CompatibleDigestItem, + T: Send + Sync + 'static, { fn verify( - &self, + &mut self, origin: BlockOrigin, header: B::Header, justification: Option, mut body: Option>, - ) -> Result<(ImportBlock, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { trace!( target: "babe", "Verifying origin: {:?} header: {:?} justification: {:?} body: {:?}", @@ -613,34 +655,40 @@ impl Verifier for BabeVerifier where .inherent_data_providers .create_inherent_data() .map_err(String::from)?; + let (_, slot_now, _) = self.time_source.extract_timestamp_and_slot(&inherent_data) .map_err(|e| format!("Could not extract timestamp and slot: {:?}", e))?; + let hash = header.hash(); let parent_hash = *header.parent_hash(); - let authorities = authorities(self.client.as_ref(), &BlockId::Hash(parent_hash)) - .map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?; - - // we add one to allow for some small drift. - // FIXME #1019 in the future, alter this queue to allow deferring of - // headers - let checked_header = check_header::( - &self.client, + let Epoch { authorities, randomness, epoch_index, .. } = + epoch(self.api.as_ref(), &BlockId::Hash(parent_hash)) + .map_err(|e| format!("Could not fetch epoch at {:?}: {:?}", parent_hash, e))?; + + // We add one to allow for some small drift. + // FIXME #1019 in the future, alter this queue to allow deferring of headers + let checked_header = check_header::( + &self.api, slot_now + 1, header, hash, - &authorities[..], - self.config.threshold(), + &authorities, + randomness, + epoch_index, + self.config.c(), + self.transaction_pool.as_ref().map(|x| &**x), )?; + match checked_header { CheckedHeader::Checked(pre_header, (pre_digest, seal)) => { - let BabePreDigest { slot_num, .. } = pre_digest.as_babe_pre_digest() + let BabePreDigest { slot_number, .. } = pre_digest.as_babe_pre_digest() .expect("check_header always returns a pre-digest digest item; qed"); // if the body is passed through, we need to use the runtime // to check that the internally-set timestamp in the inherents // actually matches the slot set in the seal. if let Some(inner_body) = body.take() { - inherent_data.babe_replace_inherent_data(slot_num); + inherent_data.babe_replace_inherent_data(slot_number); let block = B::new(pre_header.clone(), inner_body); self.check_inherents( @@ -659,14 +707,7 @@ impl Verifier for BabeVerifier where "babe.checked_and_importing"; "pre_header" => ?pre_header); - // `Consensus` is the Babe-specific authorities change log. - // It's an encoded `Vec`, the same format as is stored in the cache, - // so no need to decode/re-encode. - let maybe_keys = pre_header.digest() - .log(|l| l.try_as_raw(OpaqueDigestItemId::Consensus(&BABE_ENGINE_ID))) - .map(|blob| vec![(well_known_cache_keys::AUTHORITIES, blob.to_vec())]); - - let import_block = ImportBlock { + let import_block = BlockImportParams { origin, header: pre_header, post_digests: vec![seal], @@ -676,15 +717,8 @@ impl Verifier for BabeVerifier where auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, }; - median_algorithm( - self.config.0.median_required_blocks, - self.config.get(), - slot_num, - slot_now, - &mut *self.time_source.0.lock(), - ); - // FIXME #1019 extract authorities - Ok((import_block, maybe_keys)) + + Ok((import_block, Default::default())) } CheckedHeader::Deferred(a, b) => { debug!(target: "babe", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); @@ -697,24 +731,29 @@ impl Verifier for BabeVerifier where } } -fn authorities(client: &C, at: &BlockId) -> Result< - Vec, - ConsensusError, -> where +/// Extract current epoch data from cache and fallback to querying the runtime +/// if the cache isn't populated. +fn epoch(client: &C, at: &BlockId) -> Result where B: BlockT, C: ProvideRuntimeApi + ProvideCache, C::Api: BabeApi, { client .cache() - .and_then(|cache| cache.get_at(&well_known_cache_keys::AUTHORITIES, at) - .and_then(|v| Decode::decode(&mut &v[..]))) + .and_then(|cache| cache.get_at(&well_known_cache_keys::EPOCH, at) + .and_then(|v| Decode::decode(&mut &v[..]).ok())) .or_else(|| { if client.runtime_api().has_api::>(at).unwrap_or(false) { - BabeApi::authorities(&*client.runtime_api(), at).ok() + let s = BabeApi::epoch(&*client.runtime_api(), at).ok()?; + if s.authorities.is_empty() { + error!("No authorities!"); + None + } else { + Some(s) + } } else { - panic!("We don’t support deprecated code with new consensus algorithms, \ - therefore this is unreachable; qed") + error!("bad api!"); + None } }).ok_or(consensus_common::Error::InvalidAuthoritiesSet) } @@ -738,27 +777,51 @@ fn register_babe_inherent_data_provider( } } -fn get_keypair(q: &sr25519::Pair) -> &Keypair { - q.as_ref() +fn get_keypair(q: &AuthorityPair) -> &Keypair { + use primitives::crypto::IsWrappedBy; + primitives::sr25519::Pair::from_ref(q).as_ref() } #[allow(deprecated)] fn make_transcript( randomness: &[u8], slot_number: u64, - genesis_hash: &[u8], epoch: u64, ) -> Transcript { let mut transcript = Transcript::new(&BABE_ENGINE_ID); transcript.commit_bytes(b"slot number", &slot_number.to_le_bytes()); - transcript.commit_bytes(b"genesis block hash", genesis_hash); transcript.commit_bytes(b"current epoch", &epoch.to_le_bytes()); transcript.commit_bytes(b"chain randomness", randomness); transcript } -fn check(inout: &VRFInOut, threshold: u64) -> bool { - u64::from_le_bytes(inout.make_bytes::<[u8; 8]>(BABE_VRF_PREFIX)) < threshold +fn check(inout: &VRFInOut, threshold: u128) -> bool { + u128::from_le_bytes(inout.make_bytes::<[u8; 16]>(BABE_VRF_PREFIX)) < threshold +} + +fn calculate_threshold( + c: (u64, u64), + authorities: &[(AuthorityId, BabeWeight)], + authority_index: usize, +) -> u128 { + use num_bigint::BigUint; + use num_rational::BigRational; + use num_traits::{cast::ToPrimitive, identities::One}; + + let c = c.0 as f64 / c.1 as f64; + + let theta = + authorities[authority_index].1 as f64 / + authorities.iter().map(|(_, weight)| weight).sum::() as f64; + + let calc = || { + let p = BigRational::from_float(1f64 - (1f64 - c).powf(theta))?; + let numer = p.numer().to_biguint()?; + let denom = p.denom().to_biguint()?; + ((BigUint::one() << 128) * numer / denom).to_u128() + }; + + calc().unwrap_or(u128::max_value()) } /// Claim a slot if it is our turn. Returns `None` if it is not our turn. @@ -767,32 +830,28 @@ fn check(inout: &VRFInOut, threshold: u64) -> bool { /// the VRF. If the VRF produces a value less than `threshold`, it is our turn, /// so it returns `Some(_)`. Otherwise, it returns `None`. fn claim_slot( - randomness: &[u8], slot_number: u64, - genesis_hash: &[u8], - epoch: u64, - authorities: &[AuthorityId], - key: &sr25519::Pair, - threshold: u64, -) -> Option<((VRFInOut, VRFProof, VRFProofBatchable), usize)> { - let public = &key.public(); - let index = authorities.iter().position(|s| s == public)?; - let transcript = make_transcript( - randomness, - slot_number, - genesis_hash, - epoch, - ); + Epoch { ref authorities, ref randomness, epoch_index, .. }: Epoch, + c: (u64, u64), + keystore: &KeyStorePtr, +) -> Option<((VRFInOut, VRFProof, VRFProofBatchable), usize, AuthorityPair)> { + let keystore = keystore.read(); + let (key_pair, authority_index) = authorities.iter() + .enumerate() + .find_map(|(i, a)| { + keystore.key_pair::(&a.0).ok().map(|kp| (kp, i)) + })?; + let transcript = make_transcript(randomness, slot_number, epoch_index); // Compute the threshold we will use. // - // We already checked that authorities contains `key.public()`, so it can’t - // be empty. Therefore, this division is safe. - let threshold = threshold / authorities.len() as u64; + // We already checked that authorities contains `key.public()`, so it can't + // be empty. Therefore, this division in `calculate_threshold` is safe. + let threshold = calculate_threshold(c, authorities, authority_index); - get_keypair(key) - .vrf_sign_n_check(transcript, |inout| check(inout, threshold)) - .map(|s|(s, index)) + get_keypair(&key_pair) + .vrf_sign_after_check(transcript, |inout| check(inout, threshold)) + .map(|s|(s, authority_index, key_pair)) } fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where @@ -808,10 +867,10 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> // check if we already have initialized the cache let genesis_id = BlockId::Number(Zero::zero()); - let genesis_authorities: Option> = cache - .get_at(&well_known_cache_keys::AUTHORITIES, &genesis_id) - .and_then(|v| Decode::decode(&mut &v[..])); - if genesis_authorities.is_some() { + let genesis_epoch: Option = cache + .get_at(&well_known_cache_keys::EPOCH, &genesis_id) + .and_then(|v| Decode::decode(&mut &v[..]).ok()); + if genesis_epoch.is_some() { return Ok(()); } @@ -820,285 +879,365 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> "Error initializing authorities cache: {}", error, ))); - let genesis_authorities = authorities(client, &genesis_id)?; - cache.initialize(&well_known_cache_keys::AUTHORITIES, genesis_authorities.encode()) + + let genesis_epoch = epoch(client, &genesis_id)?; + cache.initialize(&well_known_cache_keys::EPOCH, genesis_epoch.encode()) .map_err(map_err) } -/// Start an import queue for the Babe consensus algorithm. -pub fn import_queue( - config: Config, - block_import: BoxBlockImport, - justification_import: Option>, - finality_proof_import: Option>, - client: Arc, - inherent_data_providers: InherentDataProviders, -) -> Result<(BabeImportQueue, BabeLink), consensus_common::Error> where - B: BlockT, - C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore, - C::Api: BlockBuilderApi + BabeApi, - DigestItemFor: CompatibleDigestItem, - E: 'static, -{ - register_babe_inherent_data_provider(&inherent_data_providers, config.get())?; - initialize_authorities_cache(&*client)?; - - let verifier = BabeVerifier { - client: client, - inherent_data_providers, - time_source: Default::default(), - config, - }; - let timestamp_core = verifier.time_source.clone(); - Ok((BasicQueue::new( - Arc::new(verifier), - block_import, - justification_import, - finality_proof_import, - ), timestamp_core)) +/// Tree of all epoch changes across all *seen* forks. Data stored in tree is +/// the hash and block number of the block signaling the epoch change, and the +/// epoch that was signalled at that block. +type EpochChanges = ForkTree< + ::Hash, + NumberFor, + Epoch, +>; + +/// A shared epoch changes tree. +#[derive(Clone)] +struct SharedEpochChanges { + inner: Arc>>, } -// FIXME #2532: need to allow deprecated until refactor is done -// https://github.com/paritytech/substrate/issues/2532 -#[cfg(test)] -#[allow(unused_imports, deprecated)] -#[cfg_attr(test, allow(dead_code))] -mod tests { - use super::*; - - use client::LongestChain; - use consensus_common::NoNetwork as DummyOracle; - use network::test::*; - use network::test::{Block as TestBlock, PeersClient}; - use runtime_primitives::traits::{Block as BlockT, DigestFor}; - use network::config::ProtocolConfig; - use tokio::runtime::current_thread; - use keyring::sr25519::Keyring; - use super::generic::DigestItem; - use client::BlockchainEvents; - use test_client; - use futures::{Async, stream::Stream as _}; - use futures03::{StreamExt as _, TryStreamExt as _}; - use log::debug; - use std::time::Duration; - type Item = generic::DigestItem; - use test_client::AuthorityKeyring; - - type Error = client::error::Error; - - type TestClient = client::Client< - test_client::Backend, - test_client::Executor, - TestBlock, - test_client::runtime::RuntimeApi, - >; - - struct DummyFactory(Arc); - struct DummyProposer(u64, Arc); - - impl Environment for DummyFactory { - type Proposer = DummyProposer; - type Error = Error; - - fn init(&self, parent_header: &::Header) - -> Result - { - Ok(DummyProposer(parent_header.number + 1, self.0.clone())) +impl SharedEpochChanges { + fn new() -> Self { + SharedEpochChanges { + inner: Arc::new(Mutex::new(EpochChanges::::new())) } } - impl Proposer for DummyProposer { - type Error = Error; - type Create = Result; + fn lock(&self) -> MutexGuard> { + self.inner.lock() + } +} - fn propose(&self, _: InherentData, digests: DigestFor, _: Duration) -> Result { - self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) +impl From> for SharedEpochChanges { + fn from(epoch_changes: EpochChanges) -> Self { + SharedEpochChanges { + inner: Arc::new(Mutex::new(epoch_changes)) } } +} - const SLOT_DURATION: u64 = 1; +/// A block-import handler for BABE. +/// +/// This scans each imported block for epoch change signals. The signals are +/// tracked in a tree (of all forks), and the import logic validates all epoch +/// change transitions, i.e. whether a given epoch change is expected or whether +/// it is missing. +/// +/// The epoch change tree should be pruned as blocks are finalized. +pub struct BabeBlockImport { + inner: I, + client: Arc>, + api: Arc, + epoch_changes: SharedEpochChanges, +} - pub struct BabeTestNet { - peers: Vec>, +impl Clone for BabeBlockImport { + fn clone(&self) -> Self { + BabeBlockImport { + inner: self.inner.clone(), + client: self.client.clone(), + api: self.api.clone(), + epoch_changes: self.epoch_changes.clone(), + } } +} - impl TestNetFactory for BabeTestNet { - type Specialization = DummySpecialization; - type Verifier = BabeVerifier; - type PeerData = (); - - /// Create new test network with peers and given config. - fn from_config(_config: &ProtocolConfig) -> Self { - debug!(target: "babe", "Creating test network from config"); - BabeTestNet { - peers: Vec::new(), - } +impl BabeBlockImport { + fn new( + client: Arc>, + api: Arc, + epoch_changes: SharedEpochChanges, + block_import: I, + ) -> Self { + BabeBlockImport { + client, + api, + inner: block_import, + epoch_changes, } + } +} - fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) - -> Arc - { - let client = client.as_full().expect("only full clients are used in test"); - trace!(target: "babe", "Creating a verifier"); - let config = Config::get_or_compute(&*client) - .expect("slot duration available"); - let inherent_data_providers = InherentDataProviders::new(); - register_babe_inherent_data_provider( - &inherent_data_providers, - config.get() - ).expect("Registers babe inherent data provider"); - trace!(target: "babe", "Provider registered"); - - assert_eq!(config.get(), SLOT_DURATION); - Arc::new(BabeVerifier { - client, - inherent_data_providers, - config, - time_source: Default::default(), - }) +impl BlockImport for BabeBlockImport where + Block: BlockT, + I: BlockImport + Send + Sync, + I::Error: Into, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + PRA: ProvideRuntimeApi + ProvideCache, + PRA::Api: BabeApi, +{ + type Error = ConsensusError; + + fn import_block( + &mut self, + mut block: BlockImportParams, + mut new_cache: HashMap>, + ) -> Result { + let hash = block.post_header().hash(); + let number = block.header.number().clone(); + + // early exit if block already in chain, otherwise the check for + // epoch changes will error when trying to re-import an epoch change + #[allow(deprecated)] + match self.client.backend().blockchain().status(BlockId::Hash(hash)) { + Ok(blockchain::BlockStatus::InChain) => return Ok(ImportResult::AlreadyInChain), + Ok(blockchain::BlockStatus::Unknown) => {}, + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), } - fn peer(&mut self, i: usize) -> &mut Peer { - trace!(target: "babe", "Retreiving a peer"); - &mut self.peers[i] + let slot_number = { + let pre_digest = find_pre_digest::(&block.header) + .expect("valid babe headers must contain a predigest; \ + header has been already verified; qed"); + let BabePreDigest { slot_number, .. } = pre_digest; + slot_number + }; + + // returns a function for checking whether a block is a descendent of another + // consistent with querying client directly after importing the block. + let parent_hash = *block.header.parent_hash(); + let is_descendent_of = is_descendent_of(&self.client, Some((&hash, &parent_hash))); + + // check if there's any epoch change expected to happen at this slot + let mut epoch_changes = self.epoch_changes.lock(); + let enacted_epoch = epoch_changes.find_node_where( + &hash, + &number, + &is_descendent_of, + &|epoch| epoch.start_slot <= slot_number, + ).map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; + + let check_roots = || -> Result { + // this can only happen when the chain starts, since there's no + // epoch change at genesis. afterwards every time we expect an epoch + // change it means we will import another one. + for (root, _, _) in epoch_changes.roots() { + let is_descendent_of = is_descendent_of(root, &hash) + .map_err(|e| { + ConsensusError::from(ConsensusError::ClientImport(e.to_string())) + })?; + + if is_descendent_of { + return Ok(false); + } + } + + Ok(true) + }; + + let expected_epoch_change = enacted_epoch.is_some(); + let next_epoch_digest = find_next_epoch_digest::(&block.header) + .map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; + + match (expected_epoch_change, next_epoch_digest.is_some()) { + (true, true) => {}, + (false, false) => {}, + (true, false) => { + return Err( + ConsensusError::ClientImport( + "Expected epoch change to happen by this block".into(), + ) + ); + }, + (false, true) => { + if !check_roots()? { + return Err(ConsensusError::ClientImport("Unexpected epoch change".into())); + } + }, } - fn peers(&self) -> &Vec> { - trace!(target: "babe", "Retreiving peers"); - &self.peers + // if there's a pending epoch we'll save the previous epoch changes here + // this way we can revert it if there's any error + let mut old_epoch_changes = None; + + if let Some(next_epoch) = next_epoch_digest { + if let Some(enacted_epoch) = enacted_epoch { + let enacted_epoch = &enacted_epoch.data; + if next_epoch.epoch_index.checked_sub(enacted_epoch.epoch_index) != Some(1) { + return Err(ConsensusError::ClientImport(format!( + "Invalid BABE epoch change: expected next epoch to be {:?}, got {:?}", + enacted_epoch.epoch_index.saturating_add(1), + next_epoch.epoch_index, + ))); + } + + // update the current epoch in the client cache + new_cache.insert( + well_known_cache_keys::EPOCH, + enacted_epoch.encode(), + ); + + let current_epoch = epoch(&*self.api, &BlockId::Hash(parent_hash))?; + + // if the authorities have changed then we populate the + // `AUTHORITIES` key with the enacted epoch, so that the inner + // `ImportBlock` can process it (`EPOCH` is specific to BABE). + // e.g. in the case of GRANDPA it would require a justification + // for the block, expecting that the authorities actually + // changed. + if current_epoch.authorities != enacted_epoch.authorities { + new_cache.insert( + well_known_cache_keys::AUTHORITIES, + enacted_epoch.encode(), + ); + } + } + + old_epoch_changes = Some(epoch_changes.clone()); + + // track the epoch change in the fork tree + epoch_changes.import( + hash, + number, + next_epoch, + &is_descendent_of, + ).map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; + + crate::aux_schema::write_epoch_changes::( + &*epoch_changes, + |insert| block.auxiliary.extend( + insert.iter().map(|(k, v)| (k.to_vec(), Some(v.to_vec()))) + ) + ); } - fn mut_peers>)>( - &mut self, - closure: F, - ) { - closure(&mut self.peers); + let import_result = self.inner.import_block(block, new_cache); + + // revert to the original epoch changes in case there's an error + // importing the block + if let Err(_) = import_result { + if let Some(old_epoch_changes) = old_epoch_changes { + *epoch_changes = old_epoch_changes; + } } - } - #[test] - fn can_serialize_block() { - drop(env_logger::try_init()); - assert!(BabePreDigest::decode(&mut &b""[..]).is_none()); + import_result.map_err(Into::into) } - #[test] - fn authoring_blocks() { - drop(env_logger::try_init()); - debug!(target: "babe", "checkpoint 1"); - let net = BabeTestNet::new(3); - debug!(target: "babe", "checkpoint 2"); - - debug!(target: "babe", "checkpoint 3"); - - let peers = &[ - (0, Keyring::Alice), - (1, Keyring::Bob), - (2, Keyring::Charlie), - ]; - - let net = Arc::new(Mutex::new(net)); - let mut import_notifications = Vec::new(); - debug!(target: "babe", "checkpoint 4"); - let mut runtime = current_thread::Runtime::new().unwrap(); - for (peer_id, key) in peers { - let client = net.lock().peer(*peer_id).client().as_full().unwrap(); - let environ = Arc::new(DummyFactory(client.clone())); - import_notifications.push( - client.import_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) - .for_each(move |_| Ok(())) - ); - - let config = Config::get_or_compute(&*client) - .expect("slot duration available"); + fn check_block( + &mut self, + hash: Block::Hash, + parent_hash: Block::Hash, + ) -> Result { + self.inner.check_block(hash, parent_hash).map_err(Into::into) + } +} - let inherent_data_providers = InherentDataProviders::new(); - register_babe_inherent_data_provider( - &inherent_data_providers, config.get() - ).expect("Registers babe inherent data provider"); +/// Start an import queue for the BABE consensus algorithm. This method returns +/// the import queue, some data that needs to be passed to the block authoring +/// logic (`BabeLink`), a `BabeBlockImport` which should be used by the +/// authoring when importing its own blocks, and a future that must be run to +/// completion and is responsible for listening to finality notifications and +/// pruning the epoch changes tree. +pub fn import_queue, I, RA, PRA, T>( + config: Config, + block_import: I, + justification_import: Option>, + finality_proof_import: Option>, + client: Arc>, + api: Arc, + inherent_data_providers: InherentDataProviders, + transaction_pool: Option>, +) -> ClientResult<( + BabeImportQueue, + BabeLink, + BabeBlockImport, + impl futures01::Future, +)> where + B: Backend + 'static, + I: BlockImport + Clone + Send + Sync + 'static, + I::Error: Into, + E: CallExecutor + Clone + Send + Sync + 'static, + RA: Send + Sync + 'static, + PRA: ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore + 'static, + PRA::Api: BlockBuilderApi + BabeApi, + T: Send + Sync + 'static, +{ + register_babe_inherent_data_provider(&inherent_data_providers, config.get())?; + initialize_authorities_cache(&*api)?; + let verifier = BabeVerifier { + api: api.clone(), + inherent_data_providers, + time_source: Default::default(), + config, + transaction_pool, + }; - #[allow(deprecated)] - let select_chain = LongestChain::new(client.backend().clone()); + #[allow(deprecated)] + let epoch_changes = aux_schema::load_epoch_changes(&**client.backend())?; - runtime.spawn(start_babe(BabeParams { - config, - local_key: Arc::new(key.clone().into()), - block_import: client.clone(), - select_chain, - client, - env: environ.clone(), - sync_oracle: DummyOracle, - inherent_data_providers, - force_authoring: false, - time_source: Default::default(), - }).expect("Starts babe")); - } - debug!(target: "babe", "checkpoint 5"); + let block_import = BabeBlockImport::new( + client.clone(), + api, + epoch_changes.clone(), + block_import, + ); - // wait for all finalized on each. - let wait_for = ::futures::future::join_all(import_notifications) - .map(drop) - .map_err(drop); + let pruning_task = client.finality_notification_stream() + .map(|v| Ok::<_, ()>(v)).compat() + .for_each(move |notification| { + let is_descendent_of = is_descendent_of(&client, None); + epoch_changes.lock().prune( + ¬ification.hash, + *notification.header.number(), + &is_descendent_of, + ).map_err(|e| { + debug!(target: "babe", "Error pruning epoch changes fork tree: {:?}", e) + })?; - let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); - let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(drop)).unwrap(); - } + Ok(()) + }); - #[test] - fn wrong_consensus_engine_id_rejected() { - drop(env_logger::try_init()); - let sig = sr25519::Pair::generate().0.sign(b""); - let bad_seal: Item = DigestItem::Seal([0; 4], sig.0.to_vec()); - assert!(bad_seal.as_babe_pre_digest().is_none()); - assert!(bad_seal.as_babe_seal().is_none()) - } + let timestamp_core = verifier.time_source.clone(); + let queue = BasicQueue::new( + verifier, + Box::new(block_import.clone()), + justification_import, + finality_proof_import, + ); - #[test] - fn malformed_pre_digest_rejected() { - drop(env_logger::try_init()); - let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, [0; 64].to_vec()); - assert!(bad_seal.as_babe_pre_digest().is_none()); - } + Ok((queue, timestamp_core, block_import, pruning_task)) +} - #[test] - fn sig_is_not_pre_digest() { - drop(env_logger::try_init()); - let sig = sr25519::Pair::generate().0.sign(b""); - let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig.0.to_vec()); - assert!(bad_seal.as_babe_pre_digest().is_none()); - assert!(bad_seal.as_babe_seal().is_some()) - } +/// BABE test helpers. Utility methods for manually authoring blocks. +#[cfg(feature = "test-helpers")] +pub mod test_helpers { + use super::*; - #[test] - fn can_author_block() { - drop(env_logger::try_init()); - let randomness = &[]; - let (pair, _) = sr25519::Pair::generate(); - let mut i = 0; - loop { - match claim_slot(randomness, i, &[], 0, &[pair.public()], &pair, u64::MAX / 10) { - None => i += 1, - Some(s) => { - debug!(target: "babe", "Authored block {:?}", s); - break - } + /// Try to claim the given slot and return a `BabePreDigest` if + /// successful. + pub fn claim_slot( + client: &C, + at: &BlockId, + slot_number: u64, + c: (u64, u64), + keystore: &KeyStorePtr, + ) -> Option where + B: BlockT, + C: ProvideRuntimeApi + ProvideCache, + C::Api: BabeApi, + { + let epoch = epoch(client, at).unwrap(); + + super::claim_slot( + slot_number, + epoch, + c, + keystore, + ).map(|((inout, vrf_proof, _), authority_index, _)| { + BabePreDigest { + vrf_proof, + vrf_output: inout.to_output(), + authority_index: authority_index as u32, + slot_number, } - } - } - - #[test] - fn authorities_call_works() { - drop(env_logger::try_init()); - let client = test_client::new(); - - assert_eq!(client.info().chain.best_number, 0); - assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ - Keyring::Alice.into(), - Keyring::Bob.into(), - Keyring::Charlie.into() - ]); + }) } } diff --git a/core/consensus/babe/src/tests.rs b/core/consensus/babe/src/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..01e0acb96402abc568eac216b2e5025b2b1a7991 --- /dev/null +++ b/core/consensus/babe/src/tests.rs @@ -0,0 +1,349 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! BABE testsuite + +// FIXME #2532: need to allow deprecated until refactor is done +// https://github.com/paritytech/substrate/issues/2532 +#![allow(deprecated)] +use super::*; +use super::generic::DigestItem; + +use babe_primitives::AuthorityPair; +use client::{LongestChain, block_builder::BlockBuilder}; +use consensus_common::NoNetwork as DummyOracle; +use network::test::*; +use network::test::{Block as TestBlock, PeersClient}; +use sr_primitives::traits::{Block as BlockT, DigestFor}; +use network::config::ProtocolConfig; +use tokio::runtime::current_thread; +use keyring::sr25519::Keyring; +use client::BlockchainEvents; +use test_client; +use log::debug; +use std::{time::Duration, borrow::Borrow, cell::RefCell}; +type Item = generic::DigestItem; + +type Error = client::error::Error; + +type TestClient = client::Client< + test_client::Backend, + test_client::Executor, + TestBlock, + test_client::runtime::RuntimeApi, +>; + +struct DummyFactory(Arc); +struct DummyProposer(u64, Arc); + +impl Environment for DummyFactory { + type Proposer = DummyProposer; + type Error = Error; + + fn init(&mut self, parent_header: &::Header) + -> Result + { + Ok(DummyProposer(parent_header.number + 1, self.0.clone())) + } +} + +impl Proposer for DummyProposer { + type Error = Error; + type Create = future::Ready>; + + fn propose( + &mut self, + _: InherentData, + digests: DigestFor, + _: Duration, + ) -> Self::Create { + future::ready(self.1.new_block(digests).unwrap().bake().map_err(|e| e.into())) + } +} + +type Mutator = Arc Fn(&'r mut TestHeader) + Send + Sync>; + +thread_local! { + static MUTATOR: RefCell = RefCell::new(Arc::new(|_|())); +} + +pub struct BabeTestNet { + peers: Vec>, +} + +type TestHeader = ::Header; +type TestExtrinsic = ::Extrinsic; + +pub struct TestVerifier { + inner: BabeVerifier, + mutator: Mutator, +} + +impl Verifier for TestVerifier { + /// Verify the given data and return the BlockImportParams and an optional + /// new set of validators to import. If not, err with an Error-Message + /// presented to the User in the logs. + fn verify( + &mut self, + origin: BlockOrigin, + mut header: TestHeader, + justification: Option, + body: Option>, + ) -> Result<(BlockImportParams, Option)>>), String> { + let cb: &(dyn Fn(&mut TestHeader) + Send + Sync) = self.mutator.borrow(); + cb(&mut header); + Ok(self.inner.verify(origin, header, justification, body).expect("verification failed!")) + } +} + +impl TestNetFactory for BabeTestNet { + type Specialization = DummySpecialization; + type Verifier = TestVerifier; + type PeerData = (); + + /// Create new test network with peers and given config. + fn from_config(_config: &ProtocolConfig) -> Self { + debug!(target: "babe", "Creating test network from config"); + BabeTestNet { + peers: Vec::new(), + } + } + + /// KLUDGE: this function gets the mutator from thread-local storage. + fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) + -> Self::Verifier + { + let api = client.as_full().expect("only full clients are used in test"); + trace!(target: "babe", "Creating a verifier"); + let config = Config::get_or_compute(&*api) + .expect("slot duration available"); + let inherent_data_providers = InherentDataProviders::new(); + register_babe_inherent_data_provider( + &inherent_data_providers, + config.get() + ).expect("Registers babe inherent data provider"); + trace!(target: "babe", "Provider registered"); + + TestVerifier { + inner: BabeVerifier { + api, + inherent_data_providers, + config, + time_source: Default::default(), + transaction_pool : Default::default(), + }, + mutator: MUTATOR.with(|s| s.borrow().clone()), + } + } + + fn peer(&mut self, i: usize) -> &mut Peer { + trace!(target: "babe", "Retreiving a peer"); + &mut self.peers[i] + } + + fn peers(&self) -> &Vec> { + trace!(target: "babe", "Retreiving peers"); + &self.peers + } + + fn mut_peers>)>( + &mut self, + closure: F, + ) { + closure(&mut self.peers); + } +} + +#[test] +#[should_panic] +fn rejects_empty_block() { + env_logger::try_init().unwrap(); + let mut net = BabeTestNet::new(3); + let block_builder = |builder: BlockBuilder<_, _>| { + builder.bake().unwrap() + }; + net.mut_peers(|peer| { + peer[0].generate_blocks(1, BlockOrigin::NetworkInitialSync, block_builder); + }) +} + +fn run_one_test() { + let _ = env_logger::try_init(); + let net = BabeTestNet::new(3); + + let peers = &[ + (0, "//Alice"), + (1, "//Bob"), + (2, "//Charlie"), + ]; + + let net = Arc::new(Mutex::new(net)); + let mut import_notifications = Vec::new(); + let mut runtime = current_thread::Runtime::new().unwrap(); + let mut keystore_paths = Vec::new(); + for (peer_id, seed) in peers { + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = keystore::Store::open(keystore_path.path(), None).expect("Creates keystore"); + keystore.write().insert_ephemeral_from_seed::(seed).expect("Generates authority key"); + keystore_paths.push(keystore_path); + + let client = net.lock().peer(*peer_id).client().as_full().unwrap(); + let environ = DummyFactory(client.clone()); + import_notifications.push( + client.import_notification_stream() + .take_while(|n| future::ready(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) + .for_each(move |_| future::ready(())) + ); + + let config = Config::get_or_compute(&*client).expect("slot duration available"); + + let inherent_data_providers = InherentDataProviders::new(); + register_babe_inherent_data_provider( + &inherent_data_providers, config.get() + ).expect("Registers babe inherent data provider"); + + #[allow(deprecated)] + let select_chain = LongestChain::new(client.backend().clone()); + + runtime.spawn(start_babe(BabeParams { + config, + block_import: client.clone(), + select_chain, + client, + env: environ, + sync_oracle: DummyOracle, + inherent_data_providers, + force_authoring: false, + time_source: Default::default(), + keystore, + }).expect("Starts babe")); + } + + runtime.spawn(futures01::future::poll_fn(move || { + net.lock().poll(); + Ok::<_, ()>(futures01::Async::NotReady::<()>) + })); + + runtime.block_on(future::join_all(import_notifications) + .map(|_| Ok::<(), ()>(())).compat()).unwrap(); +} + +#[test] +fn authoring_blocks() { run_one_test() } + +#[test] +#[should_panic] +fn rejects_missing_inherent_digest() { + MUTATOR.with(|s| *s.borrow_mut() = Arc::new(move |header: &mut TestHeader| { + let v = std::mem::replace(&mut header.digest_mut().logs, vec![]); + header.digest_mut().logs = v.into_iter() + .filter(|v| v.as_babe_pre_digest().is_none()) + .collect() + })); + run_one_test() +} + +#[test] +#[should_panic] +fn rejects_missing_seals() { + MUTATOR.with(|s| *s.borrow_mut() = Arc::new(move |header: &mut TestHeader| { + let v = std::mem::replace(&mut header.digest_mut().logs, vec![]); + header.digest_mut().logs = v.into_iter() + .filter(|v| v.as_babe_seal().is_none()) + .collect() + })); + run_one_test() +} + +// TODO: this test assumes that the test runtime will trigger epoch changes +// which isn't the case since it doesn't include the session module. +#[test] +#[should_panic] +#[ignore] +fn rejects_missing_consensus_digests() { + MUTATOR.with(|s| *s.borrow_mut() = Arc::new(move |header: &mut TestHeader| { + let v = std::mem::replace(&mut header.digest_mut().logs, vec![]); + header.digest_mut().logs = v.into_iter() + .filter(|v| v.as_babe_epoch().is_none()) + .collect() + })); + run_one_test() +} + +#[test] +fn wrong_consensus_engine_id_rejected() { + let _ = env_logger::try_init(); + let sig = AuthorityPair::generate().0.sign(b""); + let bad_seal: Item = DigestItem::Seal([0; 4], sig.to_vec()); + assert!(bad_seal.as_babe_pre_digest().is_none()); + assert!(bad_seal.as_babe_seal().is_none()) +} + +#[test] +fn malformed_pre_digest_rejected() { + let _ = env_logger::try_init(); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, [0; 64].to_vec()); + assert!(bad_seal.as_babe_pre_digest().is_none()); +} + +#[test] +fn sig_is_not_pre_digest() { + let _ = env_logger::try_init(); + let sig = AuthorityPair::generate().0.sign(b""); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig.to_vec()); + assert!(bad_seal.as_babe_pre_digest().is_none()); + assert!(bad_seal.as_babe_seal().is_some()) +} + +#[test] +fn can_author_block() { + let _ = env_logger::try_init(); + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = keystore::Store::open(keystore_path.path(), None).expect("Creates keystore"); + let pair = keystore.write().insert_ephemeral_from_seed::("//Alice") + .expect("Generates authority pair"); + + let mut i = 0; + let epoch = Epoch { + start_slot: 0, + authorities: vec![(pair.public(), 1)], + randomness: [0; 32], + epoch_index: 1, + duration: 100, + }; + loop { + match claim_slot(i, epoch.clone(), (3, 10), &keystore) { + None => i += 1, + Some(s) => { + debug!(target: "babe", "Authored block {:?}", s.0); + break + } + } + } +} + +#[test] +fn authorities_call_works() { + let _ = env_logger::try_init(); + let client = test_client::new(); + + assert_eq!(client.info().chain.best_number, 0); + assert_eq!(epoch(&client, &BlockId::Number(0)).unwrap().authorities, vec![ + (Keyring::Alice.public().into(), 1), + (Keyring::Bob.public().into(), 1), + (Keyring::Charlie.public().into(), 1), + ]); +} diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index c6da0c682e705c072c1f0b200ecb27ddf14a6ab5..46c8121207562240ac073059c497fd49a0c3b192 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -7,18 +7,17 @@ edition = "2018" [dependencies] derive_more = "0.14.0" -libp2p = { version = "0.10.0", default-features = false } +libp2p = { version = "0.11.0", default-features = false } log = "0.4" primitives = { package = "substrate-primitives", path= "../../primitives" } inherents = { package = "substrate-inherents", path = "../../inherents" } -futures = "0.1" +futures-preview = "=0.3.0-alpha.17" +futures-timer = "0.2.1" rstd = { package = "sr-std", path = "../../sr-std" } runtime_version = { package = "sr-version", path = "../../sr-version" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } -tokio-executor = "0.1.6" -tokio-timer = "0.2" -parity-codec = { version = "4.1.1", features = ["derive"] } -parking_lot = "0.8.0" +sr-primitives = { path = "../../sr-primitives" } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } +parking_lot = "0.9.0" [dev-dependencies] test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } diff --git a/core/consensus/common/primitives/Cargo.toml b/core/consensus/common/primitives/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..de59c3723dd7d984a56cda9c383052a7fda1069d --- /dev/null +++ b/core/consensus/common/primitives/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "substrate-consensus-common-primitives" +version = "2.0.0" +authors = ["Parity Technologies "] +description = "Common consensus primitives" +edition = "2018" + +[dependencies] +codec = { package = "parity-scale-codec", default-features = false, version = "1.0.3" } +client = { package = "substrate-client", path = "../../../client", default-features = false } +sr-primitives = { path = "../../../sr-primitives", default-features = false } +rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } + +[features] +default = ["std"] +std = [ + "rstd/std", + "client/std", + "codec/std", + "sr-primitives/std" +] diff --git a/core/consensus/common/primitives/src/lib.rs b/core/consensus/common/primitives/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..f6c1800081f90c4f07b51d20e4ffb8f368d2155b --- /dev/null +++ b/core/consensus/common/primitives/src/lib.rs @@ -0,0 +1,31 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Common consensus primitives. + +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::Codec; +use client::decl_runtime_apis; +use rstd::vec::Vec; + +decl_runtime_apis! { + /// Common consensus runtime api. + pub trait ConsensusApi { + /// Returns the set of authorities of the currently active consensus mechanism. + fn authorities() -> Vec; + } +} diff --git a/core/consensus/common/src/block_import.rs b/core/consensus/common/src/block_import.rs index 8afdd31b3f538a4a1c6a997cfa05cae133aad243..1910a7e7751ace52512380ea349d3e137e6bef63 100644 --- a/core/consensus/common/src/block_import.rs +++ b/core/consensus/common/src/block_import.rs @@ -16,8 +16,8 @@ //! Block import helpers. -use runtime_primitives::traits::{Block as BlockT, DigestItemFor, Header as HeaderT, NumberFor}; -use runtime_primitives::Justification; +use sr_primitives::traits::{Block as BlockT, DigestItemFor, Header as HeaderT, NumberFor}; +use sr_primitives::Justification; use std::borrow::Cow; use std::collections::HashMap; use std::sync::Arc; @@ -97,7 +97,7 @@ pub enum ForkChoiceStrategy { } /// Data required to import a Block -pub struct ImportBlock { +pub struct BlockImportParams { /// Origin of the Block pub origin: BlockOrigin, /// The header, without consensus post-digests applied. This should be in the same @@ -130,7 +130,7 @@ pub struct ImportBlock { pub fork_choice: ForkChoiceStrategy, } -impl ImportBlock { +impl BlockImportParams { /// Deconstruct the justified header into parts. pub fn into_inner(self) -> ( @@ -186,7 +186,7 @@ pub trait BlockImport { /// Cached data can be accessed through the blockchain cache. fn import_block( &mut self, - block: ImportBlock, + block: BlockImportParams, cache: HashMap>, ) -> Result; } @@ -206,7 +206,7 @@ where for<'r> &'r T: BlockImport fn import_block( &mut self, - block: ImportBlock, + block: BlockImportParams, cache: HashMap>, ) -> Result { (&**self).import_block(block, cache) @@ -244,6 +244,6 @@ pub trait FinalityProofImport { hash: B::Hash, number: NumberFor, finality_proof: Vec, - verifier: &dyn Verifier, + verifier: &mut dyn Verifier, ) -> Result<(B::Hash, NumberFor), Self::Error>; } diff --git a/core/consensus/common/src/error.rs b/core/consensus/common/src/error.rs index d8683d0b685472de860b405aef7c728e71a84704..cb57bb915eb2dffa903d2cdc3605bcdbbf37627a 100644 --- a/core/consensus/common/src/error.rs +++ b/core/consensus/common/src/error.rs @@ -33,7 +33,7 @@ pub enum Error { IoTerminated, /// Unable to schedule wakeup. #[display(fmt="Timer error: {}", _0)] - FaultyTimer(tokio_timer::Error), + FaultyTimer(std::io::Error), /// Error while working with inherent data. #[display(fmt="InherentData error: {}", _0)] InherentData(String), diff --git a/core/consensus/common/src/evaluation.rs b/core/consensus/common/src/evaluation.rs index ed7515a419194c1cc8ea651a903d89650f03373e..7a3e565aa09d1ab8c389436e331e3f3d6ab6476c 100644 --- a/core/consensus/common/src/evaluation.rs +++ b/core/consensus/common/src/evaluation.rs @@ -18,8 +18,8 @@ use super::MAX_BLOCK_SIZE; -use parity_codec::Encode; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, One, CheckedConversion}; +use codec::Encode; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, One, CheckedConversion}; // This is just a best effort to encode the number. None indicated that it's too big to encode // in a u128. @@ -32,8 +32,8 @@ pub type Result = std::result::Result; #[derive(Debug, derive_more::Display)] pub enum Error { /// Proposal provided not a block. - #[display(fmt="Proposal provided not a block.")] - BadProposalFormat, + #[display(fmt="Proposal provided not a block: decoding error: {}", _0)] + BadProposalFormat(codec::Error), /// Proposal had wrong parent hash. #[display(fmt="Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got)] WrongParentHash { expected: String, got: String }, @@ -60,7 +60,7 @@ pub fn evaluate_initial( let encoded = Encode::encode(proposal); let proposal = Block::decode(&mut &encoded[..]) - .ok_or_else(|| Error::BadProposalFormat)?; + .map_err(|e| Error::BadProposalFormat(e))?; if encoded.len() > MAX_BLOCK_SIZE { return Err(Error::ProposalTooLarge(encoded.len())) diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index f8041ae99bf94ad981d9e7addf3b12416e6cdfa6..f4febb5e2396b404bdc9e05de555b33f787d6b37 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -25,11 +25,11 @@ //! instantiated. The `BasicQueue` and `BasicVerifier` traits allow serial //! queues to be instantiated simply. -use std::{sync::Arc, collections::HashMap}; -use runtime_primitives::{Justification, traits::{Block as BlockT, Header as _, NumberFor}}; +use std::collections::HashMap; +use sr_primitives::{Justification, traits::{Block as BlockT, Header as _, NumberFor}}; use crate::{error::Error as ConsensusError, well_known_cache_keys::Id as CacheKeyId}; use crate::block_import::{ - BlockImport, BlockOrigin, ImportBlock, ImportedAux, JustificationImport, ImportResult, + BlockImport, BlockOrigin, BlockImportParams, ImportedAux, JustificationImport, ImportResult, FinalityProofImport, }; @@ -67,16 +67,16 @@ pub struct IncomingBlock { /// Verify a justification of a block pub trait Verifier: Send + Sync { - /// Verify the given data and return the ImportBlock and an optional + /// Verify the given data and return the BlockImportParams and an optional /// new set of validators to import. If not, err with an Error-Message /// presented to the User in the logs. fn verify( - &self, + &mut self, origin: BlockOrigin, header: B::Header, justification: Option, body: Option>, - ) -> Result<(ImportBlock, Option)>>), String>; + ) -> Result<(BlockImportParams, Option)>>), String>; } /// Blocks import queue API. @@ -106,8 +106,8 @@ pub trait ImportQueue: Send { /// /// This method should behave in a way similar to `Future::poll`. It can register the current /// task and notify later when more actions are ready to be polled. To continue the comparison, - /// it is as if this method always returned `Ok(Async::NotReady)`. - fn poll_actions(&mut self, link: &mut dyn Link); + /// it is as if this method always returned `Poll::Pending`. + fn poll_actions(&mut self, cx: &mut futures::task::Context, link: &mut dyn Link); } /// Hooks that the verification queue can use to influence the synchronization @@ -170,7 +170,7 @@ pub fn import_single_block>( import_handle: &mut dyn BlockImport, block_origin: BlockOrigin, block: IncomingBlock, - verifier: Arc, + verifier: &mut V, ) -> Result>, BlockImportError> { let peer = block.origin; diff --git a/core/consensus/common/src/import_queue/basic_queue.rs b/core/consensus/common/src/import_queue/basic_queue.rs index 51d30cddbb729d93379a055077864ba5862865c8..da6dcd02934e54562d54fd1a91d86bcde4d2fa4b 100644 --- a/core/consensus/common/src/import_queue/basic_queue.rs +++ b/core/consensus/common/src/import_queue/basic_queue.rs @@ -14,12 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::sync::Arc; -use futures::{prelude::*, future::Executor, sync::mpsc}; -use runtime_primitives::{Justification, traits::{Block as BlockT, Header as HeaderT, NumberFor}}; +use std::{mem, pin::Pin, time::Duration}; +use futures::{prelude::*, channel::mpsc, task::SpawnExt as _, task::Context, task::Poll}; +use futures_timer::Delay; +use sr_primitives::{Justification, traits::{Block as BlockT, Header as HeaderT, NumberFor}}; -use crate::error::Error as ConsensusError; -use crate::block_import::{BlockImport, BlockOrigin}; +use crate::block_import::BlockOrigin; use crate::import_queue::{ BlockImportResult, BlockImportError, Verifier, BoxBlockImport, BoxFinalityProofImport, BoxJustificationImport, ImportQueue, Link, Origin, @@ -34,15 +34,12 @@ pub struct BasicQueue { sender: mpsc::UnboundedSender>, /// Results coming from the worker task. result_port: BufferedLinkReceiver, - /// Since we have to be in a tokio context in order to spawn background tasks, we first store - /// the task to spawn here, then extract it as soon as we are in a tokio context. - /// If `Some`, contains the task to spawn in the background. If `None`, the future has already - /// been spawned. - future_to_spawn: Option + Send>>, /// If it isn't possible to spawn the future in `future_to_spawn` (which is notably the case in /// "no std" environment), we instead put it in `manual_poll`. It is then polled manually from /// `poll_actions`. - manual_poll: Option + Send>>, + manual_poll: Option + Send>>>, + /// A thread pool where the background worker is being run. + pool: Option, } impl BasicQueue { @@ -51,7 +48,7 @@ impl BasicQueue { /// This creates a background task, and calls `on_start` on the justification importer and /// finality proof importer. pub fn new>( - verifier: Arc, + verifier: V, block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, @@ -65,11 +62,27 @@ impl BasicQueue { finality_proof_import, ); + let mut pool = futures::executor::ThreadPool::builder() + .name_prefix("import-queue-worker-") + .pool_size(1) + .create() + .ok(); + + let manual_poll; + if let Some(pool) = &mut pool { + // TODO: this expect() can be removed once + // https://github.com/rust-lang-nursery/futures-rs/pull/1750 is merged and deployed + pool.spawn(future).expect("ThreadPool can never fail to spawn tasks; QED"); + manual_poll = None; + } else { + manual_poll = Some(Box::pin(future) as Pin>); + } + Self { sender: worker_sender, result_port, - future_to_spawn: Some(Box::new(future)), - manual_poll: None, + manual_poll, + pool, } } } @@ -99,25 +112,17 @@ impl ImportQueue for BasicQueue { let _ = self.sender.unbounded_send(ToWorkerMsg::ImportFinalityProof(who, hash, number, finality_proof)); } - fn poll_actions(&mut self, link: &mut dyn Link) { - // Try to spawn the future in `future_to_spawn`. - if let Some(future) = self.future_to_spawn.take() { - if let Err(err) = tokio_executor::DefaultExecutor::current().execute(future) { - debug_assert!(self.manual_poll.is_none()); - self.manual_poll = Some(err.into_future()); - } - } - + fn poll_actions(&mut self, cx: &mut Context, link: &mut dyn Link) { // As a backup mechanism, if we failed to spawn the `future_to_spawn`, we instead poll // manually here. if let Some(manual_poll) = self.manual_poll.as_mut() { - match manual_poll.poll() { - Ok(Async::NotReady) => {} + match Future::poll(Pin::new(manual_poll), cx) { + Poll::Pending => {} _ => self.manual_poll = None, } } - self.result_port.poll_actions(link); + self.result_port.poll_actions(cx, link); } } @@ -129,58 +134,93 @@ enum ToWorkerMsg { ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), } -struct BlockImportWorker> { +struct BlockImportWorker { result_sender: BufferedLinkSender, - block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, - verifier: Arc, + delay_between_blocks: Duration, } -impl> BlockImportWorker { - fn new( +impl BlockImportWorker { + fn new>( result_sender: BufferedLinkSender, - verifier: Arc, + verifier: V, block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, - ) -> (impl Future + Send, mpsc::UnboundedSender>) { + ) -> (impl Future + Send, mpsc::UnboundedSender>) { let (sender, mut port) = mpsc::unbounded(); let mut worker = BlockImportWorker { result_sender, - verifier, justification_import, - block_import, finality_proof_import, + delay_between_blocks: Duration::new(0, 0), }; + // Let's initialize `justification_import` and `finality_proof_import`. if let Some(justification_import) = worker.justification_import.as_mut() { for (hash, number) in justification_import.on_start() { worker.result_sender.request_justification(&hash, number); } } - if let Some(finality_proof_import) = worker.finality_proof_import.as_mut() { for (hash, number) in finality_proof_import.on_start() { worker.result_sender.request_finality_proof(&hash, number); } } - let future = futures::future::poll_fn(move || { + // The future below has two possible states: + // + // - Currently importing many blocks, in which case `importing` is `Some` and contains a + // `Future`, and `block_import` is `None`. + // - Something else, in which case `block_import` is `Some` and `importing` is None. + // + let mut block_import_verifier = Some((block_import, verifier)); + let mut importing = None; + + let future = futures::future::poll_fn(move |cx| { loop { - let msg = match port.poll() { - Ok(Async::Ready(Some(msg))) => msg, - Err(_) | Ok(Async::Ready(None)) => return Ok(Async::Ready(())), - Ok(Async::NotReady) => return Ok(Async::NotReady), + // If the results sender is closed, that means that the import queue is shutting + // down and we should end this future. + if worker.result_sender.is_closed() { + return Poll::Ready(()) + } + + // If we are in the process of importing a bunch of block, let's resume this + // process before doing anything more. + if let Some(imp_fut) = importing.as_mut() { + match Future::poll(Pin::new(imp_fut), cx) { + Poll::Pending => return Poll::Pending, + Poll::Ready((bi, verif)) => { + block_import_verifier = Some((bi, verif)); + importing = None; + }, + } + } + + debug_assert!(importing.is_none()); + debug_assert!(block_import_verifier.is_some()); + + // Grab the next action request sent to the import queue. + let msg = match Stream::poll_next(Pin::new(&mut port), cx) { + Poll::Ready(Some(msg)) => msg, + Poll::Ready(None) => return Poll::Ready(()), + Poll::Pending => return Poll::Pending, }; match msg { ToWorkerMsg::ImportBlocks(origin, blocks) => { - worker.import_a_batch_of_blocks(origin, blocks); + // On blocks import request, we merely *start* the process and store + // a `Future` into `importing`. + let (bi, verif) = block_import_verifier.take() + .expect("block_import_verifier is always Some; qed"); + importing = Some(worker.import_a_batch_of_blocks(bi, verif, origin, blocks)); }, ToWorkerMsg::ImportFinalityProof(who, hash, number, proof) => { - worker.import_finality_proof(who, hash, number, proof); + let (_, verif) = block_import_verifier.as_mut() + .expect("block_import_verifier is always Some; qed"); + worker.import_finality_proof(verif, who, hash, number, proof); }, ToWorkerMsg::ImportJustification(who, hash, number, justification) => { worker.import_justification(who, hash, number, justification); @@ -192,21 +232,35 @@ impl> BlockImportWorker { (future, sender) } - fn import_a_batch_of_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) { - let result_sender = &self.result_sender; - let (imported, count, results) = import_many_blocks( - &mut *self.block_import, - origin, - blocks, - self.verifier.clone(), - || !result_sender.is_closed(), - ); - - self.result_sender.blocks_processed(imported, count, results); + /// Returns a `Future` that imports the given blocks and sends the results on + /// `self.result_sender`. + /// + /// For lifetime reasons, the `BlockImport` implementation must be passed by value, and is + /// yielded back in the output once the import is finished. + fn import_a_batch_of_blocks>( + &mut self, + block_import: BoxBlockImport, + verifier: V, + origin: BlockOrigin, + blocks: Vec> + ) -> impl Future, V)> { + let mut result_sender = self.result_sender.clone(); + + import_many_blocks(block_import, origin, blocks, verifier, self.delay_between_blocks) + .then(move |(imported, count, results, block_import, verifier)| { + result_sender.blocks_processed(imported, count, results); + future::ready((block_import, verifier)) + }) } - fn import_finality_proof(&mut self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { - let verifier = &*self.verifier; + fn import_finality_proof>( + &mut self, + verifier: &mut V, + who: Origin, + hash: B::Hash, + number: NumberFor, + finality_proof: Vec + ) { let result = self.finality_proof_import.as_mut().map(|finality_proof_import| { finality_proof_import.import_finality_proof(hash, number, finality_proof, verifier) .map_err(|e| { @@ -252,20 +306,22 @@ impl> BlockImportWorker { /// Import several blocks at once, returning import result for each block. /// -/// The `keep_going` closure will be called regularly. If it returns false, then the function will -/// end prematurely. +/// For lifetime reasons, the `BlockImport` implementation must be passed by value, and is yielded +/// back in the output once the import is finished. +/// +/// The returned `Future` yields at every imported block, which makes the execution more +/// fine-grained and making it possible to interrupt the process. fn import_many_blocks>( - import_handle: &mut dyn BlockImport, + import_handle: BoxBlockImport, blocks_origin: BlockOrigin, blocks: Vec>, - verifier: Arc, - keep_going: impl Fn() -> bool, -) -> (usize, usize, Vec<( + verifier: V, + delay_between_blocks: Duration, +) -> impl Future>, BlockImportError>, B::Hash, -)>) { +)>, BoxBlockImport, V)> { let count = blocks.len(); - let mut imported = 0; let blocks_range = match ( blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), @@ -278,38 +334,77 @@ fn import_many_blocks>( trace!(target: "sync", "Starting import of {} blocks {}", count, blocks_range); + let mut imported = 0; let mut results = vec![]; - let mut has_error = false; + let mut blocks = blocks.into_iter(); + let mut import_handle = Some(import_handle); + let mut waiting = None; + let mut verifier = Some(verifier); // Blocks in the response/drain should be in ascending order. - for block in blocks { - if !keep_going() { - // Setting `has_error` to true cancels the rest of the import. - has_error = true; + + future::poll_fn(move |cx| { + // Handle the optional timer that makes us wait before the next import. + if let Some(waiting) = &mut waiting { + match Future::poll(Pin::new(waiting), cx) { + Poll::Ready(_) => {}, + Poll::Pending => return Poll::Pending, + } } + waiting = None; + + // Is there any block left to import? + let block = match blocks.next() { + Some(b) => b, + None => { + // No block left to import, success! + let import_handle = import_handle.take() + .expect("Future polled again after it has finished"); + let verifier = verifier.take() + .expect("Future polled again after it has finished"); + let results = mem::replace(&mut results, Vec::new()); + return Poll::Ready((imported, count, results, import_handle, verifier)); + }, + }; + + // We extract the content of `import_handle` and `verifier` only when the future ends, + // therefore `import_handle` and `verifier` are always `Some` here. It is illegal to poll + // a `Future` again after it has ended. + let import_handle = import_handle.as_mut() + .expect("Future polled again after it has finished"); + let verifier = verifier.as_mut() + .expect("Future polled again after it has finished"); let block_number = block.header.as_ref().map(|h| h.number().clone()); let block_hash = block.hash; let import_result = if has_error { Err(BlockImportError::Cancelled) } else { + // The actual import. import_single_block( - import_handle, + &mut **import_handle, blocks_origin.clone(), block, - verifier.clone(), + verifier, ) }; - let was_ok = import_result.is_ok(); - if was_ok { + + if import_result.is_ok() { trace!(target: "sync", "Block imported successfully {:?} ({})", block_number, block_hash); imported += 1; } else { has_error = true; } + results.push((import_result, block_hash)); - } - (imported, count, results) + // Notifies the current task again so that we re-execute this closure again for the next + // block. + if delay_between_blocks != Duration::new(0, 0) { + waiting = Some(Delay::new(delay_between_blocks)); + } + cx.waker().wake_by_ref(); + Poll::Pending + }) } diff --git a/core/consensus/common/src/import_queue/buffered_link.rs b/core/consensus/common/src/import_queue/buffered_link.rs index 9c555ba9d964dfb82d1f34388ab55b9d3193b12d..b88f1bfd1e8846b22d2684148bb9d5d86d270ec3 100644 --- a/core/consensus/common/src/import_queue/buffered_link.rs +++ b/core/consensus/common/src/import_queue/buffered_link.rs @@ -20,7 +20,7 @@ //! //! # Example //! -//! ```no_run +//! ``` //! use substrate_consensus_common::import_queue::Link; //! # use substrate_consensus_common::import_queue::buffered_link::buffered_link; //! # use test_client::runtime::Block; @@ -28,12 +28,18 @@ //! # let mut my_link = DummyLink; //! let (mut tx, mut rx) = buffered_link::(); //! tx.blocks_processed(0, 0, vec![]); -//! rx.poll_actions(&mut my_link); // Calls `my_link.blocks_processed(0, 0, vec![])` +//! +//! // Calls `my_link.blocks_processed(0, 0, vec![])` when polled. +//! let _fut = futures::future::poll_fn(move |cx| { +//! rx.poll_actions(cx, &mut my_link); +//! std::task::Poll::Pending::<()> +//! }); //! ``` //! -use futures::{prelude::*, sync::mpsc}; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use futures::{prelude::*, channel::mpsc}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; +use std::{pin::Pin, task::Context, task::Poll}; use crate::import_queue::{Origin, Link, BlockImportResult, BlockImportError}; /// Wraps around an unbounded channel from the `futures` crate. The sender implements `Link` and @@ -60,6 +66,14 @@ impl BufferedLinkSender { } } +impl Clone for BufferedLinkSender { + fn clone(&self) -> Self { + BufferedLinkSender { + tx: self.tx.clone(), + } + } +} + /// Internal buffered message. enum BlockImportWorkerMsg { BlocksProcessed(usize, usize, Vec<(Result>, BlockImportError>, B::Hash)>), @@ -120,10 +134,10 @@ impl BufferedLinkReceiver { /// /// This method should behave in a way similar to `Future::poll`. It can register the current /// task and notify later when more actions are ready to be polled. To continue the comparison, - /// it is as if this method always returned `Ok(Async::NotReady)`. - pub fn poll_actions(&mut self, link: &mut dyn Link) { + /// it is as if this method always returned `Poll::Pending`. + pub fn poll_actions(&mut self, cx: &mut Context, link: &mut dyn Link) { loop { - let msg = if let Ok(Async::Ready(Some(msg))) = self.rx.poll() { + let msg = if let Poll::Ready(Some(msg)) = Stream::poll_next(Pin::new(&mut self.rx), cx) { msg } else { break diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index 1b9f31bbbc36e196636ae1637801063b4ffe05c7..3fd0a0c694c7e9f85e0b00a63939c2a351937bf1 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -31,7 +31,7 @@ use std::sync::Arc; use std::time::Duration; -use runtime_primitives::traits::{Block as BlockT, DigestFor}; +use sr_primitives::traits::{Block as BlockT, DigestFor}; use futures::prelude::*; pub use inherents::InherentData; @@ -47,7 +47,7 @@ const MAX_BLOCK_SIZE: usize = 4 * 1024 * 1024 + 512; pub use self::error::Error; pub use block_import::{ - BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult, + BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImportParams, ImportResult, JustificationImport, FinalityProofImport, }; pub use select_chain::SelectChain; @@ -61,7 +61,7 @@ pub trait Environment { /// Initialize the proposal logic on top of a specific header. Provide /// the authorities at that header. - fn init(&self, parent_header: &B::Header) + fn init(&mut self, parent_header: &B::Header) -> Result; } @@ -75,10 +75,10 @@ pub trait Proposer { /// Error type which can occur when proposing or evaluating. type Error: From + ::std::fmt::Debug + 'static; /// Future that resolves to a committed proposal. - type Create: IntoFuture; + type Create: Future>; /// Create a proposal. fn propose( - &self, + &mut self, inherent_data: InherentData, inherent_digests: DigestFor, max_duration: Duration, @@ -92,10 +92,10 @@ pub trait Proposer { pub trait SyncOracle { /// Whether the synchronization service is undergoing major sync. /// Returns true if so. - fn is_major_syncing(&self) -> bool; + fn is_major_syncing(&mut self) -> bool; /// Whether the synchronization service is offline. /// Returns true if so. - fn is_offline(&self) -> bool; + fn is_offline(&mut self) -> bool; } /// A synchronization oracle for when there is no network. @@ -103,16 +103,18 @@ pub trait SyncOracle { pub struct NoNetwork; impl SyncOracle for NoNetwork { - fn is_major_syncing(&self) -> bool { false } - fn is_offline(&self) -> bool { false } + fn is_major_syncing(&mut self) -> bool { false } + fn is_offline(&mut self) -> bool { false } } -impl SyncOracle for Arc { - fn is_major_syncing(&self) -> bool { - T::is_major_syncing(&*self) +impl SyncOracle for Arc +where T: ?Sized, for<'r> &'r T: SyncOracle +{ + fn is_major_syncing(&mut self) -> bool { + <&T>::is_major_syncing(&mut &**self) } - fn is_offline(&self) -> bool { - T::is_offline(&*self) + fn is_offline(&mut self) -> bool { + <&T>::is_offline(&mut &**self) } } @@ -123,4 +125,7 @@ pub mod well_known_cache_keys { /// A list of authorities. pub const AUTHORITIES: Id = *b"auth"; + + /// Current Epoch data. + pub const EPOCH: Id = *b"epch"; } diff --git a/core/consensus/common/src/select_chain.rs b/core/consensus/common/src/select_chain.rs index 9ab21cba13ba9a08d5515cbf87b4f4151cecff98..cae28656a13b90cc50319d3f4fb6449ebdf59de3 100644 --- a/core/consensus/common/src/select_chain.rs +++ b/core/consensus/common/src/select_chain.rs @@ -15,7 +15,7 @@ // along with Substrate Consensus Common. If not, see . use crate::error::Error; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; /// The SelectChain trait defines the strategy upon which the head is chosen diff --git a/core/consensus/rhd/Cargo.toml b/core/consensus/rhd/Cargo.toml index 7eda2d69045174e5e7e1ee618b63941b37247fd1..801605c3f64ca2c5e4f25ebbb24074330d3c4101 100644 --- a/core/consensus/rhd/Cargo.toml +++ b/core/consensus/rhd/Cargo.toml @@ -8,20 +8,20 @@ edition = "2018" [dependencies] derive_more = "0.14.0" futures = "0.1.17" -codec = { package = "parity-codec", version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../primitives" } consensus = { package = "substrate-consensus-common", path = "../common" } client = { package = "substrate-client", path = "../../client" } transaction_pool = { package = "substrate-transaction-pool", path = "../../transaction-pool" } runtime_support = { package = "srml-support", path = "../../../srml/support" } srml-system = { path = "../../../srml/system" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } tokio = "0.1.7" -parking_lot = "0.8.0" +parking_lot = "0.9.0" log = "0.4" -rhododendron = { version = "0.6.0", features = ["codec"] } +rhododendron = { version = "0.7.0", features = ["codec"] } exit-future = "0.1" [dev-dependencies] @@ -32,6 +32,6 @@ default = ["std"] std = [ "primitives/std", "runtime_support/std", - "runtime_primitives/std", + "sr-primitives/std", "runtime_version/std", ] diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index 1f6582d07739923b9f41f4666975b6271139a83c..3bcd1346d47c96c99ba3aea9f7c48b39a2e3ebaf 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -40,19 +40,19 @@ use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::{self, Instant, Duration}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use consensus::offline_tracker::OfflineTracker; use consensus::error::{ErrorKind as CommonErrorKind}; use consensus::{Authorities, BlockImport, Environment, Proposer as BaseProposer}; use client::{Client as SubstrateClient, CallExecutor}; use client::runtime_api::{Core, BlockBuilder as BlockBuilderAPI, OldTxQueue, BlockBuilderError}; -use runtime_primitives::generic::{BlockId, Era, ImportResult, ImportBlock, BlockOrigin}; -use runtime_primitives::traits::{Block, Header}; -use runtime_primitives::traits::{ +use sr_primitives::generic::{BlockId, Era, ImportResult, BlockImportParams, BlockOrigin}; +use sr_primitives::traits::{Block, Header}; +use sr_primitives::traits::{ Block as BlockT, Hash as HashT, Header as HeaderT, BlockNumberToHash, SaturatedConversion }; -use runtime_primitives::Justification; +use sr_primitives::Justification; use primitives::{AuthorityId, ed25519, Blake2Hasher, ed25519::LocalizedSignature}; use srml_system::Trait as SystemT; @@ -391,7 +391,7 @@ impl Future for BftFuture consensus::Environment<::Block> for ProposerFac authorities: &[AuthorityId], sign_with: Arc, ) -> Result { - use runtime_primitives::traits::Hash as HashT; + use sr_primitives::traits::Hash as HashT; let parent_hash = parent_header.hash(); let id = BlockId::hash(parent_hash); @@ -1061,7 +1061,7 @@ impl BaseProposer<::Block> for Proposer where type Evaluate = Box>; fn propose(&self) -> Self::Create { - use runtime_primitives::traits::BlakeTwo256; + use sr_primitives::traits::BlakeTwo256; const MAX_VOTE_OFFLINE_SECONDS: Duration = Duration::from_secs(60); @@ -1237,7 +1237,7 @@ impl LocalProposer<::Block> for Proposer where _misbehavior: Vec<(AuthorityId, Misbehavior<<::Block as BlockT>::Hash>)> ) { use rhododendron::Misbehavior as GenericMisbehavior; - use runtime_primitives::bft::{MisbehaviorKind, MisbehaviorReport}; + use sr_primitives::bft::{MisbehaviorKind, MisbehaviorReport}; use node_runtime::{Call, UncheckedExtrinsic, ConsensusCall}; let mut next_index = { @@ -1329,9 +1329,9 @@ mod tests { use std::collections::HashSet; use std::marker::PhantomData; - use runtime_primitives::testing::{Block as GenericTestBlock, Header as TestHeader}; + use sr_primitives::testing::{Block as GenericTestBlock, Header as TestHeader}; use primitives::H256; - use keyring::AuthorityKeyring; + use keyring::Ed25519Keyring; type TestBlock = GenericTestBlock<()>; @@ -1344,7 +1344,7 @@ mod tests { type Error = Error; fn import_block(&self, - block: ImportBlock, + block: BlockImportParams, _new_authorities: Option> ) -> Result { assert!(self.imported_heights.lock().insert(block.header.number)); @@ -1392,7 +1392,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &TestHeader, _authorities: &[AuthorityId], _sign_with: Arc) + fn init(&mut self, parent_header: &TestHeader, _authorities: &[AuthorityId], _sign_with: Arc) -> Result { Ok(DummyProposer(parent_header.number + 1)) @@ -1436,7 +1436,7 @@ mod tests { start_round: 0, })), round_timeout_multiplier: 10, - key: Arc::new(AuthorityKeyring::One.into()), + key: Arc::new(Ed25519Keyring::One.into()), factory: DummyFactory } } @@ -1462,10 +1462,10 @@ mod tests { fn future_gets_preempted() { let client = FakeClient { authorities: vec![ - AuthorityKeyring::One.into(), - AuthorityKeyring::Two.into(), - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::One.into(), + Ed25519Keyring::Two.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ], imported_heights: Mutex::new(HashSet::new()), }; @@ -1509,17 +1509,17 @@ mod tests { let hash = [0xff; 32].into(); let authorities = vec![ - AuthorityKeyring::One.into(), - AuthorityKeyring::Two.into(), - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::One.into(), + Ed25519Keyring::Two.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ]; let authorities_keys = vec![ - AuthorityKeyring::One.into(), - AuthorityKeyring::Two.into(), - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::One.into(), + Ed25519Keyring::Two.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ]; let unchecked = UncheckedJustification(rhododendron::UncheckedJustification { @@ -1570,8 +1570,8 @@ mod tests { let parent_hash = Default::default(); let authorities = vec![ - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ]; let block = TestBlock { @@ -1579,7 +1579,11 @@ mod tests { extrinsics: Default::default() }; - let proposal = sign_message(rhododendron::Message::Propose(1, block.clone()), &AuthorityKeyring::Alice.pair(), parent_hash);; + let proposal = sign_message( + rhododendron::Message::Propose(1, block.clone()), + &Ed25519Keyring::Alice.pair(), + parent_hash, + ); if let rhododendron::LocalizedMessage::Propose(proposal) = proposal { assert!(check_proposal(&authorities, &parent_hash, &proposal).is_ok()); let mut invalid_round = proposal.clone(); @@ -1593,7 +1597,11 @@ mod tests { } // Not an authority - let proposal = sign_message::(rhododendron::Message::Propose(1, block), &AuthorityKeyring::Bob.pair(), parent_hash);; + let proposal = sign_message::( + rhododendron::Message::Propose(1, block), + &Ed25519Keyring::Bob.pair(), + parent_hash, + ); if let rhododendron::LocalizedMessage::Propose(proposal) = proposal { assert!(check_proposal(&authorities, &parent_hash, &proposal).is_err()); } else { @@ -1607,8 +1615,8 @@ mod tests { let hash: H256 = [0xff; 32].into(); let authorities = vec![ - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ]; let vote = sign_message::(rhododendron::Message::Vote(rhododendron::Vote::Prepare(1, hash)), &Keyring::Alice.pair(), parent_hash);; @@ -1634,10 +1642,10 @@ mod tests { fn drop_bft_future_does_not_deadlock() { let client = FakeClient { authorities: vec![ - AuthorityKeyring::One.into(), - AuthorityKeyring::Two.into(), - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::One.into(), + Ed25519Keyring::Two.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ], imported_heights: Mutex::new(HashSet::new()), }; @@ -1659,10 +1667,10 @@ mod tests { fn bft_can_build_though_skipped() { let client = FakeClient { authorities: vec![ - AuthorityKeyring::One.into(), - AuthorityKeyring::Two.into(), - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Eve.into(), + Ed25519Keyring::One.into(), + Ed25519Keyring::Two.into(), + Ed25519Keyring::Alice.into(), + Ed25519Keyring::Eve.into(), ], imported_heights: Mutex::new(HashSet::new()), }; diff --git a/core/consensus/rhd/src/misbehaviour_check.rs b/core/consensus/rhd/src/misbehaviour_check.rs index 58b36542f692bfe16dda219a1d5fd53cb83bf160..bde3976c19b0977553b427c4e0b72783fa6523c8 100644 --- a/core/consensus/rhd/src/misbehaviour_check.rs +++ b/core/consensus/rhd/src/misbehaviour_check.rs @@ -26,7 +26,7 @@ use runtime_io; fn check_message_sig( message: Message, signature: &Signature, - from: &AuthorityId + from: &AuthorityId, ) -> bool { let msg: Vec = message.encode(); runtime_io::ed25519_verify(&signature.0, &msg, from) @@ -74,10 +74,10 @@ pub fn evaluate_misbehavior( mod tests { use super::*; - use keyring::AuthorityKeyring; + use keyring::Ed25519Keyring; use rhododendron; - use runtime_primitives::testing::{H256, Block as RawBlock}; + use sr_primitives::testing::{H256, Block as RawBlock}; type Block = RawBlock; @@ -109,7 +109,7 @@ mod tests { #[test] fn evaluates_double_prepare() { - let key = AuthorityKeyring::One.pair(); + let key = Ed25519Keyring::One.pair(); let parent_hash = [0xff; 32].into(); let hash_1 = [0; 32].into(); let hash_2 = [1; 32].into(); @@ -138,7 +138,7 @@ mod tests { // misbehavior has wrong target. assert!(!evaluate_misbehavior::( - &AuthorityKeyring::Two.into(), + &Ed25519Keyring::Two.into(), parent_hash, &MisbehaviorKind::BftDoublePrepare( 1, @@ -150,7 +150,7 @@ mod tests { #[test] fn evaluates_double_commit() { - let key = AuthorityKeyring::One.pair(); + let key = Ed25519Keyring::One.pair(); let parent_hash = [0xff; 32].into(); let hash_1 = [0; 32].into(); let hash_2 = [1; 32].into(); @@ -179,7 +179,7 @@ mod tests { // misbehavior has wrong target. assert!(!evaluate_misbehavior::( - &AuthorityKeyring::Two.into(), + &Ed25519Keyring::Two.into(), parent_hash, &MisbehaviorKind::BftDoubleCommit( 1, diff --git a/core/consensus/rhd/src/service.rs b/core/consensus/rhd/src/service.rs index f59393c530356dad7564e3247f8ed065c45d367c..641a97fe06e9bbad5f5690bb6a20aae7f2019fcb 100644 --- a/core/consensus/rhd/src/service.rs +++ b/core/consensus/rhd/src/service.rs @@ -25,7 +25,7 @@ use std::sync::Arc; use client::{BlockchainEvents, BlockBody}; use futures::prelude::*; use transaction_pool::txpool::{Pool as TransactionPool, ChainApi as PoolChainApi}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, BlockNumberToHash}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, BlockNumberToHash}; use tokio::executor::current_thread::TaskExecutor as LocalThreadHandle; use tokio::runtime::TaskExecutor as ThreadPoolHandle; diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index fa856bbfbb8df53aaee5b150d4e47c945cf89008..f74837a62f9de36970ccea2e8915276a4956c5ec 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -6,15 +6,15 @@ description = "Generic slots-based utilities for consensus" edition = "2018" [dependencies] -codec = { package = "parity-codec", version = "4.1.1" } +codec = { package = "parity-scale-codec", version = "1.0.0" } client = { package = "substrate-client", path = "../../client" } primitives = { package = "substrate-primitives", path = "../../primitives" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } consensus_common = { package = "substrate-consensus-common", path = "../common" } inherents = { package = "substrate-inherents", path = "../../inherents" } -futures = "0.1.17" -tokio-timer = "0.2.11" -parking_lot = "0.8.0" +futures-preview = "=0.3.0-alpha.17" +futures-timer = "0.2.1" +parking_lot = "0.9.0" log = "0.4" [dev-dependencies] diff --git a/core/consensus/slots/src/aux_schema.rs b/core/consensus/slots/src/aux_schema.rs index 1af8b2da530116afa6e409ca787c7cf0314be645..1d54cb5c2ee6cf05e52edb70c6f6fea5621bb180 100644 --- a/core/consensus/slots/src/aux_schema.rs +++ b/core/consensus/slots/src/aux_schema.rs @@ -19,7 +19,7 @@ use codec::{Encode, Decode}; use client::backend::AuxStore; use client::error::{Result as ClientResult, Error as ClientError}; -use runtime_primitives::traits::Header; +use sr_primitives::traits::Header; const SLOT_HEADER_MAP_KEY: &[u8] = b"slot_header_map"; const SLOT_HEADER_START: &[u8] = b"slot_header_start"; @@ -37,8 +37,8 @@ fn load_decode(backend: &C, key: &[u8]) -> ClientResult> match backend.get_aux(key)? { None => Ok(None), Some(t) => T::decode(&mut &t[..]) - .ok_or_else( - || ClientError::Backend(format!("Slots DB is corrupted.")).into(), + .map_err( + |e| ClientError::Backend(format!("Slots DB is corrupted. Decode error: {}", e.what())).into(), ) .map(Some) } @@ -153,7 +153,7 @@ pub fn check_equivocation( mod test { use primitives::{sr25519, Pair}; use primitives::hash::H256; - use runtime_primitives::testing::{Header as HeaderTest, Digest as DigestTest}; + use sr_primitives::testing::{Header as HeaderTest, Digest as DigestTest}; use test_client; use super::{MAX_SLOT_CAPACITY, PRUNING_BOUND, check_equivocation}; diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index dd6d55345be4739eb11a2376ee69bea7ca0394b6..fc0134f746af79a72ec1224515ac595e3b0b1006 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -20,36 +20,33 @@ //! time during which certain events can and/or must occur. This crate //! provides generic functionality for slots. -#![forbid(warnings, unsafe_code, missing_docs)] +#![deny(warnings)] +#![forbid(unsafe_code, missing_docs)] mod slots; mod aux_schema; -pub use slots::{SignedDuration, SlotInfo, Slots}; +pub use slots::{SignedDuration, SlotInfo}; +use slots::Slots; pub use aux_schema::{check_equivocation, MAX_SLOT_CAPACITY, PRUNING_BOUND}; use codec::{Decode, Encode}; use consensus_common::{SyncOracle, SelectChain}; -use futures::prelude::*; -use futures::{ - future::{self, Either}, - Future, IntoFuture, -}; +use futures::{prelude::*, future::{self, Either}}; use inherents::{InherentData, InherentDataProviders}; use log::{debug, error, info, warn}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ApiRef, Block as BlockT, ProvideRuntimeApi}; -use std::fmt::Debug; -use std::ops::Deref; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ApiRef, Block as BlockT, ProvideRuntimeApi}; +use std::{fmt::Debug, ops::Deref}; /// A worker that should be invoked at every new slot. pub trait SlotWorker { /// The type of the future that will be returned when a new slot is /// triggered. - type OnSlot: IntoFuture; + type OnSlot: Future>; /// Called when a new slot is triggered. - fn on_slot(&self, chain_head: B::Header, slot_info: SlotInfo) -> Self::OnSlot; + fn on_slot(&mut self, chain_head: B::Header, slot_info: SlotInfo) -> Self::OnSlot; } /// Slot compatible inherent data. @@ -72,32 +69,33 @@ pub trait SlotCompatible { pub fn start_slot_worker( slot_duration: SlotDuration, client: C, - worker: W, - sync_oracle: SO, + mut worker: W, + mut sync_oracle: SO, inherent_data_providers: InherentDataProviders, timestamp_extractor: SC, -) -> impl Future +) -> impl Future where B: BlockT, C: SelectChain + Clone, W: SlotWorker, + W::OnSlot: Unpin, SO: SyncOracle + Send + Clone, - SC: SlotCompatible, + SC: SlotCompatible + Unpin, T: SlotData + Clone, { let SlotDuration(slot_duration) = slot_duration; // rather than use a timer interval, we schedule our waits ourselves - let mut authorship = Slots::::new( + Slots::::new( slot_duration.slot_duration(), inherent_data_providers, timestamp_extractor, - ).map_err(|e| debug!(target: "slots", "Faulty timer: {:?}", e)) - .for_each(move |slot_info| { + ).inspect_err(|e| debug!(target: "slots", "Faulty timer: {:?}", e)) + .try_for_each(move |slot_info| { // only propose when we are not syncing. if sync_oracle.is_major_syncing() { debug!(target: "slots", "Skipping proposal slot due to sync."); - return Either::B(future::ok(())); + return Either::Right(future::ready(Ok(()))); } let slot_num = slot_info.number; @@ -106,33 +104,21 @@ where Err(e) => { warn!(target: "slots", "Unable to author block in slot {}. \ no best block header: {:?}", slot_num, e); - return Either::B(future::ok(())); + return Either::Right(future::ready(Ok(()))); } }; - Either::A(worker.on_slot(chain_head, slot_info).into_future().map_err( - |e| warn!(target: "slots", "Encountered consensus error: {:?}", e), - )) - }); - - future::poll_fn(move || - loop { - let mut authorship = std::panic::AssertUnwindSafe(&mut authorship); - match std::panic::catch_unwind(move || authorship.poll()) { - Ok(Ok(Async::Ready(()))) => - warn!(target: "slots", "Slots stream has terminated unexpectedly."), - Ok(Ok(Async::NotReady)) => break Ok(Async::NotReady), - Ok(Err(())) => warn!(target: "slots", "Authorship task terminated unexpectedly. Restarting"), - Err(e) => { - if let Some(s) = e.downcast_ref::<&'static str>() { - warn!(target: "slots", "Authorship task panicked at {:?}", s); - } - - warn!(target: "slots", "Restarting authorship task"); - } + Either::Left(worker.on_slot(chain_head, slot_info).map_err( + |e| { + warn!(target: "slots", "Encountered consensus error: {:?}", e); + }).or_else(|_| future::ready(Ok(()))) + ) + }).then(|res| { + if let Err(err) = res { + warn!(target: "slots", "Slots stream terminated with an error: {:?}", err); } - } - ) + future::ready(()) + }) } /// A header which has been checked @@ -202,7 +188,7 @@ impl SlotDuration { match client.get_aux(T::SLOT_KEY)? { Some(v) => ::decode(&mut &v[..]) .map(SlotDuration) - .ok_or_else(|| { + .map_err(|_| { ::client::error::Error::Backend({ error!(target: "slots", "slot duration kept in invalid format"); format!("slot duration kept in invalid format") @@ -210,7 +196,7 @@ impl SlotDuration { .into() }), None => { - use runtime_primitives::traits::Zero; + use sr_primitives::traits::Zero; let genesis_slot_duration = cb(client.runtime_api(), &BlockId::number(Zero::zero()))?; diff --git a/core/consensus/slots/src/slots.rs b/core/consensus/slots/src/slots.rs index c35b252b4000ec0440869c059d5e392706597c09..98310bbf2e27cddd0cae618739bad152de17f136 100644 --- a/core/consensus/slots/src/slots.rs +++ b/core/consensus/slots/src/slots.rs @@ -16,16 +16,15 @@ //! Utility stream for yielding slots in a loop. //! -//! This is used instead of `tokio_timer::Interval` because it was unreliable. +//! This is used instead of `futures_timer::Interval` because it was unreliable. use super::SlotCompatible; use consensus_common::Error; -use futures::prelude::*; -use futures::try_ready; +use futures::{prelude::*, task::Context, task::Poll}; use inherents::{InherentData, InherentDataProviders}; -use std::time::{Duration, Instant}; -use tokio_timer::Delay; +use std::{pin::Pin, time::{Duration, Instant}}; +use futures_timer::Delay; /// Returns current duration since unix epoch. pub fn duration_now() -> Duration { @@ -58,15 +57,14 @@ impl SignedDuration { duration_now() + self.offset } else { duration_now() - self.offset - }.as_secs()) / slot_duration + }.as_millis() as u64) / slot_duration } } /// Returns the duration until the next slot, based on current duration since pub fn time_until_next(now: Duration, slot_duration: u64) -> Duration { - let remaining_full_secs = slot_duration - (now.as_secs() % slot_duration) - 1; - let remaining_nanos = 1_000_000_000 - now.subsec_nanos(); - Duration::new(remaining_full_secs, remaining_nanos) + let remaining_full_millis = slot_duration - (now.as_millis() as u64 % slot_duration) - 1; + Duration::from_millis(remaining_full_millis) } /// Information about a slot. @@ -90,13 +88,13 @@ impl SlotInfo { if now < self.ends_at { self.ends_at.duration_since(now) } else { - Duration::from_secs(0) + Duration::from_millis(0) } } } /// A stream that returns every time there is a new slot. -pub struct Slots { +pub(crate) struct Slots { last_slot: u64, slot_duration: u64, inner_delay: Option, @@ -121,47 +119,51 @@ impl Slots { } } -impl Stream for Slots { - type Item = SlotInfo; - type Error = Error; +impl Stream for Slots { + type Item = Result; - fn poll(&mut self) -> Poll, Self::Error> { + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { loop { let slot_duration = self.slot_duration; self.inner_delay = match self.inner_delay.take() { None => { // schedule wait. - let wait_until = Instant::now() + time_until_next(duration_now(), slot_duration); - Some(Delay::new(wait_until)) + let wait_dur = time_until_next(duration_now(), slot_duration); + Some(Delay::new(wait_dur)) } Some(d) => Some(d), }; if let Some(ref mut inner_delay) = self.inner_delay { - try_ready!(inner_delay - .poll() - .map_err(Error::FaultyTimer)); + match Future::poll(Pin::new(inner_delay), cx) { + Poll::Pending => return Poll::Pending, + Poll::Ready(Err(err)) => return Poll::Ready(Some(Err(Error::FaultyTimer(err)))), + Poll::Ready(Ok(())) => {} + } } // timeout has fired. - let inherent_data = self - .inherent_data_providers - .create_inherent_data() - .map_err(|s| consensus_common::Error::InherentData(s.into_owned()))?; - let (timestamp, slot_num, offset) = self - .timestamp_extractor - .extract_timestamp_and_slot(&inherent_data)?; + let inherent_data = match self.inherent_data_providers.create_inherent_data() { + Ok(id) => id, + Err(err) => return Poll::Ready(Some(Err(consensus_common::Error::InherentData(err.into_owned())))), + }; + let result = self.timestamp_extractor.extract_timestamp_and_slot(&inherent_data); + let (timestamp, slot_num, offset) = match result { + Ok(v) => v, + Err(err) => return Poll::Ready(Some(Err(err))), + }; // reschedule delay for next slot. - let ends_at = Instant::now() + offset + - time_until_next(Duration::from_secs(timestamp), slot_duration); - self.inner_delay = Some(Delay::new(ends_at)); + let ends_in = offset + + time_until_next(Duration::from_millis(timestamp), slot_duration); + let ends_at = Instant::now() + ends_in; + self.inner_delay = Some(Delay::new(ends_in)); // never yield the same slot twice. if slot_num > self.last_slot { self.last_slot = slot_num; - break Ok(Async::Ready(Some(SlotInfo { + break Poll::Ready(Some(Ok(SlotInfo { number: slot_num, duration: self.slot_duration, timestamp, diff --git a/core/consensus/uncles/Cargo.toml b/core/consensus/uncles/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..98b8adee8b7930ef94859492a84b632b4706b887 --- /dev/null +++ b/core/consensus/uncles/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "substrate-consensus-uncles" +version = "2.0.0" +authors = ["Parity Technologies "] +description = "Generic uncle inclusion utilities for consensus" +edition = "2018" + +[dependencies] +client = { package = "substrate-client", path = "../../client" } +primitives = { package = "substrate-primitives", path = "../../primitives" } +sr-primitives = { path = "../../sr-primitives" } +srml-authorship = { path = "../../../srml/authorship" } +consensus_common = { package = "substrate-consensus-common", path = "../common" } +inherents = { package = "substrate-inherents", path = "../../inherents" } +log = "0.4" diff --git a/core/consensus/uncles/src/lib.rs b/core/consensus/uncles/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..5638a23175d560389085df6d84461da06ad5e70c --- /dev/null +++ b/core/consensus/uncles/src/lib.rs @@ -0,0 +1,66 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Uncles functionality for Substrate. +//! +#![deny(warnings)] +#![forbid(unsafe_code, missing_docs)] + +use consensus_common::SelectChain; +use inherents::{InherentDataProviders}; +use log::warn; +use client::ProvideUncles; +use sr_primitives::traits::{Block as BlockT, Header}; +use std::sync::Arc; + +/// Maximum uncles generations we may provide to the runtime. +const MAX_UNCLE_GENERATIONS: u32 = 8; + +/// Register uncles inherent data provider, if not registered already. +pub fn register_uncles_inherent_data_provider( + client: Arc, + select_chain: SC, + inherent_data_providers: &InherentDataProviders, +) -> Result<(), consensus_common::Error> where + B: BlockT, + C: ProvideUncles + Send + Sync + 'static, + SC: SelectChain + 'static, +{ + if !inherent_data_providers.has_provider(&srml_authorship::INHERENT_IDENTIFIER) { + inherent_data_providers + .register_provider(srml_authorship::InherentDataProvider::new(move || { + { + let chain_head = match select_chain.best_chain() { + Ok(x) => x, + Err(e) => { + warn!(target: "uncles", "Unable to get chain head: {:?}", e); + return Vec::new(); + } + }; + match client.uncles(chain_head.hash(), MAX_UNCLE_GENERATIONS.into()) { + Ok(uncles) => uncles, + Err(e) => { + warn!(target: "uncles", "Unable to get uncles: {:?}", e); + Vec::new() + } + } + } + })) + .map_err(|err| consensus_common::Error::InherentData(err.into()))?; + } + Ok(()) +} + diff --git a/core/executor/Cargo.toml b/core/executor/Cargo.toml index 50afe391db958ff096bfc10cbd1c0d9d4e940532..a4707fb89e3d408880db28cd7fb008e951c2a0f9 100644 --- a/core/executor/Cargo.toml +++ b/core/executor/Cargo.toml @@ -5,8 +5,8 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -derive_more = "0.15.0" -parity-codec = "4.1.1" +derive_more = "0.14.0" +codec = { package = "parity-scale-codec", version = "1.0.0" } runtime_io = { package = "sr-io", path = "../sr-io" } primitives = { package = "substrate-primitives", path = "../primitives" } trie = { package = "substrate-trie", path = "../trie" } @@ -14,10 +14,11 @@ serializer = { package = "substrate-serializer", path = "../serializer" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } runtime_version = { package = "sr-version", path = "../sr-version" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } -wasmi = { version = "0.4.3" } +wasmi = "0.5.0" +parity-wasm = "0.31" byteorder = "1.3" lazy_static = "1.3" -parking_lot = "0.8.0" +parking_lot = "0.9.0" log = "0.4" libsecp256k1 = "0.2.1" tiny-keccak = "1.4.2" diff --git a/core/executor/runtime-test/Cargo.toml b/core/executor/runtime-test/Cargo.toml index 26bf2f71bdcf2d25a9ef5169e73be3ced15fe5bc..28a0ed2b874aaa5fbf71ef4b17ea192524fa8a45 100644 --- a/core/executor/runtime-test/Cargo.toml +++ b/core/executor/runtime-test/Cargo.toml @@ -9,7 +9,7 @@ build = "build.rs" rstd = { package = "sr-std", path = "../../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../sr-io", default-features = false } sandbox = { package = "sr-sandbox", path = "../../sr-sandbox", default-features = false } -substrate-primitives = { path = "../../primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../primitives", default-features = false } [build-dependencies] wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.2", path = "../../utils/wasm-builder-runner" } diff --git a/core/executor/runtime-test/build.rs b/core/executor/runtime-test/build.rs index a8a5e1cba54f6a2e6836220a7462a42c4a5c1038..86bc3ad7fab28626123baf07d64780fa4fc5a053 100644 --- a/core/executor/runtime-test/build.rs +++ b/core/executor/runtime-test/build.rs @@ -14,14 +14,17 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project, WasmBuilderSource}; +use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; fn main() { - build_current_project( + build_current_project_with_rustflags( "wasm_binary.rs", WasmBuilderSource::CratesOrPath { path: "../../utils/wasm-builder", version: "1.0.4", }, + // This instructs LLD to export __heap_base as a global variable, which is used by the + // external memory allocator. + "-Clink-arg=--export=__heap_base", ); } diff --git a/core/executor/runtime-test/src/lib.rs b/core/executor/runtime-test/src/lib.rs index bca220264642851069852722486f248dc727d4f7..5e276a88141684eb520cea68bd0a114117a67881 100644 --- a/core/executor/runtime-test/src/lib.rs +++ b/core/executor/runtime-test/src/lib.rs @@ -9,8 +9,9 @@ use rstd::{vec::Vec, slice, vec}; use runtime_io::{ set_storage, storage, clear_prefix, print, blake2_128, blake2_256, - twox_128, twox_256, ed25519_verify, sr25519_verify, enumerated_trie_root + twox_128, twox_256, ed25519_verify, sr25519_verify, ordered_trie_root }; +use primitives::{ed25519, sr25519}; macro_rules! impl_stubs { ( $( $new_name:ident => $invoke:expr, )* ) => { @@ -80,7 +81,7 @@ impl_stubs!( sig.copy_from_slice(&input[32..96]); let msg = b"all ok!"; - [ed25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec() + [ed25519_verify(&ed25519::Signature(sig), &msg[..], &ed25519::Public(pubkey)) as u8].to_vec() }, test_sr25519_verify => |input: &[u8]| { let mut pubkey = [0; 32]; @@ -90,10 +91,10 @@ impl_stubs!( sig.copy_from_slice(&input[32..96]); let msg = b"all ok!"; - [sr25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec() + [sr25519_verify(&sr25519::Signature(sig), &msg[..], &sr25519::Public(pubkey)) as u8].to_vec() }, - test_enumerated_trie_root => |_| { - enumerated_trie_root::( + test_ordered_trie_root => |_| { + ordered_trie_root::( &[ &b"zero"[..], &b"one"[..], @@ -138,19 +139,29 @@ impl_stubs!( [code].to_vec() }, test_offchain_local_storage => |_| { - let kind = substrate_primitives::offchain::StorageKind::PERSISTENT; + let kind = primitives::offchain::StorageKind::PERSISTENT; assert_eq!(runtime_io::local_storage_get(kind, b"test"), None); runtime_io::local_storage_set(kind, b"test", b"asd"); assert_eq!(runtime_io::local_storage_get(kind, b"test"), Some(b"asd".to_vec())); - let res = runtime_io::local_storage_compare_and_set(kind, b"test", b"asd", b""); + let res = runtime_io::local_storage_compare_and_set(kind, b"test", Some(b"asd"), b""); assert_eq!(res, true); assert_eq!(runtime_io::local_storage_get(kind, b"test"), Some(b"".to_vec())); [0].to_vec() }, + test_offchain_local_storage_with_none => |_| { + let kind = primitives::offchain::StorageKind::PERSISTENT; + assert_eq!(runtime_io::local_storage_get(kind, b"test"), None); + + let res = runtime_io::local_storage_compare_and_set(kind, b"test", None, b"value"); + assert_eq!(res, true); + assert_eq!(runtime_io::local_storage_get(kind, b"test"), Some(b"value".to_vec())); + + [0].to_vec() + }, test_offchain_http => |_| { - use substrate_primitives::offchain::HttpRequestStatus; + use primitives::offchain::HttpRequestStatus; let run = || -> Option<()> { let id = runtime_io::http_request_start("POST", "http://localhost:12345", &[]).ok()?; runtime_io::http_request_add_header(id, "X-Auth", "test").ok()?; diff --git a/core/executor/src/allocator.rs b/core/executor/src/allocator.rs index 9e61a2c6ef553533ee5e1dae138717001ab857b7..4cc8174f705b0840b143aaa3ad12251e763889e1 100644 --- a/core/executor/src/allocator.rs +++ b/core/executor/src/allocator.rs @@ -53,28 +53,20 @@ impl FreeingBumpHeapAllocator { /// /// # Arguments /// - /// * `ptr_offset` - The pointers returned by `allocate()` start from this - /// offset on. The pointer offset needs to be aligned to a multiple of 8, - /// hence a padding might be added to align `ptr_offset` properly. - /// - /// * `heap_size` - The size available to this heap instance (in bytes) for - /// allocating memory. - /// - /// * `heap` - A `MemoryRef` to the available `MemoryInstance` which is - /// used as the heap. - /// - pub fn new(mem: MemoryRef) -> Self { + /// - `mem` - reference to the linear memory instance on which this allocator operates. + /// - `heap_base` - the offset from the beginning of the linear memory where the heap starts. + pub fn new(mem: MemoryRef, heap_base: u32) -> Self { let current_size: Bytes = mem.current_size().into(); let current_size = current_size.0 as u32; - let used_size = mem.used_size().0 as u32; - let heap_size = current_size - used_size; - let mut ptr_offset = used_size; + let mut ptr_offset = heap_base; let padding = ptr_offset % ALIGNMENT; if padding != 0 { ptr_offset += ALIGNMENT - padding; } + let heap_size = current_size - ptr_offset; + FreeingBumpHeapAllocator { bumper: 0, heads: [0; N], @@ -194,16 +186,11 @@ mod tests { const PAGE_SIZE: u32 = 65536; - fn set_offset(mem: MemoryRef, offset: usize) { - let offset: Vec = vec![255; offset]; - mem.set(0, &offset).unwrap(); - } - #[test] fn should_allocate_properly() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); // when let ptr = heap.allocate(1).unwrap(); @@ -216,8 +203,7 @@ mod tests { fn should_always_align_pointers_to_multiples_of_8() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - set_offset(mem.clone(), 13); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 13); // when let ptr = heap.allocate(1).unwrap(); @@ -232,7 +218,7 @@ mod tests { fn should_increment_pointers_properly() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); // when let ptr1 = heap.allocate(1).unwrap(); @@ -255,7 +241,7 @@ mod tests { fn should_free_properly() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); let ptr1 = heap.allocate(1).unwrap(); // the prefix of 8 bytes is prepended to the pointer assert_eq!(ptr1, 8); @@ -277,9 +263,8 @@ mod tests { fn should_deallocate_and_reallocate_properly() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - set_offset(mem.clone(), 13); let padded_offset = 16; - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 13); let ptr1 = heap.allocate(1).unwrap(); // the prefix of 8 bytes is prepended to the pointer @@ -305,7 +290,7 @@ mod tests { fn should_build_linked_list_of_free_areas_properly() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); let ptr1 = heap.allocate(8).unwrap(); let ptr2 = heap.allocate(8).unwrap(); @@ -332,8 +317,7 @@ mod tests { fn should_not_allocate_if_too_large() { // given let mem = MemoryInstance::alloc(Pages(1), Some(Pages(1))).unwrap(); - set_offset(mem.clone(), 13); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 13); // when let ptr = heap.allocate(PAGE_SIZE - 13); @@ -352,7 +336,7 @@ mod tests { fn should_not_allocate_if_full() { // given let mem = MemoryInstance::alloc(Pages(1), Some(Pages(1))).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); let ptr1 = heap.allocate((PAGE_SIZE / 2) - 8).unwrap(); assert_eq!(ptr1, 8); @@ -375,7 +359,7 @@ mod tests { // given let pages_needed = (MAX_POSSIBLE_ALLOCATION as usize / PAGE_SIZE as usize) + 1; let mem = MemoryInstance::alloc(Pages(pages_needed), Some(Pages(pages_needed))).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); // when let ptr = heap.allocate(MAX_POSSIBLE_ALLOCATION).unwrap(); @@ -388,7 +372,7 @@ mod tests { fn should_not_allocate_if_requested_size_too_large() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 0); // when let ptr = heap.allocate(MAX_POSSIBLE_ALLOCATION + 1); @@ -407,8 +391,7 @@ mod tests { fn should_include_prefixes_in_total_heap_size() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - set_offset(mem.clone(), 1); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 1); // when // an item size of 16 must be used then @@ -422,8 +405,7 @@ mod tests { fn should_calculate_total_heap_size_to_zero() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - set_offset(mem.clone(), 13); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 13); // when let ptr = heap.allocate(42).unwrap(); @@ -438,8 +420,7 @@ mod tests { fn should_calculate_total_size_of_zero() { // given let mem = MemoryInstance::alloc(Pages(1), None).unwrap(); - set_offset(mem.clone(), 19); - let mut heap = FreeingBumpHeapAllocator::new(mem); + let mut heap = FreeingBumpHeapAllocator::new(mem, 19); // when for _ in 1..10 { diff --git a/core/executor/src/error.rs b/core/executor/src/error.rs index a81fc1b148287b0e76953455c1153f53ad998aaf..9bfa05ff5f534f08a442b3c11a97cf3d8611df12 100644 --- a/core/executor/src/error.rs +++ b/core/executor/src/error.rs @@ -38,8 +38,8 @@ pub enum Error { #[display(fmt="Method not found: '{}'", _0)] MethodNotFound(String), /// Code is invalid (expected single byte) - #[display(fmt="Invalid Code: {:?}", _0)] - InvalidCode(Vec), + #[display(fmt="Invalid Code: {}", _0)] + InvalidCode(String), /// Could not get runtime version. #[display(fmt="On-chain runtime does not specify version")] VersionInvalid, @@ -58,6 +58,13 @@ pub enum Error { /// Invalid memory reference. #[display(fmt="Invalid memory reference")] InvalidMemoryReference, + /// The runtime must provide a global named `__heap_base` of type i32 for specifying where the + /// allocator is allowed to place its data. + #[display(fmt="The runtime doesn't provide a global named `__heap_base`")] + HeapBaseNotFoundOrInvalid, + /// The runtime WebAssembly module is not allowed to have the `start` function. + #[display(fmt="The runtime has the `start` function")] + RuntimeHasStartFn, /// Some other error occurred Other(&'static str), /// Some error occurred in the allocator diff --git a/core/executor/src/lib.rs b/core/executor/src/lib.rs index fa7cc71eea6d6273866f9ac53244cf548629c6cf..065de451c19dc65c241ee6cd90bd1b45af38886f 100644 --- a/core/executor/src/lib.rs +++ b/core/executor/src/lib.rs @@ -35,14 +35,16 @@ mod wasm_executor; mod native_executor; mod sandbox; mod allocator; +mod wasm_runtimes_cache; pub mod error; pub use wasmi; pub use wasm_executor::WasmExecutor; pub use native_executor::{with_native_environment, NativeExecutor, NativeExecutionDispatch}; +pub use wasm_runtimes_cache::RuntimesCache; pub use state_machine::Externalities; pub use runtime_version::{RuntimeVersion, NativeVersion}; -pub use parity_codec::Codec; +pub use codec::Codec; #[doc(hidden)] pub use primitives::Blake2Hasher; diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index e4a65c811bf6ae6e5ab49bc9db2fd7c38461a27e..937e0033539f0ea3dbd8abf0638be2f507cf443e 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -14,93 +14,27 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::{borrow::BorrowMut, result, cell::{RefMut, RefCell}}; +use std::{result, cell::RefCell, panic::UnwindSafe}; use crate::error::{Error, Result}; use state_machine::{CodeExecutor, Externalities}; use crate::wasm_executor::WasmExecutor; -use wasmi::{Module as WasmModule, ModuleRef as WasmModuleInstanceRef}; use runtime_version::{NativeVersion, RuntimeVersion}; -use std::{collections::HashMap, panic::UnwindSafe}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use crate::RuntimeInfo; use primitives::{Blake2Hasher, NativeOrEncoded}; -use primitives::storage::well_known_keys; -use log::trace; +use log::{trace, warn}; -/// Default num of pages for the heap -const DEFAULT_HEAP_PAGES: u64 = 1024; - -// For the internal Runtime Cache: -// Is it compatible enough to run this natively or do we need to fall back on the WasmModule - -enum RuntimePreproc { - InvalidCode, - ValidCode(WasmModuleInstanceRef, Option), -} - -type CacheType = HashMap<[u8; 32], RuntimePreproc>; +use crate::RuntimesCache; thread_local! { - static RUNTIMES_CACHE: RefCell = RefCell::new(HashMap::new()); -} - -/// fetch a runtime version from the cache or if there is no cached version yet, create -/// the runtime version entry for `code`, determines whether `Compatibility::IsCompatible` -/// can be used by comparing returned RuntimeVersion to `ref_version` -fn fetch_cached_runtime_version<'a, E: Externalities>( - wasm_executor: &WasmExecutor, - cache: &'a mut RefMut, - ext: &mut E, - default_heap_pages: Option, -) -> Result<(&'a WasmModuleInstanceRef, &'a Option)> { - let code_hash = match ext.original_storage_hash(well_known_keys::CODE) { - Some(code_hash) => code_hash, - None => return Err(Error::InvalidCode(vec![])), - }; - - let maybe_runtime_preproc = cache.borrow_mut().entry(code_hash.into()) - .or_insert_with(|| { - let code = match ext.original_storage(well_known_keys::CODE) { - Some(code) => code, - None => return RuntimePreproc::InvalidCode, - }; - let heap_pages = ext.storage(well_known_keys::HEAP_PAGES) - .and_then(|pages| u64::decode(&mut &pages[..])) - .or(default_heap_pages) - .unwrap_or(DEFAULT_HEAP_PAGES); - match WasmModule::from_buffer(code) - .map_err(|_| Error::InvalidCode(vec![])) - .and_then(|module| wasm_executor.prepare_module(ext, heap_pages as usize, &module)) - { - Ok(module) => { - let version = wasm_executor.call_in_wasm_module(ext, &module, "Core_version", &[]) - .ok() - .and_then(|v| RuntimeVersion::decode(&mut v.as_slice())); - RuntimePreproc::ValidCode(module, version) - } - Err(e) => { - trace!(target: "executor", "Invalid code presented to executor ({:?})", e); - RuntimePreproc::InvalidCode - } - } - }); - - match maybe_runtime_preproc { - RuntimePreproc::InvalidCode => { - let code = ext.original_storage(well_known_keys::CODE).unwrap_or(vec![]); - Err(Error::InvalidCode(code)) - }, - RuntimePreproc::ValidCode(m, v) => { - Ok((m, v)) - } - } + static RUNTIMES_CACHE: RefCell = RefCell::new(RuntimesCache::new()); } fn safe_call(f: F) -> Result where F: UnwindSafe + FnOnce() -> U { // Substrate uses custom panic hook that terminates process on panic. Disable termination for the native call. - let _guard = panic_handler::AbortGuard::new(false); + let _guard = panic_handler::AbortGuard::force_unwind(); ::std::panic::catch_unwind(f).map_err(|_| Error::Runtime) } @@ -118,16 +52,11 @@ pub trait NativeExecutionDispatch: Send + Sync { /// Get the wasm code that the native dispatch will be equivalent to. fn native_equivalent() -> &'static [u8]; - /// Dispatch a method and input data to be executed natively. Returns `Some` result or `None` - /// if the `method` is unknown. Panics if there's an unrecoverable error. - // fn dispatch(ext: &mut Externalities, method: &str, data: &[u8]) -> Result>; + /// Dispatch a method and input data to be executed natively. fn dispatch(ext: &mut dyn Externalities, method: &str, data: &[u8]) -> Result>; /// Provide native runtime version. fn native_version() -> NativeVersion; - - /// Construct corresponding `NativeExecutor` - fn new(default_heap_pages: Option) -> NativeExecutor where Self: Sized; } /// A generic `CodeExecutor` implementation that uses a delegate to determine wasm code equivalence @@ -140,7 +69,7 @@ pub struct NativeExecutor { fallback: WasmExecutor, /// Native runtime version info. native_version: NativeVersion, - /// The default number of 64KB pages to allocate for Wasm execution. + /// The number of 64KB pages to allocate for Wasm execution. default_heap_pages: Option, } @@ -151,7 +80,7 @@ impl NativeExecutor { _dummy: Default::default(), fallback: WasmExecutor::new(), native_version: D::native_version(), - default_heap_pages, + default_heap_pages: default_heap_pages, } } } @@ -176,10 +105,17 @@ impl RuntimeInfo for NativeExecutor { &self, ext: &mut E, ) -> Option { - RUNTIMES_CACHE.with(|c| - fetch_cached_runtime_version(&self.fallback, &mut c.borrow_mut(), ext, self.default_heap_pages) - .ok()?.1.clone() - ) + RUNTIMES_CACHE.with(|cache| { + let cache = &mut cache.borrow_mut(); + + match cache.fetch_runtime(&self.fallback, ext, self.default_heap_pages) { + Ok(runtime) => runtime.version(), + Err(e) => { + warn!(target: "executor", "Failed to fetch runtime: {:?}", e); + None + } + } + }) } } @@ -198,14 +134,16 @@ impl CodeExecutor for NativeExecutor, - ) -> (Result>, bool) { - RUNTIMES_CACHE.with(|c| { - let mut c = c.borrow_mut(); - let (module, onchain_version) = match fetch_cached_runtime_version( - &self.fallback, &mut c, ext, self.default_heap_pages) { - Ok((module, onchain_version)) => (module, onchain_version), - Err(e) => return (Err(e), false), + ) -> (Result>, bool){ + RUNTIMES_CACHE.with(|cache| { + let cache = &mut cache.borrow_mut(); + let cached_runtime = match cache.fetch_runtime( + &self.fallback, ext, self.default_heap_pages, + ) { + Ok(cached_runtime) => cached_runtime, + Err(e) => return (Err(e), false), }; + let onchain_version = cached_runtime.version(); match ( use_native, onchain_version @@ -223,17 +161,21 @@ impl CodeExecutor for NativeExecutor".into(), |v| format!("{}", v)) ); ( - self.fallback - .call_in_wasm_module(ext, module, method, data) - .map(NativeOrEncoded::Encoded), + cached_runtime.with(|module| + self.fallback + .call_in_wasm_module(ext, module, method, data) + .map(NativeOrEncoded::Encoded) + ), false ) } (false, _, _) => { ( - self.fallback - .call_in_wasm_module(ext, module, method, data) - .map(NativeOrEncoded::Encoded), + cached_runtime.with(|module| + self.fallback + .call_in_wasm_module(ext, module, method, data) + .map(NativeOrEncoded::Encoded) + ), false ) } @@ -281,7 +223,12 @@ macro_rules! native_executor_instance { // get a proper build script, this must be strictly adhered to or things will go wrong. $code } - fn dispatch(ext: &mut $crate::Externalities<$crate::Blake2Hasher>, method: &str, data: &[u8]) -> $crate::error::Result> { + + fn dispatch( + ext: &mut $crate::Externalities<$crate::Blake2Hasher>, + method: &str, + data: &[u8] + ) -> $crate::error::Result> { $crate::with_native_environment(ext, move || $dispatcher(method, data))? .ok_or_else(|| $crate::error::Error::MethodNotFound(method.to_owned())) } @@ -289,10 +236,6 @@ macro_rules! native_executor_instance { fn native_version() -> $crate::NativeVersion { $version() } - - fn new(default_heap_pages: Option) -> $crate::NativeExecutor<$name> { - $crate::NativeExecutor::new(default_heap_pages) - } } } } diff --git a/core/executor/src/sandbox.rs b/core/executor/src/sandbox.rs index 1ce300c38ad8168df3c401d8df4ee41032ab0823..6687738abc89750acefae9b9dbdc39bba5a27ec1 100644 --- a/core/executor/src/sandbox.rs +++ b/core/executor/src/sandbox.rs @@ -20,7 +20,7 @@ use crate::error::{Result, Error}; use std::{collections::HashMap, rc::Rc}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use primitives::sandbox as sandbox_primitives; use wasmi::{ Externals, FuncRef, ImportResolver, MemoryInstance, MemoryRef, Module, ModuleInstance, @@ -193,7 +193,7 @@ fn trap(msg: &'static str) -> Trap { fn deserialize_result(serialized_result: &[u8]) -> std::result::Result, Trap> { use self::sandbox_primitives::{HostError, ReturnValue}; let result_val = std::result::Result::::decode(&mut &serialized_result[..]) - .ok_or_else(|| trap("Decoding Result failed!"))?; + .map_err(|_| trap("Decoding Result failed!"))?; match result_val { Ok(return_value) => Ok(match return_value { @@ -361,7 +361,7 @@ fn decode_environment_definition( memories: &[Option], ) -> std::result::Result<(Imports, GuestToSupervisorFunctionMapping), InstantiationError> { let env_def = sandbox_primitives::EnvironmentDefinition::decode(&mut &raw_env_def[..]) - .ok_or_else(|| InstantiationError::EnvironmentDefinitionCorrupted)?; + .map_err(|_| InstantiationError::EnvironmentDefinitionCorrupted)?; let mut func_map = HashMap::new(); let mut memories_map = HashMap::new(); diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 83f1cf5a4befaccfc043254d993c6e3ce48d9b6c..3eed549773f1a03cc2994b42831bb8191b069e19 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -26,12 +26,12 @@ use wasmi::{ }; use state_machine::{Externalities, ChildStorageKey}; use crate::error::{Error, Result}; -use primitives::{blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair}; -use primitives::offchain; -use primitives::hexdisplay::HexDisplay; -use primitives::sandbox as sandbox_primitives; -use primitives::{H256, Blake2Hasher}; -use trie::ordered_trie_root; +use codec::Encode; +use primitives::{ + blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair, crypto::KeyTypeId, + offchain, hexdisplay::HexDisplay, sandbox as sandbox_primitives, H256, Blake2Hasher, +}; +use trie::{TrieConfiguration, trie_types::Layout}; use crate::sandbox; use crate::allocator; use log::trace; @@ -55,10 +55,10 @@ struct FunctionExecutor<'e, E: Externalities + 'e> { } impl<'e, E: Externalities> FunctionExecutor<'e, E> { - fn new(m: MemoryRef, t: Option, e: &'e mut E) -> Result { + fn new(m: MemoryRef, heap_base: u32, t: Option, e: &'e mut E) -> Result { Ok(FunctionExecutor { sandbox_store: sandbox::Store::new(), - heap: allocator::FreeingBumpHeapAllocator::new(m.clone()), + heap: allocator::FreeingBumpHeapAllocator::new(m.clone(), heap_base), memory: m, table: t, ext: e, @@ -121,16 +121,6 @@ fn deadline_to_timestamp(deadline: u64) -> Option { } } -fn u32_to_key(key: u32) -> std::result::Result, ()> { - if key > u16::max_value() as u32 { - Err(()) - } else if key == 0 { - Ok(None) - } else { - Ok(Some(offchain::CryptoKeyId(key as u16))) - } -} - impl_function_executor!(this: FunctionExecutor<'e, E>, ext_print_utf8(utf8_data: *const u8, utf8_len: u32) => { if let Ok(utf8) = this.memory.get(utf8_data, utf8_len as usize) { @@ -291,6 +281,23 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.ext.clear_prefix(&prefix); Ok(()) }, + ext_clear_child_prefix( + storage_key_data: *const u8, + storage_key_len: u32, + prefix_data: *const u8, + prefix_len: u32 + ) => { + let storage_key = this.memory.get( + storage_key_data, + storage_key_len as usize + ).map_err(|_| "Invalid attempt to determine storage_key in ext_clear_child_prefix")?; + let storage_key = ChildStorageKey::from_vec(storage_key) + .ok_or_else(|| "ext_clear_child_prefix: child storage key is not valid")?; + let prefix = this.memory.get(prefix_data, prefix_len as usize) + .map_err(|_| "Invalid attempt to determine prefix in ext_clear_child_prefix")?; + this.ext.clear_child_prefix(storage_key, &prefix); + Ok(()) + }, ext_kill_child_storage(storage_key_data: *const u8, storage_key_len: u32) => { let storage_key = this.memory.get( storage_key_data, @@ -420,7 +427,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let written = std::cmp::min(value_len as usize, value.len()); this.memory.set(value_data, &value[..written]) .map_err(|_| "Invalid attempt to set value in ext_get_storage_into")?; - Ok(written as u32) + Ok(value.len() as u32) } else { Ok(u32::max_value()) } @@ -467,10 +474,10 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, if let Some(value) = maybe_value { let value = &value[value_offset as usize..]; - let written = ::std::cmp::min(value_len as usize, value.len()); + let written = std::cmp::min(value_len as usize, value.len()); this.memory.set(value_data, &value[..written]) .map_err(|_| "Invalid attempt to set value in ext_get_child_storage_into")?; - Ok(written as u32) + Ok(value.len() as u32) } else { Ok(u32::max_value()) } @@ -537,7 +544,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, ) ) .collect::>>()?; - let r = ordered_trie_root::(values.into_iter()); + let r = Layout::::ordered_trie_root(values.into_iter()); this.memory.set(result, &r[..]) .map_err(|_| "Invalid attempt to set memory in ext_blake2_256_enumerated_trie_root")?; Ok(()) @@ -650,7 +657,30 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.memory.set(out, &result).map_err(|_| "Invalid attempt to set result in ext_keccak_256")?; Ok(()) }, - ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => { + ext_ed25519_public_keys(id_data: *const u8, result_len: *mut u32) -> *mut u8 => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_ed25519_public_keys")?; + let key_type = KeyTypeId(id); + + let keys = runtime_io::ed25519_public_keys(key_type).encode(); + + let len = keys.len() as u32; + let offset = this.heap.allocate(len)? as u32; + + this.memory.set(offset, keys.as_ref()) + .map_err(|_| "Invalid attempt to set memory in ext_ed25519_public_keys")?; + this.memory.write_primitive(result_len, len) + .map_err(|_| "Invalid attempt to write result_len in ext_ed25519_public_keys")?; + + Ok(offset) + }, + ext_ed25519_verify( + msg_data: *const u8, + msg_len: u32, + sig_data: *const u8, + pubkey_data: *const u8, + ) -> u32 => { let mut sig = [0u8; 64]; this.memory.get_into(sig_data, &mut sig[..]) .map_err(|_| "Invalid attempt to get signature in ext_ed25519_verify")?; @@ -666,7 +696,87 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, 5 }) }, - ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => { + ext_ed25519_generate(id_data: *const u8, seed: *const u8, seed_len: u32, out: *mut u8) => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_ed25519_generate")?; + let key_type = KeyTypeId(id); + + let seed = if seed_len == 0 { + None + } else { + Some( + this.memory.get(seed, seed_len as usize) + .map_err(|_| "Invalid attempt to get seed in ext_ed25519_generate")? + ) + }; + + let seed = seed.as_ref() + .map(|seed| + std::str::from_utf8(&seed) + .map_err(|_| "Seed not a valid utf8 string in ext_sr25119_generate") + ).transpose()?; + + let pubkey = runtime_io::ed25519_generate(key_type, seed); + + this.memory.set(out, pubkey.as_ref()) + .map_err(|_| "Invalid attempt to set out in ext_ed25519_generate".into()) + }, + ext_ed25519_sign( + id_data: *const u8, + pubkey_data: *const u8, + msg_data: *const u8, + msg_len: u32, + out: *mut u8, + ) -> u32 => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_ed25519_sign")?; + let key_type = KeyTypeId(id); + + let mut pubkey = [0u8; 32]; + this.memory.get_into(pubkey_data, &mut pubkey[..]) + .map_err(|_| "Invalid attempt to get pubkey in ext_ed25519_sign")?; + + let msg = this.memory.get(msg_data, msg_len as usize) + .map_err(|_| "Invalid attempt to get message in ext_ed25519_sign")?; + + let signature = runtime_io::ed25519_sign(key_type, &ed25519::Public(pubkey), &msg); + + match signature { + Some(signature) => { + this.memory + .set(out, signature.as_ref()) + .map_err(|_| "Invalid attempt to set out in ext_ed25519_sign")?; + Ok(0) + }, + None => Ok(1), + } + }, + ext_sr25519_public_keys(id_data: *const u8, result_len: *mut u32) -> *mut u8 => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_sr25519_public_keys")?; + let key_type = KeyTypeId(id); + + let keys = runtime_io::sr25519_public_keys(key_type).encode(); + + let len = keys.len() as u32; + let offset = this.heap.allocate(len)? as u32; + + this.memory.set(offset, keys.as_ref()) + .map_err(|_| "Invalid attempt to set memory in ext_sr25519_public_keys")?; + this.memory.write_primitive(result_len, len) + .map_err(|_| "Invalid attempt to write result_len in ext_sr25519_public_keys")?; + + Ok(offset) + }, + ext_sr25519_verify( + msg_data: *const u8, + msg_len: u32, + sig_data: *const u8, + pubkey_data: *const u8, + ) -> u32 => { let mut sig = [0u8; 64]; this.memory.get_into(sig_data, &mut sig[..]) .map_err(|_| "Invalid attempt to get signature in ext_sr25519_verify")?; @@ -682,6 +792,62 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, 5 }) }, + ext_sr25519_generate(id_data: *const u8, seed: *const u8, seed_len: u32, out: *mut u8) => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_sr25519_generate")?; + let key_type = KeyTypeId(id); + let seed = if seed_len == 0 { + None + } else { + Some( + this.memory.get(seed, seed_len as usize) + .map_err(|_| "Invalid attempt to get seed in ext_sr25519_generate")? + ) + }; + + let seed = seed.as_ref() + .map(|seed| + std::str::from_utf8(&seed) + .map_err(|_| "Seed not a valid utf8 string in ext_sr25119_generate") + ) + .transpose()?; + + let pubkey = runtime_io::sr25519_generate(key_type, seed); + + this.memory.set(out, pubkey.as_ref()) + .map_err(|_| "Invalid attempt to set out in ext_sr25519_generate".into()) + }, + ext_sr25519_sign( + id_data: *const u8, + pubkey_data: *const u8, + msg_data: *const u8, + msg_len: u32, + out: *mut u8, + ) -> u32 => { + let mut id = [0u8; 4]; + this.memory.get_into(id_data, &mut id[..]) + .map_err(|_| "Invalid attempt to get id in ext_sr25519_sign")?; + let key_type = KeyTypeId(id); + + let mut pubkey = [0u8; 32]; + this.memory.get_into(pubkey_data, &mut pubkey[..]) + .map_err(|_| "Invalid attempt to get pubkey in ext_sr25519_sign")?; + + let msg = this.memory.get(msg_data, msg_len as usize) + .map_err(|_| "Invalid attempt to get message in ext_sr25519_sign")?; + + let signature = runtime_io::sr25519_sign(key_type, &sr25519::Public(pubkey), &msg); + + match signature { + Some(signature) => { + this.memory.set(out, signature.as_ref()) + .map_err(|_| "Invalid attempt to set out in ext_sr25519_sign")?; + Ok(0) + }, + None => Ok(1), + } + }, ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32 => { let mut sig = [0u8; 65]; this.memory.get_into(sig_data, &mut sig[..]) @@ -710,6 +876,13 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(0) }, + ext_is_validator() -> u32 => { + Ok(if runtime_io::is_validator() { + 1 + } else { + 0 + }) + }, ext_submit_transaction(msg_data: *const u8, len: u32) -> u32 => { let extrinsic = this.memory.get(msg_data, len as usize) .map_err(|_| "OOB while ext_submit_transaction: wasm")?; @@ -720,148 +893,22 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(if res.is_ok() { 0 } else { 1 }) }, - ext_new_crypto_key(crypto: u32) -> u32 => { - let kind = offchain::CryptoKind::try_from(crypto) - .map_err(|_| "crypto kind OOB while ext_new_crypto_key: wasm")?; - - let res = this.ext.offchain() - .map(|api| api.new_crypto_key(kind)) - .ok_or_else(|| "Calling unavailable API ext_new_crypto_key: wasm")?; - - match res { - Ok(key_id) => Ok(key_id.into()), - Err(()) => Ok(u32::max_value()), - } - }, - ext_encrypt( - key: u32, - kind: u32, - data: *const u8, - data_len: u32, - msg_len: *mut u32 - ) -> *mut u8 => { - let key = u32_to_key(key) - .map_err(|_| "Key OOB while ext_encrypt: wasm")?; - let kind = offchain::CryptoKind::try_from(kind) - .map_err(|_| "crypto kind OOB while ext_encrypt: wasm")?; - let message = this.memory.get(data, data_len as usize) - .map_err(|_| "OOB while ext_encrypt: wasm")?; - - let res = this.ext.offchain() - .map(|api| api.encrypt(key, kind, &*message)) - .ok_or_else(|| "Calling unavailable API ext_encrypt: wasm")?; - - let (offset,len) = match res { - Ok(encrypted) => { - let len = encrypted.len() as u32; - let offset = this.heap.allocate(len)? as u32; - this.memory.set(offset, &encrypted) - .map_err(|_| "Invalid attempt to set memory in ext_encrypt")?; - (offset, len) - }, - Err(()) => (0, u32::max_value()), - }; - - this.memory.write_primitive(msg_len, len) - .map_err(|_| "Invalid attempt to write msg_len in ext_encrypt")?; - - Ok(offset) - }, - ext_decrypt( - key: u32, - kind: u32, - data: *const u8, - data_len: u32, - msg_len: *mut u32 - ) -> *mut u8 => { - let key = u32_to_key(key) - .map_err(|_| "Key OOB while ext_decrypt: wasm")?; - let kind = offchain::CryptoKind::try_from(kind) - .map_err(|_| "crypto kind OOB while ext_decrypt: wasm")?; - let message = this.memory.get(data, data_len as usize) - .map_err(|_| "OOB while ext_decrypt: wasm")?; - + ext_network_state(written_out: *mut u32) -> *mut u8 => { let res = this.ext.offchain() - .map(|api| api.decrypt(key, kind, &*message)) - .ok_or_else(|| "Calling unavailable API ext_decrypt: wasm")?; - - let (offset,len) = match res { - Ok(decrypted) => { - let len = decrypted.len() as u32; - let offset = this.heap.allocate(len)? as u32; - this.memory.set(offset, &decrypted) - .map_err(|_| "Invalid attempt to set memory in ext_decrypt")?; - (offset, len) - }, - Err(()) => (0, u32::max_value()), - }; - - this.memory.write_primitive(msg_len, len) - .map_err(|_| "Invalid attempt to write msg_len in ext_decrypt")?; - - Ok(offset) - }, - ext_sign( - key: u32, - kind: u32, - data: *const u8, - data_len: u32, - sig_data_len: *mut u32 - ) -> *mut u8 => { - let key = u32_to_key(key) - .map_err(|_| "Key OOB while ext_sign: wasm")?; - let kind = offchain::CryptoKind::try_from(kind) - .map_err(|_| "crypto kind OOB while ext_sign: wasm")?; - let message = this.memory.get(data, data_len as usize) - .map_err(|_| "OOB while ext_sign: wasm")?; + .map(|api| api.network_state()) + .ok_or_else(|| "Calling unavailable API ext_network_state: wasm")?; - let res = this.ext.offchain() - .map(|api| api.sign(key, kind, &*message)) - .ok_or_else(|| "Calling unavailable API ext_sign: wasm")?; - - let (offset,len) = match res { - Ok(signature) => { - let len = signature.len() as u32; - let offset = this.heap.allocate(len)? as u32; - this.memory.set(offset, &signature) - .map_err(|_| "Invalid attempt to set memory in ext_sign")?; - (offset, len) - }, - Err(()) => (0, u32::max_value()), - }; + let encoded = res.encode(); + let len = encoded.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &encoded) + .map_err(|_| "Invalid attempt to set memory in ext_network_state")?; - this.memory.write_primitive(sig_data_len, len) - .map_err(|_| "Invalid attempt to write sig_data_len in ext_sign")?; + this.memory.write_primitive(written_out, len) + .map_err(|_| "Invalid attempt to write written_out in ext_network_state")?; Ok(offset) }, - ext_verify( - key: u32, - kind: u32, - msg: *const u8, - msg_len: u32, - signature: *const u8, - signature_len: u32 - ) -> u32 => { - let key = u32_to_key(key) - .map_err(|_| "Key OOB while ext_verify: wasm")?; - let kind = offchain::CryptoKind::try_from(kind) - .map_err(|_| "crypto kind OOB while ext_verify: wasm")?; - let message = this.memory.get(msg, msg_len as usize) - .map_err(|_| "OOB while ext_verify: wasm")?; - let signature = this.memory.get(signature, signature_len as usize) - .map_err(|_| "OOB while ext_verify: wasm")?; - - let res = this.ext.offchain() - .map(|api| api.verify(key, kind, &*message, &*signature)) - .ok_or_else(|| "Calling unavailable API ext_verify: wasm")?; - - match res { - Ok(true) => Ok(0), - Ok(false) => Ok(1), - Err(()) => Ok(u32::max_value()), - } - }, ext_timestamp() -> u64 => { let timestamp = this.ext.offchain() .map(|api| api.timestamp()) @@ -935,17 +982,24 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, .map_err(|_| "storage kind OOB while ext_local_storage_compare_and_set: wasm")?; let key = this.memory.get(key, key_len as usize) .map_err(|_| "OOB while ext_local_storage_compare_and_set: wasm")?; - let old_value = this.memory.get(old_value, old_value_len as usize) - .map_err(|_| "OOB while ext_local_storage_compare_and_set: wasm")?; let new_value = this.memory.get(new_value, new_value_len as usize) .map_err(|_| "OOB while ext_local_storage_compare_and_set: wasm")?; - let res = this.ext.offchain() - .map(|api| api.local_storage_compare_and_set(kind, &key, &old_value, &new_value)) - .ok_or_else(|| "Calling unavailable API ext_local_storage_compare_andset: wasm")?; + let res = { + if old_value == u32::max_value() { + this.ext.offchain() + .map(|api| api.local_storage_compare_and_set(kind, &key, None, &new_value)) + .ok_or_else(|| "Calling unavailable API ext_local_storage_compare_and_set: wasm")? + } else { + let v = this.memory.get(old_value, old_value_len as usize) + .map_err(|_| "OOB while ext_local_storage_compare_and_set: wasm")?; + this.ext.offchain() + .map(|api| api.local_storage_compare_and_set(kind, &key, Some(v.as_slice()), &new_value)) + .ok_or_else(|| "Calling unavailable API ext_local_storage_compare_and_set: wasm")? + } + }; Ok(if res { 0 } else { 1 }) - }, ext_http_request_start( method: *const u8, @@ -1060,7 +1114,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, request_id: u32, written_out: *mut u32 ) -> *mut u8 => { - use parity_codec::Encode; + use codec::Encode; let headers = this.ext.offchain() .map(|api| api.http_response_headers(offchain::HttpRequestId(request_id as u16))) @@ -1151,7 +1205,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, return_val_len: usize, state: usize ) -> u32 => { - use parity_codec::{Decode, Encode}; + use codec::{Decode, Encode}; trace!(target: "sr-sandbox", "invoke, instance_idx={}", instance_idx); let export = this.memory.get(export_ptr, export_len as usize) @@ -1165,7 +1219,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let serialized_args = this.memory.get(args_ptr, args_len as usize) .map_err(|_| "OOB while ext_sandbox_invoke: args")?; let args = Vec::::decode(&mut &serialized_args[..]) - .ok_or_else(|| "Can't decode serialized arguments for the invocation")? + .map_err(|_| "Can't decode serialized arguments for the invocation")? .into_iter() .map(Into::into) .collect::>(); @@ -1256,7 +1310,7 @@ impl WasmExecutor { data: &[u8], ) -> Result> { let module = ::wasmi::Module::from_buffer(code)?; - let module = self.prepare_module(ext, heap_pages, &module)?; + let module = Self::instantiate_module::(heap_pages, &module)?; self.call_in_wasm_module(ext, &module, method, data) } @@ -1278,7 +1332,7 @@ impl WasmExecutor { filter_result: FR, ) -> Result { let module = wasmi::Module::from_buffer(code)?; - let module = self.prepare_module(ext, heap_pages, &module)?; + let module = Self::instantiate_module::(heap_pages, &module)?; self.call_in_wasm_module_with_custom_signature( ext, &module, @@ -1297,6 +1351,22 @@ impl WasmExecutor { .clone()) } + /// Find the global named `__heap_base` in the given wasm module instance and + /// tries to get its value. + fn get_heap_base(module: &ModuleRef) -> Result { + let heap_base_val = module + .export_by_name("__heap_base") + .ok_or_else(|| Error::HeapBaseNotFoundOrInvalid)? + .as_global() + .ok_or_else(|| Error::HeapBaseNotFoundOrInvalid)? + .get(); + + Ok(match heap_base_val { + wasmi::RuntimeValue::I32(v) => v as u32, + _ => return Err(Error::HeapBaseNotFoundOrInvalid), + }) + } + /// Call a given method in the given wasm-module runtime. pub fn call_in_wasm_module>( &self, @@ -1345,10 +1415,9 @@ impl WasmExecutor { let table: Option = module_instance .export_by_name("__indirect_function_table") .and_then(|e| e.as_table().cloned()); + let heap_base = Self::get_heap_base(module_instance)?; - let low = memory.lowest_used(); - let used_mem = memory.used_size(); - let mut fec = FunctionExecutor::new(memory.clone(), table, ext)?; + let mut fec = FunctionExecutor::new(memory.clone(), heap_base, table, ext)?; let parameters = create_parameters(&mut |data: &[u8]| { let offset = fec.heap.allocate(data.len() as u32)?; memory.set(offset, &data)?; @@ -1371,24 +1440,14 @@ impl WasmExecutor { }, }; - // cleanup module instance for next use - let new_low = memory.lowest_used(); - if new_low < low { - memory.zero(new_low as usize, (low - new_low) as usize)?; - memory.reset_lowest_used(low); - } - memory.with_direct_access_mut(|buf| buf.resize(used_mem.0, 0)); result } /// Prepare module instance - pub fn prepare_module>( - &self, - ext: &mut E, + pub fn instantiate_module>( heap_pages: usize, module: &Module, - ) -> Result - { + ) -> Result { // start module instantiation. Don't run 'start' function yet. let intermediate_instance = ModuleInstance::new( module, @@ -1396,18 +1455,19 @@ impl WasmExecutor { .with_resolver("env", FunctionExecutor::::resolver()) )?; - // extract a reference to a linear memory, optional reference to a table - // and then initialize FunctionExecutor. + // Verify that the module has the heap base global variable. + let _ = Self::get_heap_base(intermediate_instance.not_started_instance())?; + + // Extract a reference to a linear memory. let memory = Self::get_mem_instance(intermediate_instance.not_started_instance())?; memory.grow(Pages(heap_pages)).map_err(|_| Error::Runtime)?; - let table: Option = intermediate_instance - .not_started_instance() - .export_by_name("__indirect_function_table") - .and_then(|e| e.as_table().cloned()); - let mut fec = FunctionExecutor::new(memory.clone(), table, ext)?; - // finish instantiation by running 'start' function (if any). - Ok(intermediate_instance.run_start(&mut fec)?) + if intermediate_instance.has_start() { + // Runtime is not allowed to have the `start` function. + Err(Error::RuntimeHasStartFn) + } else { + Ok(intermediate_instance.assert_no_start()) + } } } @@ -1416,7 +1476,7 @@ impl WasmExecutor { mod tests { use super::*; - use parity_codec::Encode; + use codec::Encode; use state_machine::TestExternalities as CoreTestExternalities; use hex_literal::hex; @@ -1460,11 +1520,11 @@ mod tests { assert_eq!(output, b"all ok!".to_vec()); - let expected = TestExternalities::new(map![ + let expected = TestExternalities::new((map![ b"input".to_vec() => b"Hello world".to_vec(), b"foo".to_vec() => b"bar".to_vec(), b"baz".to_vec() => b"bar".to_vec() - ]); + ], map![])); assert_eq!(ext, expected); } @@ -1483,11 +1543,11 @@ mod tests { assert_eq!(output, b"all ok!".to_vec()); - let expected: TestExternalities<_> = map![ + let expected = TestExternalities::new((map![ b"aaa".to_vec() => b"1".to_vec(), b"aab".to_vec() => b"2".to_vec(), b"bbb".to_vec() => b"5".to_vec() - ]; + ], map![])); assert_eq!(expected, ext); } @@ -1600,12 +1660,13 @@ mod tests { } #[test] - fn enumerated_trie_root_should_work() { + fn ordered_trie_root_should_work() { let mut ext = TestExternalities::::default(); + let trie_input = vec![b"zero".to_vec(), b"one".to_vec(), b"two".to_vec()]; let test_code = WASM_BINARY; assert_eq!( - WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_enumerated_trie_root", &[]).unwrap(), - ordered_trie_root::(vec![b"zero".to_vec(), b"one".to_vec(), b"two".to_vec()].iter()).as_fixed_bytes().encode() + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_ordered_trie_root", &[]).unwrap(), + Layout::::ordered_trie_root(trie_input.iter()).as_fixed_bytes().encode() ); } diff --git a/core/executor/src/wasm_runtimes_cache.rs b/core/executor/src/wasm_runtimes_cache.rs new file mode 100644 index 0000000000000000000000000000000000000000..110a28fe7d305e8fe1ee5785caa50a85c09f4ccb --- /dev/null +++ b/core/executor/src/wasm_runtimes_cache.rs @@ -0,0 +1,331 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Implements a cache for pre-created Wasm runtime module instances. + +use crate::error::Error; +use crate::wasm_executor::WasmExecutor; +use log::{trace, warn}; +use codec::Decode; +use parity_wasm::elements::{deserialize_buffer, DataSegment, Instruction, Module as RawModule}; +use primitives::storage::well_known_keys; +use primitives::Blake2Hasher; +use runtime_version::RuntimeVersion; +use state_machine::Externalities; +use std::collections::hash_map::{Entry, HashMap}; +use std::mem; +use std::rc::Rc; +use wasmi::{Module as WasmModule, ModuleRef as WasmModuleInstanceRef, RuntimeValue}; + +#[derive(Debug)] +enum CacheError { + CodeNotFound, + ApplySnapshotFailed, + InvalidModule, + CantDeserializeWasm, + Instantiation(Error), +} + +/// A runtime along with its version and initial state snapshot. +#[derive(Clone)] +pub struct CachedRuntime { + /// A wasm module instance. + instance: WasmModuleInstanceRef, + /// Runtime version according to `Core_version`. + /// + /// Can be `None` if the runtime doesn't expose this function. + version: Option, + /// The snapshot of the instance's state taken just after the instantiation. + state_snapshot: StateSnapshot, +} + +impl CachedRuntime { + /// Perform an operation with the clean version of the runtime wasm instance. + pub fn with(&self, f: F) -> R + where + F: FnOnce(&WasmModuleInstanceRef) -> R, + { + self.state_snapshot.apply(&self.instance).expect( + "applying the snapshot can only fail if the passed instance is different + from the one that was used for creation of the snapshot; + we use the snapshot that is directly associated with the instance; + thus the snapshot was created using the instance; + qed", + ); + f(&self.instance) + } + + /// Returns the version of this cached runtime. + /// + /// Returns `None` if the runtime doesn't provide the information or there was an error + /// while fetching it. + pub fn version(&self) -> Option { + self.version.clone() + } +} + +/// A state snapshot of an instance taken just after instantiation. +/// +/// It is used for restoring the state of the module after execution. +#[derive(Clone)] +struct StateSnapshot { + /// The offset and the content of the memory segments that should be used to restore the snapshot + data_segments: Vec<(u32, Vec)>, + /// The list of all global mutable variables of the module in their sequential order. + global_mut_values: Vec, + heap_pages: u32, +} + +impl StateSnapshot { + // Returns `None` if instance is not valid. + fn take( + module_instance: &WasmModuleInstanceRef, + data_segments: Vec, + heap_pages: u32, + ) -> Option { + let prepared_segments = data_segments + .into_iter() + .map(|mut segment| { + // Just replace contents of the segment since the segments will be discarded later + // anyway. + let contents = mem::replace(segment.value_mut(), vec![]); + + let init_expr = segment.offset().code(); + // [op, End] + if init_expr.len() != 2 { + return None; + } + let offset = match init_expr[0] { + Instruction::I32Const(v) => v as u32, + Instruction::GetGlobal(idx) => { + let global_val = module_instance.globals().get(idx as usize)?.get(); + match global_val { + RuntimeValue::I32(v) => v as u32, + _ => return None, + } + } + _ => return None, + }; + + Some((offset, contents)) + }) + .collect::>>()?; + + // Collect all values of mutable globals. + let global_mut_values = module_instance + .globals() + .iter() + .filter(|g| g.is_mutable()) + .map(|g| g.get()) + .collect(); + + Some(Self { + data_segments: prepared_segments, + global_mut_values, + heap_pages, + }) + } + + /// Reset the runtime instance to the initial version by restoring + /// the preserved memory and globals. + /// + /// Returns `Err` if applying the snapshot is failed. + fn apply(&self, instance: &WasmModuleInstanceRef) -> Result<(), CacheError> { + let memory = instance + .export_by_name("memory") + .ok_or(CacheError::ApplySnapshotFailed)? + .as_memory() + .cloned() + .ok_or(CacheError::ApplySnapshotFailed)?; + + // First, erase the memory and copy the data segments into it. + memory + .erase() + .map_err(|_| CacheError::ApplySnapshotFailed)?; + for (offset, contents) in &self.data_segments { + memory + .set(*offset, contents) + .map_err(|_| CacheError::ApplySnapshotFailed)?; + } + + // Second, restore the values of mutable globals. + for (global_ref, global_val) in instance + .globals() + .iter() + .filter(|g| g.is_mutable()) + .zip(self.global_mut_values.iter()) + { + // the instance should be the same as used for preserving and + // we iterate the same way it as we do it for preserving values that means that the + // types should be the same and all the values are mutable. So no error is expected/ + global_ref + .set(*global_val) + .map_err(|_| CacheError::ApplySnapshotFailed)?; + } + Ok(()) + } +} + +/// Default num of pages for the heap +const DEFAULT_HEAP_PAGES: u64 = 1024; + +/// Cache for the runtimes. +/// +/// When an instance is requested for the first time it is added to this +/// cache. Furthermore its initial memory and values of mutable globals are preserved here. Follow-up +/// requests to fetch a runtime return this one instance with the memory +/// reset to the initial memory. So, one runtime instance is reused for +/// every fetch request. +/// +/// For now the cache grows indefinitely, but that should be fine for now since runtimes can only be +/// upgraded rarely and there are no other ways to make the node to execute some other runtime. +pub struct RuntimesCache { + /// A cache of runtime instances along with metadata, ready to be reused. + /// + /// Instances are keyed by the hash of their code. + instances: HashMap<[u8; 32], Result, CacheError>>, +} + +impl RuntimesCache { + /// Creates a new instance of a runtimes cache. + pub fn new() -> RuntimesCache { + RuntimesCache { + instances: HashMap::new(), + } + } + + /// Fetches an instance of the runtime. + /// + /// On first use we create a new runtime instance, save it to the cache + /// and persist its initial memory. + /// + /// Each subsequent request will return this instance, with its memory restored + /// to the persisted initial memory. Thus, we reuse one single runtime instance + /// for every `fetch_runtime` invocation. + /// + /// # Parameters + /// + /// `wasm_executor`- Rust wasm executor. Executes the provided code in a + /// sandboxed Wasm runtime. + /// + /// `ext` - Externalities to use for the runtime. This is used for setting + /// up an initial runtime instance. The parameter is only needed for calling + /// into the Wasm module to find out the `Core_version`. + /// + /// `default_heap_pages` - Number of 64KB pages to allocate for Wasm execution. + /// Defaults to `DEFAULT_HEAP_PAGES` if `None` is provided. + /// + /// # Return value + /// + /// If no error occurred a tuple `(wasmi::ModuleRef, Option)` is + /// returned. `RuntimeVersion` is contained if the call to `Core_version` returned + /// a version. + /// + /// In case of failure one of two errors can be returned: + /// + /// `Err::InvalidCode` is returned for runtime code issues. + /// + /// `Error::InvalidMemoryReference` is returned if no memory export with the + /// identifier `memory` can be found in the runtime. + pub fn fetch_runtime>( + &mut self, + wasm_executor: &WasmExecutor, + ext: &mut E, + default_heap_pages: Option, + ) -> Result, Error> { + let code_hash = ext + .original_storage_hash(well_known_keys::CODE) + .ok_or(Error::InvalidCode("`CODE` not found in storage.".into()))?; + + // This is direct result from fighting with borrowck. + let handle_result = + |cached_result: &Result, CacheError>| match *cached_result { + Err(ref e) => Err(Error::InvalidCode(format!("{:?}", e))), + Ok(ref cached_runtime) => Ok(Rc::clone(cached_runtime)), + }; + + match self.instances.entry(code_hash.into()) { + Entry::Occupied(o) => handle_result(o.get()), + Entry::Vacant(v) => { + trace!(target: "runtimes_cache", "no instance found in cache, creating now."); + let result = Self::create_wasm_instance(wasm_executor, ext, default_heap_pages); + if let Err(ref err) = result { + warn!(target: "runtimes_cache", "cannot create a runtime: {:?}", err); + } + handle_result(v.insert(result)) + } + } + } + + fn create_wasm_instance>( + wasm_executor: &WasmExecutor, + ext: &mut E, + default_heap_pages: Option, + ) -> Result, CacheError> { + let code = ext + .original_storage(well_known_keys::CODE) + .ok_or(CacheError::CodeNotFound)?; + let module = WasmModule::from_buffer(&code).map_err(|_| CacheError::InvalidModule)?; + + // Extract the data segments from the wasm code. + // + // A return of this error actually indicates that there is a problem in logic, since + // we just loaded and validated the `module` above. + let data_segments = extract_data_segments(&code).ok_or(CacheError::CantDeserializeWasm)?; + + let heap_pages = ext + .storage(well_known_keys::HEAP_PAGES) + .and_then(|pages| u64::decode(&mut &pages[..]).ok()) + .or(default_heap_pages) + .unwrap_or(DEFAULT_HEAP_PAGES); + + // Instantiate this module. + let instance = WasmExecutor::instantiate_module::(heap_pages as usize, &module) + .map_err(CacheError::Instantiation)?; + + // Take state snapshot before executing anything. + let state_snapshot = StateSnapshot::take(&instance, data_segments, heap_pages as u32) + .expect( + "`take` returns `Err` if the module is not valid; + we already loaded module above, thus the `Module` is proven to be valid at this point; + qed + ", + ); + + let version = wasm_executor + .call_in_wasm_module(ext, &instance, "Core_version", &[]) + .ok() + .and_then(|v| RuntimeVersion::decode(&mut v.as_slice()).ok()); + Ok(Rc::new(CachedRuntime { + instance, + version, + state_snapshot, + })) + } +} + +/// Extract the data segments from the given wasm code. +/// +/// Returns `Err` if the given wasm code cannot be deserialized. +fn extract_data_segments(wasm_code: &[u8]) -> Option> { + let raw_module: RawModule = deserialize_buffer(wasm_code).ok()?; + let segments = raw_module + .data_section() + .map(|ds| ds.entries()) + .unwrap_or(&[]) + .to_vec(); + Some(segments) +} diff --git a/core/executor/src/wasm_utils.rs b/core/executor/src/wasm_utils.rs index 47867f7b4849b00f5ea5ded19ce5b1b9f7b49385..80ef376df5212dcb8a329169d85d8e8bb376859e 100644 --- a/core/executor/src/wasm_utils.rs +++ b/core/executor/src/wasm_utils.rs @@ -217,9 +217,15 @@ macro_rules! dispatch_fn { /// Implements `wasmi::Externals` trait and `Resolver` for given struct. #[macro_export] macro_rules! impl_function_executor { - ( $objectname:ident : $structname:ty, - $( $name:ident ( $( $names:ident : $params:ty ),* ) $( -> $returns:ty )* => $body:tt , )* - => $($pre:tt)+ ) => ( + ( + $objectname:ident : $structname:ty, + $( + $name:ident + ( $( $names:ident : $params:ty ),* $(,)? ) + $( -> $returns:ty )? => { $( $body:tt )* }, + )* + => $( $pre:tt )+ + ) => ( impl $( $pre ) + $structname { #[allow(unused)] fn resolver() -> &'static dyn $crate::wasmi::ModuleImportResolver { @@ -230,7 +236,11 @@ macro_rules! impl_function_executor { name: &str, signature: &$crate::wasmi::Signature ) -> std::result::Result<$crate::wasmi::FuncRef, $crate::wasmi::Error> { - resolve_fn!(signature, name, $( $name( $( $params ),* ) $( -> $returns )* => )*); + resolve_fn!( + signature, + name, + $( $name( $( $params ),* ) $( -> $returns )? => )* + ); Err($crate::wasmi::Error::Instantiation( format!("Export {} not found", name), @@ -249,7 +259,12 @@ macro_rules! impl_function_executor { ) -> std::result::Result, $crate::wasmi::Trap> { let $objectname = self; let mut args = args.as_ref().iter(); - dispatch_fn!(index, $objectname, args, $( $name( $( $names : $params ),* ) $( -> $returns )* => $body ),*); + dispatch_fn! { + index, + $objectname, + args, + $( $name( $( $names : $params ),* ) $( -> $returns )? => { $( $body )* } ),* + }; } } ); diff --git a/core/finality-grandpa/Cargo.toml b/core/finality-grandpa/Cargo.toml index 3cbb56df81c11df9aacc6759282e6b593723277b..22237c5a0b5a0f886fe2853604270627b272cf79 100644 --- a/core/finality-grandpa/Cargo.toml +++ b/core/finality-grandpa/Cargo.toml @@ -7,17 +7,18 @@ edition = "2018" [dependencies] fork-tree = { path = "../../core/utils/fork-tree" } futures = "0.1" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17", features = ["compat"] } log = "0.4" -parking_lot = "0.8.0" +parking_lot = "0.9.0" tokio-executor = "0.1.7" tokio-timer = "0.2.11" rand = "0.6" -parity-codec = { version = "4.1.1", features = ["derive"] } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } +sr-primitives = { path = "../sr-primitives" } consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } -substrate-primitives = { path = "../primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } substrate-telemetry = { path = "../telemetry" } +keystore = { package = "substrate-keystore", path = "../keystore" } serde_json = "1.0" client = { package = "substrate-client", path = "../client" } inherents = { package = "substrate-inherents", path = "../../core/inherents" } @@ -25,15 +26,17 @@ network = { package = "substrate-network", path = "../network" } service = { package = "substrate-service", path = "../service", optional = true } srml-finality-tracker = { path = "../../srml/finality-tracker" } fg_primitives = { package = "substrate-finality-grandpa-primitives", path = "primitives" } -grandpa = { package = "finality-grandpa", version = "0.8.1", features = ["derive-codec"] } +grandpa = { package = "finality-grandpa", version = "0.9.0", features = ["derive-codec"] } [dev-dependencies] -grandpa = { package = "finality-grandpa", version = "0.8.1", features = ["derive-codec", "test-helpers"] } +grandpa = { package = "finality-grandpa", version = "0.9.0", features = ["derive-codec", "test-helpers"] } network = { package = "substrate-network", path = "../network", features = ["test-helpers"] } keyring = { package = "substrate-keyring", path = "../keyring" } test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client"} +babe_primitives = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives" } env_logger = "0.6" tokio = "0.1.17" +tempfile = "3.1" [features] default = ["service-integration"] diff --git a/core/finality-grandpa/primitives/Cargo.toml b/core/finality-grandpa/primitives/Cargo.toml index 4f3b469ca8f179ca27e5ee447727fd6df8947616..ecbaf2e1ecc70b8bce006fc710137ae915c00e8f 100644 --- a/core/finality-grandpa/primitives/Cargo.toml +++ b/core/finality-grandpa/primitives/Cargo.toml @@ -6,8 +6,8 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../../client", default-features = false } -substrate-primitives = { path = "../../primitives", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +app-crypto = { package = "substrate-application-crypto", path = "../../application-crypto", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sr-primitives = { path = "../../sr-primitives", default-features = false } rstd = { package = "sr-std", path = "../../sr-std", default-features = false } serde = { version = "1.0", optional = true, features = ["derive"] } @@ -15,10 +15,10 @@ serde = { version = "1.0", optional = true, features = ["derive"] } [features] default = ["std"] std = [ - "substrate-primitives/std", "client/std", - "parity-codec/std", + "codec/std", "sr-primitives/std", "rstd/std", "serde", + "app-crypto/std", ] diff --git a/core/finality-grandpa/primitives/src/lib.rs b/core/finality-grandpa/primitives/src/lib.rs index f3721d5dcc7ea93f8f180511d99a4f9ac54a4c7c..b92444e26295ce20415e7db64eaf638bdbd7fc2d 100644 --- a/core/finality-grandpa/primitives/src/lib.rs +++ b/core/finality-grandpa/primitives/src/lib.rs @@ -23,20 +23,25 @@ extern crate alloc; #[cfg(feature = "std")] use serde::Serialize; -use parity_codec::{Encode, Decode, Codec}; +use codec::{Encode, Decode, Codec}; use sr_primitives::{ConsensusEngineId, traits::{DigestFor, NumberFor}}; use client::decl_runtime_apis; use rstd::vec::Vec; +mod app { + use app_crypto::{app_crypto, key_types::GRANDPA, ed25519}; + app_crypto!(ed25519, GRANDPA); +} + /// The grandpa crypto scheme defined via the keypair type. #[cfg(feature = "std")] -pub type AuthorityPair = substrate_primitives::ed25519::Pair; +pub type AuthorityPair = app::Pair; /// Identity of a Grandpa authority. -pub type AuthorityId = substrate_primitives::ed25519::Public; +pub type AuthorityId = app::Public; /// Signature for a Grandpa authority. -pub type AuthoritySignature = substrate_primitives::ed25519::Signature; +pub type AuthoritySignature = app::Signature; /// The `ConsensusEngineId` of GRANDPA. pub const GRANDPA_ENGINE_ID: ConsensusEngineId = *b"FRNK"; @@ -93,6 +98,14 @@ pub enum ConsensusLog { /// Note that the authority with given index is disabled until the next change. #[codec(index = "3")] OnDisabled(AuthorityIndex), + /// A signal to pause the current authority set after the given delay. + /// After finalizing the block at _delay_ the authorities should stop voting. + #[codec(index = "4")] + Pause(N), + /// A signal to resume the current authority set after the given delay. + /// After authoring the block at _delay_ the authorities should resume voting. + #[codec(index = "5")] + Resume(N), } impl ConsensusLog { @@ -100,7 +113,7 @@ impl ConsensusLog { pub fn try_into_change(self) -> Option> { match self { ConsensusLog::ScheduledChange(change) => Some(change), - ConsensusLog::ForcedChange(_, _) | ConsensusLog::OnDisabled(_) => None, + _ => None, } } @@ -108,7 +121,23 @@ impl ConsensusLog { pub fn try_into_forced_change(self) -> Option<(N, ScheduledChange)> { match self { ConsensusLog::ForcedChange(median, change) => Some((median, change)), - ConsensusLog::ScheduledChange(_) | ConsensusLog::OnDisabled(_) => None, + _ => None, + } + } + + /// Try to cast the log entry as a contained pause signal. + pub fn try_into_pause(self) -> Option { + match self { + ConsensusLog::Pause(delay) => Some(delay), + _ => None, + } + } + + /// Try to cast the log entry as a contained resume signal. + pub fn try_into_resume(self) -> Option { + match self { + ConsensusLog::Resume(delay) => Some(delay), + _ => None, } } } diff --git a/core/finality-grandpa/src/authorities.rs b/core/finality-grandpa/src/authorities.rs index 8b329d4116d8f9dc08cf1195e5ca36679f0e1c2f..9b83c9feb68710a3b60c5ebcef78cb64131a0094 100644 --- a/core/finality-grandpa/src/authorities.rs +++ b/core/finality-grandpa/src/authorities.rs @@ -19,7 +19,7 @@ use fork_tree::ForkTree; use parking_lot::RwLock; use grandpa::voter_set::VoterSet; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use log::{debug, info}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use fg_primitives::AuthorityId; @@ -403,7 +403,7 @@ pub(crate) struct PendingChange { } impl Decode for PendingChange { - fn decode(value: &mut I) -> Option { + fn decode(value: &mut I) -> Result { let next_authorities = Decode::decode(value)?; let delay = Decode::decode(value)?; let canon_height = Decode::decode(value)?; @@ -411,7 +411,7 @@ impl Decode for PendingChange { let delay_kind = DelayKind::decode(value).unwrap_or(DelayKind::Finalized); - Some(PendingChange { + Ok(PendingChange { next_authorities, delay, canon_height, @@ -431,6 +431,7 @@ impl + Clone> PendingChange { #[cfg(test)] mod tests { use super::*; + use primitives::crypto::Public; fn static_is_descendent_of(value: bool) -> impl Fn(&A, &A) -> Result @@ -520,8 +521,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; - let set_b = vec![(AuthorityId::from_raw([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_slice(&[1; 32]), 5)]; + let set_b = vec![(AuthorityId::from_slice(&[2; 32]), 5)]; // two competing changes at the same height on different forks let change_a = PendingChange { @@ -585,8 +586,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; - let set_c = vec![(AuthorityId::from_raw([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_slice(&[1; 32]), 5)]; + let set_c = vec![(AuthorityId::from_slice(&[2; 32]), 5)]; // two competing changes at the same height on different forks let change_a = PendingChange { @@ -651,7 +652,7 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; + let set_a = vec![(AuthorityId::from_slice(&[1; 32]), 5)]; let change_a = PendingChange { next_authorities: set_a.clone(), @@ -717,8 +718,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; - let set_b = vec![(AuthorityId::from_raw([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_slice(&[1; 32]), 5)]; + let set_b = vec![(AuthorityId::from_slice(&[2; 32]), 5)]; let change_a = PendingChange { next_authorities: set_a.clone(), diff --git a/core/finality-grandpa/src/aux_schema.rs b/core/finality-grandpa/src/aux_schema.rs index f3939f46502744663d51a3ca634ad9a0e3939253..78c1741d519037fdd6adcde19a1f4be883f3118d 100644 --- a/core/finality-grandpa/src/aux_schema.rs +++ b/core/finality-grandpa/src/aux_schema.rs @@ -18,19 +18,21 @@ use std::fmt::Debug; use std::sync::Arc; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use client::backend::AuxStore; use client::error::{Result as ClientResult, Error as ClientError}; use fork_tree::ForkTree; use grandpa::round::State as RoundState; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; use log::{info, warn}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use fg_primitives::AuthorityId; use crate::authorities::{AuthoritySet, SharedAuthoritySet, PendingChange, DelayKind}; use crate::consensus_changes::{SharedConsensusChanges, ConsensusChanges}; -use crate::environment::{CompletedRound, CompletedRounds, HasVoted, SharedVoterSetState, VoterSetState}; +use crate::environment::{ + CompletedRound, CompletedRounds, CurrentRounds, HasVoted, SharedVoterSetState, VoterSetState, +}; use crate::NewAuthoritySet; const VERSION_KEY: &[u8] = b"grandpa_schema_version"; @@ -108,8 +110,8 @@ pub(crate) fn load_decode(backend: &B, key: &[u8]) -> Cl match backend.get_aux(key)? { None => Ok(None), Some(t) => T::decode(&mut &t[..]) - .ok_or_else( - || ClientError::Backend(format!("GRANDPA DB is corrupted.")), + .map_err( + |e| ClientError::Backend(format!("GRANDPA DB is corrupted: {}", e.what())), ) .map(Some) } @@ -155,6 +157,9 @@ fn migrate_from_version0( let base = last_round_state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); + let mut current_rounds = CurrentRounds::new(); + current_rounds.insert(last_round_number + 1, HasVoted::No); + let set_state = VoterSetState::Live { completed_rounds: CompletedRounds::new( CompletedRound { @@ -166,7 +171,7 @@ fn migrate_from_version0( set_id, &new_set, ), - current_round: HasVoted::No, + current_rounds, }; backend.insert_aux(&[(SET_STATE_KEY, set_state.encode().as_slice())], &[])?; @@ -223,9 +228,12 @@ fn migrate_from_version1( let base = set_state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); + let mut current_rounds = CurrentRounds::new(); + current_rounds.insert(last_round_number + 1, HasVoted::No); + VoterSetState::Live { completed_rounds: completed_rounds(last_round_number, set_state, base), - current_round: HasVoted::No, + current_rounds, } }, None => { @@ -233,10 +241,11 @@ fn migrate_from_version1( let base = set_state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); - VoterSetState::Live { - completed_rounds: completed_rounds(0, set_state, base), - current_round: HasVoted::No, - } + VoterSetState::live( + set_id, + &set, + base, + ) }, }; @@ -300,19 +309,11 @@ pub(crate) fn load_persistent( let base = state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); - VoterSetState::Live { - completed_rounds: CompletedRounds::new( - CompletedRound { - number: 0, - votes: Vec::new(), - base, - state, - }, - set.current().0, - &set, - ), - current_round: HasVoted::No, - } + VoterSetState::live( + set.current().0, + &set, + base, + ) } }; @@ -338,19 +339,12 @@ pub(crate) fn load_persistent( let base = state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); - let genesis_state = VoterSetState::Live { - completed_rounds: CompletedRounds::new( - CompletedRound { - number: 0, - votes: Vec::new(), - state, - base, - }, - 0, - &genesis_set, - ), - current_round: HasVoted::No, - }; + let genesis_state = VoterSetState::live( + 0, + &genesis_set, + base, + ); + backend.insert_aux( &[ (AUTHORITY_SET_KEY, genesis_set.encode().as_slice()), @@ -396,23 +390,11 @@ pub(crate) fn update_authority_set( // we also overwrite the "last completed round" entry with a blank slate // because from the perspective of the finality gadget, the chain has // reset. - let round_state = RoundState::genesis(( - new_set.canon_hash.clone(), - new_set.canon_number.clone(), - )); - let set_state = VoterSetState::::Live { - completed_rounds: CompletedRounds::new( - CompletedRound { - number: 0, - state: round_state, - votes: Vec::new(), - base: (new_set.canon_hash, new_set.canon_number), - }, - new_set.set_id, - &set, - ), - current_round: HasVoted::No, - }; + let set_state = VoterSetState::::live( + new_set.set_id, + &set, + (new_set.canon_hash, new_set.canon_number), + ); let encoded = set_state.encode(); write_aux(&[ @@ -456,7 +438,7 @@ pub(crate) fn load_authorities(backend: &B) #[cfg(test)] mod test { - use substrate_primitives::H256; + use primitives::H256; use test_client; use super::*; @@ -527,6 +509,9 @@ mod test { }, ); + let mut current_rounds = CurrentRounds::new(); + current_rounds.insert(round_number + 1, HasVoted::No); + assert_eq!( &*set_state.read(), &VoterSetState::Live { @@ -540,7 +525,7 @@ mod test { set_id, &*authority_set.inner().read(), ), - current_round: HasVoted::No, + current_rounds, }, ); } @@ -614,6 +599,9 @@ mod test { }, ); + let mut current_rounds = CurrentRounds::new(); + current_rounds.insert(round_number + 1, HasVoted::No); + assert_eq!( &*set_state.read(), &VoterSetState::Live { @@ -627,7 +615,7 @@ mod test { set_id, &*authority_set.inner().read(), ), - current_round: HasVoted::No, + current_rounds, }, ); } diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index dfaa96628f2dc43699bd7297247353e50112fdae..20a629b6ae378142db98edc4f38a71d17775974c 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -82,11 +82,11 @@ //! //! We only send polite messages to peers, -use runtime_primitives::traits::{NumberFor, Block as BlockT, Zero}; +use sr_primitives::traits::{NumberFor, Block as BlockT, Zero}; use network::consensus_gossip::{self as network_gossip, MessageIntent, ValidatorContext}; use network::{config::Roles, PeerId}; -use parity_codec::{Encode, Decode}; -use crate::ed25519::Public as AuthorityId; +use codec::{Encode, Decode}; +use fg_primitives::AuthorityId; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG}; use log::{trace, debug, warn}; @@ -977,10 +977,10 @@ impl GossipValidator { let action = { match GossipMessage::::decode(&mut data) { - Some(GossipMessage::VoteOrPrecommit(ref message)) + Ok(GossipMessage::VoteOrPrecommit(ref message)) => self.inner.write().validate_round_message(who, message), - Some(GossipMessage::Commit(ref message)) => self.inner.write().validate_commit_message(who, message), - Some(GossipMessage::Neighbor(update)) => { + Ok(GossipMessage::Commit(ref message)) => self.inner.write().validate_commit_message(who, message), + Ok(GossipMessage::Neighbor(update)) => { let (topics, action, catch_up, report) = self.inner.write().import_neighbor_message( who, update.into_neighbor_packet(), @@ -994,9 +994,9 @@ impl GossipValidator { peer_reply = catch_up; action } - Some(GossipMessage::CatchUp(ref message)) + Ok(GossipMessage::CatchUp(ref message)) => self.inner.write().validate_catch_up_message(who, message), - Some(GossipMessage::CatchUpRequest(request)) => { + Ok(GossipMessage::CatchUpRequest(request)) => { let (reply, action) = self.inner.write().handle_catch_up_request( who, request, @@ -1006,8 +1006,8 @@ impl GossipValidator { peer_reply = reply; action } - None => { - debug!(target: "afg", "Error decoding message"); + Err(e) => { + debug!(target: "afg", "Error decoding message: {}", e.what()); telemetry!(CONSENSUS_DEBUG; "afg.err_decoding_msg"; "" => ""); let len = std::cmp::min(i32::max_value() as usize, data.len()) as i32; @@ -1127,17 +1127,17 @@ impl network_gossip::Validator for GossipValidator let peer_best_commit = peer.view.last_commit; match GossipMessage::::decode(&mut data) { - None => false, - Some(GossipMessage::Commit(full)) => { + Err(_) => false, + Ok(GossipMessage::Commit(full)) => { // we only broadcast our best commit and only if it's // better than last received by peer. Some(full.message.target_number) == our_best_commit && Some(full.message.target_number) > peer_best_commit } - Some(GossipMessage::Neighbor(_)) => false, - Some(GossipMessage::CatchUpRequest(_)) => false, - Some(GossipMessage::CatchUp(_)) => false, - Some(GossipMessage::VoteOrPrecommit(_)) => false, // should not be the case. + Ok(GossipMessage::Neighbor(_)) => false, + Ok(GossipMessage::CatchUpRequest(_)) => false, + Ok(GossipMessage::CatchUp(_)) => false, + Ok(GossipMessage::VoteOrPrecommit(_)) => false, // should not be the case. } }) } @@ -1162,10 +1162,10 @@ impl network_gossip::Validator for GossipValidator let best_commit = local_view.last_commit; match GossipMessage::::decode(&mut data) { - None => true, - Some(GossipMessage::Commit(full)) + Err(_) => true, + Ok(GossipMessage::Commit(full)) => Some(full.message.target_number) != best_commit, - Some(_) => true, + Ok(_) => true, } }) } @@ -1233,13 +1233,14 @@ mod tests { use super::environment::SharedVoterSetState; use network_gossip::Validator as GossipValidatorT; use network::test::Block; + use primitives::crypto::Public; // some random config (not really needed) fn config() -> crate::Config { crate::Config { gossip_duration: Duration::from_millis(10), justification_period: 256, - local_key: None, + keystore: None, name: None, } } @@ -1247,26 +1248,16 @@ mod tests { // dummy voter set state fn voter_set_state() -> SharedVoterSetState { use crate::authorities::AuthoritySet; - use crate::environment::{CompletedRound, CompletedRounds, HasVoted, VoterSetState}; - use grandpa::round::State as RoundState; - use substrate_primitives::H256; + use crate::environment::VoterSetState; + use primitives::H256; - let state = RoundState::genesis((H256::zero(), 0)); - let base = state.prevote_ghost.unwrap(); + let base = (H256::zero(), 0); let voters = AuthoritySet::genesis(Vec::new()); - let set_state = VoterSetState::Live { - completed_rounds: CompletedRounds::new( - CompletedRound { - state, - number: 0, - votes: Vec::new(), - base, - }, - 0, - &voters, - ), - current_round: HasVoted::No, - }; + let set_state = VoterSetState::live( + 0, + &voters, + base, + ); set_state.into() } @@ -1452,7 +1443,7 @@ mod tests { voter_set_state(), ); let set_id = 1; - let auth = AuthorityId::from_raw([1u8; 32]); + let auth = AuthorityId::from_slice(&[1u8; 32]); let peer = PeerId::random(); val.note_set(SetId(set_id), vec![auth.clone()], |_, _| {}); @@ -1468,7 +1459,7 @@ mod tests { target_number: 10, }), signature: Default::default(), - id: AuthorityId::from_raw([2u8; 32]), + id: AuthorityId::from_slice(&[2u8; 32]), } }); @@ -1497,7 +1488,7 @@ mod tests { ); let set_id = 1; - let auth = AuthorityId::from_raw([1u8; 32]); + let auth = AuthorityId::from_slice(&[1u8; 32]); let peer = PeerId::random(); val.note_set(SetId(set_id), vec![auth.clone()], |_, _| {}); @@ -1541,16 +1532,19 @@ mod tests { let set_state: SharedVoterSetState = { let mut completed_rounds = voter_set_state().read().completed_rounds(); - assert!(completed_rounds.push(environment::CompletedRound { + completed_rounds.push(environment::CompletedRound { number: 1, state: grandpa::round::State::genesis(Default::default()), base: Default::default(), votes: Default::default(), - })); + }); + + let mut current_rounds = environment::CurrentRounds::new(); + current_rounds.insert(2, environment::HasVoted::No); let set_state = environment::VoterSetState::::Live { completed_rounds, - current_round: environment::HasVoted::No, + current_rounds, }; set_state.into() @@ -1562,7 +1556,7 @@ mod tests { ); let set_id = 1; - let auth = AuthorityId::from_raw([1u8; 32]); + let auth = AuthorityId::from_slice(&[1u8; 32]); let peer = PeerId::random(); val.note_set(SetId(set_id), vec![auth.clone()], |_, _| {}); diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index 4707dede78d65cd6b3e618d367479c985f847c43..2aa2618535948821e99984b9934c17b79a46f95e 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -29,18 +29,18 @@ use std::sync::Arc; -use grandpa::{voter, voter_set::VoterSet}; -use grandpa::Message::{Prevote, Precommit, PrimaryPropose}; use futures::prelude::*; use futures::sync::{oneshot, mpsc}; +use grandpa::Message::{Prevote, Precommit, PrimaryPropose}; +use grandpa::{voter, voter_set::VoterSet}; use log::{debug, trace}; -use tokio_executor::Executor; -use parity_codec::{Encode, Decode}; -use substrate_primitives::{ed25519, Pair}; -use substrate_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; -use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; use network::{consensus_gossip as network_gossip, NetworkService}; use network_gossip::ConsensusMessage; +use codec::{Encode, Decode}; +use primitives::Pair; +use sr_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; +use substrate_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; +use tokio_executor::Executor; use crate::{ CatchUp, Commit, CommunicationIn, CommunicationOut, CompactCommit, Error, @@ -50,7 +50,7 @@ use crate::environment::HasVoted; use gossip::{ GossipMessage, FullCatchUpMessage, FullCommitMessage, VoteOrPrecommitMessage, GossipValidator }; -use substrate_primitives::ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; +use fg_primitives::{AuthorityPair, AuthorityId, AuthoritySignature}; pub mod gossip; mod periodic; @@ -341,7 +341,7 @@ impl> NetworkBridge { round: Round, set_id: SetId, voters: Arc>, - local_key: Option>, + local_key: Option, has_voted: HasVoted, ) -> ( impl Stream,Error=Error>, @@ -354,8 +354,7 @@ impl> NetworkBridge { ); let locals = local_key.and_then(|pair| { - let public = pair.public(); - let id = AuthorityId(public.0); + let id = pair.public(); if voters.contains_key(&id) { Some((pair, id)) } else { @@ -367,10 +366,10 @@ impl> NetworkBridge { let incoming = self.service.messages_for(topic) .filter_map(|notification| { let decoded = GossipMessage::::decode(&mut ¬ification.message[..]); - if decoded.is_none() { - debug!(target: "afg", "Skipping malformed message {:?}", notification); + if let Err(ref e) = decoded { + debug!(target: "afg", "Skipping malformed message {:?}: {}", notification, e); } - decoded + decoded.ok() }) .and_then(move |msg| { match msg { @@ -583,10 +582,10 @@ fn incoming_global>( .filter_map(|notification| { // this could be optimized by decoding piecewise. let decoded = GossipMessage::::decode(&mut ¬ification.message[..]); - if decoded.is_none() { - trace!(target: "afg", "Skipping malformed commit message {:?}", notification); + if let Err(ref e) = decoded { + trace!(target: "afg", "Skipping malformed commit message {:?}: {}", notification, e); } - decoded.map(move |d| (notification, d)) + decoded.map(move |d| (notification, d)).ok() }) .filter_map(move |(notification, msg)| { match msg { @@ -633,9 +632,9 @@ pub(crate) fn check_message_sig( round: u64, set_id: u64, ) -> Result<(), ()> { - let as_public = AuthorityId::from_raw(id.0); + let as_public = id.clone(); let encoded_raw = localized_payload(round, set_id, message); - if ed25519::Pair::verify(signature, &encoded_raw, as_public) { + if AuthorityPair::verify(signature, &encoded_raw, &as_public) { Ok(()) } else { debug!(target: "afg", "Bad signature on message from {:?}", id); @@ -653,7 +652,7 @@ pub(crate) fn check_message_sig( struct OutgoingMessages> { round: u64, set_id: u64, - locals: Option<(Arc, AuthorityId)>, + locals: Option<(AuthorityPair, AuthorityId)>, sender: mpsc::UnboundedSender>, network: N, has_voted: HasVoted, diff --git a/core/finality-grandpa/src/communication/periodic.rs b/core/finality-grandpa/src/communication/periodic.rs index 8490ff2f794ebcd789b8cb05ec46c029b7771838..7265fe34a2a8659783c9b7cd2e5afa1bed05b560 100644 --- a/core/finality-grandpa/src/communication/periodic.rs +++ b/core/finality-grandpa/src/communication/periodic.rs @@ -19,11 +19,11 @@ use super::{gossip::{NeighborPacket, GossipMessage}, Network}; use futures::prelude::*; use futures::sync::mpsc; -use runtime_primitives::traits::{NumberFor, Block as BlockT}; +use sr_primitives::traits::{NumberFor, Block as BlockT}; use network::PeerId; use tokio_timer::Delay; use log::warn; -use parity_codec::Encode; +use codec::Encode; use std::time::{Instant, Duration}; diff --git a/core/finality-grandpa/src/communication/tests.rs b/core/finality-grandpa/src/communication/tests.rs index 5760b3936cd987ea79c65cc07b781be2205d5a93..de5a084039268193e840f7511e322cf41155940e 100644 --- a/core/finality-grandpa/src/communication/tests.rs +++ b/core/finality-grandpa/src/communication/tests.rs @@ -23,8 +23,8 @@ use network::test::{Block, Hash}; use network_gossip::Validator; use tokio::runtime::current_thread; use std::sync::Arc; -use keyring::AuthorityKeyring; -use parity_codec::Encode; +use keyring::Ed25519Keyring; +use codec::Encode; use crate::environment::SharedVoterSetState; use super::gossip::{self, GossipValidator}; @@ -133,7 +133,7 @@ fn config() -> crate::Config { crate::Config { gossip_duration: std::time::Duration::from_millis(10), justification_period: 256, - local_key: None, + keystore: None, name: None, } } @@ -141,26 +141,18 @@ fn config() -> crate::Config { // dummy voter set state fn voter_set_state() -> SharedVoterSetState { use crate::authorities::AuthoritySet; - use crate::environment::{CompletedRound, CompletedRounds, HasVoted, VoterSetState}; + use crate::environment::VoterSetState; use grandpa::round::State as RoundState; - use substrate_primitives::H256; + use primitives::H256; let state = RoundState::genesis((H256::zero(), 0)); let base = state.prevote_ghost.unwrap(); let voters = AuthoritySet::genesis(Vec::new()); - let set_state = VoterSetState::Live { - completed_rounds: CompletedRounds::new( - CompletedRound { - state, - number: 0, - votes: Vec::new(), - base, - }, - 0, - &voters, - ), - current_round: HasVoted::No, - }; + let set_state = VoterSetState::live( + 0, + &voters, + base, + ); set_state.into() } @@ -202,9 +194,9 @@ fn make_test_network() -> ( ) } -fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(AuthorityId, u64)> { +fn make_ids(keys: &[Ed25519Keyring]) -> Vec<(AuthorityId, u64)> { keys.iter() - .map(|key| AuthorityId(key.to_raw_public())) + .map(|key| key.clone().public().into()) .map(|id| (id, 1)) .collect() } @@ -220,7 +212,7 @@ impl network_gossip::ValidatorContext for NoopContext { #[test] fn good_commit_leads_to_relay() { - let private = [AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let private = [Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let public = make_ids(&private[..]); let voter_set = Arc::new(public.iter().cloned().collect::>()); @@ -242,7 +234,7 @@ fn good_commit_leads_to_relay() { for (i, key) in private.iter().enumerate() { precommits.push(precommit.clone()); - let signature = key.sign(&payload[..]); + let signature = fg_primitives::AuthoritySignature::from(key.sign(&payload[..])); auth_data.push((signature, public[i].0.clone())) } @@ -335,7 +327,7 @@ fn good_commit_leads_to_relay() { #[test] fn bad_commit_leads_to_report() { - let private = [AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let private = [Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let public = make_ids(&private[..]); let voter_set = Arc::new(public.iter().cloned().collect::>()); @@ -357,7 +349,7 @@ fn bad_commit_leads_to_report() { for (i, key) in private.iter().enumerate() { precommits.push(precommit.clone()); - let signature = key.sign(&payload[..]); + let signature = fg_primitives::AuthoritySignature::from(key.sign(&payload[..])); auth_data.push((signature, public[i].0.clone())) } diff --git a/core/finality-grandpa/src/consensus_changes.rs b/core/finality-grandpa/src/consensus_changes.rs index 02ac95124151d70a42368f0917430a0c0e6d449b..4d942248920f7175a81cb097932225aaa8327e4a 100644 --- a/core/finality-grandpa/src/consensus_changes.rs +++ b/core/finality-grandpa/src/consensus_changes.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use std::sync::Arc; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; /// Consensus-related data changes tracker. #[derive(Clone, Debug, Encode, Decode)] diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 414e3ca0ab43e8dac57aa2bd440b407fe5932236..5761093c5eb676a2c5e3ec56c01d636a1216d033 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -14,29 +14,30 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::collections::VecDeque; +use std::collections::BTreeMap; use std::iter::FromIterator; use std::sync::Arc; use std::time::{Duration, Instant}; use log::{debug, warn, info}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use futures::prelude::*; use tokio_timer::Delay; use parking_lot::RwLock; use client::{ - backend::Backend, BlockchainEvents, CallExecutor, Client, error::Error as ClientError + backend::Backend, BlockchainEvents, CallExecutor, Client, error::Error as ClientError, + utils::is_descendent_of, }; use grandpa::{ BlockNumberOps, Equivocation, Error as GrandpaError, round::State as RoundState, voter, voter_set::VoterSet, }; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ - Block as BlockT, Header as HeaderT, NumberFor, One, Zero, BlockNumberToHash, +use primitives::{Blake2Hasher, H256, Pair}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ + Block as BlockT, Header as HeaderT, NumberFor, One, Zero, }; -use substrate_primitives::{Blake2Hasher, ed25519, H256, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use crate::{ @@ -73,11 +74,12 @@ pub struct CompletedRound { pub votes: Vec>, } -// Data about last completed rounds within a single voter set. Stores NUM_LAST_COMPLETED_ROUNDS and always -// contains data about at least one round (genesis). +// Data about last completed rounds within a single voter set. Stores +// NUM_LAST_COMPLETED_ROUNDS and always contains data about at least one round +// (genesis). #[derive(Debug, Clone, PartialEq)] pub struct CompletedRounds { - rounds: VecDeque>, + rounds: Vec>, set_id: u64, voters: Vec, } @@ -94,8 +96,10 @@ impl Encode for CompletedRounds { } } +impl codec::EncodeLike for CompletedRounds {} + impl Decode for CompletedRounds { - fn decode(value: &mut I) -> Option { + fn decode(value: &mut I) -> Result { <(Vec>, u64, Vec)>::decode(value) .map(|(rounds, set_id, voters)| CompletedRounds { rounds: rounds.into(), @@ -114,8 +118,8 @@ impl CompletedRounds { ) -> CompletedRounds { - let mut rounds = VecDeque::with_capacity(NUM_LAST_COMPLETED_ROUNDS); - rounds.push_back(genesis); + let mut rounds = Vec::with_capacity(NUM_LAST_COMPLETED_ROUNDS); + rounds.push(genesis); let voters = voters.current().1.iter().map(|(a, _)| a.clone()).collect(); CompletedRounds { rounds, set_id, voters } @@ -128,32 +132,38 @@ impl CompletedRounds { /// Iterate over all completed rounds. pub fn iter(&self) -> impl Iterator> { - self.rounds.iter() + self.rounds.iter().rev() } /// Returns the last (latest) completed round. pub fn last(&self) -> &CompletedRound { - self.rounds.back() + self.rounds.first() .expect("inner is never empty; always contains at least genesis; qed") } - /// Push a new completed round, returns false if the given round is older - /// than the last completed round. - pub fn push(&mut self, completed_round: CompletedRound) -> bool { - if self.last().number >= completed_round.number { - return false; - } + /// Push a new completed round, oldest round is evicted if number of rounds + /// is higher than `NUM_LAST_COMPLETED_ROUNDS`. + pub fn push(&mut self, completed_round: CompletedRound) { + use std::cmp::Reverse; + + match self.rounds.binary_search_by_key( + &Reverse(completed_round.number), + |completed_round| Reverse(completed_round.number), + ) { + Ok(idx) => self.rounds[idx] = completed_round, + Err(idx) => self.rounds.insert(idx, completed_round), + }; - if self.rounds.len() == NUM_LAST_COMPLETED_ROUNDS { - self.rounds.pop_front(); + if self.rounds.len() > NUM_LAST_COMPLETED_ROUNDS { + self.rounds.pop(); } - - self.rounds.push_back(completed_round); - - true } } +/// A map with voter status information for currently live rounds, +/// which votes have we cast and what are they. +pub type CurrentRounds = BTreeMap>; + /// The state of the current voter set, whether it is currently active or not /// and information related to the previously completed rounds. Current round /// voting status is used when restarting the voter, i.e. it will re-use the @@ -165,8 +175,8 @@ pub enum VoterSetState { Live { /// The previously completed rounds. completed_rounds: CompletedRounds, - /// Vote status for the current round. - current_round: HasVoted, + /// Voter status for the currently live rounds. + current_rounds: CurrentRounds, }, /// The voter is paused, i.e. not casting or importing any votes. Paused { @@ -176,6 +186,35 @@ pub enum VoterSetState { } impl VoterSetState { + /// Create a new live VoterSetState with round 0 as a completed round using + /// the given genesis state and the given authorities. Round 1 is added as a + /// current round (with state `HasVoted::No`). + pub(crate) fn live( + set_id: u64, + authority_set: &AuthoritySet>, + genesis_state: (Block::Hash, NumberFor), + ) -> VoterSetState { + let state = RoundState::genesis((genesis_state.0, genesis_state.1)); + let completed_rounds = CompletedRounds::new( + CompletedRound { + number: 0, + state, + base: (genesis_state.0, genesis_state.1), + votes: Vec::new(), + }, + set_id, + authority_set, + ); + + let mut current_rounds = CurrentRounds::new(); + current_rounds.insert(1, HasVoted::No); + + VoterSetState::Live { + completed_rounds, + current_rounds, + } + } + /// Returns the last completed rounds. pub(crate) fn completed_rounds(&self) -> CompletedRounds { match self { @@ -195,10 +234,28 @@ impl VoterSetState { completed_rounds.last().clone(), } } + + /// Returns the voter set state validating that it includes the given round + /// in current rounds and that the voter isn't paused. + pub fn with_current_round(&self, round: u64) + -> Result<(&CompletedRounds, &CurrentRounds), Error> + { + if let VoterSetState::Live { completed_rounds, current_rounds } = self { + if current_rounds.contains_key(&round) { + return Ok((completed_rounds, current_rounds)); + } else { + let msg = "Voter acting on a live round we are not tracking."; + return Err(Error::Safety(msg.to_string())); + } + } else { + let msg = "Voter acting while in paused state."; + return Err(Error::Safety(msg.to_string())); + } + } } /// Whether we've voted already during a prior run of the program. -#[derive(Debug, Decode, Encode, PartialEq)] +#[derive(Clone, Debug, Decode, Encode, PartialEq)] pub enum HasVoted { /// Has not voted already in this round. No, @@ -287,10 +344,16 @@ impl SharedVoterSetState { } /// Return vote status information for the current round. - pub(crate) fn has_voted(&self) -> HasVoted { + pub(crate) fn has_voted(&self, round: u64) -> HasVoted { match &*self.inner.read() { - VoterSetState::Live { current_round: HasVoted::Yes(id, vote), .. } => - HasVoted::Yes(id.clone(), vote.clone()), + VoterSetState::Live { current_rounds, .. } => { + current_rounds.get(&round).and_then(|has_voted| match has_voted { + HasVoted::Yes(id, vote) => + Some(HasVoted::Yes(id.clone(), vote.clone())), + _ => None, + }) + .unwrap_or(HasVoted::No) + }, _ => HasVoted::No, } } @@ -475,7 +538,7 @@ where { type Timer = Box + Send>; type Id = AuthorityId; - type Signature = ed25519::Signature; + type Signature = AuthoritySignature; // regular round message streams type In = Box { + if local_key.as_ref().map(|k| k.public() == id).unwrap_or(false) { + HasVoted::Yes(id, vote) + } else { + HasVoted::No + } + }, + HasVoted::No => HasVoted::No, + }; let (incoming, outgoing) = self.network.round_communication( crate::communication::Round(round), crate::communication::SetId(self.set_id), self.voters.clone(), - local_key.cloned(), - self.voter_set_state.has_voted(), + local_key.clone(), + has_voted, ); // schedule incoming messages from the network to be held until @@ -520,7 +593,7 @@ where let outgoing = Box::new(outgoing.sink_map_err(Into::into)); voter::RoundData { - voter_id: self.config.local_key.as_ref().map(|pair| pair.public().clone()), + voter_id: local_key.map(|pair| pair.public()), prevote_timer: Box::new(prevote_timer.map_err(|e| Error::Timer(e).into())), precommit_timer: Box::new(precommit_timer.map_err(|e| Error::Timer(e).into())), incoming, @@ -528,34 +601,35 @@ where } } - fn proposed(&self, _round: u64, propose: PrimaryPropose) -> Result<(), Self::Error> { - let local_id = self.config.local_key.as_ref() - .map(|pair| pair.public().into()) - .filter(|id| self.voters.contains_key(&id)); + fn proposed(&self, round: u64, propose: PrimaryPropose) -> Result<(), Self::Error> { + let local_id = crate::is_voter(&self.voters, &self.config.keystore); let local_id = match local_id { - Some(id) => id, + Some(id) => id.public(), None => return Ok(()), }; self.update_voter_set_state(|voter_set_state| { - let completed_rounds = match voter_set_state { - VoterSetState::Live { completed_rounds, current_round: HasVoted::No } => completed_rounds, - VoterSetState::Live { current_round, .. } if !current_round.can_propose() => { - // we've already proposed in this round (in a previous run), - // ignore the given vote and don't update the voter set - // state - return Ok(None); - }, - _ => { - let msg = "Voter proposing after prevote/precommit or while paused."; - return Err(Error::Safety(msg.to_string())); - }, - }; + let (completed_rounds, current_rounds) = voter_set_state.with_current_round(round)?; + let current_round = current_rounds.get(&round) + .expect("checked in with_current_round that key exists; qed."); + + if !current_round.can_propose() { + // we've already proposed in this round (in a previous run), + // ignore the given vote and don't update the voter set + // state + return Ok(None); + } + + let mut current_rounds = current_rounds.clone(); + let current_round = current_rounds.get_mut(&round) + .expect("checked previously that key exists; qed."); + + *current_round = HasVoted::Yes(local_id, Vote::Propose(propose)); let set_state = VoterSetState::::Live { completed_rounds: completed_rounds.clone(), - current_round: HasVoted::Yes(local_id, Vote::Propose(propose)), + current_rounds, }; #[allow(deprecated)] @@ -567,37 +641,37 @@ where Ok(()) } - fn prevoted(&self, _round: u64, prevote: Prevote) -> Result<(), Self::Error> { - let local_id = self.config.local_key.as_ref() - .map(|pair| pair.public().into()) - .filter(|id| self.voters.contains_key(&id)); + fn prevoted(&self, round: u64, prevote: Prevote) -> Result<(), Self::Error> { + let local_id = crate::is_voter(&self.voters, &self.config.keystore); let local_id = match local_id { - Some(id) => id, + Some(id) => id.public(), None => return Ok(()), }; self.update_voter_set_state(|voter_set_state| { - let (completed_rounds, propose) = match voter_set_state { - VoterSetState::Live { completed_rounds, current_round: HasVoted::No } => - (completed_rounds, None), - VoterSetState::Live { completed_rounds, current_round: HasVoted::Yes(_, Vote::Propose(propose)) } => - (completed_rounds, Some(propose)), - VoterSetState::Live { current_round, .. } if !current_round.can_prevote() => { - // we've already prevoted in this round (in a previous run), - // ignore the given vote and don't update the voter set - // state - return Ok(None); - }, - _ => { - let msg = "Voter prevoting after precommit or while paused."; - return Err(Error::Safety(msg.to_string())); - }, - }; + let (completed_rounds, current_rounds) = voter_set_state.with_current_round(round)?; + let current_round = current_rounds.get(&round) + .expect("checked in with_current_round that key exists; qed."); + + if !current_round.can_prevote() { + // we've already prevoted in this round (in a previous run), + // ignore the given vote and don't update the voter set + // state + return Ok(None); + } + + let propose = current_round.propose(); + + let mut current_rounds = current_rounds.clone(); + let current_round = current_rounds.get_mut(&round) + .expect("checked previously that key exists; qed."); + + *current_round = HasVoted::Yes(local_id, Vote::Prevote(propose.cloned(), prevote)); let set_state = VoterSetState::::Live { completed_rounds: completed_rounds.clone(), - current_round: HasVoted::Yes(local_id, Vote::Prevote(propose.cloned(), prevote)), + current_rounds, }; #[allow(deprecated)] @@ -609,35 +683,47 @@ where Ok(()) } - fn precommitted(&self, _round: u64, precommit: Precommit) -> Result<(), Self::Error> { - let local_id = self.config.local_key.as_ref() - .map(|pair| pair.public().into()) - .filter(|id| self.voters.contains_key(&id)); + fn precommitted(&self, round: u64, precommit: Precommit) -> Result<(), Self::Error> { + let local_id = crate::is_voter(&self.voters, &self.config.keystore); let local_id = match local_id { - Some(id) => id, + Some(id) => id.public(), None => return Ok(()), }; self.update_voter_set_state(|voter_set_state| { - let (completed_rounds, propose, prevote) = match voter_set_state { - VoterSetState::Live { completed_rounds, current_round: HasVoted::Yes(_, Vote::Prevote(propose, prevote)) } => - (completed_rounds, propose, prevote), - VoterSetState::Live { current_round, .. } if !current_round.can_precommit() => { - // we've already precommitted in this round (in a previous run), - // ignore the given vote and don't update the voter set - // state - return Ok(None); - }, + let (completed_rounds, current_rounds) = voter_set_state.with_current_round(round)?; + let current_round = current_rounds.get(&round) + .expect("checked in with_current_round that key exists; qed."); + + if !current_round.can_precommit() { + // we've already precommitted in this round (in a previous run), + // ignore the given vote and don't update the voter set + // state + return Ok(None); + } + + let propose = current_round.propose(); + let prevote = match current_round { + HasVoted::Yes(_, Vote::Prevote(_, prevote)) => prevote, _ => { - let msg = "Voter precommitting while paused."; + let msg = "Voter precommitting before prevoting."; return Err(Error::Safety(msg.to_string())); - } + }, }; + let mut current_rounds = current_rounds.clone(); + let current_round = current_rounds.get_mut(&round) + .expect("checked previously that key exists; qed."); + + *current_round = HasVoted::Yes( + local_id, + Vote::Precommit(propose.cloned(), prevote.clone(), precommit), + ); + let set_state = VoterSetState::::Live { completed_rounds: completed_rounds.clone(), - current_round: HasVoted::Yes(local_id, Vote::Precommit(propose.clone(), prevote.clone(), precommit)), + current_rounds, }; #[allow(deprecated)] @@ -666,25 +752,37 @@ where ); self.update_voter_set_state(|voter_set_state| { - let mut completed_rounds = voter_set_state.completed_rounds(); + // NOTE: we don't use `with_current_round` here, it is possible that + // we are not currently tracking this round if it is a round we + // caught up to. + let (completed_rounds, current_rounds) = + if let VoterSetState::Live { completed_rounds, current_rounds } = voter_set_state { + (completed_rounds, current_rounds) + } else { + let msg = "Voter acting while in paused state."; + return Err(Error::Safety(msg.to_string())); + }; + + let mut completed_rounds = completed_rounds.clone(); // TODO: Future integration will store the prevote and precommit index. See #2611. let votes = historical_votes.seen().clone(); - // NOTE: the Environment assumes that rounds are *always* completed in-order. - if !completed_rounds.push(CompletedRound { + completed_rounds.push(CompletedRound { number: round, state: state.clone(), base, votes, - }) { - let msg = "Voter completed round that is older than the last completed round."; - return Err(Error::Safety(msg.to_string())); - }; + }); + + // remove the round from live rounds and start tracking the next round + let mut current_rounds = current_rounds.clone(); + current_rounds.remove(&round); + current_rounds.insert(round + 1, HasVoted::No); let set_state = VoterSetState::::Live { completed_rounds, - current_round: HasVoted::No, + current_rounds, }; #[allow(deprecated)] @@ -961,10 +1059,10 @@ pub(crate) fn canonical_at_height, RA>( if base_is_canonical { return Ok(Some(base.0)); } else { - return Ok(client.block_number_to_hash(height)); + return Ok(client.block_hash(height).unwrap_or(None)); } } else if base_is_canonical { - return Ok(client.block_number_to_hash(height)); + return Ok(client.block_hash(height).unwrap_or(None)); } let one = NumberFor::::one(); @@ -990,42 +1088,3 @@ pub(crate) fn canonical_at_height, RA>( Ok(Some(current.hash())) } - -/// Returns a function for checking block ancestry, the returned function will -/// return `true` if the given hash (second parameter) is a descendent of the -/// base (first parameter). If the `current` parameter is defined, it should -/// represent the current block `hash` and its `parent hash`, if given the -/// function that's returned will assume that `hash` isn't part of the local DB -/// yet, and all searches in the DB will instead reference the parent. -pub fn is_descendent_of<'a, B, E, Block: BlockT, RA>( - client: &'a Client, - current: Option<(&'a H256, &'a H256)>, -) -> impl Fn(&H256, &H256) -> Result + 'a -where B: Backend, - E: CallExecutor + Send + Sync, -{ - move |base, hash| { - if base == hash { return Ok(false); } - - let mut hash = hash; - if let Some((current_hash, current_parent_hash)) = current { - if base == current_hash { return Ok(false); } - if hash == current_hash { - if base == current_parent_hash { - return Ok(true); - } else { - hash = current_parent_hash; - } - } - } - - let tree_route = client::blockchain::tree_route( - #[allow(deprecated)] - client.backend().blockchain(), - BlockId::Hash(*hash), - BlockId::Hash(*base), - )?; - - Ok(tree_route.common_block().hash == *base) - } -} diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index e9cc08c6951c96604c767c9a606a8c163b184f03..6262ad74a7acb2e6a120af422367472057cef77b 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -43,13 +43,13 @@ use client::{ light::fetcher::{FetchChecker, RemoteCallRequest}, ExecutionStrategy, NeverOffchainExt, }; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use grandpa::BlockNumberOps; -use runtime_primitives::{Justification, generic::BlockId}; -use runtime_primitives::traits::{ +use sr_primitives::{Justification, generic::BlockId}; +use sr_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, One, }; -use substrate_primitives::{H256, Blake2Hasher}; +use primitives::{H256, Blake2Hasher}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use fg_primitives::AuthorityId; @@ -81,8 +81,8 @@ impl, RA> AuthoritySetForFinalityProver fo ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new(), ).and_then(|call_result| Decode::decode(&mut &call_result[..]) - .ok_or_else(|| ClientError::CallResultDecode( - "failed to decode GRANDPA authorities set proof".into(), + .map_err(|err| ClientError::CallResultDecode( + "failed to decode GRANDPA authorities set proof".into(), err ))) } @@ -121,8 +121,8 @@ impl AuthoritySetForFinalityChecker for Arc = Decode::decode(&mut &authorities[..]) - .ok_or_else(|| ClientError::CallResultDecode( - "failed to decode GRANDPA authorities set proof".into(), + .map_err(|err| ClientError::CallResultDecode( + "failed to decode GRANDPA authorities set proof".into(), err ))?; Ok(authorities.into_iter().collect()) }) @@ -167,8 +167,8 @@ impl network::FinalityProofProvider for FinalityProofPro request: &[u8], ) -> Result>, ClientError> { let request: FinalityProofRequest = Decode::decode(&mut &request[..]) - .ok_or_else(|| { - warn!(target: "finality", "Unable to decode finality proof request."); + .map_err(|e| { + warn!(target: "finality", "Unable to decode finality proof request: {}", e.what()); ClientError::Backend(format!("Invalid finality proof request")) })?; match request { @@ -445,7 +445,7 @@ fn do_check_finality_proof, B, J>( { // decode finality proof let proof = FinalityProof::::decode(&mut &remote_proof[..]) - .ok_or_else(|| ClientError::BadJustification("failed to decode finality proof".into()))?; + .map_err(|_| ClientError::BadJustification("failed to decode finality proof".into()))?; // empty proof can't prove anything if proof.is_empty() { @@ -500,7 +500,7 @@ fn check_finality_proof_fragment, B, J>( // verify justification using previous authorities set let (mut current_set_id, mut current_authorities) = authority_set.extract_authorities(); let justification: J = Decode::decode(&mut &proof_fragment.justification[..]) - .ok_or_else(|| ClientError::JustificationDecode)?; + .map_err(|_| ClientError::JustificationDecode)?; justification.verify(current_set_id, ¤t_authorities)?; // and now verify new authorities proof (if provided) @@ -560,7 +560,8 @@ pub(crate) trait ProvableJustification: Encode + Decode { set_id: u64, authorities: &[(AuthorityId, u64)], ) -> ClientResult { - let justification = Self::decode(&mut &**justification).ok_or(ClientError::JustificationDecode)?; + let justification = Self::decode(&mut &**justification) + .map_err(|_| ClientError::JustificationDecode)?; justification.verify(set_id, authorities)?; Ok(justification) } @@ -581,6 +582,7 @@ pub(crate) mod tests { use test_client::client::{backend::NewBlockState}; use test_client::client::in_mem::Blockchain as InMemoryBlockchain; use super::*; + use primitives::crypto::Public; type FinalityProof = super::FinalityProof

; @@ -739,7 +741,7 @@ pub(crate) mod tests { let proof_of_4 = prove_finality::<_, _, TestJustification>( &blockchain, &( - |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| Ok(vec![(AuthorityId::from_slice(&[1u8; 32]), 1u64)]), |_| unreachable!("authorities didn't change => ProveAuthorities won't be called"), ), 0, @@ -762,7 +764,7 @@ pub(crate) mod tests { let proof_of_5: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( &blockchain, &( - |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| Ok(vec![(AuthorityId::from_slice(&[1u8; 32]), 1u64)]), |_| unreachable!("should return before calling ProveAuthorities"), ), 0, @@ -788,7 +790,7 @@ pub(crate) mod tests { let proof_of_5: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( &blockchain, &( - |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| Ok(vec![(AuthorityId::from_slice(&[1u8; 32]), 1u64)]), |_| unreachable!("should return before calling ProveAuthorities"), ), 0, @@ -820,10 +822,12 @@ pub(crate) mod tests { &blockchain, &( |block_id| match block_id { - BlockId::Hash(h) if h == header(3).hash() => Ok(vec![(AuthorityId::from_raw([3u8; 32]), 1u64)]), - BlockId::Number(3) => Ok(vec![(AuthorityId::from_raw([3u8; 32]), 1u64)]), - BlockId::Number(4) => Ok(vec![(AuthorityId::from_raw([4u8; 32]), 1u64)]), - BlockId::Number(6) => Ok(vec![(AuthorityId::from_raw([6u8; 32]), 1u64)]), + BlockId::Hash(h) if h == header(3).hash() => Ok( + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)] + ), + BlockId::Number(3) => Ok(vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)]), + BlockId::Number(4) => Ok(vec![(AuthorityId::from_slice(&[4u8; 32]), 1u64)]), + BlockId::Number(6) => Ok(vec![(AuthorityId::from_slice(&[6u8; 32]), 1u64)]), _ => unreachable!("no other authorities should be fetched: {:?}", block_id), }, |block_id| match block_id { @@ -864,7 +868,7 @@ pub(crate) mod tests { do_check_finality_proof::<_, _, TestJustification>( &blockchain, 1, - vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)], &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), vec![42], ).unwrap_err(); @@ -878,7 +882,7 @@ pub(crate) mod tests { do_check_finality_proof::<_, _, TestJustification>( &blockchain, 1, - vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)], &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), Vec::::new().encode(), ).unwrap_err(); @@ -892,7 +896,7 @@ pub(crate) mod tests { do_check_finality_proof::<_, _, TestJustification>( &blockchain, 1, - vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)], &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), vec![FinalityProofFragment { block: header(4).hash(), @@ -916,7 +920,7 @@ pub(crate) mod tests { do_check_finality_proof::<_, _, TestJustification>( &blockchain, 1, - vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)], &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), vec![FinalityProofFragment { block: header(4).hash(), @@ -939,8 +943,8 @@ pub(crate) mod tests { let effects = do_check_finality_proof::<_, _, TestJustification>( &blockchain, 1, - vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], - &ClosureAuthoritySetForFinalityChecker(|_, _, _| Ok(vec![(AuthorityId::from_raw([4u8; 32]), 1u64)])), + vec![(AuthorityId::from_slice(&[3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| Ok(vec![(AuthorityId::from_slice(&[4u8; 32]), 1u64)])), vec![FinalityProofFragment { block: header(2).hash(), justification: TestJustification(true, vec![7]).encode(), @@ -958,7 +962,7 @@ pub(crate) mod tests { block: header(4).hash(), justification: TestJustification(true, vec![8]).encode(), new_set_id: 2, - new_authorities: vec![(AuthorityId::from_raw([4u8; 32]), 1u64)], + new_authorities: vec![(AuthorityId::from_slice(&[4u8; 32]), 1u64)], }); } @@ -975,7 +979,7 @@ pub(crate) mod tests { let proof_of_4 = prove_finality::<_, _, TestJustification>( &blockchain, &( - |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| Ok(vec![(AuthorityId::from_slice(&[1u8; 32]), 1u64)]), |_| unreachable!("should return before calling ProveAuthorities"), ), 0, diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index ccef682fea68223303b4b069c915e86a3c3d2974..4144a279c530ea590b39a88afb491297c0940b05 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -17,7 +17,7 @@ use std::{sync::Arc, collections::HashMap}; use log::{debug, trace, info}; -use parity_codec::Encode; +use codec::Encode; use futures::sync::mpsc; use parking_lot::RwLockWriteGuard; @@ -25,24 +25,25 @@ use client::{blockchain, CallExecutor, Client}; use client::blockchain::HeaderBackend; use client::backend::Backend; use client::runtime_api::ApiExt; +use client::utils::is_descendent_of; use consensus_common::{ BlockImport, Error as ConsensusError, - ImportBlock, ImportResult, JustificationImport, well_known_cache_keys, + BlockImportParams, ImportResult, JustificationImport, well_known_cache_keys, SelectChain, }; use fg_primitives::GrandpaApi; -use runtime_primitives::Justification; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ +use sr_primitives::Justification; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ Block as BlockT, DigestFor, Header as HeaderT, NumberFor, ProvideRuntimeApi, }; -use substrate_primitives::{H256, Blake2Hasher}; +use primitives::{H256, Blake2Hasher}; use crate::{Error, CommandOrError, NewAuthoritySet, VoterCommand}; use crate::authorities::{AuthoritySet, SharedAuthoritySet, DelayKind, PendingChange}; use crate::consensus_changes::SharedConsensusChanges; -use crate::environment::{finalize_block, is_descendent_of}; +use crate::environment::finalize_block; use crate::justification::GrandpaJustification; /// A block-import handler for GRANDPA. @@ -244,7 +245,7 @@ where } } - fn make_authorities_changes<'a>(&'a self, block: &mut ImportBlock, hash: Block::Hash) + fn make_authorities_changes<'a>(&'a self, block: &mut BlockImportParams, hash: Block::Hash) -> Result, ConsensusError> { // when we update the authorities, we need to hold the lock @@ -405,7 +406,7 @@ impl, RA, PRA, SC> BlockImport { type Error = ConsensusError; - fn import_block(&mut self, mut block: ImportBlock, new_cache: HashMap>) + fn import_block(&mut self, mut block: BlockImportParams, new_cache: HashMap>) -> Result { let hash = block.post_header().hash(); @@ -424,7 +425,7 @@ impl, RA, PRA, SC> BlockImport // we don't want to finalize on `inner.import_block` let mut justification = block.justification.take(); - let enacts_consensus_change = !new_cache.is_empty(); + let enacts_consensus_change = new_cache.contains_key(&well_known_cache_keys::AUTHORITIES); let import_result = (&*self.inner).import_block(block, new_cache); let mut imported_aux = { diff --git a/core/finality-grandpa/src/justification.rs b/core/finality-grandpa/src/justification.rs index 99aedbae052b1920ebb61248b5628850f0f5d4d2..a6554b1e90d1b8ea3d33689061ed9fa3ebb55524 100644 --- a/core/finality-grandpa/src/justification.rs +++ b/core/finality-grandpa/src/justification.rs @@ -20,12 +20,12 @@ use client::{CallExecutor, Client}; use client::backend::Backend; use client::blockchain::HeaderBackend; use client::error::Error as ClientError; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use grandpa::voter_set::VoterSet; use grandpa::{Error as GrandpaError}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{NumberFor, Block as BlockT, Header as HeaderT}; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{NumberFor, Block as BlockT, Header as HeaderT}; +use primitives::{H256, Blake2Hasher}; use fg_primitives::AuthorityId; use crate::{Commit, Error}; @@ -104,7 +104,7 @@ impl> GrandpaJustification { { let justification = GrandpaJustification::::decode(&mut &*encoded) - .ok_or(ClientError::JustificationDecode)?; + .map_err(|_| ClientError::JustificationDecode)?; if (justification.commit.target_hash, justification.commit.target_number) != finalized_target { let msg = "invalid commit target in grandpa justification".to_string(); diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 534a5d9256036273a846e2637b1b341d598bed60..5c6835e3bb4df92a0082d0e6327c164eeb49c398 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -53,26 +53,29 @@ //! included in the newly-finalized chain. use futures::prelude::*; -use log::{debug, info, warn}; +use log::{debug, error, info}; use futures::sync::mpsc; -use client::{BlockchainEvents, CallExecutor, Client, backend::Backend, error::Error as ClientError}; +use client::{ + BlockchainEvents, CallExecutor, Client, backend::Backend, error::Error as ClientError, +}; use client::blockchain::HeaderBackend; -use parity_codec::Encode; -use runtime_primitives::traits::{ - NumberFor, Block as BlockT, DigestFor, ProvideRuntimeApi, +use codec::Encode; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ + NumberFor, Block as BlockT, DigestFor, ProvideRuntimeApi }; -use fg_primitives::GrandpaApi; +use fg_primitives::{GrandpaApi, AuthorityPair}; +use keystore::KeyStorePtr; use inherents::InherentDataProviders; -use runtime_primitives::generic::BlockId; use consensus_common::SelectChain; -use substrate_primitives::{ed25519, H256, Pair, Blake2Hasher}; +use primitives::{H256, Blake2Hasher}; use substrate_telemetry::{telemetry, CONSENSUS_INFO, CONSENSUS_DEBUG, CONSENSUS_WARN}; use serde_json; use srml_finality_tracker; use grandpa::Error as GrandpaError; -use grandpa::{voter, round::State as RoundState, BlockNumberOps, voter_set::VoterSet}; +use grandpa::{voter, BlockNumberOps, voter_set::VoterSet}; use std::fmt; use std::sync::Arc; @@ -100,7 +103,7 @@ pub use light_import::light_block_import; pub use observer::run_grandpa_observer; use aux_schema::PersistentData; -use environment::{CompletedRound, CompletedRounds, Environment, HasVoted, SharedVoterSetState, VoterSetState}; +use environment::{Environment, SharedVoterSetState, VoterSetState}; use import::GrandpaBlockImport; use until_imported::UntilGlobalMessageBlocksImported; use communication::NetworkBridge; @@ -198,10 +201,10 @@ pub struct Config { /// at least every justification_period blocks. There are some other events which might cause /// justification generation. pub justification_period: u32, - /// The local signing key. - pub local_key: Option>, /// Some local identifier of the voter. pub name: Option, + /// The keystore that manages the keys of this node. + pub keystore: Option, } impl Config { @@ -355,7 +358,7 @@ where PRA::Api: GrandpaApi, SC: SelectChain, { - use runtime_primitives::traits::Zero; + use sr_primitives::traits::Zero; let chain_info = client.info(); let genesis_hash = chain_info.chain.genesis_hash; @@ -396,11 +399,11 @@ where } fn global_communication, B, E, N, RA>( - local_key: Option<&Arc>, set_id: u64, voters: &Arc>, client: &Arc>, network: &NetworkBridge, + keystore: &Option, ) -> ( impl Stream< Item = CommunicationInH, @@ -417,10 +420,7 @@ fn global_communication, B, E, N, RA>( RA: Send + Sync, NumberFor: BlockNumberOps, { - - let is_voter = local_key - .map(|pair| voters.contains_key(&pair.public().into())) - .unwrap_or(false); + let is_voter = is_voter(voters, keystore).is_some(); // verification stream let (global_in, global_out) = network.global_communication( @@ -491,7 +491,7 @@ pub struct GrandpaParams, N, RA, SC, X> { /// block import worker that has already been instantiated with `block_import`. pub fn run_grandpa_voter, N, RA, SC, X>( grandpa_params: GrandpaParams, -) -> ::client::error::Result + Send + 'static> where +) -> client::error::Result + Send + 'static> where Block::Hash: Ord, B: Backend + 'static, E: CallExecutor + Send + Sync + 'static, @@ -568,31 +568,6 @@ pub fn run_grandpa_voter, N, RA, SC, X>( voter_set_state: set_state.clone(), }); - initial_environment.update_voter_set_state(|voter_set_state| { - match voter_set_state { - VoterSetState::Live { current_round: HasVoted::Yes(id, _), completed_rounds } => { - let local_id = config.local_key.clone().map(|pair| pair.public()); - let has_voted = match local_id { - Some(local_id) => if *id == local_id { - // keep the previous votes - return Ok(None); - } else { - HasVoted::No - }, - _ => HasVoted::No, - }; - - // NOTE: only updated on disk when the voter first - // proposes/prevotes/precommits or completes a round. - Ok(Some(VoterSetState::Live { - current_round: has_voted, - completed_rounds: completed_rounds.clone(), - })) - }, - _ => Ok(None), - } - }).expect("operation inside closure cannot fail; qed"); - let initial_state = (initial_environment, voter_commands_rx.into_future()); let voter_work = future::loop_fn(initial_state, move |params| { let (env, voter_commands_rx) = params; @@ -611,20 +586,18 @@ pub fn run_grandpa_voter, N, RA, SC, X>( ); let global_comms = global_communication( - config.local_key.as_ref(), env.set_id, &env.voters, &client, &network, + &config.keystore, ); - let voters = (*env.voters).clone(); - let last_completed_round = completed_rounds.last(); Some(voter::Voter::new( env.clone(), - voters, + (*env.voters).clone(), global_comms, last_completed_round.number, last_completed_round.state.clone(), @@ -662,22 +635,11 @@ pub fn run_grandpa_voter, N, RA, SC, X>( // start the new authority set using the block where the // set changed (not where the signal happened!) as the base. - let genesis_state = RoundState::genesis((new.canon_hash, new.canon_number)); - - let set_state = VoterSetState::Live { - // always start at round 0 when changing sets. - completed_rounds: CompletedRounds::new( - CompletedRound { - number: 0, - state: genesis_state, - base: (new.canon_hash, new.canon_number), - votes: Vec::new(), - }, - new.set_id, - &*authority_set.inner().read(), - ), - current_round: HasVoted::No, - }; + let set_state = VoterSetState::live( + new.set_id, + &*authority_set.inner().read(), + (new.canon_hash, new.canon_number), + ); #[allow(deprecated)] aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; @@ -718,8 +680,8 @@ pub fn run_grandpa_voter, N, RA, SC, X>( poll_voter.select2(voter_commands_rx).then(move |res| match res { Ok(future::Either::A(((), _))) => { - // voters don't conclude naturally; this could reasonably be an error. - Ok(FutureLoop::Break(())) + // voters don't conclude naturally + Err(Error::Safety("GRANDPA voter has concluded.".into())) }, Err(future::Either::B(_)) => { // the `voter_commands_rx` stream should not fail. @@ -747,7 +709,7 @@ pub fn run_grandpa_voter, N, RA, SC, X>( let voter_work = voter_work .map(|_| ()) .map_err(|e| { - warn!("GRANDPA Voter failed: {:?}", e); + error!("GRANDPA Voter failed: {:?}", e); telemetry!(CONSENSUS_WARN; "afg.voter_failed"; "e" => ?e); }); @@ -777,3 +739,44 @@ pub fn run_grandpa, N, RA, SC, X>( { run_grandpa_voter(grandpa_params) } + +/// When GRANDPA is not initialized we still need to register the finality +/// tracker inherent provider which might be expected by the runtime for block +/// authoring. Additionally, we register a gossip message validator that +/// discards all GRANDPA messages (otherwise, we end up banning nodes that send +/// us a `Neighbor` message, since there is no registered gossip validator for +/// the engine id defined in the message.) +pub fn setup_disabled_grandpa, RA, N>( + client: Arc>, + inherent_data_providers: &InherentDataProviders, + network: N, +) -> Result<(), consensus_common::Error> where + B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, + RA: Send + Sync + 'static, + N: Network + Send + Sync + 'static, + N::In: Send + 'static, +{ + register_finality_tracker_inherent_data_provider( + client, + inherent_data_providers, + )?; + + network.register_validator(Arc::new(network::consensus_gossip::DiscardAll)); + + Ok(()) +} + +/// Checks if this node is a voter in the given voter set. +/// +/// Returns the key pair of the node that is being used in the current voter set or `None`. +fn is_voter( + voters: &Arc>, + keystore: &Option, +) -> Option { + match keystore { + Some(keystore) => voters.voters().iter() + .find_map(|(p, _)| keystore.read().key_pair::(&p).ok()), + None => None, + } +} diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index 717054e3087b162753533db98f2038675e8ab365..6ecc24bd2bca86803d788af840b44215a242ea3c 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -25,20 +25,20 @@ use client::{ blockchain::HeaderBackend, error::Error as ClientError, }; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use consensus_common::{ import_queue::Verifier, well_known_cache_keys, - BlockOrigin, BlockImport, FinalityProofImport, ImportBlock, ImportResult, ImportedAux, + BlockOrigin, BlockImport, FinalityProofImport, BlockImportParams, ImportResult, ImportedAux, Error as ConsensusError, }; use network::config::{BoxFinalityProofRequestBuilder, FinalityProofRequestBuilder}; -use runtime_primitives::Justification; -use runtime_primitives::traits::{ +use sr_primitives::Justification; +use sr_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, ProvideRuntimeApi, DigestFor, }; use fg_primitives::{GrandpaApi, AuthorityId}; -use runtime_primitives::generic::BlockId; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::generic::BlockId; +use primitives::{H256, Blake2Hasher}; use crate::aux_schema::load_decode; use crate::consensus_changes::ConsensusChanges; @@ -128,7 +128,7 @@ impl, RA> BlockImport fn import_block( &mut self, - block: ImportBlock, + block: BlockImportParams, new_cache: HashMap>, ) -> Result { do_import_block::<_, _, _, _, GrandpaJustification>( @@ -174,7 +174,7 @@ impl, RA> FinalityProofImport hash: Block::Hash, number: NumberFor, finality_proof: Vec, - verifier: &dyn Verifier, + verifier: &mut dyn Verifier, ) -> Result<(Block::Hash, NumberFor), Self::Error> { do_import_finality_proof::<_, _, _, _, GrandpaJustification>( &*self.client, @@ -230,7 +230,7 @@ impl> FinalityProofRequestBuilder for GrandpaFinalityPro fn do_import_block, RA, J>( mut client: &Client, data: &mut LightImportData, - mut block: ImportBlock, + mut block: BlockImportParams, new_cache: HashMap>, ) -> Result where @@ -246,7 +246,7 @@ fn do_import_block, RA, J>( // we don't want to finalize on `inner.import_block` let justification = block.justification.take(); - let enacts_consensus_change = !new_cache.is_empty(); + let enacts_consensus_change = new_cache.contains_key(&well_known_cache_keys::AUTHORITIES); let import_result = BlockImport::import_block(&mut client, block, new_cache); let mut imported_aux = match import_result { @@ -290,7 +290,7 @@ fn do_import_finality_proof, RA, J>( _hash: Block::Hash, _number: NumberFor, finality_proof: Vec, - verifier: &dyn Verifier, + verifier: &mut dyn Verifier, ) -> Result<(Block::Hash, NumberFor), ConsensusError> where B: Backend + 'static, @@ -468,7 +468,7 @@ fn load_aux_import_data, PRA>( PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, { - use runtime_primitives::traits::Zero; + use sr_primitives::traits::Zero; let authority_set = match load_decode(aux_store, LIGHT_AUTHORITY_SET_KEY)? { Some(authority_set) => authority_set, None => { @@ -538,7 +538,7 @@ fn on_post_finalization_error(error: ClientError, value_type: &str) -> Consensus pub mod tests { use super::*; use consensus_common::ForkChoiceStrategy; - use substrate_primitives::H256; + use primitives::{H256, crypto::Public}; use test_client::client::in_mem::Blockchain as InMemoryAuxStore; use test_client::runtime::{Block, Header}; use crate::tests::TestApi; @@ -573,7 +573,7 @@ pub mod tests { fn import_block( &mut self, - mut block: ImportBlock, + mut block: BlockImportParams, new_cache: HashMap>, ) -> Result { block.justification.take(); @@ -608,7 +608,7 @@ pub mod tests { hash: Block::Hash, number: NumberFor, finality_proof: Vec, - verifier: &dyn Verifier, + verifier: &mut dyn Verifier, ) -> Result<(Block::Hash, NumberFor), Self::Error> { self.0.import_finality_proof(hash, number, finality_proof, verifier) } @@ -637,10 +637,10 @@ pub mod tests { let client = test_client::new_light(); let mut import_data = LightImportData { last_finalized: Default::default(), - authority_set: LightAuthoritySet::genesis(vec![(AuthorityId::from_raw([1; 32]), 1)]), + authority_set: LightAuthoritySet::genesis(vec![(AuthorityId::from_slice(&[1; 32]), 1)]), consensus_changes: ConsensusChanges::empty(), }; - let block = ImportBlock { + let block = BlockImportParams { origin: BlockOrigin::Own, header: Header { number: 1, @@ -688,7 +688,7 @@ pub mod tests { #[test] fn finality_proof_required_when_consensus_data_changes_and_no_justification_provided() { let mut cache = HashMap::new(); - cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_raw([2; 32])].encode()); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_slice(&[2; 32])].encode()); assert_eq!(import_block(cache, None), ImportResult::Imported(ImportedAux { clear_justification_requests: false, needs_justification: false, @@ -701,7 +701,7 @@ pub mod tests { fn finality_proof_required_when_consensus_data_changes_and_incorrect_justification_provided() { let justification = TestJustification(false, Vec::new()).encode(); let mut cache = HashMap::new(); - cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_raw([2; 32])].encode()); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_slice(&[2; 32])].encode()); assert_eq!( import_block(cache, Some(justification)), ImportResult::Imported(ImportedAux { @@ -717,7 +717,7 @@ pub mod tests { #[test] fn aux_data_updated_on_start() { let aux_store = InMemoryAuxStore::::new(); - let api = Arc::new(TestApi::new(vec![(AuthorityId::from_raw([1; 32]), 1)])); + let api = Arc::new(TestApi::new(vec![(AuthorityId::from_slice(&[1; 32]), 1)])); // when aux store is empty initially assert!(aux_store.get_aux(LIGHT_AUTHORITY_SET_KEY).unwrap().is_none()); @@ -732,7 +732,7 @@ pub mod tests { #[test] fn aux_data_loaded_on_restart() { let aux_store = InMemoryAuxStore::::new(); - let api = Arc::new(TestApi::new(vec![(AuthorityId::from_raw([1; 32]), 1)])); + let api = Arc::new(TestApi::new(vec![(AuthorityId::from_slice(&[1; 32]), 1)])); // when aux store is non-empty initially let mut consensus_changes = ConsensusChanges::::empty(); @@ -741,7 +741,9 @@ pub mod tests { &[ ( LIGHT_AUTHORITY_SET_KEY, - LightAuthoritySet::genesis(vec![(AuthorityId::from_raw([42; 32]), 2)]).encode().as_slice(), + LightAuthoritySet::genesis( + vec![(AuthorityId::from_slice(&[42; 32]), 2)] + ).encode().as_slice(), ), ( LIGHT_CONSENSUS_CHANGES_KEY, @@ -753,7 +755,7 @@ pub mod tests { // importer uses it on start let data = load_aux_import_data(Default::default(), &aux_store, api).unwrap(); - assert_eq!(data.authority_set.authorities(), vec![(AuthorityId::from_raw([42; 32]), 2)]); + assert_eq!(data.authority_set.authorities(), vec![(AuthorityId::from_slice(&[42; 32]), 2)]); assert_eq!(data.consensus_changes.pending_changes(), &[(42, Default::default())]); } } diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index 2c0818c2d70957def110832da26ee3020aeadf65..bce292262e028792aeb5a02a2796e052b3a45ef2 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -17,26 +17,25 @@ use std::sync::Arc; use futures::prelude::*; -use futures::future::{self, Loop as FutureLoop}; +use futures::{future, sync::mpsc}; use grandpa::{ - BlockNumberOps, Error as GrandpaError, round::State as RoundState, voter, voter_set::VoterSet + BlockNumberOps, Error as GrandpaError, voter, voter_set::VoterSet }; use log::{debug, info, warn}; use consensus_common::SelectChain; use client::{CallExecutor, Client, backend::Backend}; -use runtime_primitives::traits::{NumberFor, Block as BlockT}; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::traits::{NumberFor, Block as BlockT}; +use primitives::{H256, Blake2Hasher}; use crate::{ global_communication, CommandOrError, CommunicationIn, Config, environment, - LinkHalf, Network, aux_schema::PersistentData, VoterCommand, VoterSetState, + LinkHalf, Network, Error, aux_schema::PersistentData, VoterCommand, VoterSetState, }; use crate::authorities::SharedAuthoritySet; use crate::communication::NetworkBridge; use crate::consensus_changes::SharedConsensusChanges; -use crate::environment::{CompletedRound, CompletedRounds, HasVoted}; use fg_primitives::AuthorityId; struct ObserverChain<'a, Block: BlockT, B, E, RA>(&'a Client); @@ -172,34 +171,98 @@ pub fn run_grandpa_observer, N, RA, SC>( voter_commands_rx, } = link; - let PersistentData { authority_set, consensus_changes, set_state } = persistent_data; - let initial_state = (authority_set, consensus_changes, set_state.clone(), voter_commands_rx.into_future()); + let (network, network_startup) = NetworkBridge::new( + network, + config.clone(), + persistent_data.set_state.clone(), + on_exit.clone() + ); + let observer_work = ObserverWork::new( + client, + network, + persistent_data, + config.keystore.clone(), + voter_commands_rx + ); + + let observer_work = observer_work + .map(|_| ()) + .map_err(|e| { + warn!("GRANDPA Observer failed: {:?}", e); + }); + + let observer_work = network_startup.and_then(move |()| observer_work); + + Ok(observer_work.select(on_exit).map(|_| ()).map_err(|_| ())) +} + +/// Future that powers the observer. +#[must_use] +struct ObserverWork, N: Network, E, Backend, RA> { + observer: Box>> + Send>, + client: Arc>, + network: NetworkBridge, + persistent_data: PersistentData, + keystore: Option, + voter_commands_rx: mpsc::UnboundedReceiver>>, +} - let (network, network_startup) = NetworkBridge::new(network, config.clone(), set_state, on_exit.clone()); +impl ObserverWork +where + B: BlockT, + N: Network, + N::In: Send + 'static, + NumberFor: BlockNumberOps, + RA: 'static + Send + Sync, + E: CallExecutor + Send + Sync + 'static, + Bk: Backend + 'static, +{ + fn new( + client: Arc>, + network: NetworkBridge, + persistent_data: PersistentData, + keystore: Option, + voter_commands_rx: mpsc::UnboundedReceiver>>, + ) -> Self { + + let mut work = ObserverWork { + // `observer` is set to a temporary value and replaced below when + // calling `rebuild_observer`. + observer: Box::new(futures::empty()) as Box<_>, + client, + network, + persistent_data, + keystore, + voter_commands_rx, + }; + work.rebuild_observer(); + work + } - let observer_work = future::loop_fn(initial_state, move |state| { - let (authority_set, consensus_changes, set_state, voter_commands_rx) = state; - let set_id = authority_set.set_id(); - let voters = Arc::new(authority_set.current_authorities()); - let client = client.clone(); + /// Rebuilds the `self.observer` field using the current authority set + /// state. This method should be called when we know that the authority set + /// has changed (e.g. as signalled by a voter command). + fn rebuild_observer(&mut self) { + let set_id = self.persistent_data.authority_set.set_id(); + let voters = Arc::new(self.persistent_data.authority_set.current_authorities()); // start global communication stream for the current set let (global_in, _) = global_communication( - None, set_id, &voters, - &client, - &network, + &self.client, + &self.network, + &self.keystore, ); - let last_finalized_number = client.info().chain.finalized_number; + let last_finalized_number = self.client.info().chain.finalized_number; // NOTE: since we are not using `round_communication` we have to // manually note the round with the gossip validator, otherwise we won't // relay round messages. we want all full nodes to contribute to vote // availability. let note_round = { - let network = network.clone(); + let network = self.network.clone(); let voters = voters.clone(); move |round| network.note_round( @@ -211,96 +274,105 @@ pub fn run_grandpa_observer, N, RA, SC>( // create observer for the current set let observer = grandpa_observer( - &client, - &authority_set, - &consensus_changes, + &self.client, + &self.persistent_data.authority_set, + &self.persistent_data.consensus_changes, &voters, last_finalized_number, global_in, note_round, ); - let handle_voter_command = move |command, voter_commands_rx| { - // the observer doesn't use the voter set state, but we need to - // update it on-disk in case we restart as validator in the future. - let set_state = match command { - VoterCommand::Pause(reason) => { - info!(target: "afg", "Pausing old validator set: {}", reason); - - let completed_rounds = set_state.read().completed_rounds(); - let set_state = VoterSetState::Paused { completed_rounds }; - - #[allow(deprecated)] - crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; - - set_state - }, - VoterCommand::ChangeAuthorities(new) => { - // start the new authority set using the block where the - // set changed (not where the signal happened!) as the base. - let genesis_state = RoundState::genesis((new.canon_hash, new.canon_number)); - - let set_state = VoterSetState::Live:: { - // always start at round 0 when changing sets. - completed_rounds: CompletedRounds::new( - CompletedRound { - number: 0, - state: genesis_state, - base: (new.canon_hash, new.canon_number), - votes: Vec::new(), - }, - new.set_id, - &*authority_set.inner().read(), - ), - current_round: HasVoted::No, - }; - - #[allow(deprecated)] - crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; - - set_state - }, - }; + self.observer = Box::new(observer); + } - Ok(FutureLoop::Continue((authority_set, consensus_changes, set_state.into(), voter_commands_rx))) - }; + fn handle_voter_command( + &mut self, + command: VoterCommand>, + ) -> Result<(), Error> { + // the observer doesn't use the voter set state, but we need to + // update it on-disk in case we restart as validator in the future. + self.persistent_data.set_state = match command { + VoterCommand::Pause(reason) => { + info!(target: "afg", "Pausing old validator set: {}", reason); - // run observer and listen to commands (switch authorities or pause) - observer.select2(voter_commands_rx).then(move |res| match res { - Ok(future::Either::A((_, _))) => { - // observer commit stream doesn't conclude naturally; this could reasonably be an error. - Ok(FutureLoop::Break(())) - }, - Err(future::Either::B(_)) => { - // the `voter_commands_rx` stream should not fail. - Ok(FutureLoop::Break(())) + let completed_rounds = self.persistent_data.set_state.read().completed_rounds(); + let set_state = VoterSetState::Paused { completed_rounds }; + + #[allow(deprecated)] + crate::aux_schema::write_voter_set_state(&**self.client.backend(), &set_state)?; + + set_state }, - Ok(future::Either::B(((None, _), _))) => { - // the `voter_commands_rx` stream should never conclude since it's never closed. - Ok(FutureLoop::Break(())) + VoterCommand::ChangeAuthorities(new) => { + // start the new authority set using the block where the + // set changed (not where the signal happened!) as the base. + let set_state = VoterSetState::live( + new.set_id, + &*self.persistent_data.authority_set.inner().read(), + (new.canon_hash, new.canon_number), + ); + + #[allow(deprecated)] + crate::aux_schema::write_voter_set_state(&**self.client.backend(), &set_state)?; + + set_state }, - Err(future::Either::A((CommandOrError::Error(e), _))) => { + }.into(); + + self.rebuild_observer(); + Ok(()) + } +} + +impl Future for ObserverWork +where + B: BlockT, + N: Network, + N::In: Send + 'static, + NumberFor: BlockNumberOps, + RA: 'static + Send + Sync, + E: CallExecutor + Send + Sync + 'static, + Bk: Backend + 'static, +{ + type Item = (); + type Error = Error; + + fn poll(&mut self) -> Poll { + match self.observer.poll() { + Ok(Async::NotReady) => {} + Ok(Async::Ready(())) => { + // observer commit stream doesn't conclude naturally; this could reasonably be an error. + return Ok(Async::Ready(())) + } + Err(CommandOrError::Error(e)) => { // return inner observer error - Err(e) - }, - Ok(future::Either::B(((Some(command), voter_commands_rx), _))) => { - // some command issued externally - handle_voter_command(command, voter_commands_rx.into_future()) - }, - Err(future::Either::A((CommandOrError::VoterCommand(command), voter_commands_rx))) => { + return Err(e) + } + Err(CommandOrError::VoterCommand(command)) => { // some command issued internally - handle_voter_command(command, voter_commands_rx) - }, - }) - }); - - let observer_work = observer_work - .map(|_| ()) - .map_err(|e| { - warn!("GRANDPA Observer failed: {:?}", e); - }); + self.handle_voter_command(command)?; + futures::task::current().notify(); + } + } - let observer_work = network_startup.and_then(move |()| observer_work); + match self.voter_commands_rx.poll() { + Ok(Async::NotReady) => {} + Err(_) => { + // the `voter_commands_rx` stream should not fail. + return Ok(Async::Ready(())) + } + Ok(Async::Ready(None)) => { + // the `voter_commands_rx` stream should never conclude since it's never closed. + return Ok(Async::Ready(())) + } + Ok(Async::Ready(Some(command))) => { + // some command issued externally + self.handle_voter_command(command)?; + futures::task::current().notify(); + } + } - Ok(observer_work.select(on_exit).map(|_| ()).map_err(|_| ())) + Ok(Async::NotReady) + } } diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 0a727df9a24adc2f3b4a5bd27921dbd3d9f89b39..bbaae1e9b7e018929cb55c367327e35a97818d3c 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -17,27 +17,28 @@ //! Tests and test helpers for GRANDPA. use super::*; +use environment::HasVoted; use network::test::{Block, DummySpecialization, Hash, TestNetFactory, Peer, PeersClient}; use network::test::{PassThroughVerifier}; use network::config::{ProtocolConfig, Roles, BoxFinalityProofRequestBuilder}; use parking_lot::Mutex; use futures03::{StreamExt as _, TryStreamExt as _}; use tokio::runtime::current_thread; -use keyring::ed25519::{Keyring as AuthorityKeyring}; +use keyring::Ed25519Keyring; use client::{ error::Result, runtime_api::{Core, RuntimeVersion, ApiExt}, LongestChain, }; use test_client::{self, runtime::BlockNumber}; -use consensus_common::{BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult}; +use consensus_common::{BlockOrigin, ForkChoiceStrategy, ImportedAux, BlockImportParams, ImportResult}; use consensus_common::import_queue::{BoxBlockImport, BoxJustificationImport, BoxFinalityProofImport}; use std::collections::{HashMap, HashSet}; use std::result; -use parity_codec::Decode; -use runtime_primitives::traits::{ApiRef, ProvideRuntimeApi, Header as HeaderT}; -use runtime_primitives::generic::BlockId; -use substrate_primitives::{NativeOrEncoded, ExecutionContext}; +use codec::Decode; +use sr_primitives::traits::{ApiRef, ProvideRuntimeApi, Header as HeaderT}; +use sr_primitives::generic::BlockId; +use primitives::{NativeOrEncoded, ExecutionContext, crypto::Public}; use fg_primitives::AuthorityId; use authorities::AuthoritySet; @@ -97,10 +98,8 @@ impl TestNetFactory for GrandpaTestNet { } } - fn make_verifier(&self, _client: PeersClient, _cfg: &ProtocolConfig) - -> Arc - { - Arc::new(PassThroughVerifier(false)) // use non-instant finality. + fn make_verifier(&self, _client: PeersClient, _cfg: &ProtocolConfig) -> Self::Verifier { + PassThroughVerifier(false) // use non-instant finality. } fn make_block_import(&self, client: PeersClient) @@ -273,7 +272,7 @@ impl GrandpaApi for RuntimeApi { _: ExecutionContext, _: Option<()>, _: Vec, - ) -> Result>> { + ) -> Result>> { Ok(self.inner.genesis_authorities.clone()).map(NativeOrEncoded::Native) } @@ -336,17 +335,23 @@ impl AuthoritySetForFinalityChecker for TestApi { proof: Vec>, ) -> Result> { Decode::decode(&mut &proof[0][..]) - .ok_or_else(|| unreachable!("incorrect value is passed as GRANDPA authorities proof")) + .map_err(|_| unreachable!("incorrect value is passed as GRANDPA authorities proof")) } } const TEST_GOSSIP_DURATION: Duration = Duration::from_millis(500); -fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(substrate_primitives::ed25519::Public, u64)> { - keys.iter() - .map(|key| AuthorityId::from_raw(key.to_raw_public())) - .map(|id| (id, 1)) - .collect() +fn make_ids(keys: &[Ed25519Keyring]) -> Vec<(AuthorityId, u64)> { + keys.iter().map(|key| key.clone().public().into()).map(|id| (id, 1)).collect() +} + +fn create_keystore(authority: Ed25519Keyring) -> (KeyStorePtr, tempfile::TempDir) { + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = keystore::Store::open(keystore_path.path(), None).expect("Creates keystore"); + keystore.write().insert_ephemeral_from_seed::(&authority.to_seed()) + .expect("Creates authority key"); + + (keystore, keystore_path) } // run the voters to completion. provide a closure to be invoked after @@ -355,7 +360,7 @@ fn run_to_completion_with( runtime: &mut current_thread::Runtime, blocks: u64, net: Arc>, - peers: &[AuthorityKeyring], + peers: &[Ed25519Keyring], with: F, ) -> u64 where F: FnOnce(current_thread::Handle) -> Option>> @@ -370,7 +375,11 @@ fn run_to_completion_with( wait_for.push(f); }; + let mut keystore_paths = Vec::new(); for (peer_id, key) in peers.iter().enumerate() { + let (keystore, keystore_path) = create_keystore(*key); + keystore_paths.push(keystore_path); + let highest_finalized = highest_finalized.clone(); let (client, net_service, link) = { let net = net.lock(); @@ -405,7 +414,7 @@ fn run_to_completion_with( config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key: Some(Arc::new(key.clone().into())), + keystore: Some(keystore), name: Some(format!("peer#{}", peer_id)), }, link: link, @@ -437,7 +446,7 @@ fn run_to_completion( runtime: &mut current_thread::Runtime, blocks: u64, net: Arc>, - peers: &[AuthorityKeyring] + peers: &[Ed25519Keyring] ) -> u64 { run_to_completion_with(runtime, blocks, net, peers, |_| None) } @@ -446,7 +455,7 @@ fn run_to_completion( fn finalize_3_voters_no_observers() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); @@ -462,15 +471,17 @@ fn finalize_3_voters_no_observers() { run_to_completion(&mut runtime, 20, net.clone(), peers); // normally there's no justification for finalized blocks - assert!(net.lock().peer(0).client().justification(&BlockId::Number(20)).unwrap().is_none(), - "Extra justification for block#1"); + assert!( + net.lock().peer(0).client().justification(&BlockId::Number(20)).unwrap().is_none(), + "Extra justification for block#1", + ); } #[test] fn finalize_3_voters_1_full_observer() { let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 4); @@ -482,8 +493,10 @@ fn finalize_3_voters_1_full_observer() { let all_peers = peers.iter() .cloned() - .map(|key| Some(Arc::new(key.into()))) - .chain(::std::iter::once(None)); + .map(Some) + .chain(std::iter::once(None)); + + let mut keystore_paths = Vec::new(); for (peer_id, local_key) in all_peers.enumerate() { let (client, net_service, link) = { @@ -502,11 +515,19 @@ fn finalize_3_voters_1_full_observer() { .for_each(move |_| Ok(())) ); + let keystore = if let Some(local_key) = local_key { + let (keystore, keystore_path) = create_keystore(local_key); + keystore_paths.push(keystore_path); + Some(keystore) + } else { + None + }; + let grandpa_params = GrandpaParams { config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key, + keystore, name: Some(format!("peer#{}", peer_id)), }, link: link, @@ -521,7 +542,7 @@ fn finalize_3_voters_1_full_observer() { } // wait for all finalized on each. - let wait_for = ::futures::future::join_all(finality_notifications) + let wait_for = futures::future::join_all(finality_notifications) .map(|_| ()) .map_err(|_| ()); @@ -533,24 +554,24 @@ fn finalize_3_voters_1_full_observer() { fn transition_3_voters_twice_1_full_observer() { let _ = env_logger::try_init(); let peers_a = &[ - AuthorityKeyring::Alice, - AuthorityKeyring::Bob, - AuthorityKeyring::Charlie, + Ed25519Keyring::Alice, + Ed25519Keyring::Bob, + Ed25519Keyring::Charlie, ]; let peers_b = &[ - AuthorityKeyring::Dave, - AuthorityKeyring::Eve, - AuthorityKeyring::Ferdie, + Ed25519Keyring::Dave, + Ed25519Keyring::Eve, + Ed25519Keyring::Ferdie, ]; let peers_c = &[ - AuthorityKeyring::Alice, - AuthorityKeyring::Eve, - AuthorityKeyring::Two, + Ed25519Keyring::Alice, + Ed25519Keyring::Eve, + Ed25519Keyring::Two, ]; - let observer = &[AuthorityKeyring::One]; + let observer = &[Ed25519Keyring::One]; let genesis_voters = make_ids(peers_a); @@ -640,10 +661,13 @@ fn transition_3_voters_twice_1_full_observer() { .cloned() .collect::>() // deduplicate .into_iter() - .map(|key| Some(Arc::new(key.into()))) .enumerate(); + let mut keystore_paths = Vec::new(); for (peer_id, local_key) in all_peers { + let (keystore, keystore_path) = create_keystore(local_key); + keystore_paths.push(keystore_path); + let (client, net_service, link) = { let net = net.lock(); let link = net.peers[peer_id].data.lock().take().expect("link initialized at startup; qed"); @@ -674,7 +698,7 @@ fn transition_3_voters_twice_1_full_observer() { config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key, + keystore: Some(keystore), name: Some(format!("peer#{}", peer_id)), }, link: link, @@ -700,11 +724,11 @@ fn transition_3_voters_twice_1_full_observer() { #[test] fn justification_is_emitted_when_consensus_data_changes() { let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 3); // import block#1 WITH consensus data change - let new_authorities = vec![substrate_primitives::sr25519::Public::from_raw([42; 32])]; + let new_authorities = vec![babe_primitives::AuthorityId::from_slice(&[42; 32])]; net.peer(0).push_authorities_change_block(new_authorities); net.block_until_sync(&mut runtime); let net = Arc::new(Mutex::new(net)); @@ -718,7 +742,7 @@ fn justification_is_emitted_when_consensus_data_changes() { #[test] fn justification_is_generated_periodically() { let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); @@ -757,8 +781,8 @@ fn consensus_changes_works() { #[test] fn sync_justifications_on_change_blocks() { let mut runtime = current_thread::Runtime::new().unwrap(); - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; - let peers_b = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; + let peers_b = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers_b); // 4 peers, 3 of them are authorities and participate in grandpa @@ -813,13 +837,13 @@ fn finalizes_multiple_pending_changes_in_order() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; - let peers_b = &[AuthorityKeyring::Dave, AuthorityKeyring::Eve, AuthorityKeyring::Ferdie]; - let peers_c = &[AuthorityKeyring::Dave, AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; + let peers_b = &[Ed25519Keyring::Dave, Ed25519Keyring::Eve, Ed25519Keyring::Ferdie]; + let peers_c = &[Ed25519Keyring::Dave, Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let all_peers = &[ - AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie, - AuthorityKeyring::Dave, AuthorityKeyring::Eve, AuthorityKeyring::Ferdie, + Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie, + Ed25519Keyring::Dave, Ed25519Keyring::Eve, Ed25519Keyring::Ferdie, ]; let genesis_voters = make_ids(peers_a); @@ -872,7 +896,7 @@ fn finalizes_multiple_pending_changes_in_order() { #[test] fn doesnt_vote_on_the_tip_of_the_chain() { let mut runtime = current_thread::Runtime::new().unwrap(); - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(peers_a); let api = TestApi::new(voters); let mut net = GrandpaTestNet::new(api, 3); @@ -898,8 +922,14 @@ fn force_change_to_new_set() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); // two of these guys are offline. - let genesis_authorities = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie, AuthorityKeyring::One, AuthorityKeyring::Two]; - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let genesis_authorities = &[ + Ed25519Keyring::Alice, + Ed25519Keyring::Bob, + Ed25519Keyring::Charlie, + Ed25519Keyring::One, + Ed25519Keyring::Two, + ]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let api = TestApi::new(make_ids(genesis_authorities)); let voters = make_ids(peers_a); @@ -950,8 +980,8 @@ fn force_change_to_new_set() { #[test] fn allows_reimporting_change_blocks() { - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; - let peers_b = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; + let peers_b = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers_a); let api = TestApi::new(voters); let mut net = GrandpaTestNet::new(api.clone(), 3); @@ -969,7 +999,7 @@ fn allows_reimporting_change_blocks() { let block = || { let block = block.clone(); - ImportBlock { + BlockImportParams { origin: BlockOrigin::File, header: block.header, justification: None, @@ -999,8 +1029,8 @@ fn allows_reimporting_change_blocks() { #[test] fn test_bad_justification() { - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; - let peers_b = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; + let peers_b = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers_a); let api = TestApi::new(voters); let mut net = GrandpaTestNet::new(api.clone(), 3); @@ -1018,7 +1048,7 @@ fn test_bad_justification() { let block = || { let block = block.clone(); - ImportBlock { + BlockImportParams { origin: BlockOrigin::File, header: block.header, justification: Some(Vec::new()), @@ -1058,7 +1088,7 @@ fn voter_persists_its_votes() { // we have two authorities but we'll only be running the voter for alice // we are going to be listening for the prevotes it casts - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers); // alice has a chain with 20 blocks @@ -1074,6 +1104,8 @@ fn voter_persists_its_votes() { let (voter_tx, voter_rx) = mpsc::unbounded::<()>(); + let mut keystore_paths = Vec::new(); + // startup a grandpa voter for alice but also listen for messages on a // channel. whenever a message is received the voter is restarted. when the // sender is dropped the voter is stopped. @@ -1081,6 +1113,9 @@ fn voter_persists_its_votes() { let net = net.clone(); let client = client.clone(); + let (keystore, keystore_path) = create_keystore(peers[0]); + keystore_paths.push(keystore_path); + let voter = future::loop_fn(voter_rx, move |rx| { let (_block_import, _, _, _, link) = net.lock().make_block_import(client.clone()); let link = link.lock().take().unwrap(); @@ -1089,10 +1124,10 @@ fn voter_persists_its_votes() { config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key: Some(Arc::new(peers[0].clone().into())), + keystore: Some(keystore.clone()), name: Some(format!("peer#{}", 0)), }, - link: link, + link, network: net.lock().peers[0].network_service().clone(), inherent_data_providers: InherentDataProviders::new(), on_exit: Exit, @@ -1138,10 +1173,13 @@ fn voter_persists_its_votes() { // voter. instead we'll listen for the prevote that alice casts // and cast our own manually { + let (keystore, keystore_path) = create_keystore(peers[1]); + keystore_paths.push(keystore_path); + let config = Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key: Some(Arc::new(peers[1].clone().into())), + keystore: Some(keystore), name: Some(format!("peer#{}", 1)), }; @@ -1164,7 +1202,7 @@ fn voter_persists_its_votes() { communication::Round(1), communication::SetId(0), Arc::new(VoterSet::from_iter(voters)), - Some(config.local_key.unwrap()), + Some(peers[1].pair().into()), HasVoted::No, ); @@ -1264,7 +1302,7 @@ fn voter_persists_its_votes() { fn finalize_3_voters_1_light_observer() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let authorities = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let authorities = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let voters = make_ids(authorities); let mut net = GrandpaTestNet::new(TestApi::new(voters), 4); @@ -1290,7 +1328,7 @@ fn finalize_3_voters_1_light_observer() { Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key: None, + keystore: None, name: Some("observer".to_string()), }, link, @@ -1308,13 +1346,13 @@ fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { let _ = ::env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice]; + let peers = &[Ed25519Keyring::Alice]; let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 1); net.add_light_peer(&GrandpaTestNet::default_config()); // import block#1 WITH consensus data change. Light client ignores justification // && instead fetches finality proof for block #1 - net.peer(0).push_authorities_change_block(vec![substrate_primitives::sr25519::Public::from_raw([42; 32])]); + net.peer(0).push_authorities_change_block(vec![babe_primitives::AuthorityId::from_slice(&[42; 32])]); let net = Arc::new(Mutex::new(net)); run_to_completion(&mut runtime, 1, net.clone(), peers); net.lock().block_until_sync(&mut runtime); @@ -1341,20 +1379,20 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ // two of these guys are offline. let genesis_authorities = if FORCE_CHANGE { vec![ - AuthorityKeyring::Alice, - AuthorityKeyring::Bob, - AuthorityKeyring::Charlie, - AuthorityKeyring::One, - AuthorityKeyring::Two, + Ed25519Keyring::Alice, + Ed25519Keyring::Bob, + Ed25519Keyring::Charlie, + Ed25519Keyring::One, + Ed25519Keyring::Two, ] } else { vec![ - AuthorityKeyring::Alice, - AuthorityKeyring::Bob, - AuthorityKeyring::Charlie, + Ed25519Keyring::Alice, + Ed25519Keyring::Bob, + Ed25519Keyring::Charlie, ] }; - let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers_a = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob, Ed25519Keyring::Charlie]; let api = TestApi::new(make_ids(&genesis_authorities)); let voters = make_ids(peers_a); @@ -1377,7 +1415,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ // normally it will reach light client, but because of the forced change, it will not net.lock().peer(0).push_blocks(8, false); // best is #9 net.lock().peer(0).push_authorities_change_block( - vec![substrate_primitives::sr25519::Public::from_raw([42; 32])] + vec![babe_primitives::AuthorityId::from_slice(&[42; 32])] ); // #10 net.lock().peer(0).push_blocks(1, false); // best is #11 net.lock().block_until_sync(&mut runtime); @@ -1401,7 +1439,7 @@ fn voter_catches_up_to_latest_round_when_behind() { let _ = env_logger::try_init(); let mut runtime = current_thread::Runtime::new().unwrap(); - let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; + let peers = &[Ed25519Keyring::Alice, Ed25519Keyring::Bob]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); @@ -1411,15 +1449,15 @@ fn voter_catches_up_to_latest_round_when_behind() { let net = Arc::new(Mutex::new(net)); let mut finality_notifications = Vec::new(); - let voter = |local_key, peer_id, link, net: Arc>| -> Box + Send> { + let voter = |keystore, peer_id, link, net: Arc>| -> Box + Send> { let grandpa_params = GrandpaParams { config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, - local_key, + keystore, name: Some(format!("peer#{}", peer_id)), }, - link: link, + link, network: net.lock().peer(peer_id).network_service().clone(), inherent_data_providers: InherentDataProviders::new(), on_exit: Exit, @@ -1429,6 +1467,8 @@ fn voter_catches_up_to_latest_round_when_behind() { Box::new(run_grandpa_voter(grandpa_params).expect("all in order with client and network")) }; + let mut keystore_paths = Vec::new(); + // spawn authorities for (peer_id, key) in peers.iter().enumerate() { let (client, link) = { @@ -1447,7 +1487,10 @@ fn voter_catches_up_to_latest_round_when_behind() { .for_each(move |_| Ok(())) ); - let voter = voter(Some(Arc::new((*key).into())), peer_id, link, net.clone()); + let (keystore, keystore_path) = create_keystore(*key); + keystore_paths.push(keystore_path); + + let voter = voter(Some(keystore), peer_id, link, net.clone()); runtime.spawn(voter); } @@ -1466,35 +1509,35 @@ fn voter_catches_up_to_latest_round_when_behind() { wait_for_finality.and_then(move |_| { let peer_id = 2; - let (client, link) = { + let link = { let net = net.lock(); - let link = net.peers[peer_id].data.lock().take().expect("link initialized at startup; qed"); - ( - net.peers[peer_id].client().clone(), - link, - ) + let mut link = net.peers[peer_id].data.lock(); + link.take().expect("link initialized at startup; qed") }; let set_state = link.persistent_data.set_state.clone(); - let wait = client.finality_notification_stream() - .map(|v| Ok::<_, ()>(v)).compat() - .take_while(|n| Ok(n.header.number() < &50)) - .collect() - .map(|_| set_state); - let voter = voter(None, peer_id, link, net); runtime.spawn(voter).unwrap(); - wait + let start_time = std::time::Instant::now(); + let timeout = Duration::from_secs(5 * 60); + let wait_for_catch_up = futures::future::poll_fn(move || { + // The voter will start at round 1 and since everyone else is + // already at a later round the only way to get to round 4 (or + // later) is by issuing a catch up request. + if set_state.read().last_completed_round().number >= 4 { + Ok(Async::Ready(())) + } else if start_time.elapsed() > timeout { + panic!("Timed out while waiting for catch up to happen") + } else { + Ok(Async::NotReady) + } + }); + + wait_for_catch_up }) - .and_then(|set_state| { - // the last completed round in the new voter is higher than 4 - // which means it caught up to the voters - assert!(set_state.read().last_completed_round().number >= 4); - Ok(()) - }) }; let drive_to_completion = futures::future::poll_fn(|| { net.lock().poll(); Ok(Async::NotReady) }); diff --git a/core/finality-grandpa/src/until_imported.rs b/core/finality-grandpa/src/until_imported.rs index 5575a0d2c6009ecdeb8478f7fa3128e7eb2fda7c..af797c99ab39bdda781ee6d1fecfb4d781573746 100644 --- a/core/finality-grandpa/src/until_imported.rs +++ b/core/finality-grandpa/src/until_imported.rs @@ -29,7 +29,7 @@ use futures::stream::Fuse; use futures03::{StreamExt as _, TryStreamExt as _}; use grandpa::voter; use parking_lot::Mutex; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; use tokio_timer::Interval; use std::collections::{HashMap, VecDeque}; diff --git a/core/inherents/Cargo.toml b/core/inherents/Cargo.toml index 1824eef80f06b7e953ec008e8a261375e56f917b..45e0b9e828ec78a207e2522c8dddadd081630c24 100644 --- a/core/inherents/Cargo.toml +++ b/core/inherents/Cargo.toml @@ -5,16 +5,16 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = { version = "0.8.0", optional = true } +parking_lot = { version = "0.9.0", optional = true } rstd = { package = "sr-std", path = "../sr-std", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +sr-primitives = { path = "../sr-primitives", default-features = false } [features] default = [ "std" ] std = [ "parking_lot", "rstd/std", - "parity-codec/std", - "runtime_primitives/std", + "codec/std", + "sr-primitives/std", ] diff --git a/core/inherents/src/lib.rs b/core/inherents/src/lib.rs index 040f289957fc31e5cf98b6cd35cdf9a6e5963e67..f7363b483bfecb54b601136ce044eb735bf6277d 100644 --- a/core/inherents/src/lib.rs +++ b/core/inherents/src/lib.rs @@ -33,7 +33,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![warn(missing_docs)] -use parity_codec as codec; use codec::{Encode, Decode}; use rstd::{collections::btree_map::{BTreeMap, IntoIter, Entry}, vec::Vec}; @@ -44,7 +43,7 @@ use parking_lot::RwLock; #[cfg(feature = "std")] use std::{sync::Arc, format}; -pub use runtime_primitives::RuntimeString; +pub use sr_primitives::RuntimeString; /// An identifier for an inherent. pub type InherentIdentifier = [u8; 8]; @@ -52,7 +51,7 @@ pub type InherentIdentifier = [u8; 8]; /// Inherent data to include in a block. #[derive(Clone, Default, Encode, Decode)] pub struct InherentData { - /// All inherent data encoded with parity-codec and an identifier. + /// All inherent data encoded with parity-scale-codec and an identifier. data: BTreeMap> } @@ -111,7 +110,7 @@ impl InherentData { match self.data.get(identifier) { Some(inherent) => I::decode(&mut &inherent[..]) - .ok_or_else(|| { + .map_err(|_| { "Could not decode requested inherent type!".into() }) .map(Some), diff --git a/core/keyring/Cargo.toml b/core/keyring/Cargo.toml index 299d822843a3e1de0e297adf173c2fafdbeaede5..1a58dc133e35891acc816082dc3ae36eab089de9 100644 --- a/core/keyring/Cargo.toml +++ b/core/keyring/Cargo.toml @@ -5,8 +5,8 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -substrate-primitives = { path = "../primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } sr-primitives = { path = "../sr-primitives" } lazy_static = { version = "1.0" } -strum = "0.14.0" -strum_macros = "0.14.0" +strum = "0.15.0" +strum_macros = "0.15.0" diff --git a/core/keyring/src/ed25519.rs b/core/keyring/src/ed25519.rs index bec4c801561f7b35486aeb16e831801c88ded151..56bdb1ce8c0e60d3a43116631378b38592a8f762 100644 --- a/core/keyring/src/ed25519.rs +++ b/core/keyring/src/ed25519.rs @@ -18,8 +18,8 @@ use std::{collections::HashMap, ops::Deref}; use lazy_static::lazy_static; -use substrate_primitives::{ed25519::{Pair, Public, Signature}, Pair as PairT, Public as PublicT, H256}; -pub use substrate_primitives::ed25519; +use primitives::{ed25519::{Pair, Public, Signature}, Pair as PairT, Public as PublicT, H256}; +pub use primitives::ed25519; /// Set of test accounts. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum_macros::Display, strum_macros::EnumIter)] @@ -36,18 +36,7 @@ pub enum Keyring { impl Keyring { pub fn from_public(who: &Public) -> Option { - [ - Keyring::Alice, - Keyring::Bob, - Keyring::Charlie, - Keyring::Dave, - Keyring::Eve, - Keyring::Ferdie, - Keyring::One, - Keyring::Two, - ].iter() - .map(|i| *i) - .find(|&k| &Public::from(k) == who) + Self::iter().find(|&k| &Public::from(k) == who) } pub fn from_raw_public(who: [u8; 32]) -> Option { @@ -83,6 +72,14 @@ impl Keyring { pub fn iter() -> impl Iterator { ::iter() } + + pub fn public(self) -> Public { + self.pair().public() + } + + pub fn to_seed(self) -> String { + format!("//{}", self) + } } impl From for &'static str { @@ -168,12 +165,30 @@ impl Deref for Keyring { #[cfg(test)] mod tests { use super::*; - use substrate_primitives::{ed25519::Pair, Pair as PairT}; + use primitives::{ed25519::Pair, Pair as PairT}; #[test] fn should_work() { - assert!(Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Alice)); - assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Bob!", Keyring::Alice)); - assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Bob)); + assert!( + Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Alice!", + &Keyring::Alice.public(), + ) + ); + assert!( + !Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Bob!", + &Keyring::Alice.public(), + ) + ); + assert!( + !Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Alice!", + &Keyring::Bob.public(), + ) + ); } } diff --git a/core/keyring/src/lib.rs b/core/keyring/src/lib.rs index 5cf38401d0823f84a80054e9ccb9eb2d9bb8eba0..e4714ad3c42a9731bd174e4bee5262c41bb1d8b7 100644 --- a/core/keyring/src/lib.rs +++ b/core/keyring/src/lib.rs @@ -23,12 +23,12 @@ pub mod sr25519; pub mod ed25519; /// Convenience export: Sr25519's Keyring is exposed as `AccountKeyring`, -/// since it tends to be used for accounts. +/// since it tends to be used for accounts (although it may also be used +/// by authorities). pub use sr25519::Keyring as AccountKeyring; -/// Convenience export: Ed25519's Keyring is exposed as `AuthorityKeyring`, -/// since it tends to be used for authorities (session keys &c.). -pub use ed25519::Keyring as AuthorityKeyring; +pub use ed25519::Keyring as Ed25519Keyring; +pub use sr25519::Keyring as Sr25519Keyring; pub mod test { /// The keyring for use with accounts when using the test runtime. diff --git a/core/keyring/src/sr25519.rs b/core/keyring/src/sr25519.rs index 8db66ab5ddff7e54d3ac80ba229b763858bd7922..bb3aaa6b51db19569208bbad3128b269f5cb7707 100644 --- a/core/keyring/src/sr25519.rs +++ b/core/keyring/src/sr25519.rs @@ -19,11 +19,11 @@ use std::collections::HashMap; use std::ops::Deref; use lazy_static::lazy_static; -use substrate_primitives::{sr25519::{Pair, Public, Signature}, Pair as PairT, Public as PublicT, H256}; -pub use substrate_primitives::sr25519; +use primitives::{sr25519::{Pair, Public, Signature}, Pair as PairT, Public as PublicT, H256}; +pub use primitives::sr25519; /// Set of test accounts. -#[derive(Clone, Copy, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum_macros::Display, strum_macros::EnumIter)] pub enum Keyring { Alice, Bob, @@ -37,18 +37,7 @@ pub enum Keyring { impl Keyring { pub fn from_public(who: &Public) -> Option { - [ - Keyring::Alice, - Keyring::Bob, - Keyring::Charlie, - Keyring::Dave, - Keyring::Eve, - Keyring::Ferdie, - Keyring::One, - Keyring::Two, - ].iter() - .map(|i| *i) - .find(|&k| &Public::from(k) == who) + Self::iter().find(|&k| &Public::from(k) == who) } pub fn from_raw_public(who: [u8; 32]) -> Option { @@ -79,6 +68,19 @@ impl Keyring { Pair::from_string(&format!("//{}", <&'static str>::from(self)), None) .expect("static values are known good; qed") } + + /// Returns an iterator over all test accounts. + pub fn iter() -> impl Iterator { + ::iter() + } + + pub fn public(self) -> Public { + self.pair().public() + } + + pub fn to_seed(self) -> String { + format!("//{}", self) + } } impl From for &'static str { @@ -104,16 +106,7 @@ impl From for sr_primitives::MultiSigner { lazy_static! { static ref PRIVATE_KEYS: HashMap = { - [ - Keyring::Alice, - Keyring::Bob, - Keyring::Charlie, - Keyring::Dave, - Keyring::Eve, - Keyring::Ferdie, - Keyring::One, - Keyring::Two, - ].iter().map(|&i| (i, i.pair())).collect() + Keyring::iter().map(|i| (i, i.pair())).collect() }; static ref PUBLIC_KEYS: HashMap = { @@ -173,12 +166,30 @@ impl Deref for Keyring { #[cfg(test)] mod tests { use super::*; - use substrate_primitives::{sr25519::Pair, Pair as PairT}; + use primitives::{sr25519::Pair, Pair as PairT}; #[test] fn should_work() { - assert!(Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Alice)); - assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Bob!", Keyring::Alice)); - assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Bob)); + assert!( + Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Alice!", + &Keyring::Alice.public(), + ) + ); + assert!( + !Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Bob!", + &Keyring::Alice.public(), + ) + ); + assert!( + !Pair::verify( + &Keyring::Alice.sign(b"I am Alice!"), + b"I am Alice!", + &Keyring::Bob.public(), + ) + ); } } diff --git a/core/keystore/Cargo.toml b/core/keystore/Cargo.toml index 1d4f146b7ed7fc156590dedd4fb825f84deaca8e..c56b9ba67dcbdf055697fac19b56c0ad97b16274 100644 --- a/core/keystore/Cargo.toml +++ b/core/keystore/Cargo.toml @@ -5,12 +5,14 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -derive_more = "0.14.0" -substrate-primitives = { path = "../primitives" } +derive_more = "0.15.0" +primitives = { package = "substrate-primitives", path = "../primitives" } +app-crypto = { package = "substrate-application-crypto", path = "../application-crypto" } hex = "0.3" rand = "0.6" serde_json = "1.0" subtle = "2.0" +parking_lot = "0.9.0" [dev-dependencies] tempdir = "0.3" diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index 77106059f82bd3cad93d14f26c71c79112d72fa2..9125ddbda650228f4ace7233248b7b84083dac12 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -18,12 +18,18 @@ #![warn(missing_docs)] -use std::collections::HashMap; -use std::path::PathBuf; -use std::fs::{self, File}; -use std::io::{self, Write}; +use std::{collections::HashMap, path::PathBuf, fs::{self, File}, io::{self, Write}, sync::Arc}; -use substrate_primitives::crypto::{KeyTypeId, Pair, Public}; +use primitives::{ + crypto::{KeyTypeId, Pair as PairT, Public, IsWrappedBy, Protected}, traits::BareCryptoStore, +}; + +use app_crypto::{AppKey, AppPublic, AppPair, ed25519, sr25519}; + +use parking_lot::RwLock; + +/// Keystore pointer +pub type KeyStorePtr = Arc>; /// Keystore error. #[derive(Debug, derive_more::Display, derive_more::From)] @@ -41,6 +47,9 @@ pub enum Error { /// Invalid seed #[display(fmt="Invalid seed")] InvalidSeed, + /// Keystore unavailable + #[display(fmt="Keystore unavailable")] + Unavailable, } /// Keystore Result @@ -57,80 +66,159 @@ impl std::error::Error for Error { } /// Key store. +/// +/// Stores key pairs in a file system store + short lived key pairs in memory. +/// +/// Every pair that is being generated by a `seed`, will be placed in memory. pub struct Store { path: PathBuf, additional: HashMap<(KeyTypeId, Vec), Vec>, + password: Option>, } impl Store { - /// Create a new store at the given path. - pub fn open(path: PathBuf) -> Result { + /// Open the store at the given path. + /// + /// Optionally takes a password that will be used to encrypt/decrypt the keys. + pub fn open>(path: T, password: Option>) -> Result { + let path = path.into(); fs::create_dir_all(&path)?; - Ok(Store { path, additional: HashMap::new() }) + + let instance = Self { path, additional: HashMap::new(), password }; + Ok(Arc::new(RwLock::new(instance))) } - fn get_pair(&self, public: &TPair::Public) -> Result> { - let key = (TPair::KEY_TYPE, public.to_raw_vec()); - if let Some(bytes) = self.additional.get(&key) { - let pair = TPair::from_seed_slice(bytes) - .map_err(|_| Error::InvalidSeed)?; - return Ok(Some(pair)); - } - Ok(None) + /// Get the public/private key pair for the given public key and key type. + fn get_additional_pair( + &self, + public: &Pair::Public, + key_type: KeyTypeId, + ) -> Result> { + let key = (key_type, public.to_raw_vec()); + self.additional + .get(&key) + .map(|bytes| Pair::from_seed_slice(bytes).map_err(|_| Error::InvalidSeed)) + .transpose() } - fn insert_pair(&mut self, pair: &TPair) { - let key = (TPair::KEY_TYPE, pair.public().to_raw_vec()); + /// Insert the given public/private key pair with the given key type. + /// + /// Does not place it into the file system store. + fn insert_ephemeral_pair(&mut self, pair: &Pair, key_type: KeyTypeId) { + let key = (key_type, pair.public().to_raw_vec()); self.additional.insert(key, pair.to_raw_vec()); } - /// Generate a new key, placing it into the store. - pub fn generate(&self, password: &str) -> Result { - let (pair, phrase, _) = TPair::generate_with_phrase(Some(password)); - let mut file = File::create(self.key_file_path::(&pair.public()))?; - ::serde_json::to_writer(&file, &phrase)?; + /// Insert a new key with anonymous crypto. + /// + /// Places it into the file system store. + fn insert_unknown(&self, key_type: KeyTypeId, suri: &str, public: &[u8]) -> Result<()> { + let mut file = File::create(self.key_file_path(public, key_type)).map_err(Error::Io)?; + serde_json::to_writer(&file, &suri).map_err(Error::Json)?; + file.flush().map_err(Error::Io)?; + Ok(()) + } + + /// Insert a new key. + /// + /// Places it into the file system store. + pub fn insert_by_type(&self, key_type: KeyTypeId, suri: &str) -> Result { + let pair = Pair::from_string( + suri, + self.password.as_ref().map(|p| &***p) + ).map_err(|_| Error::InvalidSeed)?; + self.insert_unknown(key_type, suri, pair.public().as_slice()) + .map_err(|_| Error::Unavailable)?; + Ok(pair) + } + + /// Insert a new key. + /// + /// Places it into the file system store. + pub fn insert(&self, suri: &str) -> Result { + self.insert_by_type::(Pair::ID, suri).map(Into::into) + } + + /// Generate a new key. + /// + /// Places it into the file system store. + pub fn generate_by_type(&self, key_type: KeyTypeId) -> Result { + let (pair, phrase, _) = Pair::generate_with_phrase(self.password.as_ref().map(|p| &***p)); + let mut file = File::create(self.key_file_path(pair.public().as_slice(), key_type))?; + serde_json::to_writer(&file, &phrase)?; file.flush()?; Ok(pair) } - /// Create a new key from seed. Do not place it into the store. - pub fn generate_from_seed(&mut self, seed: &str) -> Result { - let pair = TPair::from_string(seed, None) - .ok().ok_or(Error::InvalidSeed)?; - self.insert_pair(&pair); + /// Generate a new key. + /// + /// Places it into the file system store. + pub fn generate(&self) -> Result { + self.generate_by_type::(Pair::ID).map(Into::into) + } + + /// Create a new key from seed. + /// + /// Does not place it into the file system store. + pub fn insert_ephemeral_from_seed_by_type( + &mut self, + seed: &str, + key_type: KeyTypeId, + ) -> Result { + let pair = Pair::from_string(seed, None).map_err(|_| Error::InvalidSeed)?; + self.insert_ephemeral_pair(&pair, key_type); Ok(pair) } - /// Load a key file with given public key. - pub fn load(&self, public: &TPair::Public, password: &str) -> Result { - if let Some(pair) = self.get_pair(public)? { + /// Create a new key from seed. + /// + /// Does not place it into the file system store. + pub fn insert_ephemeral_from_seed(&mut self, seed: &str) -> Result { + self.insert_ephemeral_from_seed_by_type::(seed, Pair::ID).map(Into::into) + } + + /// Get a key pair for the given public key and key type. + pub fn key_pair_by_type(&self, + public: &Pair::Public, + key_type: KeyTypeId, + ) -> Result { + if let Some(pair) = self.get_additional_pair(public, key_type)? { return Ok(pair) } - let path = self.key_file_path::(public); + let path = self.key_file_path(public.as_slice(), key_type); let file = File::open(path)?; - let phrase: String = ::serde_json::from_reader(&file)?; - let (pair, _) = TPair::from_phrase(&phrase, Some(password)) - .ok().ok_or(Error::InvalidPhrase)?; - if &pair.public() != public { - return Err(Error::InvalidPassword); + let phrase: String = serde_json::from_reader(&file)?; + let pair = Pair::from_string( + &phrase, + self.password.as_ref().map(|p| &***p), + ).map_err(|_| Error::InvalidPhrase)?; + + if &pair.public() == public { + Ok(pair) + } else { + Err(Error::InvalidPassword) } - Ok(pair) } - /// Get public keys of all stored keys. - pub fn contents(&self) -> Result> { + /// Get a key pair for the given public key. + pub fn key_pair(&self, public: &::Public) -> Result { + self.key_pair_by_type::(IsWrappedBy::from_ref(public), Pair::ID).map(Into::into) + } + + /// Get public keys of all stored keys that match the given key type. + pub fn public_keys_by_type(&self, key_type: KeyTypeId) -> Result> { let mut public_keys: Vec = self.additional.keys() .filter_map(|(ty, public)| { - if *ty != TPublic::KEY_TYPE { - return None + if *ty == key_type { + Some(TPublic::from_slice(public)) + } else { + None } - Some(TPublic::from_slice(public)) }) .collect(); - let key_type: [u8; 4] = TPublic::KEY_TYPE.to_le_bytes(); for entry in fs::read_dir(&self.path)? { let entry = entry?; let path = entry.path(); @@ -139,7 +227,7 @@ impl Store { if let Some(name) = path.file_name().and_then(|n| n.to_str()) { match hex::decode(name) { Ok(ref hex) => { - if hex[0..4] != key_type { continue } + if &hex[0..4] != &key_type.0 { continue } let public = TPublic::from_slice(&hex[4..]); public_keys.push(public); } @@ -151,48 +239,187 @@ impl Store { Ok(public_keys) } - fn key_file_path(&self, public: &TPair::Public) -> PathBuf { + /// Get public keys of all stored keys that match the key type. + /// + /// This will just use the type of the public key (a list of which to be returned) in order + /// to determine the key type. Unless you use a specialised application-type public key, then + /// this only give you keys registered under generic cryptography, and will not return keys + /// registered under the application type. + pub fn public_keys(&self) -> Result> { + self.public_keys_by_type::(Public::ID) + .map(|v| v.into_iter().map(Into::into).collect()) + } + + /// Returns the file path for the given public key and key type. + fn key_file_path(&self, public: &[u8], key_type: KeyTypeId) -> PathBuf { let mut buf = self.path.clone(); - let bytes: [u8; 4] = TPair::KEY_TYPE.to_le_bytes(); - let key_type = hex::encode(bytes); - let key = hex::encode(public.as_slice()); + let key_type = hex::encode(key_type.0); + let key = hex::encode(public); buf.push(key_type + key.as_str()); buf } } +impl BareCryptoStore for Store { + fn sr25519_public_keys(&self, key_type: KeyTypeId) -> Vec { + self.public_keys_by_type::(key_type).unwrap_or_default() + } + + fn sr25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> std::result::Result { + let pair = match seed { + Some(seed) => self.insert_ephemeral_from_seed_by_type::(seed, id), + None => self.generate_by_type::(id), + }.map_err(|e| e.to_string())?; + + Ok(pair.public()) + } + + fn sr25519_key_pair(&self, id: KeyTypeId, pub_key: &sr25519::Public) -> Option { + self.key_pair_by_type::(pub_key, id).ok() + } + + fn ed25519_public_keys(&self, key_type: KeyTypeId) -> Vec { + self.public_keys_by_type::(key_type).unwrap_or_default() + } + + fn ed25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> std::result::Result { + let pair = match seed { + Some(seed) => self.insert_ephemeral_from_seed_by_type::(seed, id), + None => self.generate_by_type::(id), + }.map_err(|e| e.to_string())?; + + Ok(pair.public()) + } + + fn ed25519_key_pair(&self, id: KeyTypeId, pub_key: &ed25519::Public) -> Option { + self.key_pair_by_type::(pub_key, id).ok() + } + + fn insert_unknown(&mut self, key_type: KeyTypeId, suri: &str, public: &[u8]) + -> std::result::Result<(), ()> + { + Store::insert_unknown(self, key_type, suri, public).map_err(|_| ()) + } + + fn password(&self) -> Option<&str> { + self.password.as_ref().map(|x| x.as_str()) + } +} + #[cfg(test)] mod tests { use super::*; use tempdir::TempDir; - use substrate_primitives::ed25519; - use substrate_primitives::crypto::Ss58Codec; + use primitives::crypto::{Ss58Codec, key_types}; #[test] fn basic_store() { let temp_dir = TempDir::new("keystore").unwrap(); - let store = Store::open(temp_dir.path().to_owned()).unwrap(); - - assert!(store.contents::().unwrap().is_empty()); + let store = Store::open(temp_dir.path(), None).unwrap(); - let key: ed25519::Pair = store.generate("thepassword").unwrap(); - let key2: ed25519::Pair = store.load(&key.public(), "thepassword").unwrap(); + assert!(store.read().public_keys::().unwrap().is_empty()); - assert!(store.load::(&key.public(), "notthepassword").is_err()); + let key: ed25519::AppPair = store.write().generate().unwrap(); + let key2: ed25519::AppPair = store.read().key_pair(&key.public()).unwrap(); assert_eq!(key.public(), key2.public()); - assert_eq!(store.contents::().unwrap()[0], key.public()); + assert_eq!(store.read().public_keys::().unwrap()[0], key.public()); } #[test] - fn test_generate_from_seed() { + fn test_insert_ephemeral_from_seed() { let temp_dir = TempDir::new("keystore").unwrap(); - let mut store = Store::open(temp_dir.path().to_owned()).unwrap(); + let store = Store::open(temp_dir.path(), None).unwrap(); - let pair: ed25519::Pair = store - .generate_from_seed("0x3d97c819d68f9bafa7d6e79cb991eebcd77d966c5334c0b94d9e1fa7ad0869dc") + let pair: ed25519::AppPair = store + .write() + .insert_ephemeral_from_seed("0x3d97c819d68f9bafa7d6e79cb991eebcd77d966c5334c0b94d9e1fa7ad0869dc") .unwrap(); - assert_eq!("5DKUrgFqCPV8iAXx9sjy1nyBygQCeiUYRFWurZGhnrn3HJCA", pair.public().to_ss58check()); + assert_eq!( + "5DKUrgFqCPV8iAXx9sjy1nyBygQCeiUYRFWurZGhnrn3HJCA", + pair.public().to_ss58check() + ); + + drop(store); + let store = Store::open(temp_dir.path(), None).unwrap(); + // Keys generated from seed should not be persisted! + assert!(store.read().key_pair::(&pair.public()).is_err()); + } + + #[test] + fn password_being_used() { + let password = String::from("password"); + let temp_dir = TempDir::new("keystore").unwrap(); + let store = Store::open(temp_dir.path(), Some(password.clone().into())).unwrap(); + + let pair: ed25519::AppPair = store.write().generate().unwrap(); + assert_eq!( + pair.public(), + store.read().key_pair::(&pair.public()).unwrap().public(), + ); + + // Without the password the key should not be retrievable + let store = Store::open(temp_dir.path(), None).unwrap(); + assert!(store.read().key_pair::(&pair.public()).is_err()); + + let store = Store::open(temp_dir.path(), Some(password.into())).unwrap(); + assert_eq!( + pair.public(), + store.read().key_pair::(&pair.public()).unwrap().public(), + ); + } + + #[test] + fn public_keys_are_returned() { + let temp_dir = TempDir::new("keystore").unwrap(); + let store = Store::open(temp_dir.path(), None).unwrap(); + + let mut public_keys = Vec::new(); + for i in 0..10 { + public_keys.push(store.write().generate::().unwrap().public()); + public_keys.push(store.write().insert_ephemeral_from_seed::( + &format!("0x3d97c819d68f9bafa7d6e79cb991eebcd7{}d966c5334c0b94d9e1fa7ad0869dc", i), + ).unwrap().public()); + } + + // Generate a key of a different type + store.write().generate::().unwrap(); + + public_keys.sort(); + let mut store_pubs = store.read().public_keys::().unwrap(); + store_pubs.sort(); + + assert_eq!(public_keys, store_pubs); + } + + #[test] + fn store_unknown_and_extract_it() { + let temp_dir = TempDir::new("keystore").unwrap(); + let store = Store::open(temp_dir.path(), None).unwrap(); + + let secret_uri = "//Alice"; + let key_pair = sr25519::AppPair::from_string(secret_uri, None).expect("Generates key pair"); + + store.write().insert_unknown( + key_types::SR25519, + secret_uri, + key_pair.public().as_ref(), + ).expect("Inserts unknown key"); + + let store_key_pair = store.read().key_pair_by_type::( + &key_pair.public(), + key_types::SR25519, + ).expect("Gets key pair from keystore"); + + assert_eq!(key_pair.public(), store_key_pair.public()); } } diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 8b343174706d24a0445e4d8ef1850e684daa66a1..dac6ecdd72cf27a533e0b628f9cbac7a4e9cd4b9 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -11,23 +11,24 @@ bytes = "0.4" derive_more = "0.14.0" either = "1.5.2" log = "0.4" -parking_lot = "0.8.0" +parking_lot = "0.9.0" bitflags = "1.0" fnv = "1.0" futures = "0.1.17" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17", features = ["compat"] } +futures-timer = "0.2.1" linked-hash-map = "0.5" linked_hash_set = "0.1.3" lru-cache = "0.1.1" rustc-hex = "2.0" rand = "0.6" -libp2p = { version = "0.10.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } +libp2p = { version = "0.11.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } fork-tree = { path = "../../core/utils/fork-tree" } -primitives = { package = "substrate-primitives", path = "../../core/primitives" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common" } client = { package = "substrate-client", path = "../../core/client" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } -parity-codec = { version = "4.1.1", features = ["derive"] } +sr-primitives = { path = "../../core/sr-primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } peerset = { package = "substrate-peerset", path = "../../core/peerset" } serde = { version = "1.0.70", features = ["derive"] } serde_json = "1.0.24" @@ -35,7 +36,6 @@ slog = { version = "^2", features = ["nested-values"] } slog_derive = "0.1.1" smallvec = "0.6" tokio-io = "0.1" -tokio-timer = "0.2.11" tokio = { version = "0.1.11", optional = true } unsigned-varint = { version = "0.2.1", features = ["codec"] } keyring = { package = "substrate-keyring", path = "../../core/keyring", optional = true } @@ -44,6 +44,7 @@ test-client = { package = "substrate-test-runtime-client", path = "../../core/te erased-serde = "0.3.9" void = "1.0" zeroize = "0.9.0" +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives" } [dev-dependencies] env_logger = { version = "0.6" } diff --git a/core/network/src/behaviour.rs b/core/network/src/behaviour.rs index 2550e906600cb35a3e3dfa837648f01fea87db4e..f2144c89a5654e1278706fb6112acfb7366f2825 100644 --- a/core/network/src/behaviour.rs +++ b/core/network/src/behaviour.rs @@ -23,11 +23,11 @@ use crate::protocol::{CustomMessageOutcome, Protocol}; use futures::prelude::*; use libp2p::NetworkBehaviour; use libp2p::core::{Multiaddr, PeerId, PublicKey}; -use libp2p::core::swarm::{NetworkBehaviourAction, NetworkBehaviourEventProcess}; +use libp2p::swarm::{NetworkBehaviourAction, NetworkBehaviourEventProcess}; use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; use libp2p::multihash::Multihash; use log::warn; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; use std::iter; use void; @@ -150,6 +150,12 @@ impl, H: ExHashT> NetworkBehaviourEventPr for Behaviour { fn inject_event(&mut self, out: DiscoveryOut) { match out { + DiscoveryOut::UnroutablePeer(_peer_id) => { + // Obtaining and reporting listen addresses for unroutable peers back + // to Kademlia is handled by the `Identify` protocol, part of the + // `DebugInfoBehaviour`. See the `NetworkBehaviourEventProcess` + // implementation for `DebugInfoEvent`. + } DiscoveryOut::Discovered(peer_id) => { self.substrate.add_discovered_nodes(iter::once(peer_id)); } diff --git a/core/network/src/chain.rs b/core/network/src/chain.rs index 76096a44aae6139f08c1489eddf88f9dc338e293..e857aa095c9f97eefc7bd462cd8f534a64bf73ec 100644 --- a/core/network/src/chain.rs +++ b/core/network/src/chain.rs @@ -20,9 +20,9 @@ use client::{self, Client as SubstrateClient, ClientInfo, BlockStatus, CallExecu use client::error::Error; use client::light::fetcher::ChangesProof; use consensus::{BlockImport, Error as ConsensusError}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; -use runtime_primitives::generic::{BlockId}; -use runtime_primitives::Justification; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT}; +use sr_primitives::generic::{BlockId}; +use sr_primitives::Justification; use primitives::{H256, Blake2Hasher, storage::StorageKey}; /// Local client abstraction for the network. diff --git a/core/network/src/config.rs b/core/network/src/config.rs index 7c7c540d1175c23f783d120f72e239a538dbadf2..46bb8aeff4ddd69deb3de94cdfaa0b561b6a214a 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -27,8 +27,7 @@ use crate::on_demand_layer::OnDemand; use crate::service::{ExHashT, TransactionPool}; use bitflags::bitflags; use consensus::import_queue::ImportQueue; -use parity_codec; -use runtime_primitives::traits::{Block as BlockT}; +use sr_primitives::traits::{Block as BlockT}; use std::sync::Arc; use libp2p::identity::{Keypair, secp256k1, ed25519}; use libp2p::wasm_ext; @@ -103,21 +102,28 @@ impl Roles { self.intersects(Roles::FULL | Roles::AUTHORITY) } + /// Does this role represents a client that does not participates in the consensus? + pub fn is_authority(&self) -> bool { + *self == Roles::AUTHORITY + } + /// Does this role represents a client that does not hold full chain data locally? pub fn is_light(&self) -> bool { !self.is_full() } } -impl parity_codec::Encode for Roles { - fn encode_to(&self, dest: &mut T) { +impl codec::Encode for Roles { + fn encode_to(&self, dest: &mut T) { dest.push_byte(self.bits()) } } -impl parity_codec::Decode for Roles { - fn decode(input: &mut I) -> Option { - Self::from_bits(input.read_byte()?) +impl codec::EncodeLike for Roles {} + +impl codec::Decode for Roles { + fn decode(input: &mut I) -> Result { + Self::from_bits(input.read_byte()?).ok_or_else(|| codec::Error::from("Invalid bytes")) } } @@ -157,7 +163,8 @@ impl ProtocolId { } } -/// Parses a string address and returns the component, if valid. +/// Parses a string address and splits it into Multiaddress and PeerId, if +/// valid. /// /// # Example /// @@ -171,8 +178,12 @@ impl ProtocolId { /// ``` /// pub fn parse_str_addr(addr_str: &str) -> Result<(PeerId, Multiaddr), ParseErr> { - let mut addr: Multiaddr = addr_str.parse()?; + let addr: Multiaddr = addr_str.parse()?; + parse_addr(addr) +} +/// Splits a Multiaddress into a Multiaddress and PeerId. +pub fn parse_addr(mut addr: Multiaddr)-> Result<(PeerId, Multiaddr), ParseErr> { let who = match addr.pop() { Some(multiaddr::Protocol::P2p(key)) => PeerId::from_multihash(key) .map_err(|_| ParseErr::InvalidPeerId)?, diff --git a/core/network/src/debug_info.rs b/core/network/src/debug_info.rs index f8e688acba500dc28a0d1f27802bbef4ec99f9e9..3b0d5513ef281dd9f449960e458d9fd3be477581 100644 --- a/core/network/src/debug_info.rs +++ b/core/network/src/debug_info.rs @@ -16,18 +16,18 @@ use fnv::FnvHashMap; use futures::prelude::*; +use futures03::{StreamExt as _, TryStreamExt as _}; use libp2p::Multiaddr; -use libp2p::core::{either::EitherOutput, PeerId, PublicKey}; -use libp2p::core::protocols_handler::{IntoProtocolsHandler, IntoProtocolsHandlerSelect, ProtocolsHandler}; -use libp2p::core::nodes::ConnectedPoint; -use libp2p::core::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; +use libp2p::core::{ConnectedPoint, either::EitherOutput, PeerId, PublicKey}; +use libp2p::swarm::{IntoProtocolsHandler, IntoProtocolsHandlerSelect, ProtocolsHandler}; +use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use libp2p::identify::{Identify, IdentifyEvent, protocol::IdentifyInfo}; use libp2p::ping::{Ping, PingConfig, PingEvent, PingSuccess}; use log::{debug, trace, error}; use std::collections::hash_map::Entry; use std::time::{Duration, Instant}; use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::Interval; +use futures_timer::Interval; /// Time after we disconnect from a node before we purge its information from the cache. const CACHE_EXPIRE: Duration = Duration::from_secs(10 * 60); @@ -44,7 +44,7 @@ pub struct DebugInfoBehaviour { /// Information that we know about all nodes. nodes_info: FnvHashMap, /// Interval at which we perform garbage collection in `nodes_info`. - garbage_collect: Interval, + garbage_collect: Box + Send>, } /// Information about a node we're connected to. @@ -76,7 +76,7 @@ impl DebugInfoBehaviour { ping: Ping::new(PingConfig::new()), identify, nodes_info: FnvHashMap::default(), - garbage_collect: Interval::new_interval(GARBAGE_COLLECT_INTERVAL), + garbage_collect: Box::new(Interval::new(GARBAGE_COLLECT_INTERVAL).map(|()| Ok(())).compat()), } } diff --git a/core/network/src/discovery.rs b/core/network/src/discovery.rs index 1a377ba8721e1950716b3d17d1056bb9c7daa5e8..9fa6b2a80fc895c69ccc5170e5692bd85dda9b6c 100644 --- a/core/network/src/discovery.rs +++ b/core/network/src/discovery.rs @@ -46,20 +46,24 @@ //! use futures::prelude::*; -use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, PublicKey}; -use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; -use libp2p::core::swarm::PollParameters; +use futures_timer::Delay; +use futures03::{compat::Compat, TryFutureExt as _}; +use libp2p::core::{ConnectedPoint, Multiaddr, PeerId, PublicKey}; +use libp2p::swarm::{ProtocolsHandler, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; +use libp2p::kad::{Kademlia, KademliaEvent, Quorum, Record}; +use libp2p::kad::GetClosestPeersError; +use libp2p::kad::record::store::MemoryStore; #[cfg(not(target_os = "unknown"))] -use libp2p::core::{swarm::toggle::Toggle, nodes::Substream, muxing::StreamMuxerBox}; -use libp2p::kad::{GetValueResult, Kademlia, KademliaOut, PutValueResult}; +use libp2p::{swarm::toggle::Toggle}; +#[cfg(not(target_os = "unknown"))] +use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; #[cfg(not(target_os = "unknown"))] use libp2p::mdns::{Mdns, MdnsEvent}; use libp2p::multihash::Multihash; use libp2p::multiaddr::Protocol; use log::{debug, info, trace, warn}; -use std::{cmp, collections::VecDeque, num::NonZeroU8, time::Duration}; +use std::{cmp, collections::VecDeque, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::{Delay, clock::Clock}; /// Implementation of `NetworkBehaviour` that discovers the nodes on the network. pub struct DiscoveryBehaviour { @@ -67,18 +71,16 @@ pub struct DiscoveryBehaviour { /// reserved nodes. user_defined: Vec<(PeerId, Multiaddr)>, /// Kademlia requests and answers. - kademlia: Kademlia, + kademlia: Kademlia, /// Discovers nodes on the local network. #[cfg(not(target_os = "unknown"))] mdns: Toggle>>, /// Stream that fires when we need to perform the next random Kademlia query. - next_kad_random_query: Delay, + next_kad_random_query: Compat, /// After `next_kad_random_query` triggers, the next one triggers after this duration. duration_to_next_kad: Duration, /// Discovered nodes to return. discoveries: VecDeque, - /// `Clock` instance that uses the current execution context's source of time. - clock: Clock, /// Identity of our local node. local_peer_id: PeerId, /// Number of nodes we're currently connected to. @@ -99,19 +101,19 @@ impl DiscoveryBehaviour { warn!(target: "sub-libp2p", "mDNS is not available on this platform"); } - let mut kademlia = Kademlia::new(local_public_key.clone().into_peer_id()); + let local_id = local_public_key.clone().into_peer_id(); + let store = MemoryStore::new(local_id.clone()); + let mut kademlia = Kademlia::new(local_id.clone(), store); for (peer_id, addr) in &user_defined { kademlia.add_address(peer_id, addr.clone()); } - let clock = Clock::new(); DiscoveryBehaviour { user_defined, kademlia, - next_kad_random_query: Delay::new(clock.now()), + next_kad_random_query: Delay::new(Duration::new(0, 0)).compat(), duration_to_next_kad: Duration::from_secs(1), discoveries: VecDeque::new(), - clock, local_peer_id: local_public_key.into_peer_id(), num_connections: 0, #[cfg(not(target_os = "unknown"))] @@ -158,8 +160,7 @@ impl DiscoveryBehaviour { /// /// A corresponding `ValueFound` or `ValueNotFound` event will later be generated. pub fn get_value(&mut self, key: &Multihash) { - self.kademlia.get_value(key, NonZeroU8::new(10) - .expect("Casting 10 to NonZeroU8 should succeed; qed")); + self.kademlia.get_record(key, Quorum::One) } /// Start putting a record into the DHT. Other nodes can later fetch that value with @@ -167,15 +168,24 @@ impl DiscoveryBehaviour { /// /// A corresponding `ValuePut` or `ValuePutFailed` event will later be generated. pub fn put_value(&mut self, key: Multihash, value: Vec) { - self.kademlia.put_value(key, value); + self.kademlia.put_record(Record::new(key, value), Quorum::All); } } /// Event generated by the `DiscoveryBehaviour`. pub enum DiscoveryOut { - /// We have discovered a node. Can be called multiple times with the same identity. + /// The address of a peer has been added to the Kademlia routing table. + /// + /// Can be called multiple times with the same identity. Discovered(PeerId), + /// A peer connected to this node for whom no listen address is known. + /// + /// In order for the peer to be added to the Kademlia routing table, a known + /// listen address must be added via [`DiscoveryBehaviour::add_self_reported_address`], + /// e.g. obtained through the `identify` protocol. + UnroutablePeer(PeerId), + /// The DHT yeided results for the record request, grouped in (key, value) pairs. ValueFound(Vec<(Multihash, Vec)>), @@ -193,7 +203,7 @@ impl NetworkBehaviour for DiscoveryBehaviour where TSubstream: AsyncRead + AsyncWrite, { - type ProtocolsHandler = as NetworkBehaviour>::ProtocolsHandler; + type ProtocolsHandler = as NetworkBehaviour>::ProtocolsHandler; type OutEvent = DiscoveryOut; fn new_handler(&mut self) -> Self::ProtocolsHandler { @@ -205,6 +215,8 @@ where .filter_map(|(p, a)| if p == peer_id { Some(a.clone()) } else { None }) .collect::>(); list.extend(self.kademlia.addresses_of_peer(peer_id)); + #[cfg(not(target_os = "unknown"))] + list.extend(self.mdns.addresses_of_peer(peer_id)); trace!(target: "sub-libp2p", "Addresses of {:?} are {:?}", peer_id, list); if list.is_empty() { if self.kademlia.kbuckets_entries().any(|p| p == peer_id) { @@ -273,10 +285,12 @@ where let random_peer_id = PeerId::random(); debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ {:?}", random_peer_id); - self.kademlia.find_node(random_peer_id); - // Reset the `Delay` to the next random. - self.next_kad_random_query.reset(self.clock.now() + self.duration_to_next_kad); + self.kademlia.get_closest_peers(random_peer_id); + + // Schedule the next random query with exponentially increasing delay, + // capped at 60 seconds. + self.next_kad_random_query = Delay::new(self.duration_to_next_kad).compat(); self.duration_to_next_kad = cmp::min(self.duration_to_next_kad * 2, Duration::from_secs(60)); }, @@ -291,50 +305,74 @@ where loop { match self.kademlia.poll(params) { Async::NotReady => break, - Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => { - match ev { - KademliaOut::Discovered { .. } => {} - KademliaOut::KBucketAdded { peer_id, .. } => { - let ev = DiscoveryOut::Discovered(peer_id); - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); - } - KademliaOut::FindNodeResult { key, closer_peers } => { - trace!(target: "sub-libp2p", "Libp2p => Query for {:?} yielded {:?} results", - key, closer_peers.len()); - if closer_peers.is_empty() && self.num_connections != 0 { - warn!(target: "sub-libp2p", "Libp2p => Random Kademlia query has yielded empty \ - results"); - } - } - KademliaOut::GetValueResult(res) => { - let ev = match res { - GetValueResult::Found { results } => { - let results = results - .into_iter() - .map(|r| (r.key, r.value)) - .collect(); - - DiscoveryOut::ValueFound(results) - } - GetValueResult::NotFound { key, .. } => { - DiscoveryOut::ValueNotFound(key) + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => match ev { + KademliaEvent::UnroutablePeer { peer, .. } => { + let ev = DiscoveryOut::UnroutablePeer(peer); + return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaEvent::RoutingUpdated { peer, .. } => { + let ev = DiscoveryOut::Discovered(peer); + return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaEvent::GetClosestPeersResult(res) => { + match res { + Err(GetClosestPeersError::Timeout { key, peers }) => { + warn!(target: "sub-libp2p", + "Libp2p => Query for {:?} timed out with {:?} results", + key, peers.len()); + }, + Ok(ok) => { + trace!(target: "sub-libp2p", + "Libp2p => Query for {:?} yielded {:?} results", + ok.key, ok.peers.len()); + if ok.peers.is_empty() && self.num_connections != 0 { + warn!(target: "sub-libp2p", "Libp2p => Random Kademlia query has yielded empty \ + results"); } - }; - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } } - KademliaOut::PutValueResult(res) => { - let ev = match res { - PutValueResult::Ok{ key, .. } => { - DiscoveryOut::ValuePut(key) - } - PutValueResult::Err { key, .. } => { - DiscoveryOut::ValuePutFailed(key) - } - }; - return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaEvent::GetRecordResult(res) => { + let ev = match res { + Ok(ok) => { + let results = ok.records + .into_iter() + .map(|r| (r.key, r.value)) + .collect(); + + DiscoveryOut::ValueFound(results) + } + Err(e) => { + DiscoveryOut::ValueNotFound(e.into_key()) + } + }; + return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaEvent::PutRecordResult(res) => { + let ev = match res { + Ok(ok) => DiscoveryOut::ValuePut(ok.key), + Err(e) => { + DiscoveryOut::ValuePutFailed(e.into_key()) + } + }; + return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaEvent::RepublishRecordResult(res) => { + match res { + Ok(ok) => debug!(target: "sub-libp2p", + "Libp2p => Record republished: {:?}", + ok.key), + Err(e) => warn!(target: "sub-libp2p", + "Libp2p => Republishing of record {:?} failed with: {:?}", + e.key(), e) } - // We never start any other type of query. - KademliaOut::GetProvidersResult { .. } => {} + } + KademliaEvent::Discovered { .. } => { + // We are not interested in these events at the moment. + } + // We never start any other type of query. + e => { + warn!(target: "sub-libp2p", "Libp2p => Unhandled Kademlia event: {:?}", e) } }, Async::Ready(NetworkBehaviourAction::DialAddress { address }) => @@ -385,9 +423,10 @@ mod tests { use futures::prelude::*; use libp2p::identity::Keypair; use libp2p::Multiaddr; - use libp2p::core::{upgrade, Swarm}; + use libp2p::core::upgrade; use libp2p::core::transport::{Transport, MemoryTransport}; use libp2p::core::upgrade::{InboundUpgradeExt, OutboundUpgradeExt}; + use libp2p::swarm::Swarm; use std::collections::HashSet; use super::{DiscoveryBehaviour, DiscoveryOut}; @@ -429,28 +468,34 @@ mod tests { .collect::>() }).collect::>(); - let fut = futures::future::poll_fn(move || -> Result<_, ()> { - loop { - let mut keep_polling = false; - + let fut = futures::future::poll_fn::<_, (), _>(move || { + 'polling: loop { for swarm_n in 0..swarms.len() { - if let Async::Ready(Some(DiscoveryOut::Discovered(other))) = - swarms[swarm_n].0.poll().unwrap() { - if to_discover[swarm_n].remove(&other) { - keep_polling = true; - // Call `add_self_reported_address` to simulate identify happening. - let addr = swarms.iter() - .find(|s| *Swarm::local_peer_id(&s.0) == other) - .unwrap() - .1.clone(); - swarms[swarm_n].0.add_self_reported_address(&other, addr); + match swarms[swarm_n].0.poll().unwrap() { + Async::Ready(Some(e)) => { + match e { + DiscoveryOut::UnroutablePeer(other) => { + // Call `add_self_reported_address` to simulate identify happening. + let addr = swarms.iter().find_map(|(s, a)| + if s.local_peer_id == other { + Some(a.clone()) + } else { + None + }) + .unwrap(); + swarms[swarm_n].0.add_self_reported_address(&other, addr); + }, + DiscoveryOut::Discovered(other) => { + to_discover[swarm_n].remove(&other); + } + _ => {} + } + continue 'polling } + _ => {} } } - - if !keep_polling { - break; - } + break } if to_discover.iter().all(|l| l.is_empty()) { diff --git a/core/network/src/custom_proto/behaviour.rs b/core/network/src/legacy_proto/behaviour.rs similarity index 90% rename from core/network/src/custom_proto/behaviour.rs rename to core/network/src/legacy_proto/behaviour.rs index f6510c1a399c57a7a21860b96e9b6d3e6f033e30..1c83329ba0e100195db9adb480b14ba58e775ea4 100644 --- a/core/network/src/custom_proto/behaviour.rs +++ b/core/network/src/legacy_proto/behaviour.rs @@ -15,25 +15,27 @@ // along with Substrate. If not, see . use crate::{DiscoveryNetBehaviour, config::ProtocolId}; -use crate::custom_proto::handler::{CustomProtoHandlerProto, CustomProtoHandlerOut, CustomProtoHandlerIn}; -use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; +use crate::legacy_proto::handler::{CustomProtoHandlerProto, CustomProtoHandlerOut, CustomProtoHandlerIn}; +use crate::legacy_proto::upgrade::RegisteredProtocol; +use crate::protocol::message::Message; use fnv::FnvHashMap; use futures::prelude::*; -use futures03::{StreamExt as _, TryStreamExt as _}; -use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; -use libp2p::core::{Multiaddr, PeerId}; +use futures03::{compat::Compat, TryFutureExt as _, StreamExt as _, TryStreamExt as _}; +use libp2p::core::{ConnectedPoint, Multiaddr, PeerId}; +use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use log::{debug, error, trace, warn}; +use rand::distributions::{Distribution as _, Uniform}; +use sr_primitives::traits::Block as BlockT; use smallvec::SmallVec; use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, pin::Pin}; use std::time::{Duration, Instant}; use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::clock::Clock; /// Network behaviour that handles opening substreams for custom protocols with other nodes. /// /// ## How it works /// -/// The role of the `CustomProto` is to synchronize the following components: +/// The role of the `LegacyProto` is to synchronize the following components: /// /// - The libp2p swarm that opens new connections and reports disconnects. /// - The connection handler (see `handler.rs`) that handles individual connections. @@ -59,9 +61,9 @@ use tokio_timer::clock::Clock; /// Note that this "banning" system is not an actual ban. If a "banned" node tries to connect to /// us, we accept the connection. The "banning" system is only about delaying dialing attempts. /// -pub struct CustomProto { +pub struct LegacyProto { /// List of protocols to open with peers. Never modified. - protocol: RegisteredProtocol, + protocol: RegisteredProtocol, /// Receiver for instructions about who to connect to or disconnect from. peerset: peerset::Peerset, @@ -78,13 +80,10 @@ pub struct CustomProto { next_incoming_index: peerset::IncomingIndex, /// Events to produce from `poll()`. - events: SmallVec<[NetworkBehaviourAction, CustomProtoOut>; 4]>, + events: SmallVec<[NetworkBehaviourAction, LegacyProtoOut>; 4]>, /// Marker to pin the generics. marker: PhantomData, - - /// `Clock` instance that uses the current execution context's source of time. - clock: Clock, } /// State of a peer we're connected to. @@ -105,7 +104,9 @@ enum PeerState { /// The peerset requested that we connect to this peer. We are not connected to this node. PendingRequest { /// When to actually start dialing. - timer: tokio_timer::Delay, + timer: Compat, + /// When the `timer` will trigger. + timer_deadline: Instant, }, /// The peerset requested that we connect to this peer. We are currently dialing this peer. @@ -135,7 +136,9 @@ enum PeerState { /// state mismatch. open: bool, /// When to enable this remote. - timer: tokio_timer::Delay, + timer: Compat, + /// When the `timer` will trigger. + timer_deadline: Instant, }, /// We are connected to this peer and the peerset has accepted it. The handler is in the @@ -184,9 +187,9 @@ struct IncomingPeer { incoming_id: peerset::IncomingIndex, } -/// Event that can be emitted by the `CustomProto`. +/// Event that can be emitted by the `LegacyProto`. #[derive(Debug)] -pub enum CustomProtoOut { +pub enum LegacyProtoOut { /// Opened a custom protocol with the remote. CustomProtocolOpen { /// Version of the protocol that has been opened. @@ -210,7 +213,7 @@ pub enum CustomProtoOut { /// Id of the peer the message came from. peer_id: PeerId, /// Message that has been received. - message: TMessage, + message: Message, }, /// The substream used by the protocol is pretty large. We should print avoid sending more @@ -219,11 +222,11 @@ pub enum CustomProtoOut { /// Id of the peer which is clogged. peer_id: PeerId, /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, + messages: Vec>, }, } -impl CustomProto { +impl LegacyProto { /// Creates a `CustomProtos`. pub fn new( protocol: impl Into, @@ -232,7 +235,7 @@ impl CustomProto { ) -> Self { let protocol = RegisteredProtocol::new(protocol, versions); - CustomProto { + LegacyProto { protocol, peerset, peers: FnvHashMap::default(), @@ -240,7 +243,6 @@ impl CustomProto { next_incoming_index: peerset::IncomingIndex(0), events: SmallVec::new(), marker: PhantomData, - clock: Clock::new(), } } @@ -277,13 +279,13 @@ impl CustomProto { st @ PeerState::Banned { .. } => *entry.into_mut() = st, // DisabledPendingEnable => Disabled. - PeerState::DisabledPendingEnable { open, connected_point, timer } => { + PeerState::DisabledPendingEnable { open, connected_point, timer_deadline, .. } => { debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()); let banned_until = Some(if let Some(ban) = ban { - cmp::max(timer.deadline(), self.clock.now() + ban) + cmp::max(timer_deadline, Instant::now() + ban) } else { - timer.deadline() + timer_deadline }); *entry.into_mut() = PeerState::Disabled { open, connected_point, banned_until } }, @@ -297,8 +299,7 @@ impl CustomProto { peer_id: peer_id.clone(), event: CustomProtoHandlerIn::Disable, }); - let clock = &self.clock; - let banned_until = ban.map(|dur| clock.now() + dur); + let banned_until = ban.map(|dur| Instant::now() + dur); *entry.into_mut() = PeerState::Disabled { open, connected_point, banned_until } }, @@ -319,8 +320,7 @@ impl CustomProto { peer_id: peer_id.clone(), event: CustomProtoHandlerIn::Disable, }); - let clock = &self.clock; - let banned_until = ban.map(|dur| clock.now() + dur); + let banned_until = ban.map(|dur| Instant::now() + dur); *entry.into_mut() = PeerState::Disabled { open: false, connected_point, banned_until } }, @@ -350,7 +350,8 @@ impl CustomProto { /// /// Also note that even we have a valid open substream, it may in fact be already closed /// without us knowing, in which case the packet will not be received. - pub fn send_packet(&mut self, target: &PeerId, message: TMessage) { + pub fn send_packet(&mut self, target: &PeerId, message: Message) + where B: BlockT { if !self.is_open(target) { return; } @@ -385,11 +386,12 @@ impl CustomProto { }; match mem::replace(occ_entry.get_mut(), PeerState::Poisoned) { - PeerState::Banned { ref until } if *until > self.clock.now() => { + PeerState::Banned { ref until } if *until > Instant::now() => { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Will start to connect at \ until {:?}", occ_entry.key(), until); *occ_entry.into_mut() = PeerState::PendingRequest { - timer: tokio_timer::Delay::new(until.clone()), + timer: futures_timer::Delay::new_at(until.clone()).compat(), + timer_deadline: until.clone(), }; }, @@ -401,13 +403,14 @@ impl CustomProto { }, PeerState::Disabled { open, ref connected_point, banned_until: Some(ref banned) } - if *banned > self.clock.now() => { + if *banned > Instant::now() => { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Has idle connection through \ {:?} but node is banned until {:?}", occ_entry.key(), connected_point, banned); *occ_entry.into_mut() = PeerState::DisabledPendingEnable { connected_point: connected_point.clone(), open, - timer: tokio_timer::Delay::new(banned.clone()), + timer: futures_timer::Delay::new_at(banned.clone()).compat(), + timer_deadline: banned.clone(), }; }, @@ -477,13 +480,13 @@ impl CustomProto { *entry.into_mut() = st; }, - PeerState::DisabledPendingEnable { open, connected_point, timer } => { + PeerState::DisabledPendingEnable { open, connected_point, timer_deadline, .. } => { debug!(target: "sub-libp2p", "PSM => Drop({:?}): Interrupting pending \ enable", entry.key()); *entry.into_mut() = PeerState::Disabled { open, connected_point, - banned_until: Some(timer.deadline()), + banned_until: Some(timer_deadline), }; }, @@ -508,9 +511,9 @@ impl CustomProto { debug!(target: "sub-libp2p", "PSM => Drop({:?}): Was not yet connected", entry.key()); entry.remove(); }, - PeerState::PendingRequest { timer } => { + PeerState::PendingRequest { timer_deadline, .. } => { debug!(target: "sub-libp2p", "PSM => Drop({:?}): Was not yet connected", entry.key()); - *entry.into_mut() = PeerState::Banned { until: timer.deadline() } + *entry.into_mut() = PeerState::Banned { until: timer_deadline } }, PeerState::Poisoned => @@ -604,7 +607,7 @@ impl CustomProto { } } -impl DiscoveryNetBehaviour for CustomProto { +impl DiscoveryNetBehaviour for LegacyProto { fn add_discovered_nodes(&mut self, peer_ids: impl Iterator) { self.peerset.discovered(peer_ids.into_iter().map(|peer_id| { debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); @@ -613,13 +616,13 @@ impl DiscoveryNetBehaviour for CustomProto NetworkBehaviour for CustomProto +impl NetworkBehaviour for LegacyProto where TSubstream: AsyncRead + AsyncWrite, - TMessage: CustomMessage, + B: BlockT, { - type ProtocolsHandler = CustomProtoHandlerProto; - type OutEvent = CustomProtoOut; + type ProtocolsHandler = CustomProtoHandlerProto; + type OutEvent = LegacyProtoOut; fn new_handler(&mut self) -> Self::ProtocolsHandler { CustomProtoHandlerProto::new(self.protocol.clone()) @@ -712,7 +715,7 @@ where } if open { debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); - let event = CustomProtoOut::CustomProtocolClosed { + let event = LegacyProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), reason: "Disconnected by libp2p".into(), }; @@ -721,15 +724,15 @@ where } } - Some(PeerState::DisabledPendingEnable { open, timer, .. }) => { + Some(PeerState::DisabledPendingEnable { open, timer_deadline, .. }) => { debug!(target: "sub-libp2p", "Libp2p => Disconnected({:?}): Was disabled \ (through {:?}) but pending enable", peer_id, endpoint); debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()); - self.peers.insert(peer_id.clone(), PeerState::Banned { until: timer.deadline() }); + self.peers.insert(peer_id.clone(), PeerState::Banned { until: timer_deadline }); if open { debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); - let event = CustomProtoOut::CustomProtocolClosed { + let event = LegacyProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), reason: "Disconnected by libp2p".into(), }; @@ -744,9 +747,14 @@ where debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()); + let ban_dur = Uniform::new(5, 10).sample(&mut rand::thread_rng()); + self.peers.insert(peer_id.clone(), PeerState::Banned { + until: Instant::now() + Duration::from_secs(ban_dur) + }); + if open { debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); - let event = CustomProtoOut::CustomProtocolClosed { + let event = LegacyProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), reason: "Disconnected by libp2p".into(), }; @@ -790,7 +798,7 @@ where PeerState::Requested | PeerState::PendingRequest { .. } => { debug!(target: "sub-libp2p", "Libp2p => Dial failure for {:?}", peer_id); *entry.into_mut() = PeerState::Banned { - until: self.clock.now() + Duration::from_secs(5) + until: Instant::now() + Duration::from_secs(5) }; debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()) @@ -817,7 +825,7 @@ where fn inject_node_event( &mut self, source: PeerId, - event: CustomProtoHandlerOut, + event: CustomProtoHandlerOut, ) { match event { CustomProtoHandlerOut::CustomProtocolClosed { reason } => { @@ -831,7 +839,7 @@ where }; debug!(target: "sub-libp2p", "External API <= Closed({:?})", source); - let event = CustomProtoOut::CustomProtocolClosed { + let event = LegacyProtoOut::CustomProtocolClosed { reason, peer_id: source.clone(), }; @@ -860,9 +868,14 @@ where debug_assert!(open); *entry.into_mut() = PeerState::Disabled { open: false, connected_point, banned_until }; }, - PeerState::DisabledPendingEnable { open, connected_point, timer } => { + PeerState::DisabledPendingEnable { open, connected_point, timer, timer_deadline } => { debug_assert!(open); - *entry.into_mut() = PeerState::DisabledPendingEnable { open: false, connected_point, timer }; + *entry.into_mut() = PeerState::DisabledPendingEnable { + open: false, + connected_point, + timer, + timer_deadline + }; }, _ => error!(target: "sub-libp2p", "State mismatch in the custom protos handler"), } @@ -884,7 +897,7 @@ where }; debug!(target: "sub-libp2p", "External API <= Open({:?})", source); - let event = CustomProtoOut::CustomProtocolOpen { + let event = LegacyProtoOut::CustomProtocolOpen { version, peer_id: source, endpoint, @@ -897,7 +910,7 @@ where debug_assert!(self.is_open(&source)); trace!(target: "sub-libp2p", "Handler({:?}) => Message", source); trace!(target: "sub-libp2p", "External API <= Message({:?})", source); - let event = CustomProtoOut::CustomMessage { + let event = LegacyProtoOut::CustomMessage { peer_id: source, message, }; @@ -911,7 +924,7 @@ where trace!(target: "sub-libp2p", "External API <= Clogged({:?})", source); warn!(target: "sub-libp2p", "Queue of packets to send to {:?} is \ pretty large", source); - self.events.push(NetworkBehaviourAction::GenerateEvent(CustomProtoOut::Clogged { + self.events.push(NetworkBehaviourAction::GenerateEvent(LegacyProtoOut::Clogged { peer_id: source, messages, })); @@ -926,6 +939,11 @@ where CustomProtoHandlerOut::ProtocolError { error, .. } => { debug!(target: "sub-libp2p", "Handler({:?}) => Severe protocol error: {:?}", source, error); + // A severe protocol error happens when we detect a "bad" node, such as a node on + // a different chain, or a node that doesn't speak the same protocol(s). We + // decrease the node's reputation, hence lowering the chances we try this node + // again in the short term. + self.peerset.report_peer(source.clone(), i32::min_value()); self.disconnect_peer_inner(&source, Some(Duration::from_secs(5))); } } @@ -936,7 +954,7 @@ where _params: &mut impl PollParameters, ) -> Async< NetworkBehaviourAction< - CustomProtoHandlerIn, + CustomProtoHandlerIn, Self::OutEvent, >, > { @@ -973,9 +991,9 @@ where for (peer_id, peer_state) in self.peers.iter_mut() { match mem::replace(peer_state, PeerState::Poisoned) { - PeerState::PendingRequest { mut timer } => { + PeerState::PendingRequest { mut timer, timer_deadline } => { if let Ok(Async::NotReady) = timer.poll() { - *peer_state = PeerState::PendingRequest { timer }; + *peer_state = PeerState::PendingRequest { timer, timer_deadline }; continue; } @@ -984,9 +1002,14 @@ where *peer_state = PeerState::Requested; } - PeerState::DisabledPendingEnable { mut timer, connected_point, open } => { + PeerState::DisabledPendingEnable { mut timer, connected_point, open, timer_deadline } => { if let Ok(Async::NotReady) = timer.poll() { - *peer_state = PeerState::DisabledPendingEnable { timer, connected_point, open }; + *peer_state = PeerState::DisabledPendingEnable { + timer, + connected_point, + open, + timer_deadline + }; continue; } diff --git a/core/network/src/custom_proto/handler.rs b/core/network/src/legacy_proto/handler.rs similarity index 85% rename from core/network/src/custom_proto/handler.rs rename to core/network/src/legacy_proto/handler.rs index 0ec60e79cd2f87d3e9d52385d0bd8630edecc63b..3fe88d3cfd410a83392cb875e8edb813854f70e3 100644 --- a/core/network/src/custom_proto/handler.rs +++ b/core/network/src/legacy_proto/handler.rs @@ -14,22 +14,25 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; -use crate::custom_proto::upgrade::{RegisteredProtocolEvent, RegisteredProtocolSubstream}; +use crate::legacy_proto::upgrade::{RegisteredProtocol, RegisteredProtocolEvent, RegisteredProtocolSubstream}; +use crate::protocol::message::Message; use futures::prelude::*; -use libp2p::core::{ - ConnectedPoint, PeerId, Endpoint, ProtocolsHandler, ProtocolsHandlerEvent, - protocols_handler::IntoProtocolsHandler, - protocols_handler::KeepAlive, - protocols_handler::ProtocolsHandlerUpgrErr, - protocols_handler::SubstreamProtocol, - upgrade::{InboundUpgrade, OutboundUpgrade} +use futures03::{compat::Compat, TryFutureExt as _}; +use futures_timer::Delay; +use libp2p::core::{ConnectedPoint, PeerId, Endpoint}; +use libp2p::core::upgrade::{InboundUpgrade, OutboundUpgrade}; +use libp2p::swarm::{ + ProtocolsHandler, ProtocolsHandlerEvent, + IntoProtocolsHandler, + KeepAlive, + ProtocolsHandlerUpgrErr, + SubstreamProtocol, }; use log::{debug, error}; +use sr_primitives::traits::Block as BlockT; use smallvec::{smallvec, SmallVec}; use std::{borrow::Cow, error, fmt, io, marker::PhantomData, mem, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::{Delay, clock::Clock}; /// Implements the `IntoProtocolsHandler` trait of libp2p. /// @@ -85,21 +88,21 @@ use tokio_timer::{Delay, clock::Clock}; /// We consider that we are now "closed" if the remote closes all the existing substreams. /// Re-opening it can then be performed by closing all active substream and re-opening one. /// -pub struct CustomProtoHandlerProto { +pub struct CustomProtoHandlerProto { /// Configuration for the protocol upgrade to negotiate. - protocol: RegisteredProtocol, + protocol: RegisteredProtocol, /// Marker to pin the generic type. marker: PhantomData, } -impl CustomProtoHandlerProto +impl CustomProtoHandlerProto where TSubstream: AsyncRead + AsyncWrite, - TMessage: CustomMessage, + B: BlockT, { /// Builds a new `CustomProtoHandlerProto`. - pub fn new(protocol: RegisteredProtocol) -> Self { + pub fn new(protocol: RegisteredProtocol) -> Self { CustomProtoHandlerProto { protocol, marker: PhantomData, @@ -107,40 +110,38 @@ where } } -impl IntoProtocolsHandler for CustomProtoHandlerProto +impl IntoProtocolsHandler for CustomProtoHandlerProto where TSubstream: AsyncRead + AsyncWrite, - TMessage: CustomMessage, + B: BlockT, { - type Handler = CustomProtoHandler; + type Handler = CustomProtoHandler; - fn inbound_protocol(&self) -> RegisteredProtocol { + fn inbound_protocol(&self) -> RegisteredProtocol { self.protocol.clone() } fn into_handler(self, remote_peer_id: &PeerId, connected_point: &ConnectedPoint) -> Self::Handler { - let clock = Clock::new(); CustomProtoHandler { protocol: self.protocol, endpoint: connected_point.to_endpoint(), remote_peer_id: remote_peer_id.clone(), state: ProtocolState::Init { substreams: SmallVec::new(), - init_deadline: Delay::new(clock.now() + Duration::from_secs(5)) + init_deadline: Delay::new(Duration::from_secs(5)).compat() }, events_queue: SmallVec::new(), - clock, } } } /// The actual handler once the connection has been established. -pub struct CustomProtoHandler { +pub struct CustomProtoHandler { /// Configuration for the protocol upgrade to negotiate. - protocol: RegisteredProtocol, + protocol: RegisteredProtocol, /// State of the communications with the remote. - state: ProtocolState, + state: ProtocolState, /// Identifier of the node we're talking to. Used only for logging purposes and shouldn't have /// any influence on the behaviour. @@ -154,36 +155,33 @@ pub struct CustomProtoHandler { /// /// This queue must only ever be modified to insert elements at the back, or remove the first /// element. - events_queue: SmallVec<[ProtocolsHandlerEvent, (), CustomProtoHandlerOut>; 16]>, - - /// `Clock` instance that uses the current execution context's source of time. - clock: Clock, + events_queue: SmallVec<[ProtocolsHandlerEvent, (), CustomProtoHandlerOut>; 16]>, } /// State of the handler. -enum ProtocolState { +enum ProtocolState { /// Waiting for the behaviour to tell the handler whether it is enabled or disabled. Init { /// List of substreams opened by the remote but that haven't been processed yet. - substreams: SmallVec<[RegisteredProtocolSubstream; 6]>, + substreams: SmallVec<[RegisteredProtocolSubstream; 6]>, /// Deadline after which the initialization is abnormally long. - init_deadline: Delay, + init_deadline: Compat, }, /// Handler is opening a substream in order to activate itself. /// If we are in this state, we haven't sent any `CustomProtocolOpen` yet. Opening { /// Deadline after which the opening is abnormally long. - deadline: Delay, + deadline: Compat, }, /// Normal operating mode. Contains the substreams that are open. /// If we are in this state, we have sent a `CustomProtocolOpen` message to the outside. Normal { /// The substreams where bidirectional communications happen. - substreams: SmallVec<[RegisteredProtocolSubstream; 4]>, + substreams: SmallVec<[RegisteredProtocolSubstream; 4]>, /// Contains substreams which are being shut down. - shutdown: SmallVec<[RegisteredProtocolSubstream; 4]>, + shutdown: SmallVec<[RegisteredProtocolSubstream; 4]>, }, /// We are disabled. Contains substreams that are being closed. @@ -191,7 +189,7 @@ enum ProtocolState { /// outside or we have never sent any `CustomProtocolOpen` in the first place. Disabled { /// List of substreams to shut down. - shutdown: SmallVec<[RegisteredProtocolSubstream; 6]>, + shutdown: SmallVec<[RegisteredProtocolSubstream; 6]>, /// If true, we should reactivate the handler after all the substreams in `shutdown` have /// been closed. @@ -212,7 +210,7 @@ enum ProtocolState { /// Event that can be received by a `CustomProtoHandler`. #[derive(Debug)] -pub enum CustomProtoHandlerIn { +pub enum CustomProtoHandlerIn { /// The node should start using custom protocols. Enable, @@ -222,13 +220,13 @@ pub enum CustomProtoHandlerIn { /// Sends a message through a custom protocol substream. SendCustomMessage { /// The message to send. - message: TMessage, + message: Message, }, } /// Event that can be emitted by a `CustomProtoHandler`. #[derive(Debug)] -pub enum CustomProtoHandlerOut { +pub enum CustomProtoHandlerOut { /// Opened a custom protocol with the remote. CustomProtocolOpen { /// Version of the protocol that has been opened. @@ -244,14 +242,14 @@ pub enum CustomProtoHandlerOut { /// Receives a message on a custom protocol substream. CustomMessage { /// Message that has been received. - message: TMessage, + message: Message, }, /// A substream to the remote is clogged. The send buffer is very large, and we should print /// a diagnostic message and/or avoid sending more data. Clogged { /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, + messages: Vec>, }, /// An error has happened on the protocol level with this node. @@ -263,10 +261,10 @@ pub enum CustomProtoHandlerOut { }, } -impl CustomProtoHandler +impl CustomProtoHandler where TSubstream: AsyncRead + AsyncWrite, - TMessage: CustomMessage, + B: BlockT, { /// Enables the handler. fn enable(&mut self) { @@ -286,7 +284,7 @@ where }); } ProtocolState::Opening { - deadline: Delay::new(self.clock.now() + Duration::from_secs(60)) + deadline: Delay::new(Duration::from_secs(60)).compat() } } else { @@ -344,7 +342,7 @@ where /// Polls the state for events. Optionally returns an event to produce. #[must_use] fn poll_state(&mut self) - -> Option, (), CustomProtoHandlerOut>> { + -> Option, (), CustomProtoHandlerOut>> { match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { error!(target: "sub-libp2p", "Handler with {:?} is in poisoned state", @@ -356,7 +354,7 @@ where ProtocolState::Init { substreams, mut init_deadline } => { match init_deadline.poll() { Ok(Async::Ready(())) => { - init_deadline.reset(self.clock.now() + Duration::from_secs(60)); + init_deadline = Delay::new(Duration::from_secs(60)).compat(); error!(target: "sub-libp2p", "Handler initialization process is too long \ with {:?}", self.remote_peer_id) }, @@ -371,7 +369,7 @@ where ProtocolState::Opening { mut deadline } => { match deadline.poll() { Ok(Async::Ready(())) => { - deadline.reset(self.clock.now() + Duration::from_secs(60)); + deadline = Delay::new(Duration::from_secs(60)).compat(); let event = CustomProtoHandlerOut::ProtocolError { is_severe: true, error: "Timeout when opening protocol".to_string().into(), @@ -385,7 +383,7 @@ where }, Err(_) => { error!(target: "sub-libp2p", "Tokio timer has errored"); - deadline.reset(self.clock.now() + Duration::from_secs(60)); + deadline = Delay::new(Duration::from_secs(60)).compat(); self.state = ProtocolState::Opening { deadline }; None }, @@ -454,7 +452,7 @@ where // after all the substreams are closed. if reenable && shutdown.is_empty() { self.state = ProtocolState::Opening { - deadline: Delay::new(self.clock.now() + Duration::from_secs(60)) + deadline: Delay::new(Duration::from_secs(60)).compat() }; Some(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(self.protocol.clone()), @@ -473,7 +471,7 @@ where /// Called by `inject_fully_negotiated_inbound` and `inject_fully_negotiated_outbound`. fn inject_fully_negotiated( &mut self, - mut substream: RegisteredProtocolSubstream + mut substream: RegisteredProtocolSubstream ) { self.state = match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { @@ -518,7 +516,7 @@ where } /// Sends a message to the remote. - fn send_message(&mut self, message: TMessage) { + fn send_message(&mut self, message: Message) { match self.state { ProtocolState::Normal { ref mut substreams, .. } => substreams[0].send_message(message), @@ -529,14 +527,14 @@ where } } -impl ProtocolsHandler for CustomProtoHandler -where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { - type InEvent = CustomProtoHandlerIn; - type OutEvent = CustomProtoHandlerOut; +impl ProtocolsHandler for CustomProtoHandler +where TSubstream: AsyncRead + AsyncWrite, B: BlockT { + type InEvent = CustomProtoHandlerIn; + type OutEvent = CustomProtoHandlerOut; type Substream = TSubstream; type Error = ConnectionKillError; - type InboundProtocol = RegisteredProtocol; - type OutboundProtocol = RegisteredProtocol; + type InboundProtocol = RegisteredProtocol; + type OutboundProtocol = RegisteredProtocol; type OutboundOpenInfo = (); fn listen_protocol(&self) -> SubstreamProtocol { @@ -558,7 +556,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { self.inject_fully_negotiated(proto); } - fn inject_event(&mut self, message: CustomProtoHandlerIn) { + fn inject_event(&mut self, message: CustomProtoHandlerIn) { match message { CustomProtoHandlerIn::Disable => self.disable(), CustomProtoHandlerIn::Enable => self.enable(), @@ -615,7 +613,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { } } -impl fmt::Debug for CustomProtoHandler +impl fmt::Debug for CustomProtoHandler where TSubstream: AsyncRead + AsyncWrite, { @@ -627,9 +625,9 @@ where /// Given a list of substreams, tries to shut them down. The substreams that have been successfully /// shut down are removed from the list. -fn shutdown_list - (list: &mut SmallVec>>) -where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { +fn shutdown_list + (list: &mut SmallVec>>) +where TSubstream: AsyncRead + AsyncWrite, B: BlockT { 'outer: for n in (0..list.len()).rev() { let mut substream = list.swap_remove(n); loop { diff --git a/core/network/src/custom_proto/mod.rs b/core/network/src/legacy_proto/mod.rs similarity index 89% rename from core/network/src/custom_proto/mod.rs rename to core/network/src/legacy_proto/mod.rs index 22c66c1654968c3d1d0f541bc9d17f51859eef1a..bbe795528be9d854217dc23a622b7bbe5fd8da36 100644 --- a/core/network/src/custom_proto/mod.rs +++ b/core/network/src/legacy_proto/mod.rs @@ -14,8 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -pub use self::behaviour::{CustomProto, CustomProtoOut}; -pub use self::upgrade::CustomMessage; +pub use self::behaviour::{LegacyProto, LegacyProtoOut}; mod behaviour; mod handler; diff --git a/core/network/src/custom_proto/tests.rs b/core/network/src/legacy_proto/tests.rs similarity index 83% rename from core/network/src/custom_proto/tests.rs rename to core/network/src/legacy_proto/tests.rs index 33ff81be4752e553172a07474a68156d00fc7850..8fd47843df2e56f07d3a2a2c77a50159400b1bbd 100644 --- a/core/network/src/custom_proto/tests.rs +++ b/core/network/src/legacy_proto/tests.rs @@ -17,24 +17,23 @@ #![cfg(test)] use futures::{future, prelude::*, try_ready}; -use libp2p::core::{nodes::Substream, swarm::Swarm}; -use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox}; -use libp2p::core::{ProtocolsHandler, protocols_handler::IntoProtocolsHandler}; -use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; -use libp2p::core::swarm::PollParameters; +use libp2p::core::nodes::Substream; +use libp2p::core::{ConnectedPoint, transport::boxed::Boxed, muxing::StreamMuxerBox}; +use libp2p::swarm::{Swarm, ProtocolsHandler, IntoProtocolsHandler}; +use libp2p::swarm::{PollParameters, NetworkBehaviour, NetworkBehaviourAction}; use libp2p::{PeerId, Multiaddr, Transport}; use rand::seq::SliceRandom; use std::{io, time::Duration, time::Instant}; use test_client::runtime::Block; -use crate::message::{Message as MessageAlias, generic::Message}; -use crate::custom_proto::{CustomProto, CustomProtoOut, CustomMessage}; +use crate::message::generic::Message; +use crate::legacy_proto::{LegacyProto, LegacyProtoOut}; /// Builds two nodes that have each other as bootstrap nodes. /// This is to be used only for testing, and a panic will happen if something goes wrong. -fn build_nodes() +fn build_nodes() -> ( - Swarm, CustomProtoWithAddr>, - Swarm, CustomProtoWithAddr> + Swarm, CustomProtoWithAddr>, + Swarm, CustomProtoWithAddr> ) { let mut out = Vec::with_capacity(2); @@ -72,7 +71,7 @@ fn build_nodes() }); let behaviour = CustomProtoWithAddr { - inner: CustomProto::new(&b"test"[..], &[1], peerset), + inner: LegacyProto::new(&b"test"[..], &[1], peerset), addrs: addrs .iter() .enumerate() @@ -84,7 +83,7 @@ fn build_nodes() .collect(), }; - let mut swarm = libp2p::core::swarm::Swarm::new( + let mut swarm = Swarm::new( transport, behaviour, keypairs[index].public().into_peer_id() @@ -101,29 +100,29 @@ fn build_nodes() } /// Wraps around the `CustomBehaviour` network behaviour, and adds hardcoded node addresses to it. -struct CustomProtoWithAddr { - inner: CustomProto>, +struct CustomProtoWithAddr { + inner: LegacyProto>, addrs: Vec<(PeerId, Multiaddr)>, } -impl std::ops::Deref for CustomProtoWithAddr { - type Target = CustomProto>; +impl std::ops::Deref for CustomProtoWithAddr { + type Target = LegacyProto>; fn deref(&self) -> &Self::Target { &self.inner } } -impl std::ops::DerefMut for CustomProtoWithAddr { +impl std::ops::DerefMut for CustomProtoWithAddr { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner } } -impl NetworkBehaviour for CustomProtoWithAddr { +impl NetworkBehaviour for CustomProtoWithAddr { type ProtocolsHandler = - > as NetworkBehaviour>::ProtocolsHandler; - type OutEvent = > as NetworkBehaviour>::OutEvent; + > as NetworkBehaviour>::ProtocolsHandler; + type OutEvent = > as NetworkBehaviour>::OutEvent; fn new_handler(&mut self) -> Self::ProtocolsHandler { self.inner.new_handler() @@ -201,12 +200,12 @@ fn two_nodes_transfer_lots_of_packets() { // substreams allowed by the multiplexer. const NUM_PACKETS: u32 = 5000; - let (mut service1, mut service2) = build_nodes::>(); + let (mut service1, mut service2) = build_nodes(); let fut1 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service1.poll()) { - Some(CustomProtoOut::CustomProtocolOpen { peer_id, .. }) => { + Some(LegacyProtoOut::CustomProtocolOpen { peer_id, .. }) => { for n in 0 .. NUM_PACKETS { service1.send_packet( &peer_id, @@ -223,8 +222,8 @@ fn two_nodes_transfer_lots_of_packets() { let fut2 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service2.poll()) { - Some(CustomProtoOut::CustomProtocolOpen { .. }) => {}, - Some(CustomProtoOut::CustomMessage { message: Message::ChainSpecific(message), .. }) => { + Some(LegacyProtoOut::CustomProtocolOpen { .. }) => {}, + Some(LegacyProtoOut::CustomMessage { message: Message::ChainSpecific(message), .. }) => { assert_eq!(message.len(), 1); packet_counter += 1; if packet_counter == NUM_PACKETS { @@ -242,7 +241,7 @@ fn two_nodes_transfer_lots_of_packets() { #[test] fn basic_two_nodes_requests_in_parallel() { - let (mut service1, mut service2) = build_nodes::>(); + let (mut service1, mut service2) = build_nodes(); // Generate random messages with or without a request id. let mut to_send = { @@ -262,7 +261,7 @@ fn basic_two_nodes_requests_in_parallel() { let fut1 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service1.poll()) { - Some(CustomProtoOut::CustomProtocolOpen { peer_id, .. }) => { + Some(LegacyProtoOut::CustomProtocolOpen { peer_id, .. }) => { for msg in to_send.drain(..) { service1.send_packet(&peer_id, msg); } @@ -275,8 +274,8 @@ fn basic_two_nodes_requests_in_parallel() { let fut2 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service2.poll()) { - Some(CustomProtoOut::CustomProtocolOpen { .. }) => {}, - Some(CustomProtoOut::CustomMessage { message, .. }) => { + Some(LegacyProtoOut::CustomProtocolOpen { .. }) => {}, + Some(LegacyProtoOut::CustomMessage { message, .. }) => { let pos = to_receive.iter().position(|m| *m == message).unwrap(); to_receive.remove(pos); if to_receive.is_empty() { @@ -297,7 +296,7 @@ fn reconnect_after_disconnect() { // We connect two nodes together, then force a disconnect (through the API of the `Service`), // check that the disconnect worked, and finally check whether they successfully reconnect. - let (mut service1, mut service2) = build_nodes::>(); + let (mut service1, mut service2) = build_nodes(); // We use the `current_thread` runtime because it doesn't require us to have `'static` futures. let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); @@ -314,7 +313,7 @@ fn reconnect_after_disconnect() { let mut service1_not_ready = false; match service1.poll().unwrap() { - Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { .. })) => { + Async::Ready(Some(LegacyProtoOut::CustomProtocolOpen { .. })) => { match service1_state { ServiceState::NotConnected => { service1_state = ServiceState::FirstConnec; @@ -326,7 +325,7 @@ fn reconnect_after_disconnect() { ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), } }, - Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { .. })) => { + Async::Ready(Some(LegacyProtoOut::CustomProtocolClosed { .. })) => { match service1_state { ServiceState::FirstConnec => service1_state = ServiceState::Disconnected, ServiceState::ConnectedAgain| ServiceState::NotConnected | @@ -338,7 +337,7 @@ fn reconnect_after_disconnect() { } match service2.poll().unwrap() { - Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { .. })) => { + Async::Ready(Some(LegacyProtoOut::CustomProtocolOpen { .. })) => { match service2_state { ServiceState::NotConnected => { service2_state = ServiceState::FirstConnec; @@ -350,7 +349,7 @@ fn reconnect_after_disconnect() { ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), } }, - Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { .. })) => { + Async::Ready(Some(LegacyProtoOut::CustomProtocolClosed { .. })) => { match service2_state { ServiceState::FirstConnec => service2_state = ServiceState::Disconnected, ServiceState::ConnectedAgain| ServiceState::NotConnected | diff --git a/core/network/src/custom_proto/upgrade.rs b/core/network/src/legacy_proto/upgrade.rs similarity index 83% rename from core/network/src/custom_proto/upgrade.rs rename to core/network/src/legacy_proto/upgrade.rs index 4cb6cb5dd9042e4333d6982eb31349565b3a5253..8831d16f91636ae0a94c1a20fd843b4d781c0a57 100644 --- a/core/network/src/custom_proto/upgrade.rs +++ b/core/network/src/legacy_proto/upgrade.rs @@ -15,12 +15,15 @@ // along with Substrate. If not, see . use crate::config::ProtocolId; +use crate::protocol::message::Message; use bytes::Bytes; use libp2p::core::{Negotiated, Endpoint, UpgradeInfo, InboundUpgrade, OutboundUpgrade, upgrade::ProtocolName}; use libp2p::tokio_codec::Framed; -use log::warn; +use log::debug; use std::{collections::VecDeque, io, marker::PhantomData, vec::IntoIter as VecIntoIter}; use futures::{prelude::*, future, stream}; +use codec::{Decode, Encode}; +use sr_primitives::traits::Block as BlockT; use tokio_io::{AsyncRead, AsyncWrite}; use unsigned_varint::codec::UviBytes; @@ -28,7 +31,7 @@ use unsigned_varint::codec::UviBytes; /// /// Note that "a single protocol" here refers to `par` for example. However /// each protocol can have multiple different versions for networking purposes. -pub struct RegisteredProtocol { +pub struct RegisteredProtocol { /// Id of the protocol for API purposes. id: ProtocolId, /// Base name of the protocol as advertised on the network. @@ -38,10 +41,10 @@ pub struct RegisteredProtocol { /// Ordered in descending order so that the best comes first. supported_versions: Vec, /// Marker to pin the generic. - marker: PhantomData, + marker: PhantomData, } -impl RegisteredProtocol { +impl RegisteredProtocol { /// Creates a new `RegisteredProtocol`. The `custom_data` parameter will be /// passed inside the `RegisteredProtocolOutput`. pub fn new(protocol: impl Into, versions: &[u8]) @@ -64,7 +67,7 @@ impl RegisteredProtocol { } } -impl Clone for RegisteredProtocol { +impl Clone for RegisteredProtocol { fn clone(&self) -> Self { RegisteredProtocol { id: self.id.clone(), @@ -76,7 +79,7 @@ impl Clone for RegisteredProtocol { } /// Output of a `RegisteredProtocol` upgrade. -pub struct RegisteredProtocolSubstream { +pub struct RegisteredProtocolSubstream { /// If true, we are in the process of closing the sink. is_closing: bool, /// Whether the local node opened this substream (dialer), or we received this substream from @@ -94,10 +97,10 @@ pub struct RegisteredProtocolSubstream { /// unless the buffer empties then fills itself again. clogged_fuse: bool, /// Marker to pin the generic. - marker: PhantomData, + marker: PhantomData, } -impl RegisteredProtocolSubstream { +impl RegisteredProtocolSubstream { /// Returns the version of the protocol that was negotiated. pub fn protocol_version(&self) -> u8 { self.protocol_version @@ -121,43 +124,33 @@ impl RegisteredProtocolSubstream { } /// Sends a message to the substream. - pub fn send_message(&mut self, data: TMessage) - where TMessage: CustomMessage { + pub fn send_message(&mut self, data: Message) + where B: BlockT { if self.is_closing { return } - self.send_queue.push_back(data.into_bytes()); + self.send_queue.push_back(data.encode()); } } -/// Implemented on messages that can be sent or received on the network. -pub trait CustomMessage { - /// Turns a message into the raw bytes to send over the network. - fn into_bytes(self) -> Vec; - - /// Tries to parse `bytes` received from the network into a message. - fn from_bytes(bytes: &[u8]) -> Result - where Self: Sized; -} - /// Event produced by the `RegisteredProtocolSubstream`. #[derive(Debug, Clone)] -pub enum RegisteredProtocolEvent { +pub enum RegisteredProtocolEvent { /// Received a message from the remote. - Message(TMessage), + Message(Message), /// Diagnostic event indicating that the connection is clogged and we should avoid sending too /// many messages to it. Clogged { /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, + messages: Vec>, }, } -impl Stream for RegisteredProtocolSubstream -where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { - type Item = RegisteredProtocolEvent; +impl Stream for RegisteredProtocolSubstream +where TSubstream: AsyncRead + AsyncWrite, B: BlockT { + type Item = RegisteredProtocolEvent; type Error = io::Error; fn poll(&mut self) -> Poll, Self::Error> { @@ -186,7 +179,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { self.clogged_fuse = true; return Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { messages: self.send_queue.iter() - .map(|m| CustomMessage::from_bytes(&m)) + .map(|m| Decode::decode(&mut &m[..])) .filter_map(Result::ok) .collect(), }))) @@ -206,9 +199,12 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { // Note that `inner` is wrapped in a `Fuse`, therefore we can poll it forever. match self.inner.poll()? { Async::Ready(Some(data)) => { - let message = ::from_bytes(&data) - .map_err(|()| { - warn!(target: "sub-libp2p", "Couldn't decode packet sent by the remote: {:?}", data); + let message = as Decode>::decode(&mut &data[..]) + .map_err(|err| { + debug!( + target: "sub-libp2p", + "Couldn't decode packet sent by the remote: {:?}: {}", data, err.what(), + ); io::ErrorKind::InvalidData })?; Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) @@ -224,7 +220,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { } } -impl UpgradeInfo for RegisteredProtocol { +impl UpgradeInfo for RegisteredProtocol { type Info = RegisteredProtocolName; type InfoIter = VecIntoIter; @@ -259,10 +255,10 @@ impl ProtocolName for RegisteredProtocolName { } } -impl InboundUpgrade for RegisteredProtocol +impl InboundUpgrade for RegisteredProtocol where TSubstream: AsyncRead + AsyncWrite, { - type Output = RegisteredProtocolSubstream; + type Output = RegisteredProtocolSubstream; type Future = future::FutureResult; type Error = io::Error; @@ -290,7 +286,7 @@ where TSubstream: AsyncRead + AsyncWrite, } } -impl OutboundUpgrade for RegisteredProtocol +impl OutboundUpgrade for RegisteredProtocol where TSubstream: AsyncRead + AsyncWrite, { type Output = >::Output; diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 98cbf75c63fcc1e813f3997e2ffa2dbb8f0803a1..e5714c66f20a52a9762e3c8687b48d12b53f4a8a 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -172,7 +172,7 @@ mod behaviour; mod chain; -mod custom_proto; +mod legacy_proto; mod debug_info; mod discovery; mod on_demand_layer; @@ -189,6 +189,7 @@ pub mod test; pub use chain::{Client as ClientHandle, FinalityProofProvider}; pub use service::{ NetworkService, NetworkWorker, TransactionPool, ExHashT, ReportHandle, + NetworkStateInfo, }; pub use protocol::{PeerInfo, Context, consensus_gossip, message, specialization}; pub use protocol::sync::SyncState; @@ -201,9 +202,9 @@ pub use on_demand_layer::{OnDemand, RemoteResponse}; // Used by the `construct_simple_protocol!` macro. #[doc(hidden)] -pub use runtime_primitives::traits::Block as BlockT; +pub use sr_primitives::traits::Block as BlockT; -use libp2p::core::nodes::ConnectedPoint; +use libp2p::core::ConnectedPoint; use serde::{Deserialize, Serialize}; use slog_derive::SerdeValue; use std::{collections::{HashMap, HashSet}, time::Duration}; diff --git a/core/network/src/on_demand_layer.rs b/core/network/src/on_demand_layer.rs index 17a70bbe0df57fe4de30b99996ece7dbc5a00e20..818230eea54b8c3ad741fa0467a141192c914c69 100644 --- a/core/network/src/on_demand_layer.rs +++ b/core/network/src/on_demand_layer.rs @@ -16,7 +16,7 @@ //! On-demand requests service. -use crate::protocol::on_demand::RequestData; +use crate::protocol::light_dispatch::RequestData; use std::sync::Arc; use futures::{prelude::*, sync::mpsc, sync::oneshot}; use futures03::compat::{Compat01As03, Future01CompatExt as _}; @@ -25,7 +25,7 @@ use client::error::Error as ClientError; use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, RemoteReadChildRequest, RemoteBodyRequest}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; /// Implements the `Fetcher` trait of the client. Makes it possible for the light client to perform /// network requests for some state. diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 50b6ad274166d55dce1ab137f5e734bddf65c539..b561322b5bbf8342d7729508152cf4116f7d8da5 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -15,16 +15,17 @@ // along with Substrate. If not, see . use crate::{DiscoveryNetBehaviour, config::ProtocolId}; -use crate::custom_proto::{CustomProto, CustomProtoOut}; +use crate::legacy_proto::{LegacyProto, LegacyProtoOut}; use futures::prelude::*; +use futures03::{StreamExt as _, TryStreamExt as _}; use libp2p::{Multiaddr, PeerId}; -use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; -use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; -use libp2p::core::protocols_handler::{ProtocolsHandler, IntoProtocolsHandler}; +use libp2p::core::{ConnectedPoint, nodes::Substream, muxing::StreamMuxerBox}; +use libp2p::swarm::{ProtocolsHandler, IntoProtocolsHandler}; +use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; use primitives::storage::StorageKey; use consensus::{import_queue::IncomingBlock, import_queue::Origin, BlockOrigin}; -use runtime_primitives::{generic::BlockId, ConsensusEngineId, Justification}; -use runtime_primitives::traits::{ +use sr_primitives::{generic::BlockId, ConsensusEngineId, Justification}; +use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, NumberFor, One, Zero, CheckedSub, SaturatedConversion }; @@ -33,7 +34,7 @@ use message::{BlockAttributes, Direction, FromBlock, Message, RequestId}; use message::generic::{Message as GenericMessage, ConsensusMessage}; use event::Event; use consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; -use on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; +use light_dispatch::{LightDispatch, LightDispatchNetwork, RequestData}; use specialization::NetworkSpecialization; use sync::{ChainSync, SyncState}; use crate::service::{TransactionPool, ExHashT}; @@ -52,7 +53,7 @@ mod util; pub mod consensus_gossip; pub mod message; pub mod event; -pub mod on_demand; +pub mod light_dispatch; pub mod specialization; pub mod sync; @@ -91,12 +92,12 @@ const RPC_FAILED_REPUTATION_CHANGE: i32 = -(1 << 12); // Lock must always be taken in order declared here. pub struct Protocol, H: ExHashT> { /// Interval at which we call `tick`. - tick_timeout: tokio_timer::Interval, + tick_timeout: Box + Send>, /// Interval at which we call `propagate_extrinsics`. - propagate_timeout: tokio_timer::Interval, + propagate_timeout: Box + Send>, config: ProtocolConfig, - /// Handler for on-demand requests. - on_demand_core: OnDemandCore, + /// Handler for light client requests. + light_dispatch: LightDispatch, genesis_hash: B::Hash, sync: ChainSync, specialization: S, @@ -110,7 +111,7 @@ pub struct Protocol, H: ExHashT> { /// When asked for a proof of finality, we use this struct to build one. finality_proof_provider: Option>>, /// Handles opening the unique substream and sending and receiving raw messages. - behaviour: CustomProto, Substream>, + behaviour: LegacyProto>, } /// A peer that we are connected to @@ -148,12 +149,12 @@ pub struct PeerInfo { pub best_number: ::Number, } -struct OnDemandIn<'a, B: BlockT> { - behaviour: &'a mut CustomProto, Substream>, +struct LightDispatchIn<'a, B: BlockT> { + behaviour: &'a mut LegacyProto>, peerset: peerset::PeersetHandle, } -impl<'a, B: BlockT> OnDemandNetwork for OnDemandIn<'a, B> { +impl<'a, B: BlockT> LightDispatchNetwork for LightDispatchIn<'a, B> { fn report_peer(&mut self, who: &PeerId, reputation: i32) { self.peerset.report_peer(who.clone(), reputation) } @@ -280,7 +281,7 @@ pub trait Context { /// Protocol context. struct ProtocolContext<'a, B: 'a + BlockT, H: 'a + ExHashT> { - behaviour: &'a mut CustomProto, Substream>, + behaviour: &'a mut LegacyProto>, context_data: &'a mut ContextData, peerset_handle: &'a peerset::PeersetHandle, } @@ -288,7 +289,7 @@ struct ProtocolContext<'a, B: 'a + BlockT, H: 'a + ExHashT> { impl<'a, B: BlockT + 'a, H: 'a + ExHashT> ProtocolContext<'a, B, H> { fn new( context_data: &'a mut ContextData, - behaviour: &'a mut CustomProto, Substream>, + behaviour: &'a mut LegacyProto>, peerset_handle: &'a peerset::PeersetHandle, ) -> Self { ProtocolContext { context_data, peerset_handle, behaviour } @@ -362,17 +363,17 @@ impl, H: ExHashT> Protocol { let sync = ChainSync::new(config.roles, chain.clone(), &info, finality_proof_request_builder); let (peerset, peerset_handle) = peerset::Peerset::from_config(peerset_config); let versions = &((MIN_VERSION as u8)..=(CURRENT_VERSION as u8)).collect::>(); - let behaviour = CustomProto::new(protocol_id, versions, peerset); + let behaviour = LegacyProto::new(protocol_id, versions, peerset); let protocol = Protocol { - tick_timeout: tokio_timer::Interval::new_interval(TICK_TIMEOUT), - propagate_timeout: tokio_timer::Interval::new_interval(PROPAGATE_TIMEOUT), + tick_timeout: Box::new(futures_timer::Interval::new(TICK_TIMEOUT).map(|v| Ok::<_, ()>(v)).compat()), + propagate_timeout: Box::new(futures_timer::Interval::new(PROPAGATE_TIMEOUT).map(|v| Ok::<_, ()>(v)).compat()), config: config, context_data: ContextData { peers: HashMap::new(), chain, }, - on_demand_core: OnDemandCore::new(checker), + light_dispatch: LightDispatch::new(checker), genesis_hash: info.chain.genesis_hash, sync, specialization: specialization, @@ -441,18 +442,23 @@ impl, H: ExHashT> Protocol { self.sync.status().num_peers } + /// Number of blocks in the import queue. + pub fn num_queued_blocks(&self) -> u32 { + self.sync.status().queued_blocks + } + /// Starts a new data demand request. /// /// The parameter contains a `Sender` where the result, once received, must be sent. - pub(crate) fn add_on_demand_request(&mut self, rq: RequestData) { - self.on_demand_core.add_request(OnDemandIn { + pub(crate) fn add_light_client_request(&mut self, rq: RequestData) { + self.light_dispatch.add_request(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, rq); } - fn is_on_demand_response(&self, who: &PeerId, response_id: message::RequestId) -> bool { - self.on_demand_core.is_on_demand_response(&who, response_id) + fn is_light_response(&self, who: &PeerId, response_id: message::RequestId) -> bool { + self.light_dispatch.is_light_response(&who, response_id) } fn handle_response( @@ -505,7 +511,7 @@ impl, H: ExHashT> Protocol { GenericMessage::BlockRequest(r) => self.on_block_request(who, r), GenericMessage::BlockResponse(r) => { // Note, this is safe because only `ordinary bodies` and `remote bodies` are received in this matter. - if self.is_on_demand_response(&who, r.id) { + if self.is_light_response(&who, r.id) { self.on_remote_body_response(who, r); } else { if let Some(request) = self.handle_response(who.clone(), &r) { @@ -628,7 +634,7 @@ impl, H: ExHashT> Protocol { } self.sync.peer_disconnected(peer.clone()); self.specialization.on_disconnect(&mut context, peer.clone()); - self.on_demand_core.on_disconnect(OnDemandIn { + self.light_dispatch.on_disconnect(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, peer); @@ -792,7 +798,7 @@ impl, H: ExHashT> Protocol { &mut ProtocolContext::new(&mut self.context_data, &mut self.behaviour, &self.peerset_handle) ); self.maintain_peers(); - self.on_demand_core.maintain_peers(OnDemandIn { + self.light_dispatch.maintain_peers(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }); @@ -913,7 +919,7 @@ impl, H: ExHashT> Protocol { }; let info = self.context_data.peers.get(&who).expect("We just inserted above; QED").info.clone(); - self.on_demand_core.on_connect(OnDemandIn { + self.light_dispatch.on_connect(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who.clone(), status.roles, status.best_number); @@ -1052,7 +1058,7 @@ impl, H: ExHashT> Protocol { peer.known_blocks.insert(hash.clone()); } } - self.on_demand_core.on_block_announce(OnDemandIn { + self.light_dispatch.update_best_number(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who.clone(), *header.number()); @@ -1252,7 +1258,7 @@ impl, H: ExHashT> Protocol { response: message::RemoteCallResponse ) { trace!(target: "sync", "Remote call response {} from {}", response.id, who); - self.on_demand_core.on_remote_call_response(OnDemandIn { + self.light_dispatch.on_remote_call_response(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who, response); @@ -1293,7 +1299,7 @@ impl, H: ExHashT> Protocol { response: message::RemoteReadResponse ) { trace!(target: "sync", "Remote read response {} from {}", response.id, who); - self.on_demand_core.on_remote_read_response(OnDemandIn { + self.light_dispatch.on_remote_read_response(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who, response); @@ -1334,7 +1340,7 @@ impl, H: ExHashT> Protocol { response: message::RemoteHeaderResponse, ) { trace!(target: "sync", "Remote header proof response {} from {}", response.id, who); - self.on_demand_core.on_remote_header_response(OnDemandIn { + self.light_dispatch.on_remote_header_response(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who, response); @@ -1400,7 +1406,7 @@ impl, H: ExHashT> Protocol { who, response.max ); - self.on_demand_core.on_remote_changes_response(OnDemandIn { + self.light_dispatch.on_remote_changes_response(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, who, response); @@ -1461,7 +1467,7 @@ impl, H: ExHashT> Protocol { peer: PeerId, response: message::BlockResponse ) { - self.on_demand_core.on_remote_body_response(OnDemandIn { + self.light_dispatch.on_remote_body_response(LightDispatchIn { behaviour: &mut self.behaviour, peerset: self.peerset_handle.clone(), }, peer, response); @@ -1478,7 +1484,7 @@ pub enum CustomMessageOutcome { } fn send_message( - behaviour: &mut CustomProto, Substream>, + behaviour: &mut LegacyProto>, peers: &mut HashMap>, who: PeerId, mut message: Message, @@ -1499,7 +1505,7 @@ fn send_message( impl, H: ExHashT> NetworkBehaviour for Protocol { - type ProtocolsHandler = , Substream> as NetworkBehaviour>::ProtocolsHandler; + type ProtocolsHandler = > as NetworkBehaviour>::ProtocolsHandler; type OutEvent = CustomMessageOutcome; fn new_handler(&mut self) -> Self::ProtocolsHandler { @@ -1567,7 +1573,7 @@ Protocol { }; let outcome = match event { - CustomProtoOut::CustomProtocolOpen { peer_id, version, .. } => { + LegacyProtoOut::CustomProtocolOpen { peer_id, version, .. } => { debug_assert!( version <= CURRENT_VERSION as u8 && version >= MIN_VERSION as u8 @@ -1575,13 +1581,13 @@ Protocol { self.on_peer_connected(peer_id); CustomMessageOutcome::None } - CustomProtoOut::CustomProtocolClosed { peer_id, .. } => { + LegacyProtoOut::CustomProtocolClosed { peer_id, .. } => { self.on_peer_disconnected(peer_id); CustomMessageOutcome::None }, - CustomProtoOut::CustomMessage { peer_id, message } => + LegacyProtoOut::CustomMessage { peer_id, message } => self.on_custom_message(peer_id, message), - CustomProtoOut::Clogged { peer_id, messages } => { + LegacyProtoOut::Clogged { peer_id, messages } => { debug!(target: "sync", "{} clogging messages:", messages.len()); for msg in messages.into_iter().take(5) { debug!(target: "sync", "{:?}", msg); diff --git a/core/network/src/protocol/consensus_gossip.rs b/core/network/src/protocol/consensus_gossip.rs index f1343269596aa1c5eb7784be54e4fe08ffc3c000..328fe197ea54055ed0a3cde9c70437dae4128b19 100644 --- a/core/network/src/protocol/consensus_gossip.rs +++ b/core/network/src/protocol/consensus_gossip.rs @@ -25,8 +25,8 @@ use log::{trace, debug}; use futures::sync::mpsc; use lru_cache::LruCache; use libp2p::PeerId; -use runtime_primitives::traits::{Block as BlockT, Hash, HashFor}; -use runtime_primitives::ConsensusEngineId; +use sr_primitives::traits::{Block as BlockT, Hash, HashFor}; +use sr_primitives::ConsensusEngineId; pub use crate::message::generic::{Message, ConsensusMessage}; use crate::protocol::Context; use crate::config::Roles; @@ -554,9 +554,31 @@ impl ConsensusGossip { } } +/// A gossip message validator that discards all messages. +pub struct DiscardAll; + +impl Validator for DiscardAll { + fn validate( + &self, + _context: &mut dyn ValidatorContext, + _sender: &PeerId, + _data: &[u8], + ) -> ValidationResult { + ValidationResult::Discard + } + + fn message_expired<'a>(&'a self) -> Box bool + 'a> { + Box::new(move |_topic, _data| true) + } + + fn message_allowed<'a>(&'a self) -> Box bool + 'a> { + Box::new(move |_who, _intent, _topic, _data| false) + } +} + #[cfg(test)] mod tests { - use runtime_primitives::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::testing::{H256, Block as RawBlock, ExtrinsicWrapper}; use futures::Stream; use super::*; diff --git a/core/network/src/protocol/on_demand.rs b/core/network/src/protocol/light_dispatch.rs similarity index 68% rename from core/network/src/protocol/on_demand.rs rename to core/network/src/protocol/light_dispatch.rs index 76c926df107c868662612bec6c5ae23e1a463e96..a7b327686af606e6dec4f68252d20fd3ee5e0e30 100644 --- a/core/network/src/protocol/on_demand.rs +++ b/core/network/src/protocol/light_dispatch.rs @@ -14,7 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! On-demand requests service. +//! Light client requests service. +//! +//! Handles requests for data coming from our local light client and that must be answered by +//! nodes on the network. use std::collections::{HashMap, VecDeque}; use std::sync::Arc; @@ -29,7 +32,7 @@ use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; use libp2p::PeerId; use crate::config::Roles; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; /// Remote request timeout. const REQUEST_TIMEOUT: Duration = Duration::from_secs(15); @@ -38,8 +41,8 @@ const RETRY_COUNT: usize = 1; /// Reputation change for a peer when a request timed out. const TIMEOUT_REPUTATION_CHANGE: i32 = -(1 << 8); -/// Trait used by the `OnDemandCore` service to communicate messages back to the network. -pub trait OnDemandNetwork { +/// Trait used by the `LightDispatch` service to communicate messages back to the network. +pub trait LightDispatchNetwork { /// Adjusts the reputation of the given peer. fn report_peer(&mut self, who: &PeerId, reputation_change: i32); @@ -97,19 +100,30 @@ pub trait OnDemandNetwork { ); } -/// On-demand requests service. Dispatches requests to appropriate peers. -pub struct OnDemandCore { +/// Light client requests service. Dispatches requests to appropriate peers. +pub struct LightDispatch { + /// Verifies that responses are correct. Passed at initialization. checker: Arc>, + /// Numeric ID to assign to the next outgoing request. Used to assign responses to their + /// corresponding request. next_request_id: u64, + /// Requests that we have yet to send out on the network. pending_requests: VecDeque>, + /// List of nodes to which we have sent a request and that are yet to answer. active_peers: LinkedHashMap>, + /// List of nodes that we know of that aren't doing anything and that are available for new + /// requests. idle_peers: VecDeque, + /// Best known block for each node in `active_peers` and `idle_peers`. best_blocks: HashMap>, } struct Request { id: u64, + /// When the request got created or sent out to the network. timestamp: Instant, + /// Number of remaining attempts to fulfill this request. If it reaches 0, we interrupt the + /// attempt. retry_count: usize, data: RequestData, } @@ -196,12 +210,12 @@ impl FetchChecker for AlwaysBadChecker { } } -impl OnDemandCore where +impl LightDispatch where B::Header: HeaderT, { - /// Creates new on-demand requests processer. + /// Creates new light client requests processer. pub fn new(checker: Arc>) -> Self { - OnDemandCore { + LightDispatch { checker, next_request_id: 0, pending_requests: VecDeque::new(), @@ -212,7 +226,7 @@ impl OnDemandCore where } /// Inserts a new request in the list of requests to execute. - pub(crate) fn add_request(&mut self, network: impl OnDemandNetwork, data: RequestData) { + pub(crate) fn add_request(&mut self, network: impl LightDispatchNetwork, data: RequestData) { self.insert(RETRY_COUNT, data); self.dispatch(network); } @@ -234,7 +248,7 @@ impl OnDemandCore where fn accept_response( &mut self, rtype: &str, - mut network: impl OnDemandNetwork, + mut network: impl LightDispatchNetwork, peer: PeerId, request_id: u64, try_accept: impl FnOnce(Request, &Arc>) -> Accept @@ -284,9 +298,10 @@ impl OnDemandCore where self.dispatch(network); } + /// Call this when we connect to a node on the network. pub fn on_connect( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, role: Roles, best_number: NumberFor @@ -301,17 +316,20 @@ impl OnDemandCore where self.dispatch(network); } - pub fn on_block_announce(&mut self, network: impl OnDemandNetwork, peer: PeerId, best_number: NumberFor) { + /// Sets the best seen block for the given node. + pub fn update_best_number(&mut self, network: impl LightDispatchNetwork, peer: PeerId, best_number: NumberFor) { self.best_blocks.insert(peer, best_number); self.dispatch(network); } - pub fn on_disconnect(&mut self, network: impl OnDemandNetwork, peer: PeerId) { + /// Call this when we disconnect from a node. + pub fn on_disconnect(&mut self, network: impl LightDispatchNetwork, peer: PeerId) { self.remove_peer(peer); self.dispatch(network); } - pub fn maintain_peers(&mut self, mut network: impl OnDemandNetwork) { + /// Must be called periodically in order to perform maintenance. + pub fn maintain_peers(&mut self, mut network: impl LightDispatchNetwork) { let now = Instant::now(); loop { @@ -329,9 +347,10 @@ impl OnDemandCore where self.dispatch(network); } + /// Handles a remote header response message from on the network. pub fn on_remote_header_response( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, response: message::RemoteHeaderResponse ) { @@ -352,9 +371,10 @@ impl OnDemandCore where }) } + /// Handles a remote read response message from on the network. pub fn on_remote_read_response( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, response: message::RemoteReadResponse ) { @@ -387,9 +407,10 @@ impl OnDemandCore where }) } + /// Handles a remote call response message from on the network. pub fn on_remote_call_response( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, response: message::RemoteCallResponse ) { @@ -406,9 +427,10 @@ impl OnDemandCore where }) } + /// Handles a remote changes response message from on the network. pub fn on_remote_changes_response( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, response: message::RemoteChangesResponse, B::Hash> ) { @@ -431,9 +453,10 @@ impl OnDemandCore where }) } + /// Handles a remote body response message from on the network. pub fn on_remote_body_response( &mut self, - network: impl OnDemandNetwork, + network: impl LightDispatchNetwork, peer: PeerId, response: message::BlockResponse ) { @@ -466,7 +489,7 @@ impl OnDemandCore where }) } - pub fn is_on_demand_response(&self, peer: &PeerId, request_id: message::RequestId) -> bool { + pub fn is_light_response(&self, peer: &PeerId, request_id: message::RequestId) -> bool { self.active_peers.get(&peer).map_or(false, |r| r.id == request_id) } @@ -483,7 +506,10 @@ impl OnDemandCore where } } - pub fn remove_peer(&mut self, peer: PeerId) { + /// Removes a peer from the list of known peers. + /// + /// Puts back the active request that this node was performing into `pending_requests`. + fn remove_peer(&mut self, peer: PeerId) { self.best_blocks.remove(&peer); if let Some(request) = self.active_peers.remove(&peer) { @@ -497,7 +523,7 @@ impl OnDemandCore where } /// Dispatches pending requests. - fn dispatch(&mut self, mut network: impl OnDemandNetwork) { + fn dispatch(&mut self, mut network: impl LightDispatchNetwork) { let mut last_peer = self.idle_peers.back().cloned(); let mut unhandled_requests = VecDeque::new(); @@ -551,6 +577,8 @@ impl OnDemandCore where } impl Request { + /// Returns the block that the remote needs to have in order to be able to fulfill + /// this request. fn required_block(&self) -> NumberFor { match self.data { RequestData::RemoteHeader(ref data, _) => data.block, @@ -562,7 +590,7 @@ impl Request { } } - fn send_to(&self, out: &mut impl OnDemandNetwork, peer: &PeerId) { + fn send_to(&self, out: &mut impl LightDispatchNetwork, peer: &PeerId) { match self.data { RequestData::RemoteHeader(ref data, _) => out.send_header_request( @@ -637,7 +665,7 @@ pub mod tests { use std::sync::Arc; use std::time::Instant; use futures::{Future, sync::oneshot}; - use runtime_primitives::traits::{Block as BlockT, NumberFor, Header as HeaderT}; + use sr_primitives::traits::{Block as BlockT, NumberFor, Header as HeaderT}; use client::{error::{Error as ClientError, Result as ClientResult}}; use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, ChangesProof, RemoteCallRequest, RemoteReadRequest, @@ -645,7 +673,7 @@ pub mod tests { use crate::config::Roles; use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; use libp2p::PeerId; - use super::{REQUEST_TIMEOUT, OnDemandCore, OnDemandNetwork, RequestData}; + use super::{REQUEST_TIMEOUT, LightDispatch, LightDispatchNetwork, RequestData}; use test_client::runtime::{changes_trie_config, Block, Extrinsic, Header}; struct DummyFetchChecker { ok: bool } @@ -711,21 +739,21 @@ pub mod tests { } } - fn dummy(ok: bool) -> OnDemandCore { - OnDemandCore::new(Arc::new(DummyFetchChecker { ok })) + fn dummy(ok: bool) -> LightDispatch { + LightDispatch::new(Arc::new(DummyFetchChecker { ok })) } - fn total_peers(on_demand: &OnDemandCore) -> usize { - on_demand.idle_peers.len() + on_demand.active_peers.len() + fn total_peers(light_dispatch: &LightDispatch) -> usize { + light_dispatch.idle_peers.len() + light_dispatch.active_peers.len() } fn receive_call_response( - network_interface: impl OnDemandNetwork, - on_demand: &mut OnDemandCore, + network_interface: impl LightDispatchNetwork, + light_dispatch: &mut LightDispatch, peer: PeerId, id: message::RequestId ) { - on_demand.on_remote_call_response(network_interface, peer, message::RemoteCallResponse { + light_dispatch.on_remote_call_response(network_interface, peer, message::RemoteCallResponse { id: id, proof: vec![vec![2]], }); @@ -746,7 +774,7 @@ pub mod tests { disconnected_peers: HashSet, } - impl<'a, B: BlockT> OnDemandNetwork for &'a mut DummyNetwork { + impl<'a, B: BlockT> LightDispatchNetwork for &'a mut DummyNetwork { fn report_peer(&mut self, _: &PeerId, _: i32) {} fn disconnect_peer(&mut self, who: &PeerId) { self.disconnected_peers.insert(who.clone()); @@ -769,16 +797,16 @@ pub mod tests { #[test] fn knows_about_peers_roles() { let mut network_interface = DummyNetwork::default(); - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let peer0 = PeerId::random(); let peer1 = PeerId::random(); let peer2 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0, Roles::LIGHT, 1000); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 2000); - on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::AUTHORITY, 3000); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.best_blocks.get(&peer1), Some(&2000)); - assert_eq!(on_demand.best_blocks.get(&peer2), Some(&3000)); + light_dispatch.on_connect(&mut network_interface, peer0, Roles::LIGHT, 1000); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 2000); + light_dispatch.on_connect(&mut network_interface, peer2.clone(), Roles::AUTHORITY, 3000); + assert_eq!(vec![peer1.clone(), peer2.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert_eq!(light_dispatch.best_blocks.get(&peer1), Some(&2000)); + assert_eq!(light_dispatch.best_blocks.get(&peer2), Some(&3000)); } #[test] @@ -786,69 +814,69 @@ pub mod tests { let peer0 = PeerId::random(); let mut network_interface = DummyNetwork::default(); - let mut on_demand = dummy(true); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 100); - assert_eq!(1, total_peers(&on_demand)); - assert!(!on_demand.best_blocks.is_empty()); - - on_demand.on_disconnect(&mut network_interface, peer0); - assert_eq!(0, total_peers(&on_demand)); - assert!(on_demand.best_blocks.is_empty()); + let mut light_dispatch = dummy(true); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 100); + assert_eq!(1, total_peers(&light_dispatch)); + assert!(!light_dispatch.best_blocks.is_empty()); + + light_dispatch.on_disconnect(&mut network_interface, peer0); + assert_eq!(0, total_peers(&light_dispatch)); + assert!(light_dispatch.best_blocks.is_empty()); } #[test] fn disconnects_from_timeouted_peer() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); let peer1 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 1000); - assert_eq!(vec![peer0.clone(), peer1.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert!(on_demand.active_peers.is_empty()); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 1000); + assert_eq!(vec![peer0.clone(), peer1.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert!(light_dispatch.active_peers.is_empty()); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: None, }, oneshot::channel().0)); - assert_eq!(vec![peer1.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert_eq!(vec![peer0.clone()], on_demand.active_peers.keys().cloned().collect::>()); + assert_eq!(vec![peer1.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert_eq!(vec![peer0.clone()], light_dispatch.active_peers.keys().cloned().collect::>()); - on_demand.active_peers[&peer0].timestamp = Instant::now() - REQUEST_TIMEOUT - REQUEST_TIMEOUT; - on_demand.maintain_peers(&mut network_interface); - assert!(on_demand.idle_peers.is_empty()); - assert_eq!(vec![peer1.clone()], on_demand.active_peers.keys().cloned().collect::>()); + light_dispatch.active_peers[&peer0].timestamp = Instant::now() - REQUEST_TIMEOUT - REQUEST_TIMEOUT; + light_dispatch.maintain_peers(&mut network_interface); + assert!(light_dispatch.idle_peers.is_empty()); + assert_eq!(vec![peer1.clone()], light_dispatch.active_peers.keys().cloned().collect::>()); assert_disconnected_peer(&network_interface); } #[test] fn disconnects_from_peer_on_response_with_wrong_id() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let peer0 = PeerId::random(); let mut network_interface = DummyNetwork::default(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: None, }, oneshot::channel().0)); - receive_call_response(&mut network_interface, &mut on_demand, peer0, 1); + receive_call_response(&mut network_interface, &mut light_dispatch, peer0, 1); assert_disconnected_peer(&network_interface); - assert_eq!(on_demand.pending_requests.len(), 1); + assert_eq!(light_dispatch.pending_requests.len(), 1); } #[test] fn disconnects_from_peer_on_incorrect_response() { - let mut on_demand = dummy(false); + let mut light_dispatch = dummy(false); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), @@ -856,31 +884,31 @@ pub mod tests { retry_count: Some(1), }, oneshot::channel().0)); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + receive_call_response(&mut network_interface, &mut light_dispatch, peer0.clone(), 0); assert_disconnected_peer(&network_interface); - assert_eq!(on_demand.pending_requests.len(), 1); + assert_eq!(light_dispatch.pending_requests.len(), 1); } #[test] fn disconnects_from_peer_on_unexpected_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - receive_call_response(&mut network_interface, &mut on_demand, peer0, 0); + receive_call_response(&mut network_interface, &mut light_dispatch, peer0, 0); assert_disconnected_peer(&network_interface); } #[test] fn disconnects_from_peer_on_wrong_response_type() { - let mut on_demand = dummy(false); + let mut light_dispatch = dummy(false); let peer0 = PeerId::random(); let mut network_interface = DummyNetwork::default(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), @@ -888,159 +916,122 @@ pub mod tests { retry_count: Some(1), }, oneshot::channel().0)); - on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { + light_dispatch.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], }); assert_disconnected_peer(&network_interface); - assert_eq!(on_demand.pending_requests.len(), 1); + assert_eq!(light_dispatch.pending_requests.len(), 1); } #[test] fn receives_remote_failure_after_retry_count_failures() { - use parking_lot::{Condvar, Mutex}; - let retry_count = 2; let peer_ids = (0 .. retry_count + 1).map(|_| PeerId::random()).collect::>(); - let mut on_demand = dummy(false); + let mut light_dispatch = dummy(false); let mut network_interface = DummyNetwork::default(); for i in 0..retry_count+1 { - on_demand.on_connect(&mut network_interface, peer_ids[i].clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer_ids[i].clone(), Roles::FULL, 1000); } - let sync = Arc::new((Mutex::new(0), Mutex::new(0), Condvar::new())); - let thread_sync = sync.clone(); - - let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + let (tx, mut response) = oneshot::channel(); + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: Some(retry_count) }, tx)); - let thread = ::std::thread::spawn(move || { - let &(ref current, ref finished_at, ref finished) = &*thread_sync; - let _ = response.wait().unwrap().unwrap_err(); - *finished_at.lock() = *current.lock(); - finished.notify_one(); - }); - let &(ref current, ref finished_at, ref finished) = &*sync; - for i in 0..retry_count+1 { - let mut current = current.lock(); - *current = *current + 1; - receive_call_response(&mut network_interface, &mut on_demand, peer_ids[i].clone(), i as u64); + for i in 0..retry_count { + assert!(response.try_recv().unwrap().is_none()); + receive_call_response(&mut network_interface, &mut light_dispatch, peer_ids[i].clone(), i as u64); } - let mut finished_at = finished_at.lock(); - assert!(!finished.wait_for(&mut finished_at, ::std::time::Duration::from_millis(1000)).timed_out()); - assert_eq!(*finished_at, retry_count + 1); - - thread.join().unwrap(); + assert!(response.try_recv().unwrap().unwrap().is_err()); } #[test] fn receives_remote_call_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: None, }, tx)); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap().unwrap(); - assert_eq!(result, vec![42]); - }); - receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); - thread.join().unwrap(); + receive_call_response(&mut network_interface, &mut light_dispatch, peer0.clone(), 0); + assert_eq!(response.wait().unwrap().unwrap(), vec![42]); } #[test] fn receives_remote_read_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteRead(RemoteReadRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteRead(RemoteReadRequest { header: dummy_header(), block: Default::default(), key: b":key".to_vec(), retry_count: None, }, tx)); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap().unwrap(); - assert_eq!(result, Some(vec![42])); - }); - on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { + light_dispatch.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], }); - thread.join().unwrap(); + assert_eq!(response.wait().unwrap().unwrap(), Some(vec![42])); } #[test] fn receives_remote_read_child_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteReadChild(RemoteReadChildRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteReadChild(RemoteReadChildRequest { header: dummy_header(), block: Default::default(), storage_key: b":child_storage:sub".to_vec(), key: b":key".to_vec(), retry_count: None, }, tx)); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap().unwrap(); - assert_eq!(result, Some(vec![42])); - }); - on_demand.on_remote_read_response(&mut network_interface, + light_dispatch.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], }); - thread.join().unwrap(); + assert_eq!(response.wait().unwrap().unwrap(), Some(vec![42])); } #[test] fn receives_remote_header_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 1, retry_count: None, }, tx)); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap().unwrap(); - assert_eq!( - result.hash(), - "6443a0b46e0412e626363028115a9f2c\ - f963eeed526b8b33e5316f08b50d0dc3".parse().unwrap() - ); - }); - on_demand.on_remote_header_response(&mut network_interface, peer0.clone(), message::RemoteHeaderResponse { + light_dispatch.on_remote_header_response(&mut network_interface, peer0.clone(), message::RemoteHeaderResponse { id: 0, header: Some(Header { parent_hash: Default::default(), @@ -1051,18 +1042,21 @@ pub mod tests { }), proof: vec![vec![2]], }); - thread.join().unwrap(); + assert_eq!( + response.wait().unwrap().unwrap().hash(), + "6443a0b46e0412e626363028115a9f2cf963eeed526b8b33e5316f08b50d0dc3".parse().unwrap(), + ); } #[test] fn receives_remote_changes_response() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + light_dispatch.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); let (tx, response) = oneshot::channel(); - on_demand.add_request(&mut network_interface, RequestData::RemoteChanges(RemoteChangesRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteChanges(RemoteChangesRequest { changes_trie_config: changes_trie_config(), first_block: (1, Default::default()), last_block: (100, Default::default()), @@ -1071,69 +1065,65 @@ pub mod tests { key: vec![], retry_count: None, }, tx)); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap().unwrap(); - assert_eq!(result, vec![(100, 2)]); - }); - on_demand.on_remote_changes_response(&mut network_interface, peer0.clone(), message::RemoteChangesResponse { + light_dispatch.on_remote_changes_response(&mut network_interface, peer0.clone(), message::RemoteChangesResponse { id: 0, max: 1000, proof: vec![vec![2]], roots: vec![], roots_proof: vec![], }); - thread.join().unwrap(); + assert_eq!(response.wait().unwrap().unwrap(), vec![(100, 2)]); } #[test] fn does_not_sends_request_to_peer_who_has_no_required_block() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let peer2 = PeerId::random(); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 100); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 100); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 200, retry_count: None, }, oneshot::channel().0)); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, }, oneshot::channel().0)); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, }, oneshot::channel().0)); - on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 150); + light_dispatch.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 150); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.pending_requests.len(), 3); + assert_eq!(vec![peer1.clone(), peer2.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert_eq!(light_dispatch.pending_requests.len(), 3); - on_demand.on_block_announce(&mut network_interface, peer1.clone(), 250); + light_dispatch.update_best_number(&mut network_interface, peer1.clone(), 250); - assert_eq!(vec![peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.pending_requests.len(), 2); + assert_eq!(vec![peer2.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert_eq!(light_dispatch.pending_requests.len(), 2); - on_demand.on_block_announce(&mut network_interface, peer2.clone(), 250); + light_dispatch.update_best_number(&mut network_interface, peer2.clone(), 250); - assert!(!on_demand.idle_peers.iter().any(|_| true)); - assert_eq!(on_demand.pending_requests.len(), 1); + assert!(!light_dispatch.idle_peers.iter().any(|_| true)); + assert_eq!(light_dispatch.pending_requests.len(), 1); - on_demand.on_remote_header_response(&mut network_interface, peer1.clone(), message::RemoteHeaderResponse { + light_dispatch.on_remote_header_response(&mut network_interface, peer1.clone(), message::RemoteHeaderResponse { id: 0, header: Some(dummy_header()), proof: vec![], }); - assert!(!on_demand.idle_peers.iter().any(|_| true)); - assert_eq!(on_demand.pending_requests.len(), 0); + assert!(!light_dispatch.idle_peers.iter().any(|_| true)); + assert_eq!(light_dispatch.pending_requests.len(), 0); } #[test] @@ -1141,70 +1131,70 @@ pub mod tests { // this test is a regression for a bug where the dispatch function would // loop forever after dispatching a request to the last peer, since the // last peer was not updated - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let peer2 = PeerId::random(); let peer3 = PeerId::random(); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, }, oneshot::channel().0)); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, }, oneshot::channel().0)); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 200); - on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 200); - on_demand.on_connect(&mut network_interface, peer3.clone(), Roles::FULL, 250); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 200); + light_dispatch.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 200); + light_dispatch.on_connect(&mut network_interface, peer3.clone(), Roles::FULL, 250); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.pending_requests.len(), 1); + assert_eq!(vec![peer1.clone(), peer2.clone()], light_dispatch.idle_peers.iter().cloned().collect::>()); + assert_eq!(light_dispatch.pending_requests.len(), 1); } #[test] fn tries_to_send_all_pending_requests() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 300, retry_count: None, }, oneshot::channel().0)); - on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, }, oneshot::channel().0)); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); - assert!(on_demand.idle_peers.iter().cloned().collect::>().is_empty()); - assert_eq!(on_demand.pending_requests.len(), 1); + assert!(light_dispatch.idle_peers.iter().cloned().collect::>().is_empty()); + assert_eq!(light_dispatch.pending_requests.len(), 1); } #[test] fn remote_body_with_one_block_body_should_succeed() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let header = dummy_header(); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); - on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { header: header.clone(), retry_count: None, }, oneshot::channel().0)); - assert!(on_demand.pending_requests.is_empty()); - assert_eq!(on_demand.active_peers.len(), 1); + assert!(light_dispatch.pending_requests.is_empty()); + assert_eq!(light_dispatch.active_peers.len(), 1); let block = message::BlockData:: { hash: primitives::H256::random(), @@ -1220,28 +1210,28 @@ pub mod tests { blocks: vec![block], }; - on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); + light_dispatch.on_remote_body_response(&mut network_interface, peer1.clone(), response); - assert!(on_demand.active_peers.is_empty()); - assert_eq!(on_demand.idle_peers.len(), 1); + assert!(light_dispatch.active_peers.is_empty()); + assert_eq!(light_dispatch.idle_peers.len(), 1); } #[test] fn remote_body_with_three_bodies_should_fail() { - let mut on_demand = dummy(true); + let mut light_dispatch = dummy(true); let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let header = dummy_header(); - on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + light_dispatch.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); - on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { + light_dispatch.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { header: header.clone(), retry_count: None, }, oneshot::channel().0)); - assert!(on_demand.pending_requests.is_empty()); - assert_eq!(on_demand.active_peers.len(), 1); + assert!(light_dispatch.pending_requests.is_empty()); + assert_eq!(light_dispatch.active_peers.len(), 1); let response = { let blocks: Vec<_> = (0..3).map(|_| message::BlockData:: { @@ -1259,8 +1249,8 @@ pub mod tests { } }; - on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); - assert!(on_demand.active_peers.is_empty()); - assert!(on_demand.idle_peers.is_empty(), "peer should be disconnected after bad response"); + light_dispatch.on_remote_body_response(&mut network_interface, peer1.clone(), response); + assert!(light_dispatch.active_peers.is_empty()); + assert!(light_dispatch.idle_peers.is_empty(), "peer should be disconnected after bad response"); } } diff --git a/core/network/src/protocol/message.rs b/core/network/src/protocol/message.rs index 7b9b684cd8bfed9dae9a7004cc3681b57d226e94..4110970f99cec48c97a5e706ea4dafa4567cd1ba 100644 --- a/core/network/src/protocol/message.rs +++ b/core/network/src/protocol/message.rs @@ -17,8 +17,8 @@ //! Network packet message types. These get serialized and put into the lower level protocol payload. use bitflags::bitflags; -use runtime_primitives::{ConsensusEngineId, traits::{Block as BlockT, Header as HeaderT}}; -use parity_codec::{Encode, Decode, Input, Output}; +use sr_primitives::{ConsensusEngineId, traits::{Block as BlockT, Header as HeaderT}}; +use codec::{Encode, Decode, Input, Output, Error}; pub use self::generic::{ BlockAnnounce, RemoteCallRequest, RemoteReadRequest, RemoteHeaderRequest, RemoteHeaderResponse, @@ -90,9 +90,11 @@ impl Encode for BlockAttributes { } } +impl codec::EncodeLike for BlockAttributes {} + impl Decode for BlockAttributes { - fn decode(input: &mut I) -> Option { - Self::from_bits(input.read_byte()?) + fn decode(input: &mut I) -> Result { + Self::from_bits(input.read_byte()?).ok_or_else(|| Error::from("Invalid bytes")) } } @@ -125,9 +127,8 @@ pub struct RemoteReadResponse { /// Generic types. pub mod generic { - use crate::custom_proto::CustomMessage; - use parity_codec::{Encode, Decode}; - use runtime_primitives::Justification; + use codec::{Encode, Decode}; + use sr_primitives::Justification; use crate::config::Roles; use super::{ RemoteReadResponse, Transactions, Direction, @@ -210,18 +211,6 @@ pub mod generic { ChainSpecific(Vec), } - impl CustomMessage for Message - where Self: Decode + Encode - { - fn into_bytes(self) -> Vec { - self.encode() - } - - fn from_bytes(bytes: &[u8]) -> Result { - Decode::decode(&mut &bytes[..]).ok_or(()) - } - } - /// Status sent on connection. #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] pub struct Status { diff --git a/core/network/src/protocol/specialization.rs b/core/network/src/protocol/specialization.rs index 7f6b7dc44f716a2fecb18b84dbeacf6f1cd32093..e2c444ea889d6b8d336394c6c1cdff67119bd520 100644 --- a/core/network/src/protocol/specialization.rs +++ b/core/network/src/protocol/specialization.rs @@ -20,7 +20,7 @@ pub use crate::protocol::event::{DhtEvent, Event}; use crate::protocol::Context; use libp2p::PeerId; -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; /// A specialization of the substrate network protocol. Handles events and sends messages. pub trait NetworkSpecialization: Send + Sync + 'static { diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs index 3cc4b8243c452ed83d1022accf49dee6432ddef9..bd67c6cde7e6c868b95f340cff32ca398c5aee09 100644 --- a/core/network/src/protocol/sync.rs +++ b/core/network/src/protocol/sync.rs @@ -39,7 +39,7 @@ use either::Either; use extra_requests::ExtraRequests; use libp2p::PeerId; use log::{debug, trace, warn, info, error}; -use runtime_primitives::{ +use sr_primitives::{ Justification, generic::BlockId, traits::{Block as BlockT, Header, NumberFor, Zero, One, CheckedSub, SaturatedConversion} @@ -119,7 +119,9 @@ pub struct ChainSync { queue_blocks: HashSet, /// The best block number that we are currently importing. best_importing_number: NumberFor, - request_builder: Option> + request_builder: Option>, + /// A flag that caches idle state with no pending requests. + is_idle: bool, } /// All the data we have about a Peer that we are trying to sync with @@ -198,7 +200,9 @@ pub struct Status { /// Target sync block number. pub best_seen_block: Option>, /// Number of peers participating in syncing. - pub num_peers: u32 + pub num_peers: u32, + /// Number of blocks queued for import + pub queued_blocks: u32, } /// A peer did not behave as expected and should be reported. @@ -287,7 +291,8 @@ impl ChainSync { required_block_attributes, queue_blocks: Default::default(), best_importing_number: Zero::zero(), - request_builder + request_builder, + is_idle: false, } } @@ -317,7 +322,8 @@ impl ChainSync { Status { state: sync_state, best_seen_block: best_seen, - num_peers: self.peers.len() as u32 + num_peers: self.peers.len() as u32, + queued_blocks: self.queue_blocks.len() as u32, } } @@ -343,7 +349,6 @@ impl ChainSync { info!("New peer with unknown genesis hash {} ({}).", info.best_hash, info.best_number); return Err(BadPeer(who, i32::min_value())) } - // If there are more than `MAJOR_SYNC_BLOCKS` in the import queue then we have // enough to do in the import queue that it's not worth kicking off // an ancestor search, which is what we do in the next match case below. @@ -395,6 +400,7 @@ impl ChainSync { ), recently_announced: Default::default() }); + self.is_idle = false; Ok(Some(ancestry_request::(common_best))) } @@ -407,6 +413,7 @@ impl ChainSync { state: PeerSyncState::Available, recently_announced: Default::default(), }); + self.is_idle = false; Ok(None) } } @@ -484,12 +491,16 @@ impl ChainSync { /// Get an iterator over all block requests of all peers. pub fn block_requests(&mut self) -> impl Iterator)> + '_ { + if self.is_idle { + return Either::Left(std::iter::empty()) + } if self.queue_blocks.len() > MAX_IMPORTING_BLOCKS { trace!(target: "sync", "Too many blocks in the queue."); return Either::Left(std::iter::empty()) } let blocks = &mut self.blocks; let attrs = &self.required_block_attributes; + let mut have_requests = false; let iter = self.peers.iter_mut().filter_map(move |(id, peer)| { if !peer.state.is_available() { trace!(target: "sync", "Peer {} is busy", id); @@ -497,13 +508,17 @@ impl ChainSync { } if let Some((range, req)) = peer_block_request(id, peer, blocks, attrs) { peer.state = PeerSyncState::DownloadingNew(range.start); - trace!(target: "sync", "new block request for {}", id); + trace!(target: "sync", "New block request for {}", id); + have_requests = true; Some((id.clone(), req)) } else { - trace!(target: "sync", "no new block request for {}", id); + trace!(target: "sync", "No new block request for {}", id); None } }); + if !have_requests { + self.is_idle = true; + } Either::Right(iter) } @@ -523,6 +538,7 @@ impl ChainSync { trace!(target: "sync", "Reversing incoming block list"); blocks.reverse() } + self.is_idle = false; match &mut peer.state { PeerSyncState::DownloadingNew(start_block) => { self.blocks.clear_peer_download(&who); @@ -638,6 +654,7 @@ impl ChainSync { return Ok(OnBlockJustification::Nothing) }; + self.is_idle = false; if let PeerSyncState::DownloadingJustification(hash) = peer.state { peer.state = PeerSyncState::Available; @@ -676,6 +693,7 @@ impl ChainSync { return Ok(OnBlockFinalityProof::Nothing) }; + self.is_idle = false; if let PeerSyncState::DownloadingFinalityProof(hash) = peer.state { peer.state = PeerSyncState::Available; @@ -789,6 +807,7 @@ impl ChainSync { self.best_importing_number = Zero::zero() } + self.is_idle = false; output.into_iter() } @@ -802,10 +821,12 @@ impl ChainSync { number, ) } + self.is_idle = false; } pub fn on_finality_proof_import(&mut self, req: (B::Hash, NumberFor), res: Result<(B::Hash, NumberFor), ()>) { self.extra_finality_proofs.try_finalize_root(req, res, true); + self.is_idle = false; } /// Notify about finalization of the given block. @@ -860,6 +881,7 @@ impl ChainSync { ); peer.common_number = new_common_number; } + self.is_idle = false; } /// Call when a node announces a new block. @@ -905,6 +927,7 @@ impl ChainSync { } else if known { peer.common_number = number } + self.is_idle = false; // known block case if known || self.is_already_downloading(&hash) { @@ -984,6 +1007,7 @@ impl ChainSync { self.peers.remove(&who); self.extra_justifications.peer_disconnected(&who); self.extra_finality_proofs.peer_disconnected(&who); + self.is_idle = false; } /// Restart the sync process. @@ -997,6 +1021,7 @@ impl ChainSync { let info = self.client.info(); self.best_queued_hash = info.chain.best_hash; self.best_queued_number = info.chain.best_number; + self.is_idle = false; debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); let old_peers = std::mem::replace(&mut self.peers, HashMap::new()); old_peers.into_iter().filter_map(move |(id, _)| { @@ -1189,4 +1214,3 @@ fn peer_block_request( None } } - diff --git a/core/network/src/protocol/sync/blocks.rs b/core/network/src/protocol/sync/blocks.rs index ff8d9907af0cd2bd619d128e79157f9952bf252c..90264249ea03ce113fa4c6946596089d735fb526 100644 --- a/core/network/src/protocol/sync/blocks.rs +++ b/core/network/src/protocol/sync/blocks.rs @@ -21,7 +21,7 @@ use std::collections::{HashMap, BTreeMap}; use std::collections::hash_map::Entry; use log::trace; use libp2p::PeerId; -use runtime_primitives::traits::{Block as BlockT, NumberFor, One}; +use sr_primitives::traits::{Block as BlockT, NumberFor, One}; use crate::message; const MAX_PARALLEL_DOWNLOADS: u32 = 1; @@ -202,7 +202,7 @@ impl BlockCollection { mod test { use super::{BlockCollection, BlockData, BlockRangeState}; use crate::{message, PeerId}; - use runtime_primitives::testing::{Block as RawBlock, ExtrinsicWrapper}; + use sr_primitives::testing::{Block as RawBlock, ExtrinsicWrapper}; use primitives::H256; type Block = RawBlock>; diff --git a/core/network/src/protocol/sync/extra_requests.rs b/core/network/src/protocol/sync/extra_requests.rs index c4f6de05a224aa8a0b16b52ce5e4ab3053584b71..0ee009cab8689a63a1831ee2f94fab6b722731d2 100644 --- a/core/network/src/protocol/sync/extra_requests.rs +++ b/core/network/src/protocol/sync/extra_requests.rs @@ -19,7 +19,7 @@ use crate::protocol::sync::{PeerSync, PeerSyncState}; use fork_tree::ForkTree; use libp2p::PeerId; use log::warn; -use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::traits::{Block as BlockT, NumberFor}; use std::collections::{HashMap, HashSet, VecDeque}; use std::time::{Duration, Instant}; diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 5841336b446dbeccd59f88762089df5691e27b2c..d5ba8db7ae4885c0c7449043c1085339653c85ea 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -25,26 +25,29 @@ //! The methods of the [`NetworkService`] are implemented by sending a message over a channel, //! which is then processed by [`NetworkWorker::poll`]. -use std::{collections::HashMap, fs, marker::PhantomData, io, path::Path}; +use std::{collections::{HashMap, HashSet}, fs, marker::PhantomData, io, path::Path}; use std::sync::{Arc, atomic::{AtomicBool, AtomicUsize, Ordering}}; use consensus::import_queue::{ImportQueue, Link}; use consensus::import_queue::{BlockImportResult, BlockImportError}; use futures::{prelude::*, sync::mpsc}; +use futures03::TryFutureExt as _; use log::{warn, error, info}; -use libp2p::core::{swarm::NetworkBehaviour, transport::boxed::Boxed, muxing::StreamMuxerBox}; use libp2p::{PeerId, Multiaddr, multihash::Multihash}; +use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox}; +use libp2p::swarm::NetworkBehaviour; +use parking_lot::Mutex; use peerset::PeersetHandle; -use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; +use sr_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; -use crate::{behaviour::{Behaviour, BehaviourOut}, config::parse_str_addr}; +use crate::{behaviour::{Behaviour, BehaviourOut}, config::{parse_str_addr, parse_addr}}; use crate::{NetworkState, NetworkStateNotConnectedPeer, NetworkStatePeer}; use crate::{transport, config::NodeKeyConfig, config::NonReservedPeerMode}; use crate::config::{Params, TransportConfig}; use crate::error::Error; use crate::protocol::{self, Protocol, Context, CustomMessageOutcome, PeerInfo}; use crate::protocol::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; -use crate::protocol::{event::Event, on_demand::{AlwaysBadChecker, RequestData}}; +use crate::protocol::{event::Event, light_dispatch::{AlwaysBadChecker, RequestData}}; use crate::protocol::specialization::NetworkSpecialization; use crate::protocol::sync::SyncState; @@ -86,6 +89,8 @@ impl ReportHandle { pub struct NetworkService, H: ExHashT> { /// Number of peers we're connected to. num_connected: Arc, + /// The local external addresses. + external_addresses: Arc>>, /// Are we actively catching up with the chain? is_major_syncing: Arc, /// Local copy of the `PeerId` of the local node. @@ -215,8 +220,11 @@ impl, H: ExHashT> NetworkWorker Swarm::::add_external_address(&mut swarm, addr.clone()); } + let external_addresses = Arc::new(Mutex::new(Vec::new())); + let service = Arc::new(NetworkService { bandwidth, + external_addresses: external_addresses.clone(), num_connected: num_connected.clone(), is_major_syncing: is_major_syncing.clone(), peerset: peerset_handle, @@ -226,13 +234,14 @@ impl, H: ExHashT> NetworkWorker }); Ok(NetworkWorker { + external_addresses, num_connected, is_major_syncing, network_service: swarm, service, import_queue: params.import_queue, from_worker, - on_demand_in: params.on_demand.and_then(|od| od.extract_receiver()), + light_client_rqs: params.on_demand.and_then(|od| od.extract_receiver()), }) } @@ -271,6 +280,11 @@ impl, H: ExHashT> NetworkWorker self.network_service.user_protocol().num_sync_peers() } + /// Number of blocks in the import queue. + pub fn num_queued_blocks(&self) -> u32 { + self.network_service.user_protocol().num_queued_blocks() + } + /// Adds an address for a node. pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { self.network_service.add_known_address(peer_id, addr); @@ -295,7 +309,7 @@ impl, H: ExHashT> NetworkWorker /// Get network state. /// /// **Note**: Use this only for debugging. This API is unstable. There are warnings literaly - /// everywhere about this. Please don't use this function to retreive actual information. + /// everywhere about this. Please don't use this function to retrieve actual information. pub fn network_state(&mut self) -> NetworkState { let swarm = &mut self.network_service; let open = swarm.user_protocol().open_peers().cloned().collect::>(); @@ -483,23 +497,83 @@ impl, H: ExHashT> NetworkServic Ok(()) } + /// Modify a peerset priority group. + pub fn set_priority_group(&self, group_id: String, peers: HashSet) -> Result<(), String> { + let peers = peers.into_iter().map(|p| { + parse_addr(p).map_err(|e| format!("{:?}", e)) + }).collect::, String>>()?; + + let peer_ids = peers.iter().map(|(peer_id, _addr)| peer_id.clone()).collect(); + self.peerset.set_priority_group(group_id, peer_ids); + + for (peer_id, addr) in peers.into_iter() { + let _ = self + .to_worker + .unbounded_send(ServerToWorkerMsg::AddKnownAddress(peer_id, addr)); + } + + Ok(()) + } + /// Returns the number of peers we're connected to. pub fn num_connected(&self) -> usize { self.num_connected.load(Ordering::Relaxed) } + + /// Returns the local external addresses. + pub fn external_addresses(&self) -> Vec { + self.external_addresses.lock().clone() + } } impl, H: ExHashT> ::consensus::SyncOracle for NetworkService { - fn is_major_syncing(&self) -> bool { - self.is_major_syncing() + fn is_major_syncing(&mut self) -> bool { + NetworkService::is_major_syncing(self) + } + + fn is_offline(&mut self) -> bool { + self.num_connected.load(Ordering::Relaxed) == 0 + } +} + +impl<'a, B: BlockT + 'static, S: NetworkSpecialization, H: ExHashT> + ::consensus::SyncOracle for &'a NetworkService { + fn is_major_syncing(&mut self) -> bool { + NetworkService::is_major_syncing(self) } - fn is_offline(&self) -> bool { + fn is_offline(&mut self) -> bool { self.num_connected.load(Ordering::Relaxed) == 0 } } +/// Trait for providing information about the local network state +pub trait NetworkStateInfo { + /// Returns the local external addresses. + fn external_addresses(&self) -> Vec; + + /// Returns the local Peer ID. + fn peer_id(&self) -> PeerId; +} + +impl NetworkStateInfo for NetworkService + where + B: sr_primitives::traits::Block, + S: NetworkSpecialization, + H: ExHashT, +{ + /// Returns the local external addresses. + fn external_addresses(&self) -> Vec { + self.external_addresses.lock().clone() + } + + /// Returns the local Peer ID. + fn peer_id(&self) -> PeerId { + self.local_peer_id.clone() + } +} + /// Messages sent from the `NetworkService` to the `NetworkWorker`. /// /// Each entry corresponds to a method of `NetworkService`. @@ -520,6 +594,8 @@ enum ServerToWorkerMsg> { /// You are encouraged to poll this in a separate background thread or task. #[must_use = "The NetworkWorker must be polled in order for the network to work"] pub struct NetworkWorker, H: ExHashT> { + /// Updated by the `NetworkWorker` and loaded by the `NetworkService`. + external_addresses: Arc>>, /// Updated by the `NetworkWorker` and loaded by the `NetworkService`. num_connected: Arc, /// Updated by the `NetworkWorker` and loaded by the `NetworkService`. @@ -532,8 +608,8 @@ pub struct NetworkWorker, H: Ex import_queue: Box>, /// Messages from the `NetworkService` and that must be processed. from_worker: mpsc::UnboundedReceiver>, - /// Receiver for queries from the on-demand that must be processed. - on_demand_in: Option>>, + /// Receiver for queries from the light client that must be processed. + light_client_rqs: Option>>, } impl, H: ExHashT> Future for NetworkWorker { @@ -542,14 +618,17 @@ impl, H: ExHashT> Future for Ne fn poll(&mut self) -> Poll { // Poll the import queue for actions to perform. - self.import_queue.poll_actions(&mut NetworkLink { - protocol: &mut self.network_service, - }); - - // Check for new incoming on-demand requests. - if let Some(on_demand_in) = self.on_demand_in.as_mut() { - while let Ok(Async::Ready(Some(rq))) = on_demand_in.poll() { - self.network_service.user_protocol_mut().add_on_demand_request(rq); + let _ = futures03::future::poll_fn(|cx| { + self.import_queue.poll_actions(cx, &mut NetworkLink { + protocol: &mut self.network_service, + }); + std::task::Poll::Pending::> + }).compat().poll(); + + // Check for new incoming light client requests. + if let Some(light_client_rqs) = self.light_client_rqs.as_mut() { + while let Ok(Async::Ready(Some(rq))) = light_client_rqs.poll() { + self.network_service.user_protocol_mut().add_light_client_request(rq); } } @@ -621,6 +700,10 @@ impl, H: ExHashT> Future for Ne // Update the variables shared with the `NetworkService`. self.num_connected.store(self.network_service.user_protocol_mut().num_connected_peers(), Ordering::Relaxed); + { + let external_addresses = Swarm::::external_addresses(&self.network_service).cloned().collect(); + *self.external_addresses.lock() = external_addresses; + } self.is_major_syncing.store(match self.network_service.user_protocol_mut().sync_state() { SyncState::Idle => false, SyncState::Downloading => true, @@ -631,7 +714,7 @@ impl, H: ExHashT> Future for Ne } /// The libp2p swarm, customized for our needs. -type Swarm = libp2p::core::Swarm< +type Swarm = libp2p::swarm::Swarm< Boxed<(PeerId, StreamMuxerBox), io::Error>, Behaviour >; diff --git a/core/network/src/test/block_import.rs b/core/network/src/test/block_import.rs index eb49dbda7ae433f348059aa45bd6058e937052a6..ceb0451166c9e0d14f023ec9d2818ea2dba73adf 100644 --- a/core/network/src/test/block_import.rs +++ b/core/network/src/test/block_import.rs @@ -21,7 +21,7 @@ use consensus::import_queue::{ }; use test_client::{self, prelude::*}; use test_client::runtime::{Block, Hash}; -use runtime_primitives::generic::BlockId; +use sr_primitives::generic::BlockId; use super::*; fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock) { @@ -45,7 +45,7 @@ fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock) #[test] fn import_single_good_block_works() { let (_, _hash, number, peer_id, block) = prepare_good_block(); - match import_single_block(&mut test_client::new(), BlockOrigin::File, block, Arc::new(PassThroughVerifier(true))) { + match import_single_block(&mut test_client::new(), BlockOrigin::File, block, &mut PassThroughVerifier(true)) { Ok(BlockImportResult::ImportedUnknown(ref num, ref aux, ref org)) if *num == number && *aux == Default::default() && *org == Some(peer_id) => {} _ => panic!() @@ -55,7 +55,7 @@ fn import_single_good_block_works() { #[test] fn import_single_good_known_block_is_ignored() { let (mut client, _hash, number, _, block) = prepare_good_block(); - match import_single_block(&mut client, BlockOrigin::File, block, Arc::new(PassThroughVerifier(true))) { + match import_single_block(&mut client, BlockOrigin::File, block, &mut PassThroughVerifier(true)) { Ok(BlockImportResult::ImportedKnown(ref n)) if *n == number => {} _ => panic!() } @@ -65,7 +65,7 @@ fn import_single_good_known_block_is_ignored() { fn import_single_good_block_without_header_fails() { let (_, _, _, peer_id, mut block) = prepare_good_block(); block.header = None; - match import_single_block(&mut test_client::new(), BlockOrigin::File, block, Arc::new(PassThroughVerifier(true))) { + match import_single_block(&mut test_client::new(), BlockOrigin::File, block, &mut PassThroughVerifier(true)) { Err(BlockImportError::IncompleteHeader(ref org)) if *org == Some(peer_id) => {} _ => panic!() } @@ -75,7 +75,7 @@ fn import_single_good_block_without_header_fails() { fn async_import_queue_drops() { // Perform this test multiple times since it exhibits non-deterministic behavior. for _ in 0..100 { - let verifier = Arc::new(PassThroughVerifier(true)); + let verifier = PassThroughVerifier(true); let queue = BasicQueue::new(verifier, Box::new(test_client::new()), None, None); drop(queue); } diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 59a3680d40038b8c761b4588ccff363f4fcbb5a7..091047394b688f1b096f9fc43fb246ce038dd753 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -38,7 +38,7 @@ use consensus::import_queue::{ }; use consensus::block_import::{BlockImport, ImportResult}; use consensus::{Error as ConsensusError, well_known_cache_keys::{self, Id as CacheKeyId}}; -use consensus::{BlockOrigin, ForkChoiceStrategy, ImportBlock, JustificationImport}; +use consensus::{BlockOrigin, ForkChoiceStrategy, BlockImportParams, JustificationImport}; use futures::prelude::*; use futures03::{StreamExt as _, TryStreamExt as _}; use crate::{NetworkWorker, NetworkService, config::ProtocolId}; @@ -47,9 +47,9 @@ use libp2p::PeerId; use parking_lot::Mutex; use primitives::{H256, Blake2Hasher}; use crate::protocol::{Context, ProtocolConfig}; -use runtime_primitives::generic::{BlockId, OpaqueDigestItemId}; -use runtime_primitives::traits::{Block as BlockT, Header, NumberFor}; -use runtime_primitives::Justification; +use sr_primitives::generic::{BlockId, OpaqueDigestItemId}; +use sr_primitives::traits::{Block as BlockT, Header, NumberFor}; +use sr_primitives::Justification; use crate::service::TransactionPool; use crate::specialization::NetworkSpecialization; use test_client::{self, AccountKeyring}; @@ -57,7 +57,7 @@ use test_client::{self, AccountKeyring}; pub use test_client::runtime::{Block, Extrinsic, Hash, Transfer}; pub use test_client::TestClient; -type AuthorityId = primitives::sr25519::Public; +type AuthorityId = babe_primitives::AuthorityId; #[cfg(any(test, feature = "test-helpers"))] /// A Verifier that accepts all blocks and passes them on with the configured @@ -68,19 +68,19 @@ pub struct PassThroughVerifier(pub bool); /// This `Verifier` accepts all data as valid. impl Verifier for PassThroughVerifier { fn verify( - &self, + &mut self, origin: BlockOrigin, header: B::Header, justification: Option, body: Option> - ) -> Result<(ImportBlock, Option)>>), String> { + ) -> Result<(BlockImportParams, Option)>>), String> { let maybe_keys = header.digest() .log(|l| l.try_as_raw(OpaqueDigestItemId::Consensus(b"aura")) .or_else(|| l.try_as_raw(OpaqueDigestItemId::Consensus(b"babe"))) ) .map(|blob| vec![(well_known_cache_keys::AUTHORITIES, blob.to_vec())]); - Ok((ImportBlock { + Ok((BlockImportParams { origin, header, body, @@ -212,7 +212,7 @@ pub struct Peer> { client: PeersClient, /// We keep a copy of the verifier so that we can invoke it for locally-generated blocks, /// instead of going through the import queue. - verifier: Arc>, + verifier: VerifierAdapter>, /// We keep a copy of the block_import so that we can invoke it for locally-generated blocks, /// instead of going through the import queue. block_import: Box>, @@ -388,13 +388,34 @@ impl> BlockImport for BlockImportAdapter, + block: BlockImportParams, cache: HashMap>, ) -> Result { self.0.lock().import_block(block, cache) } } +/// Implements `Verifier` on an `Arc>`. Used internally. +struct VerifierAdapter(Arc>>); + +impl Clone for VerifierAdapter { + fn clone(&self) -> Self { + VerifierAdapter(self.0.clone()) + } +} + +impl> Verifier for VerifierAdapter { + fn verify( + &mut self, + origin: BlockOrigin, + header: B::Header, + justification: Option, + body: Option> + ) -> Result<(BlockImportParams, Option)>>), String> { + self.0.lock().verify(origin, header, justification, body) + } +} + pub trait TestNetFactory: Sized { type Specialization: NetworkSpecialization + SpecializationFactory; type Verifier: 'static + Verifier; @@ -402,7 +423,7 @@ pub trait TestNetFactory: Sized { /// These two need to be implemented! fn from_config(config: &ProtocolConfig) -> Self; - fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Arc; + fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Self::Verifier; /// Get reference to peer. fn peer(&mut self, i: usize) -> &mut Peer; @@ -448,6 +469,7 @@ pub trait TestNetFactory: Sized { fn add_full_peer(&mut self, config: &ProtocolConfig) { let client = Arc::new(test_client::new()); let verifier = self.make_verifier(PeersClient::Full(client.clone()), config); + let verifier = VerifierAdapter(Arc::new(Mutex::new(Box::new(verifier) as Box<_>))); let (block_import, justification_import, finality_proof_import, finality_proof_request_builder, data) = self.make_block_import(PeersClient::Full(client.clone())); let block_import = BlockImportAdapter(Arc::new(Mutex::new(block_import))); @@ -507,6 +529,7 @@ pub trait TestNetFactory: Sized { let client = Arc::new(test_client::new_light()); let verifier = self.make_verifier(PeersClient::Light(client.clone()), &config); + let verifier = VerifierAdapter(Arc::new(Mutex::new(Box::new(verifier) as Box<_>))); let (block_import, justification_import, finality_proof_import, finality_proof_request_builder, data) = self.make_block_import(PeersClient::Light(client.clone())); let block_import = BlockImportAdapter(Arc::new(Mutex::new(block_import))); @@ -568,6 +591,9 @@ pub trait TestNetFactory: Sized { // Return `NotReady` if there's a mismatch in the highest block number. let mut highest = None; for peer in self.peers().iter() { + if peer.is_major_syncing() || peer.network.num_queued_blocks() != 0 { + return Async::NotReady + } match (highest, peer.client.info().chain.best_number) { (None, b) => highest = Some(b), (Some(ref a), ref b) if a == b => {}, @@ -625,9 +651,9 @@ impl TestNetFactory for TestNet { } fn make_verifier(&self, _client: PeersClient, _config: &ProtocolConfig) - -> Arc + -> Self::Verifier { - Arc::new(PassThroughVerifier(false)) + PassThroughVerifier(false) } fn peer(&mut self, i: usize) -> &mut Peer<(), Self::Specialization> { @@ -670,9 +696,7 @@ impl TestNetFactory for JustificationTestNet { JustificationTestNet(TestNet::from_config(config)) } - fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) - -> Arc - { + fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Self::Verifier { self.0.make_verifier(client, config) } diff --git a/core/network/src/test/sync.rs b/core/network/src/test/sync.rs index a7603f755191c7c5a67ad89a3f20efa6ed90fb1f..f3a8f0c8ea4281cf1fdf054d892fc1441ab2a93d 100644 --- a/core/network/src/test/sync.rs +++ b/core/network/src/test/sync.rs @@ -17,7 +17,8 @@ use client::{backend::Backend, blockchain::HeaderBackend}; use crate::config::Roles; use consensus::BlockOrigin; -use std::{time::Duration, time::Instant}; +use futures03::TryFutureExt as _; +use std::time::Duration; use tokio::runtime::current_thread; use super::*; @@ -398,7 +399,7 @@ fn blocks_are_not_announced_by_light_nodes() { net.peers.remove(0); // Poll for a few seconds and make sure 1 and 2 (now 0 and 1) don't sync together. - let mut delay = tokio_timer::Delay::new(Instant::now() + Duration::from_secs(5)); + let mut delay = futures_timer::Delay::new(Duration::from_secs(5)).compat(); runtime.block_on(futures::future::poll_fn::<(), (), _>(|| { net.poll(); delay.poll().map_err(|_| ()) @@ -486,7 +487,7 @@ fn can_not_sync_from_light_peer() { net.peers.remove(0); // ensure that the #2 (now #1) fails to sync block #1 even after 5 seconds - let mut test_finished = tokio_timer::Delay::new(Instant::now() + Duration::from_secs(5)); + let mut test_finished = futures_timer::Delay::new(Duration::from_secs(5)).compat(); runtime.block_on(futures::future::poll_fn::<(), (), _>(|| -> Result<_, ()> { net.poll(); test_finished.poll().map_err(|_| ()) diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 758865b49c423effe51db083344ff8f50f7ab6d6..4c8891eb6b14ce58947dc12283ceb1e716a74a1d 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -8,20 +8,21 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../../core/client" } -futures = "0.1.25" +futures-preview = "=0.3.0-alpha.17" log = "0.4" offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } -parity-codec = { version = "4.1.1", features = ["derive"] } -parking_lot = "0.8.0" +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } +parking_lot = "0.9.0" primitives = { package = "substrate-primitives", path = "../../core/primitives" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } +sr-primitives = { path = "../../core/sr-primitives" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } +network = { package = "substrate-network", path = "../../core/network" } +keystore = { package = "substrate-keystore", path = "../keystore" } [dev-dependencies] env_logger = "0.6" client-db = { package = "substrate-client-db", path = "../../core/client/db/", default-features = true } test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } -tokio = "0.1.7" [features] default = [] diff --git a/core/offchain/primitives/Cargo.toml b/core/offchain/primitives/Cargo.toml index a081f681b621cd754fe83be33a8008b951037534..c96a579c4446dedc4c19f375cfff6a3373c0d597 100644 --- a/core/offchain/primitives/Cargo.toml +++ b/core/offchain/primitives/Cargo.toml @@ -8,11 +8,11 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../../client", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives", default-features = false } +sr-primitives = { path = "../../sr-primitives", default-features = false } [features] default = ["std"] std = [ "client/std", - "runtime_primitives/std" + "sr-primitives/std" ] diff --git a/core/offchain/primitives/src/lib.rs b/core/offchain/primitives/src/lib.rs index c05e8dceb90cec525835929e92e5c7788ebc05cf..d51239483aa013aa9f19b2530c42d81aaafd4baf 100644 --- a/core/offchain/primitives/src/lib.rs +++ b/core/offchain/primitives/src/lib.rs @@ -20,7 +20,7 @@ #![warn(missing_docs)] use client::decl_runtime_apis; -use runtime_primitives::traits::NumberFor; +use sr_primitives::traits::NumberFor; decl_runtime_apis! { /// The offchain worker api. diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index b6aba784b36a97c047178e89703179829daf1f54..225e7c3f725a49dae8d761fba451da2018f4ed35 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -14,24 +14,24 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::sync::Arc; +use std::{ + str::FromStr, + sync::Arc, + convert::{TryFrom, TryInto}, + time::{SystemTime, Duration}, + thread::sleep, +}; + use client::backend::OffchainStorage; -use crate::AuthorityKeyProvider; -use futures::{Stream, Future, sync::mpsc}; +use futures::{StreamExt as _, Future, future, channel::mpsc}; use log::{info, debug, warn, error}; -use parity_codec::{Encode, Decode}; +use network::{PeerId, Multiaddr, NetworkStateInfo}; +use codec::{Encode, Decode}; use primitives::offchain::{ - Timestamp, HttpRequestId, HttpRequestStatus, HttpError, - Externalities as OffchainExt, - CryptoKind, CryptoKeyId, - StorageKind, -}; -use primitives::crypto::{Pair, Protected}; -use primitives::{ed25519, sr25519}; -use runtime_primitives::{ - generic::BlockId, - traits::{self, Extrinsic}, + Externalities as OffchainExt, HttpRequestId, Timestamp, HttpRequestStatus, HttpError, + OpaqueNetworkState, OpaquePeerId, OpaqueMultiaddr, StorageKind, }; +use sr_primitives::{generic::BlockId, traits::{self, Extrinsic}}; use transaction_pool::txpool::{Pool, ChainApi}; /// A message between the offchain extension and the processing thread. @@ -39,90 +39,38 @@ enum ExtMessage { SubmitExtrinsic(Vec), } -/// A persisted key seed. -#[derive(Encode, Decode)] -struct CryptoKey { - kind: CryptoKind, - phrase: String, -} - -enum Key { - Sr25519(sr25519::Pair), - Ed25519(ed25519::Pair), -} - /// Asynchronous offchain API. /// /// NOTE this is done to prevent recursive calls into the runtime (which are not supported currently). -pub(crate) struct Api { +pub(crate) struct Api { sender: mpsc::UnboundedSender, db: Storage, - keys_password: Protected, - key_provider: KeyProvider, + network_state: Arc, + _at: BlockId, + /// Is this node a potential validator? + is_validator: bool, } fn unavailable_yet(name: &str) -> R { - error!("The {:?} API is not available for offchain workers yet. Follow \ - https://github.com/paritytech/substrate/issues/1458 for details", name); + error!( + "The {:?} API is not available for offchain workers yet. Follow \ + https://github.com/paritytech/substrate/issues/1458 for details", name + ); Default::default() } const LOCAL_DB: &str = "LOCAL (fork-aware) DB"; const STORAGE_PREFIX: &[u8] = b"storage"; -const KEYS_PREFIX: &[u8] = b"keys"; -const NEXT_ID: &[u8] = b"crypto_key_id"; - -impl Api where +impl OffchainExt for Api +where Storage: OffchainStorage, - KeyProvider: AuthorityKeyProvider, + Block: traits::Block, { - fn keypair(&self, phrase: &str) -> Result { - P::from_phrase(phrase, Some(self.keys_password.as_ref())) - .map_err(|e| { - warn!("Error recovering Offchain Worker key. Password invalid? {:?}", e); - () - }) - .map(|x| x.0) - } - - fn read_key(&self, id: Option, kind: CryptoKind) -> Result { - if let Some(id) = id { - let key = self.db.get(KEYS_PREFIX, &id.0.encode()) - .and_then(|key| CryptoKey::decode(&mut &*key)) - .ok_or(())?; - if key.kind != kind { - warn!( - "Invalid crypto kind (got: {:?}, expected: {:?}), when requesting key {:?}", - key.kind, - kind, - id - ); - return Err(()) - } - - Ok(match key.kind { - CryptoKind::Sr25519 => Key::Sr25519(self.keypair(&key.phrase)?), - CryptoKind::Ed25519 => Key::Ed25519(self.keypair(&key.phrase)?), - }) - } else { - let key = match kind { - CryptoKind::Sr25519 => self.key_provider.authority_key().map(Key::Sr25519), - CryptoKind::Ed25519 => self.key_provider.authority_key().map(Key::Ed25519), - }; - - key.ok_or_else(|| { - warn!("AuthorityKey is not configured, yet offchain worker tried to access it."); - () - }) - } + fn is_validator(&self) -> bool { + self.is_validator } -} -impl OffchainExt for Api where - Storage: OffchainStorage, - KeyProvider: AuthorityKeyProvider, -{ fn submit_transaction(&mut self, ext: Vec) -> Result<(), ()> { self.sender .unbounded_send(ExtMessage::SubmitExtrinsic(ext)) @@ -130,69 +78,40 @@ impl OffchainExt for Api where .map_err(|_| ()) } - fn new_crypto_key(&mut self, kind: CryptoKind) -> Result { - let phrase = match kind { - CryptoKind::Ed25519 => { - ed25519::Pair::generate_with_phrase(Some(self.keys_password.as_ref())).1 - }, - CryptoKind::Sr25519 => { - sr25519::Pair::generate_with_phrase(Some(self.keys_password.as_ref())).1 - }, - }; - - let (id, id_encoded) = loop { - let encoded = self.db.get(KEYS_PREFIX, NEXT_ID); - let encoded_slice = encoded.as_ref().map(|x| x.as_slice()); - let new_id = encoded_slice.and_then(|mut x| u16::decode(&mut x)).unwrap_or_default() - .checked_add(1) - .ok_or(())?; - let new_id_encoded = new_id.encode(); - - if self.db.compare_and_set(KEYS_PREFIX, NEXT_ID, encoded_slice, &new_id_encoded) { - break (new_id, new_id_encoded); - } - }; + fn network_state(&self) -> Result { + let external_addresses = self.network_state.external_addresses(); - self.db.set(KEYS_PREFIX, &id_encoded, &CryptoKey { phrase, kind } .encode()); - - Ok(CryptoKeyId(id)) - } - - fn encrypt(&mut self, _key: Option, _kind: CryptoKind, _data: &[u8]) -> Result, ()> { - unavailable_yet::<()>("encrypt"); - Err(()) - } - - fn decrypt(&mut self, _key: Option, _kind: CryptoKind, _data: &[u8]) -> Result, ()> { - unavailable_yet::<()>("decrypt"); - Err(()) - - } - - fn sign(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()> { - let key = self.read_key(key, kind)?; - - Ok(match key { - Key::Sr25519(pair) => pair.sign(data).0.to_vec(), - Key::Ed25519(pair) => pair.sign(data).0.to_vec(), - }) - } - - fn verify(&mut self, key: Option, kind: CryptoKind, msg: &[u8], signature: &[u8]) -> Result { - let key = self.read_key(key, kind)?; - - Ok(match key { - Key::Sr25519(pair) => sr25519::Pair::verify_weak(signature, msg, pair.public()), - Key::Ed25519(pair) => ed25519::Pair::verify_weak(signature, msg, pair.public()), - }) + let state = NetworkState::new( + self.network_state.peer_id(), + external_addresses, + ); + Ok(OpaqueNetworkState::from(state)) } fn timestamp(&mut self) -> Timestamp { - unavailable_yet("timestamp") + let now = SystemTime::now(); + let epoch_duration = now.duration_since(SystemTime::UNIX_EPOCH); + match epoch_duration { + Err(_) => { + // Current time is earlier than UNIX_EPOCH. + Timestamp::from_unix_millis(0) + }, + Ok(d) => { + let duration = d.as_millis(); + // Assuming overflow won't happen for a few hundred years. + Timestamp::from_unix_millis(duration.try_into() + .expect("epoch milliseconds won't overflow u64 for hundreds of years; qed")) + } + } } - fn sleep_until(&mut self, _deadline: Timestamp) { - unavailable_yet::<()>("sleep_until") + fn sleep_until(&mut self, deadline: Timestamp) { + // Get current timestamp. + let now = self.timestamp(); + // Calculate the diff with the deadline. + let diff = deadline.diff(&now); + // Call thread::sleep for the diff duration. + sleep(Duration::from_millis(diff.millis())); } fn random_seed(&mut self) -> [u8; 32] { @@ -210,12 +129,12 @@ impl OffchainExt for Api where &mut self, kind: StorageKind, key: &[u8], - old_value: &[u8], + old_value: Option<&[u8]>, new_value: &[u8], ) -> bool { match kind { StorageKind::PERSISTENT => { - self.db.compare_and_set(STORAGE_PREFIX, key, Some(old_value), new_value) + self.db.compare_and_set(STORAGE_PREFIX, key, old_value, new_value) }, StorageKind::LOCAL => unavailable_yet(LOCAL_DB), } @@ -285,6 +204,71 @@ impl OffchainExt for Api where } } +/// Information about the local node's network state. +#[derive(Clone, Eq, PartialEq, Debug)] +pub struct NetworkState { + peer_id: PeerId, + external_addresses: Vec, +} + +impl NetworkState { + fn new(peer_id: PeerId, external_addresses: Vec) -> Self { + NetworkState { + peer_id, + external_addresses, + } + } +} + +impl From for OpaqueNetworkState { + fn from(state: NetworkState) -> OpaqueNetworkState { + let enc = Encode::encode(&state.peer_id.into_bytes()); + let peer_id = OpaquePeerId::new(enc); + + let external_addresses: Vec = state + .external_addresses + .iter() + .map(|multiaddr| { + let e = Encode::encode(&multiaddr.to_string()); + OpaqueMultiaddr::new(e) + }) + .collect(); + + OpaqueNetworkState { + peer_id, + external_addresses, + } + } +} + +impl TryFrom for NetworkState { + type Error = (); + + fn try_from(state: OpaqueNetworkState) -> Result { + let inner_vec = state.peer_id.0; + + let bytes: Vec = Decode::decode(&mut &inner_vec[..]).map_err(|_| ())?; + let peer_id = PeerId::from_bytes(bytes).map_err(|_| ())?; + + let external_addresses: Result, Self::Error> = state.external_addresses + .iter() + .map(|enc_multiaddr| -> Result { + let inner_vec = &enc_multiaddr.0; + let bytes = >::decode(&mut &inner_vec[..]).map_err(|_| ())?; + let multiaddr_str = String::from_utf8(bytes).map_err(|_| ())?; + let multiaddr = Multiaddr::from_str(&multiaddr_str).map_err(|_| ())?; + Ok(multiaddr) + }) + .collect(); + let external_addresses = external_addresses?; + + Ok(NetworkState { + peer_id, + external_addresses, + }) + } +} + /// Offchain extensions implementation API /// /// This is the asynchronous processing part of the API. @@ -296,20 +280,21 @@ pub(crate) struct AsyncApi { impl AsyncApi { /// Creates new Offchain extensions API implementation an the asynchronous processing part. - pub fn new( + pub fn new( transaction_pool: Arc>, db: S, - keys_password: Protected, - key_provider: P, at: BlockId, - ) -> (Api, AsyncApi) { + network_state: Arc, + is_validator: bool, + ) -> (Api, AsyncApi) { let (sender, rx) = mpsc::unbounded(); let api = Api { sender, db, - keys_password, - key_provider, + network_state, + _at: at, + is_validator, }; let async_api = AsyncApi { @@ -322,22 +307,22 @@ impl AsyncApi { } /// Run a processing task for the API - pub fn process(mut self) -> impl Future { + pub fn process(mut self) -> impl Future { let receiver = self.receiver.take().expect("Take invoked only once."); receiver.for_each(move |msg| { match msg { ExtMessage::SubmitExtrinsic(ext) => self.submit_extrinsic(ext), } - Ok(()) + future::ready(()) }) } fn submit_extrinsic(&mut self, ext: Vec) { let xt = match ::Extrinsic::decode(&mut &*ext) { - Some(xt) => xt, - None => { - warn!("Unable to decode extrinsic: {:?}", ext); + Ok(xt) => xt, + Err(e) => { + warn!("Unable to decode extrinsic: {:?}: {}", ext, e.what()); return }, }; @@ -355,10 +340,25 @@ impl AsyncApi { #[cfg(test)] mod tests { use super::*; + use std::convert::TryFrom; + use sr_primitives::traits::Zero; use client_db::offchain::LocalStorage; - use crate::tests::TestProvider; + use network::PeerId; + use test_client::runtime::Block; + + struct MockNetworkStateInfo(); + + impl NetworkStateInfo for MockNetworkStateInfo { + fn external_addresses(&self) -> Vec { + Vec::new() + } - fn offchain_api() -> (Api, AsyncApi) { + fn peer_id(&self) -> PeerId { + PeerId::random() + } + } + + fn offchain_api() -> (Api, AsyncApi) { let _ = env_logger::try_init(); let db = LocalStorage::new_test(); let client = Arc::new(test_client::new()); @@ -366,7 +366,48 @@ mod tests { Pool::new(Default::default(), transaction_pool::ChainApi::new(client.clone())) ); - AsyncApi::new(pool, db, "pass".to_owned().into(), TestProvider::default(), BlockId::Number(0)) + let mock = Arc::new(MockNetworkStateInfo()); + AsyncApi::new( + pool, + db, + BlockId::Number(Zero::zero()), + mock, + false, + ) + } + + #[test] + fn should_get_timestamp() { + let mut api = offchain_api().0; + + // Get timestamp from std. + let now = SystemTime::now(); + let d: u64 = now.duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis().try_into().unwrap(); + + // Get timestamp from offchain api. + let timestamp = api.timestamp(); + + // Compare. + assert!(timestamp.unix_millis() > 0); + assert_eq!(timestamp.unix_millis(), d); + } + + #[test] + fn should_sleep() { + let mut api = offchain_api().0; + + // Arrange. + let now = api.timestamp(); + let delta = primitives::offchain::Duration::from_millis(100); + let deadline = now.add(delta); + + // Act. + api.sleep_until(deadline); + let new_now = api.timestamp(); + + // Assert. + // The diff could be more than the sleep duration. + assert!(new_now.unix_millis() - 100 >= now.unix_millis()); } #[test] @@ -393,66 +434,45 @@ mod tests { api.local_storage_set(kind, key, b"value"); // when - assert_eq!(api.local_storage_compare_and_set(kind, key, b"val", b"xxx"), false); + assert_eq!(api.local_storage_compare_and_set(kind, key, Some(b"val"), b"xxx"), false); assert_eq!(api.local_storage_get(kind, key), Some(b"value".to_vec())); // when - assert_eq!(api.local_storage_compare_and_set(kind, key, b"value", b"xxx"), true); + assert_eq!(api.local_storage_compare_and_set(kind, key, Some(b"value"), b"xxx"), true); assert_eq!(api.local_storage_get(kind, key), Some(b"xxx".to_vec())); } #[test] - fn should_create_a_new_key_and_sign_and_verify_stuff() { - let test = |kind: CryptoKind| { - // given - let mut api = offchain_api().0; - let msg = b"Hello world!"; - - // when - let key_id = api.new_crypto_key(kind).unwrap(); - let signature = api.sign(Some(key_id), kind, msg).unwrap(); - - // then - let res = api.verify(Some(key_id), kind, msg, &signature).unwrap(); - assert_eq!(res, true); - let res = api.verify(Some(key_id), kind, msg, &[]).unwrap(); - assert_eq!(res, false); - let res = api.verify(Some(key_id), kind, b"Different msg", &signature).unwrap(); - assert_eq!(res, false); - - assert_eq!( - api.verify(Some(key_id), CryptoKind::Sr25519, msg, &signature).is_err(), - kind != CryptoKind::Sr25519 - ); + fn should_compare_and_set_local_storage_with_none() { + // given + let kind = StorageKind::PERSISTENT; + let mut api = offchain_api().0; + let key = b"test"; - }; + // when + let res = api.local_storage_compare_and_set(kind, key, None, b"value"); - test(CryptoKind::Ed25519); - test(CryptoKind::Sr25519); + // then + assert_eq!(res, true); + assert_eq!(api.local_storage_get(kind, key), Some(b"value".to_vec())); } #[test] - fn should_sign_and_verify_with_authority_key() { + fn should_convert_network_states() { // given - let mut api = offchain_api().0; - api.key_provider.ed_key = Some(ed25519::Pair::generate().0); - let msg = b"Hello world!"; - let kind = CryptoKind::Ed25519; + let state = NetworkState::new( + PeerId::random(), + vec![ + Multiaddr::try_from("/ip4/127.0.0.1/tcp/1234".to_string()).unwrap(), + Multiaddr::try_from("/ip6/2601:9:4f81:9700:803e:ca65:66e8:c21").unwrap(), + ], + ); // when - let signature = api.sign(None, kind, msg).unwrap(); + let opaque_state = OpaqueNetworkState::from(state.clone()); + let converted_back_state = NetworkState::try_from(opaque_state).unwrap(); // then - let res = api.verify(None, kind, msg, &signature).unwrap(); - assert_eq!(res, true); - let res = api.verify(None, kind, msg, &[]).unwrap(); - assert_eq!(res, false); - let res = api.verify(None, kind, b"Different msg", &signature).unwrap(); - assert_eq!(res, false); - - assert!( - api.verify(None, CryptoKind::Sr25519, msg, &signature).is_err(), - "Invalid kind should trigger a missing key error." - ); + assert_eq!(state, converted_back_state); } } diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index de3a5da08441ac41ca5de454f7f6e020a31db326..b38b202c62e084c008c0686489ff8aaf10770825 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -40,16 +40,11 @@ use std::{ }; use client::runtime_api::ApiExt; -use log::{debug, warn}; -use primitives::{ - ExecutionContext, - crypto, -}; -use runtime_primitives::{ - generic::BlockId, - traits::{self, ProvideRuntimeApi}, -}; use futures::future::Future; +use log::{debug, warn}; +use network::NetworkStateInfo; +use primitives::ExecutionContext; +use sr_primitives::{generic::BlockId, traits::{self, ProvideRuntimeApi}}; use transaction_pool::txpool::{Pool, ChainApi}; mod api; @@ -58,53 +53,27 @@ pub mod testing; pub use offchain_primitives::OffchainWorkerApi; -/// Provides currently configured authority key. -pub trait AuthorityKeyProvider: Clone + 'static { - /// Returns currently configured authority key. - fn authority_key(&self) -> Option; -} - /// An offchain workers manager. -pub struct OffchainWorkers< - Client, - Storage, - KeyProvider, - Block: traits::Block, -> { +pub struct OffchainWorkers { client: Arc, db: Storage, - authority_key: KeyProvider, - keys_password: crypto::Protected, _block: PhantomData, } -impl OffchainWorkers< - Client, - Storage, - KeyProvider, - Block, -> { +impl OffchainWorkers { /// Creates new `OffchainWorkers`. - pub fn new( - client: Arc, - db: Storage, - authority_key: KeyProvider, - keys_password: crypto::Protected, - ) -> Self { + pub fn new(client: Arc, db: Storage) -> Self { Self { client, db, - authority_key, - keys_password, _block: PhantomData, } } } -impl fmt::Debug for OffchainWorkers< +impl fmt::Debug for OffchainWorkers< Client, Storage, - KeyProvider, Block, > { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { @@ -112,16 +81,14 @@ impl fmt::Debug for Offchain } } -impl OffchainWorkers< +impl OffchainWorkers< Client, Storage, - KeyProvider, Block, > where Block: traits::Block, - Client: ProvideRuntimeApi, + Client: ProvideRuntimeApi + Send + Sync + 'static, Client::Api: OffchainWorkerApi, - KeyProvider: AuthorityKeyProvider, Storage: client::backend::OffchainStorage + 'static, { /// Start the offchain workers after given block. @@ -130,9 +97,9 @@ impl OffchainWorkers< &self, number: &::Number, pool: &Arc>, - ) -> impl Future where - A: ChainApi + 'static, - { + network_state: Arc, + is_validator: bool, + ) -> impl Future where A: ChainApi + 'static { let runtime = self.client.runtime_api(); let at = BlockId::number(*number); let has_api = runtime.has_api::>(&at); @@ -142,39 +109,60 @@ impl OffchainWorkers< let (api, runner) = api::AsyncApi::new( pool.clone(), self.db.clone(), - self.keys_password.clone(), - self.authority_key.clone(), at.clone(), + network_state.clone(), + is_validator, ); - debug!("Running offchain workers at {:?}", at); - let api = Box::new(api); - runtime.offchain_worker_with_context(&at, ExecutionContext::OffchainWorker(api), *number).unwrap(); - futures::future::Either::A(runner.process()) + debug!("Spawning offchain workers at {:?}", at); + let number = *number; + let client = self.client.clone(); + spawn_worker(move || { + let runtime = client.runtime_api(); + let api = Box::new(api); + debug!("Running offchain workers at {:?}", at); + let run = runtime.offchain_worker_with_context( + &at, + ExecutionContext::OffchainWorker(api), + number, + ); + if let Err(e) = run { + log::error!("Error running offchain workers at {:?}: {:?}", at, e); + } + }); + futures::future::Either::Left(runner.process()) } else { - futures::future::Either::B(futures::future::ok(())) + futures::future::Either::Right(futures::future::ready(())) } } } +/// Spawns a new offchain worker. +/// +/// We spawn offchain workers for each block in a separate thread, +/// since they can run for a significant amount of time +/// in a blocking fashion and we don't want to block the runtime. +/// +/// Note that we should avoid that if we switch to future-based runtime in the future, +/// alternatively: +/// TODO [ToDr] (#1458) we can consider using a thread pool instead. +fn spawn_worker(f: impl FnOnce() -> () + Send + 'static) { + std::thread::spawn(f); +} + #[cfg(test)] mod tests { use super::*; - use futures::Future; - use primitives::{ed25519, sr25519, crypto::{TypedKey, Pair}}; + use network::{Multiaddr, PeerId}; - #[derive(Clone, Default)] - pub(crate) struct TestProvider { - pub(crate) sr_key: Option, - pub(crate) ed_key: Option, - } + struct MockNetworkStateInfo(); + + impl NetworkStateInfo for MockNetworkStateInfo { + fn external_addresses(&self) -> Vec { + Vec::new() + } - impl AuthorityKeyProvider for TestProvider { - fn authority_key(&self) -> Option { - TPair::from_seed_slice(&match TPair::KEY_TYPE { - sr25519::Pair::KEY_TYPE => self.sr_key.as_ref().map(|key| key.to_raw_vec()), - ed25519::Pair::KEY_TYPE => self.ed_key.as_ref().map(|key| key.to_raw_vec()), - _ => None, - }?).ok() + fn peer_id(&self) -> PeerId { + PeerId::random() } } @@ -182,17 +170,16 @@ mod tests { fn should_call_into_runtime_and_produce_extrinsic() { // given let _ = env_logger::try_init(); - let runtime = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); - let pool = Arc::new(Pool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone()))); + let pool = Arc::new(Pool::new(Default::default(), transaction_pool::ChainApi::new(client.clone()))); let db = client_db::offchain::LocalStorage::new_test(); + let network_state = Arc::new(MockNetworkStateInfo()); // when - let offchain = OffchainWorkers::new(client, db, TestProvider::default(), "".to_owned().into()); - runtime.executor().spawn(offchain.on_block_imported(&0u64, &pool)); + let offchain = OffchainWorkers::new(client, db); + futures::executor::block_on(offchain.on_block_imported(&0u64, &pool, network_state, false)); // then - runtime.shutdown_on_idle().wait().unwrap(); assert_eq!(pool.status().ready, 1); assert_eq!(pool.ready().next().unwrap().is_propagateable(), false); } diff --git a/core/offchain/src/testing.rs b/core/offchain/src/testing.rs index 2d8c690e9a6df3a4d7d1c1ef75e85b4b8a24a268..cdf2878c13e3fa19d67a372ceebf476db54f8af9 100644 --- a/core/offchain/src/testing.rs +++ b/core/offchain/src/testing.rs @@ -28,9 +28,8 @@ use primitives::offchain::{ HttpRequestId as RequestId, HttpRequestStatus as RequestStatus, Timestamp, - CryptoKind, - CryptoKeyId, StorageKind, + OpaqueNetworkState, }; /// Pending request. @@ -135,48 +134,15 @@ impl TestOffchainExt { } impl offchain::Externalities for TestOffchainExt { - fn submit_transaction(&mut self, _ex: Vec) -> Result<(), ()> { - unimplemented!("not needed in tests so far") - } - - fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { - unimplemented!("not needed in tests so far") - } - - fn encrypt( - &mut self, - _key: Option, - _kind: CryptoKind, - _data: &[u8], - ) -> Result, ()> { + fn is_validator(&self) -> bool { unimplemented!("not needed in tests so far") } - fn decrypt( - &mut self, - _key: Option, - _kind: CryptoKind, - _data: &[u8], - ) -> Result, ()> { - unimplemented!("not needed in tests so far") - } - - fn sign( - &mut self, - _key: Option, - _kind: CryptoKind, - _data: &[u8], - ) -> Result, ()> { + fn submit_transaction(&mut self, _ex: Vec) -> Result<(), ()> { unimplemented!("not needed in tests so far") } - fn verify( - &mut self, - _key: Option, - _kind: CryptoKind, - _msg: &[u8], - _signature: &[u8], - ) -> Result { + fn network_state(&self) -> Result { unimplemented!("not needed in tests so far") } @@ -204,14 +170,14 @@ impl offchain::Externalities for TestOffchainExt { &mut self, kind: StorageKind, key: &[u8], - old_value: &[u8], + old_value: Option<&[u8]>, new_value: &[u8] ) -> bool { let mut state = self.0.write(); match kind { StorageKind::LOCAL => &mut state.local_storage, StorageKind::PERSISTENT => &mut state.persistent_storage, - }.compare_and_set(b"", key, Some(old_value), new_value) + }.compare_and_set(b"", key, old_value, new_value) } fn local_storage_get(&mut self, kind: StorageKind, key: &[u8]) -> Option> { @@ -323,4 +289,3 @@ impl offchain::Externalities for TestOffchainExt { } } } - diff --git a/core/panic-handler/src/lib.rs b/core/panic-handler/src/lib.rs index b2fd7238e0d2e77621af4a0c345ed4433b931bab..287ff72a6aa1cd0bf649c37ddd9fa2a6487ee76d 100644 --- a/core/panic-handler/src/lib.rs +++ b/core/panic-handler/src/lib.rs @@ -15,18 +15,31 @@ // along with Substrate. If not, see . //! Custom panic hook with bug report link +//! +//! This crate provides the [`set`] function, which wraps around [`std::panic::set_hook`] and +//! sets up a panic hook that prints a backtrace and invites the user to open an issue to the +//! given URL. +//! +//! By default, the panic handler aborts the process by calling [`std::process::exit`]. This can +//! temporarily be disabled by using an [`AbortGuard`]. use backtrace::Backtrace; use std::io::{self, Write}; +use std::marker::PhantomData; use std::panic::{self, PanicInfo}; use std::cell::Cell; use std::thread; thread_local! { - pub static ABORT: Cell = Cell::new(true); + static ABORT: Cell = Cell::new(true); } -/// Set the panic hook +/// Set the panic hook. +/// +/// Calls [`std::panic::set_hook`] to set up the panic hook. +/// +/// The `bug_url` parameter is an invitation for users to visit that URL to submit a bug report +/// in the case where a panic happens. pub fn set(bug_url: &'static str) { panic::set_hook(Box::new(move |c| panic_hook(c, bug_url))); } @@ -39,7 +52,7 @@ This is a bug. Please report it at: ")} /// Set aborting flag. Returns previous value of the flag. -pub fn set_abort(enabled: bool) -> bool { +fn set_abort(enabled: bool) -> bool { ABORT.with(|flag| { let prev = flag.get(); flag.set(enabled); @@ -47,22 +60,47 @@ pub fn set_abort(enabled: bool) -> bool { }) } -/// Abort flag guard. Sets abort on construction and reverts to previous setting when dropped. -pub struct AbortGuard(bool); +/// RAII guard for whether panics in the current thread should unwind or abort. +/// +/// Sets a thread-local abort flag on construction and reverts to the previous setting when dropped. +/// Does not implement `Send` on purpose. +/// +/// > **Note**: Because we restore the previous value when dropped, you are encouraged to leave +/// > the `AbortGuard` on the stack and let it destroy itself naturally. +pub struct AbortGuard { + /// Value that was in `ABORT` before we created this guard. + previous_val: bool, + /// Marker so that `AbortGuard` doesn't implement `Send`. + _not_send: PhantomData> +} impl AbortGuard { - /// Create a new guard and set abort flag to specified value. - pub fn new(enable: bool) -> AbortGuard { - AbortGuard(set_abort(enable)) + /// Create a new guard. While the guard is alive, panics that happen in the current thread will + /// unwind the stack (unless another guard is created afterwards). + pub fn force_unwind() -> AbortGuard { + AbortGuard { + previous_val: set_abort(false), + _not_send: PhantomData + } + } + + /// Create a new guard. While the guard is alive, panics that happen in the current thread will + /// abort the process (unless another guard is created afterwards). + pub fn force_abort() -> AbortGuard { + AbortGuard { + previous_val: set_abort(true), + _not_send: PhantomData + } } } impl Drop for AbortGuard { fn drop(&mut self) { - set_abort(self.0); + set_abort(self.previous_val); } } +/// Function being called when a panic happens. fn panic_hook(info: &PanicInfo, report_url: &'static str) { let location = info.location(); let file = location.as_ref().map(|l| l.file()).unwrap_or(""); @@ -102,9 +140,14 @@ fn panic_hook(info: &PanicInfo, report_url: &'static str) { }) } -#[test] -fn does_not_abort() { - set("test"); - let _guard = AbortGuard::new(false); - ::std::panic::catch_unwind(|| panic!()).ok(); +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn does_not_abort() { + set("test"); + let _guard = AbortGuard::force_unwind(); + ::std::panic::catch_unwind(|| panic!()).ok(); + } } diff --git a/core/peerset/Cargo.toml b/core/peerset/Cargo.toml index 91e9d58e0a6b42d74690dce7cbbf1fc65309d6e5..7bf0617a9ef5d7bd2e7e2b0e88c08381feaa4beb 100644 --- a/core/peerset/Cargo.toml +++ b/core/peerset/Cargo.toml @@ -8,8 +8,8 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures-preview = "0.3.0-alpha.17" -libp2p = { version = "0.10.0", default-features = false } +futures-preview = "=0.3.0-alpha.17" +libp2p = { version = "0.11.0", default-features = false } linked-hash-map = "0.5" log = "0.4" lru-cache = "0.1.2" diff --git a/core/peerset/src/lib.rs b/core/peerset/src/lib.rs index 763c94d0d642298c6a50c0835193c0ba1bcdd00c..c7c7850f16087799a38fb455e349bf3642ad6f10 100644 --- a/core/peerset/src/lib.rs +++ b/core/peerset/src/lib.rs @@ -20,7 +20,7 @@ mod peersstate; use std::{collections::{HashSet, HashMap}, collections::VecDeque, time::Instant}; -use futures::{prelude::*, channel::mpsc, stream::Fuse}; +use futures::{prelude::*, channel::mpsc}; use libp2p::PeerId; use log::{debug, error, trace}; use serde_json::json; @@ -156,7 +156,11 @@ pub struct Peerset { data: peersstate::PeersState, /// If true, we only accept reserved nodes. reserved_only: bool, - rx: Fuse>, + /// Receiver for messages from the `PeersetHandle` and from `tx`. + rx: mpsc::UnboundedReceiver, + /// Sending side of `rx`. + tx: mpsc::UnboundedSender, + /// Queue of messages to be emitted when the `Peerset` is polled. message_queue: VecDeque, /// When the `Peerset` was created. created: Instant, @@ -170,12 +174,13 @@ impl Peerset { let (tx, rx) = mpsc::unbounded(); let handle = PeersetHandle { - tx, + tx: tx.clone(), }; let mut peerset = Peerset { data: peersstate::PeersState::new(config.in_peers, config.out_peers), - rx: rx.fuse(), + tx, + rx, reserved_only: config.reserved_only, message_queue: VecDeque::new(), created: Instant::now(), @@ -424,6 +429,14 @@ impl Peerset { } } + /// Reports an adjustment to the reputation of the given peer. + pub fn report_peer(&mut self, peer_id: PeerId, score_diff: i32) { + // We don't immediately perform the adjustments in order to have state consistency. We + // don't want the reporting here to take priority over messages sent using the + // `PeersetHandle`. + let _ = self.tx.unbounded_send(Action::ReportPeer(peer_id, score_diff)); + } + /// Produces a JSON object containing the state of the peerset manager, for debugging purposes. pub fn debug_info(&mut self) -> serde_json::Value { self.update_time(); diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 94dac26bec96c02d960b5244e3afff649ef6638e..085b7f52c1dff5c1f26b56098f3a692764f96781 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -6,28 +6,30 @@ edition = "2018" [dependencies] rstd = { package = "sr-std", path = "../sr-std", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rustc-hex = { version = "2.0", default-features = false } serde = { version = "1.0", optional = true, features = ["derive"] } twox-hash = { version = "1.2.0", optional = true } byteorder = { version = "1.3.1", default-features = false } -primitive-types = { version = "0.4.0", default-features = false, features = ["codec"] } +primitive-types = { version = "0.5.0", default-features = false, features = ["codec"] } impl-serde = { version = "0.1", optional = true } -wasmi = { version = "0.4.3", optional = true } -hash-db = { version = "0.14.0", default-features = false } -hash256-std-hasher = { version = "0.14.0", default-features = false } +wasmi = { version = "0.5.0", optional = true } +hash-db = { version = "0.15.0", default-features = false } +hash256-std-hasher = { version = "0.15.0", default-features = false } ed25519-dalek = { version = "1.0.0-pre.1", optional = true } base58 = { version = "0.1", optional = true } blake2-rfc = { version = "0.2.18", optional = true } -schnorrkel = { version = "0.1.1", optional = true } +schnorrkel = { version = "0.8.4", features = ["preaudit_deprecated"], optional = true } rand = { version = "0.6", optional = true } sha2 = { version = "0.8", optional = true } -substrate-bip39 = { version = "0.2.2", optional = true } +substrate-bip39 = { version = "0.3.1", optional = true } tiny-bip39 = { version = "0.6.1", optional = true } hex = { version = "0.3", optional = true } regex = { version = "1.1", optional = true } num-traits = { version = "0.2", default-features = false } zeroize = { version = "0.9.2", default-features = false } +lazy_static = { version = "1.3", optional = true } +parking_lot = { version = "0.9.0", optional = true } [dev-dependencies] substrate-serializer = { path = "../serializer" } @@ -47,13 +49,15 @@ bench = false default = ["std"] std = [ "wasmi", + "lazy_static", + "parking_lot", "primitive-types/std", "primitive-types/serde", "primitive-types/byteorder", "primitive-types/rustc-hex", "primitive-types/libc", "impl-serde", - "parity-codec/std", + "codec/std", "hash256-std-hasher/std", "hash-db/std", "rstd/std", diff --git a/core/primitives/benches/benches.rs b/core/primitives/benches/benches.rs index 4a0e08978fcef7aba8e98f9b2c2a65d91efb171d..5245af44a81313698fadb65f2e5dec4e9d99ee44 100644 --- a/core/primitives/benches/benches.rs +++ b/core/primitives/benches/benches.rs @@ -16,10 +16,11 @@ #[macro_use] extern crate criterion; +use substrate_primitives as primitives; use criterion::{Criterion, black_box, Bencher, Fun}; use std::time::Duration; -use substrate_primitives::crypto::Pair as _; -use substrate_primitives::hashing::{twox_128, blake2_128}; +use primitives::crypto::Pair as _; +use primitives::hashing::{twox_128, blake2_128}; const MAX_KEY_SIZE: u32 = 32; @@ -71,7 +72,7 @@ fn bench_ed25519(c: &mut Criterion) { let msg = (0..msg_size) .map(|_| rand::random::()) .collect::>(); - let key = substrate_primitives::ed25519::Pair::generate().0; + let key = primitives::ed25519::Pair::generate().0; b.iter(|| key.sign(&msg)) }, vec![32, 1024, 1024 * 1024]); @@ -79,10 +80,10 @@ fn bench_ed25519(c: &mut Criterion) { let msg = (0..msg_size) .map(|_| rand::random::()) .collect::>(); - let key = substrate_primitives::ed25519::Pair::generate().0; + let key = primitives::ed25519::Pair::generate().0; let sig = key.sign(&msg); let public = key.public(); - b.iter(|| substrate_primitives::ed25519::Pair::verify(&sig, &msg, &public)) + b.iter(|| primitives::ed25519::Pair::verify(&sig, &msg, &public)) }, vec![32, 1024, 1024 * 1024]); } diff --git a/core/primitives/src/changes_trie.rs b/core/primitives/src/changes_trie.rs index eb6a75454fe41d3ebd9fd5d363e20ac920dad630..fb7791f0a070bf67038bbc47cba00535d9f2ee7a 100644 --- a/core/primitives/src/changes_trie.rs +++ b/core/primitives/src/changes_trie.rs @@ -18,7 +18,7 @@ #[cfg(any(feature = "std", test))] use serde::{Serialize, Deserialize}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use num_traits::Zero; /// Substrate changes trie configuration. diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index 6aac4e08bcdc69e6bc89501035e57c66a0def5c7..0adf50e1602f3ca40e7b222c11c52125d614f38b 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -19,9 +19,13 @@ // end::description[] #[cfg(feature = "std")] -use rand::{RngCore, rngs::OsRng}; +use rstd::convert::TryInto; +use rstd::convert::TryFrom; +#[cfg(feature = "std")] +use parking_lot::Mutex; #[cfg(feature = "std")] -use parity_codec::{Encode, Decode}; +use rand::{RngCore, rngs::OsRng}; +use codec::{Encode, Decode}; #[cfg(feature = "std")] use regex::Regex; #[cfg(feature = "std")] @@ -29,6 +33,8 @@ use base58::{FromBase58, ToBase58}; #[cfg(feature = "std")] use std::hash::Hash; use zeroize::Zeroize; +#[doc(hidden)] +pub use rstd::ops::Deref; /// The root phrase for our publicly known keys. pub const DEV_PHRASE: &str = "bottom drive obey lake curtain smoke basket hold race lonely fit walk"; @@ -79,6 +85,14 @@ impl AsRef for Protected { } } +impl rstd::ops::Deref for Protected { + type Target = T; + + fn deref(&self) -> &T { + &self.0 + } +} + #[cfg(feature = "std")] impl std::fmt::Debug for Protected { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { @@ -243,20 +257,44 @@ pub enum PublicError { #[cfg(feature = "std")] pub trait Ss58Codec: Sized { /// Some if the string is a properly encoded SS58Check address. - fn from_ss58check(s: &str) -> Result; + fn from_ss58check(s: &str) -> Result { + Self::from_ss58check_with_version(s) + .and_then(|(r, v)| match v { + Ss58AddressFormat::SubstrateAccountDirect => Ok(r), + v if v == *DEFAULT_VERSION.lock() => Ok(r), + _ => Err(PublicError::UnknownVersion), + }) + } + /// Some if the string is a properly encoded SS58Check address. + fn from_ss58check_with_version(s: &str) -> Result<(Self, Ss58AddressFormat), PublicError>; /// Some if the string is a properly encoded SS58Check address, optionally with /// a derivation path following. - fn from_string(s: &str) -> Result { Self::from_ss58check(s) } + fn from_string(s: &str) -> Result { + Self::from_string_with_version(s) + .and_then(|(r, v)| match v { + Ss58AddressFormat::SubstrateAccountDirect => Ok(r), + v if v == *DEFAULT_VERSION.lock() => Ok(r), + _ => Err(PublicError::UnknownVersion), + }) + } + /// Return the ss58-check string for this key. - fn to_ss58check(&self) -> String; + fn to_ss58check_with_version(&self, version: Ss58AddressFormat) -> String; + /// Return the ss58-check string for this key. + fn to_ss58check(&self) -> String { self.to_ss58check_with_version(*DEFAULT_VERSION.lock()) } + /// Some if the string is a properly encoded SS58Check address, optionally with + /// a derivation path following. + fn from_string_with_version(s: &str) -> Result<(Self, Ss58AddressFormat), PublicError> { + Self::from_ss58check_with_version(s) + } } -#[cfg(feature = "std")] /// Derivable key trait. pub trait Derive: Sized { /// Derive a child key from a series of given junctions. /// /// Will be `None` for public keys if there are any hard junctions in there. + #[cfg(feature = "std")] fn derive>(&self, _path: Iter) -> Option { None } @@ -273,9 +311,92 @@ fn ss58hash(data: &[u8]) -> blake2_rfc::blake2b::Blake2bResult { context.finalize() } +#[cfg(feature = "std")] +lazy_static::lazy_static! { + static ref DEFAULT_VERSION: Mutex + = Mutex::new(Ss58AddressFormat::SubstrateAccountDirect); +} + +/// A known address (sub)format/network ID for SS58. +#[cfg(feature = "std")] +#[derive(Copy, Clone, PartialEq, Eq)] +pub enum Ss58AddressFormat { + /// Any Substrate network, direct checksum, standard account (*25519). + SubstrateAccountDirect, + /// Polkadot Relay-chain, direct checksum, standard account (*25519). + PolkadotAccountDirect, + /// Kusama Relay-chain, direct checksum, standard account (*25519). + KusamaAccountDirect, + /// Use a manually provided numeric value. + Custom(u8), +} + +#[cfg(feature = "std")] +impl From for u8 { + fn from(x: Ss58AddressFormat) -> u8 { + match x { + Ss58AddressFormat::SubstrateAccountDirect => 42, + Ss58AddressFormat::PolkadotAccountDirect => 0, + Ss58AddressFormat::KusamaAccountDirect => 2, + Ss58AddressFormat::Custom(n) => n, + } + } +} + +#[cfg(feature = "std")] +impl TryFrom for Ss58AddressFormat { + type Error = (); + fn try_from(x: u8) -> Result { + match x { + 42 => Ok(Ss58AddressFormat::SubstrateAccountDirect), + 0 => Ok(Ss58AddressFormat::PolkadotAccountDirect), + 2 => Ok(Ss58AddressFormat::KusamaAccountDirect), + _ => Err(()), + } + } +} + +#[cfg(feature = "std")] +impl<'a> TryFrom<&'a str> for Ss58AddressFormat { + type Error = (); + fn try_from(x: &'a str) -> Result { + match x { + "substrate" => Ok(Ss58AddressFormat::SubstrateAccountDirect), + "polkadot" => Ok(Ss58AddressFormat::PolkadotAccountDirect), + "kusama" => Ok(Ss58AddressFormat::KusamaAccountDirect), + a => a.parse::().map(Ss58AddressFormat::Custom).map_err(|_| ()), + } + } +} + +#[cfg(feature = "std")] +impl From for String { + fn from(x: Ss58AddressFormat) -> String { + match x { + Ss58AddressFormat::SubstrateAccountDirect => "substrate".into(), + Ss58AddressFormat::PolkadotAccountDirect => "polkadot".into(), + Ss58AddressFormat::KusamaAccountDirect => "kusama".into(), + Ss58AddressFormat::Custom(x) => x.to_string(), + } + } +} + +/// Set the default "version" (actually, this is a bit of a misnomer and the version byte is +/// typically used not just to encode format/version but also network identity) that is used for +/// encoding and decoding SS58 addresses. If an unknown version is provided then it fails. +/// +/// Current known "versions" are: +/// - 0 direct (payload) checksum for 32-byte *25519 Polkadot addresses. +/// - 2 direct (payload) checksum for 32-byte *25519 Polkadot Milestone 'K' addresses. +/// - 42 direct (payload) checksum for 32-byte *25519 addresses on any Substrate-based network. +#[cfg(feature = "std")] +pub fn set_default_ss58_version(version: Ss58AddressFormat) { + *DEFAULT_VERSION.lock() = version +} + #[cfg(feature = "std")] impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { - fn from_ss58check(s: &str) -> Result { + fn from_ss58check_with_version(s: &str) -> Result<(Self, Ss58AddressFormat), PublicError> { let mut res = T::default(); let len = res.as_mut().len(); let d = s.from_base58().map_err(|_| PublicError::BadBase58)?; // failure here would be invalid encoding. @@ -283,21 +404,18 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { // Invalid length. return Err(PublicError::BadLength); } - if d[0] != 42 { - // Invalid version. - return Err(PublicError::UnknownVersion); - } + let ver = d[0].try_into().map_err(|_: ()| PublicError::UnknownVersion)?; if d[len+1..len+3] != ss58hash(&d[0..len+1]).as_bytes()[0..2] { // Invalid checksum. return Err(PublicError::InvalidChecksum); } res.as_mut().copy_from_slice(&d[1..len+1]); - Ok(res) + Ok((res, ver)) } - fn to_ss58check(&self) -> String { - let mut v = vec![42u8]; + fn to_ss58check_with_version(&self, version: Ss58AddressFormat) -> String { + let mut v = vec![version.into()]; v.extend(self.as_ref()); let r = ss58hash(&v); v.extend(&r.as_bytes()[0..2]); @@ -324,11 +442,33 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { .ok_or(PublicError::InvalidPath) } } + + fn from_string_with_version(s: &str) -> Result<(Self, Ss58AddressFormat), PublicError> { + let re = Regex::new(r"^(?P[\w\d]+)?(?P(//?[^/]+)*)$") + .expect("constructed from known-good static value; qed"); + let cap = re.captures(s).ok_or(PublicError::InvalidFormat)?; + let re_junction = Regex::new(r"/(/?[^/]+)") + .expect("constructed from known-good static value; qed"); + let (addr, v) = Self::from_ss58check_with_version( + cap.name("ss58") + .map(|r| r.as_str()) + .unwrap_or(DEV_ADDRESS) + )?; + if cap["path"].is_empty() { + Ok((addr, v)) + } else { + let path = re_junction.captures_iter(&cap["path"]) + .map(|f| DeriveJunction::from(&f[1])); + addr.derive(path) + .ok_or(PublicError::InvalidPath) + .map(|a| (a, v)) + } + } } /// Trait suitable for typical cryptographic PKI key public type. -pub trait Public: TypedKey + PartialEq + Eq { - /// A new instance from the given slice that should be 32 bytes long. +pub trait Public: AsRef<[u8]> + AsMut<[u8]> + Default + Derive + CryptoType + PartialEq + Eq + Clone + Send + Sync { + /// A new instance from the given slice. /// /// NOTE: No checking goes on to ensure this is a real public key. Only use it if /// you are certain that the array actually is a pubkey. GIGO! @@ -336,17 +476,85 @@ pub trait Public: TypedKey + PartialEq + Eq { /// Return a `Vec` filled with raw data. #[cfg(feature = "std")] - fn to_raw_vec(&self) -> Vec; + fn to_raw_vec(&self) -> Vec { self.as_slice().to_owned() } /// Return a slice filled with raw data. - fn as_slice(&self) -> &[u8]; + fn as_slice(&self) -> &[u8] { self.as_ref() } +} + +#[cfg(feature = "std")] +pub use self::dummy::*; + +#[cfg(feature = "std")] +mod dummy { + use super::*; + + /// Dummy cryptography. Doesn't do anything. + #[derive(Clone, Hash, Default, Eq, PartialEq)] + pub struct Dummy; + + impl AsRef<[u8]> for Dummy { + fn as_ref(&self) -> &[u8] { &b""[..] } + } + + impl AsMut<[u8]> for Dummy { + fn as_mut(&mut self) -> &mut[u8] { + unsafe { + #[allow(mutable_transmutes)] + rstd::mem::transmute::<_, &'static mut [u8]>(&b""[..]) + } + } + } + + impl CryptoType for Dummy { + type Pair = Dummy; + } + + impl Derive for Dummy {} + + impl Public for Dummy { + fn from_slice(_: &[u8]) -> Self { Self } + #[cfg(feature = "std")] + fn to_raw_vec(&self) -> Vec { vec![] } + fn as_slice(&self) -> &[u8] { b"" } + } + + impl Pair for Dummy { + type Public = Dummy; + type Seed = Dummy; + type Signature = Dummy; + type DeriveError = (); + fn generate_with_phrase(_: Option<&str>) -> (Self, String, Self::Seed) { Default::default() } + fn from_phrase(_: &str, _: Option<&str>) + -> Result<(Self, Self::Seed), SecretStringError> + { + Ok(Default::default()) + } + fn derive< + Iter: Iterator + >(&self, _: Iter) -> Result { Ok(Self) } + fn from_seed(_: &Self::Seed) -> Self { Self } + fn from_seed_slice(_: &[u8]) -> Result { Ok(Self) } + fn from_standard_components< + I: Iterator + >( + _: &str, + _: Option<&str>, + _: I + ) -> Result { Ok(Self) } + fn sign(&self, _: &[u8]) -> Self::Signature { Self } + fn verify>(_: &Self::Signature, _: M, _: &Self::Public) -> bool { true } + fn verify_weak, M: AsRef<[u8]>>(_: &[u8], _: M, _: P) -> bool { true } + fn public(&self) -> Self::Public { Self } + fn to_raw_vec(&self) -> Vec { vec![] } + } } /// Trait suitable for typical cryptographic PKI key pair type. /// /// For now it just specifies how to create a key from a phrase and derivation path. #[cfg(feature = "std")] -pub trait Pair: TypedKey + Sized + 'static { +pub trait Pair: CryptoType + Sized + Clone + Send + Sync + 'static { /// The type which is used to encode a public key. type Public: Public + Hash; @@ -408,7 +616,7 @@ pub trait Pair: TypedKey + Sized + 'static { fn sign(&self, message: &[u8]) -> Self::Signature; /// Verify a signature on a message. Returns true if the signature is good. - fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool; + fn verify>(sig: &Self::Signature, message: M, pubkey: &Self::Public) -> bool; /// Verify a signature on a message. Returns true if the signature is good. fn verify_weak, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool; @@ -473,26 +681,109 @@ pub trait Pair: TypedKey + Sized + 'static { fn to_raw_vec(&self) -> Vec; } +/// One type is wrapped by another. +pub trait IsWrappedBy: From + Into { + /// Get a reference to the inner from the outer. + fn from_ref(outer: &Outer) -> &Self; + /// Get a mutable reference to the inner from the outer. + fn from_mut(outer: &mut Outer) -> &mut Self; +} + +/// Opposite of `IsWrappedBy` - denotes a type which is a simple wrapper around another type. +pub trait Wraps: Sized { + /// The inner type it is wrapping. + type Inner: IsWrappedBy; +} + +impl IsWrappedBy for T where + Outer: AsRef + AsMut + From, + T: From, +{ + /// Get a reference to the inner from the outer. + fn from_ref(outer: &Outer) -> &Self { outer.as_ref() } + + /// Get a mutable reference to the inner from the outer. + fn from_mut(outer: &mut Outer) -> &mut Self { outer.as_mut() } +} + +impl UncheckedFrom for Outer where + Outer: Wraps, + Inner: IsWrappedBy + UncheckedFrom, +{ + fn unchecked_from(t: T) -> Self { + let inner: Inner = t.unchecked_into(); + inner.into() + } +} + +/// Type which has a particular kind of crypto associated with it. +pub trait CryptoType { + /// The pair key type of this crypto. + #[cfg(feature="std")] + type Pair: Pair; +} + /// An identifier for a type of cryptographic key. /// -/// 0-1024 are reserved. -pub type KeyTypeId = u32; - -/// Constant key types. -pub mod key_types { - use super::KeyTypeId; +/// To avoid clashes with other modules when distributing your module publically, register your +/// `KeyTypeId` on the list here by making a PR. +/// +/// Values whose first character is `_` are reserved for private use and won't conflict with any +/// public modules. +#[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct KeyTypeId(pub [u8; 4]); + +impl From for KeyTypeId { + fn from(x: u32) -> Self { + Self(x.to_le_bytes()) + } +} - /// ED25519 public key. - pub const ED25519: KeyTypeId = 10; +impl From for u32 { + fn from(x: KeyTypeId) -> Self { + u32::from_le_bytes(x.0) + } +} - /// SR25519 public key. - pub const SR25519: KeyTypeId = 20; +impl<'a> TryFrom<&'a str> for KeyTypeId { + type Error = (); + fn try_from(x: &'a str) -> Result { + let b = x.as_bytes(); + if b.len() != 4 { + return Err(()); + } + let mut res = KeyTypeId::default(); + res.0.copy_from_slice(&b[0..4]); + Ok(res) + } } -/// A trait for something that has a key type ID. -pub trait TypedKey { - /// The type ID of this key. - const KEY_TYPE: KeyTypeId; +/// Known key types; this also functions as a global registry of key types for projects wishing to +/// avoid collisions with each other. +/// +/// It's not universal in the sense that *all* key types need to be mentioned here, it's just a +/// handy place to put common key types. +pub mod key_types { + use super::KeyTypeId; + + /// Key type for generic S/R 25519 key. + pub const SR25519: KeyTypeId = KeyTypeId(*b"sr25"); + /// Key type for generic Ed25519 key. + pub const ED25519: KeyTypeId = KeyTypeId(*b"ed25"); + /// Key type for Babe module, build-in. + pub const BABE: KeyTypeId = KeyTypeId(*b"babe"); + /// Key type for Grandpa module, build-in. + pub const GRANDPA: KeyTypeId = KeyTypeId(*b"gran"); + /// Key type for controlling an account in a Substrate runtime, built-in. + pub const ACCOUNT: KeyTypeId = KeyTypeId(*b"acco"); + /// Key type for Aura module, built-in. + pub const AURA: KeyTypeId = KeyTypeId(*b"aura"); + /// Key type for ImOnline module, built-in. + pub const IM_ONLINE: KeyTypeId = KeyTypeId(*b"imon"); + /// A key type ID useful for tests. + #[cfg(feature = "std")] + pub const DUMMY: KeyTypeId = KeyTypeId(*b"dumy"); } #[cfg(test)] @@ -501,7 +792,7 @@ mod tests { use hex_literal::hex; use super::*; - #[derive(Eq, PartialEq, Debug)] + #[derive(Clone, Eq, PartialEq, Debug)] enum TestPair { Generated, GeneratedWithPhrase, @@ -509,9 +800,31 @@ mod tests { Standard{phrase: String, password: Option, path: Vec}, Seed(Vec), } + impl Default for TestPair { + fn default() -> Self { + TestPair::Generated + } + } + impl CryptoType for TestPair { + type Pair = Self; + } - #[derive(PartialEq, Eq, Hash)] + #[derive(Clone, PartialEq, Eq, Hash, Default)] struct TestPublic; + impl AsRef<[u8]> for TestPublic { + fn as_ref(&self) -> &[u8] { + &[] + } + } + impl AsMut<[u8]> for TestPublic { + fn as_mut(&mut self) -> &mut [u8] { + &mut [] + } + } + impl CryptoType for TestPublic { + type Pair = TestPair; + } + impl Derive for TestPublic {} impl Public for TestPublic { fn from_slice(_bytes: &[u8]) -> Self { Self @@ -523,9 +836,6 @@ mod tests { vec![] } } - impl TypedKey for TestPublic { - const KEY_TYPE: u32 = 4242; - } impl Pair for TestPair { type Public = TestPublic; type Seed = [u8; 0]; @@ -551,11 +861,7 @@ mod tests { } fn from_seed(_seed: &::Seed) -> Self { TestPair::Seed(vec![]) } fn sign(&self, _message: &[u8]) -> Self::Signature { [] } - fn verify, M: AsRef<[u8]>>( - _sig: &Self::Signature, - _message: M, - _pubkey: P - ) -> bool { true } + fn verify>(_: &Self::Signature, _: M, _: &Self::Public) -> bool { true } fn verify_weak, M: AsRef<[u8]>>( _sig: &[u8], _message: M, @@ -582,9 +888,6 @@ mod tests { vec![] } } - impl TypedKey for TestPair { - const KEY_TYPE: u32 = 4242; - } #[test] fn interpret_std_seed_should_work() { diff --git a/core/primitives/src/ed25519.rs b/core/primitives/src/ed25519.rs index 5d1fe884a5180efa406a07392449594e8411d582..810e86767d8e365ce9026e91c932134285ed830a 100644 --- a/core/primitives/src/ed25519.rs +++ b/core/primitives/src/ed25519.rs @@ -20,7 +20,7 @@ use crate::{hash::H256, hash::H512}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; #[cfg(feature = "std")] use blake2_rfc; @@ -29,10 +29,10 @@ use substrate_bip39::seed_from_entropy; #[cfg(feature = "std")] use bip39::{Mnemonic, Language, MnemonicType}; #[cfg(feature = "std")] -use crate::crypto::{Pair as TraitPair, DeriveJunction, SecretStringError, Derive, Ss58Codec}; +use crate::crypto::{Pair as TraitPair, DeriveJunction, SecretStringError, Ss58Codec}; #[cfg(feature = "std")] use serde::{de, Serializer, Serialize, Deserializer, Deserialize}; -use crate::crypto::{key_types, KeyTypeId, Public as TraitPublic, TypedKey, UncheckedFrom}; +use crate::{crypto::{Public as TraitPublic, UncheckedFrom, CryptoType, Derive}}; /// A secret seed. It's not called a "secret key" because ring doesn't expose the secret keys /// of the key pair (yeah, dumb); as such we're forced to remember the seed manually if we @@ -77,6 +77,20 @@ impl AsMut<[u8]> for Public { } } +impl rstd::convert::TryFrom<&[u8]> for Public { + type Error = (); + + fn try_from(data: &[u8]) -> Result { + if data.len() == 32 { + let mut inner = [0u8; 32]; + inner.copy_from_slice(data); + Ok(Public(inner)) + } else { + Err(()) + } + } +} + impl From for [u8; 32] { fn from(x: Public) -> Self { x.0 @@ -90,12 +104,6 @@ impl From for Public { } } -impl AsRef for Public { - fn as_ref(&self) -> &Public { - &self - } -} - impl From for H256 { fn from(x: Public) -> Self { x.0.into() @@ -115,15 +123,15 @@ impl UncheckedFrom for Public { } #[cfg(feature = "std")] -impl ::std::fmt::Display for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Display for Public { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!(f, "{}", self.to_ss58check()) } } #[cfg(feature = "std")] -impl ::std::fmt::Debug for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Debug for Public { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { let s = self.to_ss58check(); write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) } @@ -145,8 +153,8 @@ impl<'de> Deserialize<'de> for Public { } #[cfg(feature = "std")] -impl ::std::hash::Hash for Public { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for Public { + fn hash(&self, state: &mut H) { self.0.hash(state); } } @@ -155,6 +163,20 @@ impl ::std::hash::Hash for Public { #[derive(Encode, Decode)] pub struct Signature(pub [u8; 64]); +impl rstd::convert::TryFrom<&[u8]> for Signature { + type Error = (); + + fn try_from(data: &[u8]) -> Result { + if data.len() == 64 { + let mut inner = [0u8; 64]; + inner.copy_from_slice(data); + Ok(Signature(inner)) + } else { + Err(()) + } + } +} + impl Clone for Signature { fn clone(&self) -> Self { let mut r = [0u8; 64]; @@ -171,7 +193,7 @@ impl Default for Signature { impl PartialEq for Signature { fn eq(&self, b: &Self) -> bool { - &self.0[..] == &b.0[..] + self.0[..] == b.0[..] } } @@ -208,16 +230,16 @@ impl AsMut<[u8]> for Signature { } #[cfg(feature = "std")] -impl ::std::fmt::Debug for Signature { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Debug for Signature { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) } } #[cfg(feature = "std")] -impl ::std::hash::Hash for Signature { - fn hash(&self, state: &mut H) { - ::std::hash::Hash::hash(&self.0[..], state); +impl std::hash::Hash for Signature { + fn hash(&self, state: &mut H) { + std::hash::Hash::hash(&self.0[..], state); } } @@ -306,31 +328,10 @@ impl TraitPublic for Public { r.copy_from_slice(data); Public(r) } - - /// Return a `Vec` filled with raw data. - #[cfg(feature = "std")] - fn to_raw_vec(&self) -> Vec { - let r: &[u8; 32] = self.as_ref(); - r.to_vec() - } - - /// Return a slice filled with raw data. - fn as_slice(&self) -> &[u8] { - let r: &[u8; 32] = self.as_ref(); - &r[..] - } } -#[cfg(feature = "std")] impl Derive for Public {} -#[cfg(feature = "std")] -impl AsRef for Pair { - fn as_ref(&self) -> &Pair { - &self - } -} - /// Derive a single hard junction. #[cfg(feature = "std")] fn derive_hard_junction(secret_seed: &Seed, cc: &[u8; 32]) -> Seed { @@ -438,8 +439,8 @@ impl TraitPair for Pair { } /// Verify a signature on a message. Returns true if the signature is good. - fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { - Self::verify_weak(&sig.0[..], message.as_ref(), &pubkey.as_ref().0[..]) + fn verify>(sig: &Self::Signature, message: M, pubkey: &Self::Public) -> bool { + Self::verify_weak(&sig.0[..], message.as_ref(), pubkey) } /// Verify a signature on a message. Returns true if the signature is good. @@ -488,17 +489,19 @@ impl Pair { } } -impl TypedKey for Public { - const KEY_TYPE: KeyTypeId = key_types::ED25519; +impl CryptoType for Public { + #[cfg(feature="std")] + type Pair = Pair; } -impl TypedKey for Signature { - const KEY_TYPE: KeyTypeId = key_types::ED25519; +impl CryptoType for Signature { + #[cfg(feature="std")] + type Pair = Pair; } #[cfg(feature = "std")] -impl TypedKey for Pair { - const KEY_TYPE: KeyTypeId = key_types::ED25519; +impl CryptoType for Pair { + type Pair = Pair; } #[cfg(test)] diff --git a/core/primitives/src/lib.rs b/core/primitives/src/lib.rs index 4fabb04ccb0383aa30ed99399639dd98bbe01d11..21e7c878082ad85f4aade22a8711b2633f2f89df 100644 --- a/core/primitives/src/lib.rs +++ b/core/primitives/src/lib.rs @@ -33,11 +33,13 @@ macro_rules! map { use rstd::prelude::*; use rstd::ops::Deref; -use parity_codec::{Encode, Decode}; #[cfg(feature = "std")] use std::borrow::Cow; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; +#[cfg(feature = "std")] +pub use serde;// << for macro +pub use codec::{Encode, Decode};// << for macro #[cfg(feature = "std")] pub use impl_serde::serialize as bytes; @@ -61,6 +63,8 @@ pub mod sandbox; pub mod storage; pub mod uint; mod changes_trie; +pub mod traits; +pub mod testing; #[cfg(test)] mod tests; @@ -77,7 +81,6 @@ pub use hash_db::Hasher; pub use self::hasher::blake2::Blake2Hasher; /// Context for executing a call into the runtime. -#[repr(u8)] pub enum ExecutionContext { /// Context for general importing (including own blocks). Importing, @@ -91,6 +94,17 @@ pub enum ExecutionContext { Other, } +impl ExecutionContext { + /// Returns if the keystore should be enabled for the current context. + pub fn enable_keystore(&self) -> bool { + use ExecutionContext::*; + match self { + Importing | Syncing | BlockConstruction => false, + OffchainWorker(_) | Other => true, + } + } +} + /// Hex-serialized shim for `Vec`. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash, PartialOrd, Ord))] @@ -138,16 +152,16 @@ pub enum NativeOrEncoded { } #[cfg(feature = "std")] -impl ::std::fmt::Debug for NativeOrEncoded { +impl ::std::fmt::Debug for NativeOrEncoded { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { self.as_encoded().as_ref().fmt(f) } } #[cfg(feature = "std")] -impl NativeOrEncoded { +impl NativeOrEncoded { /// Return the value as the encoded format. - pub fn as_encoded<'a>(&'a self) -> Cow<'a, [u8]> { + pub fn as_encoded(&self) -> Cow<'_, [u8]> { match self { NativeOrEncoded::Encoded(e) => Cow::Borrowed(e.as_slice()), NativeOrEncoded::Native(n) => Cow::Owned(n.encode()), @@ -164,13 +178,13 @@ impl NativeOrEncoded { } #[cfg(feature = "std")] -impl PartialEq for NativeOrEncoded { +impl PartialEq for NativeOrEncoded { fn eq(&self, other: &Self) -> bool { match (self, other) { (NativeOrEncoded::Native(l), NativeOrEncoded::Native(r)) => l == r, (NativeOrEncoded::Native(n), NativeOrEncoded::Encoded(e)) | (NativeOrEncoded::Encoded(e), NativeOrEncoded::Native(n)) => - Some(n) == parity_codec::Decode::decode(&mut &e[..]).as_ref(), + Some(n) == codec::Decode::decode(&mut &e[..]).ok().as_ref(), (NativeOrEncoded::Encoded(l), NativeOrEncoded::Encoded(r)) => l == r, } } @@ -183,7 +197,7 @@ impl PartialEq for NativeOrEncoded { pub enum NeverNativeValue {} #[cfg(feature = "std")] -impl parity_codec::Encode for NeverNativeValue { +impl codec::Encode for NeverNativeValue { fn encode(&self) -> Vec { // The enum is not constructable, so this function should never be callable! unreachable!() @@ -191,8 +205,12 @@ impl parity_codec::Encode for NeverNativeValue { } #[cfg(feature = "std")] -impl parity_codec::Decode for NeverNativeValue { - fn decode(_: &mut I) -> Option { - None +impl codec::EncodeLike for NeverNativeValue {} + +#[cfg(feature = "std")] +impl codec::Decode for NeverNativeValue { + fn decode(_: &mut I) -> Result { + Err("`NeverNativeValue` should never be decoded".into()) } } + diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs index 2ea93423d972723a318098fc907435cc9d89a4b0..52dbf5fbee3566433f2664ea1ce790a641599fdb 100644 --- a/core/primitives/src/offchain.rs +++ b/core/primitives/src/offchain.rs @@ -16,11 +16,12 @@ //! Offchain workers types -use crate::crypto; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use rstd::prelude::{Vec, Box}; use rstd::convert::TryFrom; +pub use crate::crypto::KeyTypeId; + /// A type of supported crypto. #[derive(Clone, Copy, PartialEq, Eq, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug))] @@ -58,46 +59,6 @@ impl From for u32 { } } -/// A type of supported crypto. -#[derive(Clone, Copy, PartialEq, Eq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] -#[repr(C)] -pub enum CryptoKind { - /// SR25519 crypto (Schnorrkel) - Sr25519 = crypto::key_types::SR25519 as isize, - /// ED25519 crypto (Edwards) - Ed25519 = crypto::key_types::ED25519 as isize, -} - -impl TryFrom for CryptoKind { - type Error = (); - - fn try_from(kind: u32) -> Result { - match kind { - e if e == CryptoKind::Sr25519 as isize as u32 => Ok(CryptoKind::Sr25519), - e if e == CryptoKind::Ed25519 as isize as u32 => Ok(CryptoKind::Ed25519), - _ => Err(()), - } - } -} - -impl From for u32 { - fn from(c: CryptoKind) -> Self { - c as isize as u32 - } -} - -/// Opaque type for created crypto keys. -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct CryptoKeyId(pub u16); - -impl From for u32 { - fn from(c: CryptoKeyId) -> Self { - c.0 as u32 - } -} - /// Opaque type for offchain http requests. #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[cfg_attr(feature = "std", derive(Debug))] @@ -185,6 +146,41 @@ impl TryFrom for HttpRequestStatus { } } +/// A blob to hold information about the local node's network state +/// without committing to its format. +#[derive(Clone, Eq, PartialEq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct OpaqueNetworkState { + /// PeerId of the local node. + pub peer_id: OpaquePeerId, + /// List of addresses the node knows it can be reached as. + pub external_addresses: Vec, +} + +/// Simple blob to hold a `PeerId` without committing to its format. +#[derive(Clone, Eq, PartialEq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct OpaquePeerId(pub Vec); + +impl OpaquePeerId { + /// Create new `OpaquePeerId` + pub fn new(vec: Vec) -> Self { + OpaquePeerId(vec) + } +} + +/// Simple blob to hold a `Multiaddr` without committing to its format. +#[derive(Clone, Eq, PartialEq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct OpaqueMultiaddr(pub Vec); + +impl OpaqueMultiaddr { + /// Create new `OpaqueMultiaddr` + pub fn new(vec: Vec) -> Self { + OpaqueMultiaddr(vec) + } +} + /// Opaque timestamp type #[derive(Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Default)] #[cfg_attr(feature = "std", derive(Debug))] @@ -236,46 +232,18 @@ impl Timestamp { /// An extended externalities for offchain workers. pub trait Externalities { + /// Returns if the local node is a potential validator. + /// + /// Even if this function returns `true`, it does not mean that any keys are configured + /// and that the validator is registered in the chain. + fn is_validator(&self) -> bool; /// Submit transaction. /// /// The transaction will end up in the pool and be propagated to others. fn submit_transaction(&mut self, extrinsic: Vec) -> Result<(), ()>; - /// Create new key(pair) for signing/encryption/decryption. - /// - /// Returns an error if given crypto kind is not supported. - fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result; - - /// Encrypt a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key of `CryptoKind`. - /// - /// Returns an error if `key` is not available or does not exist, - /// or the expected `CryptoKind` does not match. - fn encrypt(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; - - /// Decrypt a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key of `CryptoKind`. - /// - /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist, - /// or the expected `CryptoKind` does not match. - fn decrypt(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; - - /// Sign a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key of `CryptoKind`. - /// - /// Returns an error if `key` is not available or does not exist, - /// or the expected `CryptoKind` does not match. - fn sign(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; - - /// Verifies that `signature` for `msg` matches given `key`. - /// - /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. - /// Returns an error in case the key is not available or does not exist or the parameters - /// lengths are incorrect or `CryptoKind` does not match. - fn verify(&mut self, key: Option, kind: CryptoKind, msg: &[u8], signature: &[u8]) -> Result; + /// Returns information about the local node's network state. + fn network_state(&self) -> Result; /// Returns current UNIX timestamp (in millis) fn timestamp(&mut self) -> Timestamp; @@ -308,7 +276,7 @@ pub trait Externalities { &mut self, kind: StorageKind, key: &[u8], - old_value: &[u8], + old_value: Option<&[u8]>, new_value: &[u8], ) -> bool; @@ -319,9 +287,9 @@ pub trait Externalities { /// offchain worker tasks running on the same machine. It IS persisted between runs. fn local_storage_get(&mut self, kind: StorageKind, key: &[u8]) -> Option>; - /// Initiaties a http request given HTTP verb and the URL. + /// Initiates a http request given HTTP verb and the URL. /// - /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. + /// Meta is a future-reserved field containing additional, parity-scale-codec encoded parameters. /// Returns the id of newly started request. fn http_request_start( &mut self, @@ -386,28 +354,16 @@ pub trait Externalities { } impl Externalities for Box { - fn submit_transaction(&mut self, ex: Vec) -> Result<(), ()> { - (&mut **self).submit_transaction(ex) + fn is_validator(&self) -> bool { + (& **self).is_validator() } - fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result { - (&mut **self).new_crypto_key(crypto) - } - - fn encrypt(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()> { - (&mut **self).encrypt(key, kind, data) - } - - fn decrypt(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()> { - (&mut **self).decrypt(key, kind, data) - } - - fn sign(&mut self, key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()> { - (&mut **self).sign(key, kind, data) + fn submit_transaction(&mut self, ex: Vec) -> Result<(), ()> { + (&mut **self).submit_transaction(ex) } - fn verify(&mut self, key: Option, kind: CryptoKind, msg: &[u8], signature: &[u8]) -> Result { - (&mut **self).verify(key, kind, msg, signature) + fn network_state(&self) -> Result { + (& **self).network_state() } fn timestamp(&mut self) -> Timestamp { @@ -430,7 +386,7 @@ impl Externalities for Box { &mut self, kind: StorageKind, key: &[u8], - old_value: &[u8], + old_value: Option<&[u8]>, new_value: &[u8], ) -> bool { (&mut **self).local_storage_compare_and_set(kind, key, old_value, new_value) diff --git a/core/primitives/src/sandbox.rs b/core/primitives/src/sandbox.rs index 773a6b489330986c2e60a91c182a6bdd2ab187a0..e47a30ca5bbb7abb91c4901d9e05d0df33836b2d 100644 --- a/core/primitives/src/sandbox.rs +++ b/core/primitives/src/sandbox.rs @@ -16,7 +16,7 @@ //! Definition of a sandbox environment. -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use rstd::vec::Vec; /// Error error that can be returned from host function. @@ -184,7 +184,7 @@ pub const ERR_EXECUTION: u32 = -3i32 as u32; mod tests { use super::*; use std::fmt; - use parity_codec::Codec; + use codec::Codec; fn roundtrip(s: S) { let encoded = s.encode(); diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index e01d989143c6b8491680bb18c1a95a11e7540e32..0e573f49ce34c3de29565df0fc318b6214aae2d3 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -22,7 +22,7 @@ // end::description[] #[cfg(feature = "std")] -use schnorrkel::{signing_context, Keypair, SecretKey, MiniSecretKey, PublicKey, +use schnorrkel::{signing_context, ExpansionMode, Keypair, SecretKey, MiniSecretKey, PublicKey, derive::{Derivation, ChainCode, CHAIN_CODE_LENGTH} }; #[cfg(feature = "std")] @@ -30,10 +30,12 @@ use substrate_bip39::mini_secret_from_entropy; #[cfg(feature = "std")] use bip39::{Mnemonic, Language, MnemonicType}; #[cfg(feature = "std")] -use crate::crypto::{Pair as TraitPair, DeriveJunction, Infallible, SecretStringError, Derive, Ss58Codec}; -use crate::crypto::{key_types, KeyTypeId, Public as TraitPublic, TypedKey, UncheckedFrom}; +use crate::crypto::{ + Pair as TraitPair, DeriveJunction, Infallible, SecretStringError, Ss58Codec +}; +use crate::{crypto::{Public as TraitPublic, UncheckedFrom, CryptoType, Derive}}; use crate::hash::{H256, H512}; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; #[cfg(feature = "std")] use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; @@ -56,19 +58,13 @@ pub struct Pair(Keypair); impl Clone for Pair { fn clone(&self) -> Self { Pair(schnorrkel::Keypair { - public: self.0.public.clone(), + public: self.0.public, secret: schnorrkel::SecretKey::from_bytes(&self.0.secret.to_bytes()[..]) .expect("key is always the correct size; qed") }) } } -impl AsRef for Public { - fn as_ref(&self) -> &Public { - &self - } -} - impl AsRef<[u8; 32]> for Public { fn as_ref(&self) -> &[u8; 32] { &self.0 @@ -99,6 +95,20 @@ impl From for H256 { } } +impl rstd::convert::TryFrom<&[u8]> for Public { + type Error = (); + + fn try_from(data: &[u8]) -> Result { + if data.len() == 32 { + let mut inner = [0u8; 32]; + inner.copy_from_slice(data); + Ok(Public(inner)) + } else { + Err(()) + } + } +} + impl UncheckedFrom<[u8; 32]> for Public { fn unchecked_from(x: [u8; 32]) -> Self { Public::from_raw(x) @@ -112,15 +122,15 @@ impl UncheckedFrom for Public { } #[cfg(feature = "std")] -impl ::std::fmt::Display for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Display for Public { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!(f, "{}", self.to_ss58check()) } } #[cfg(feature = "std")] -impl ::std::fmt::Debug for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { +impl std::fmt::Debug for Public { + fn fmt(&self, f: &mut std::fmt::Formatter) -> ::std::fmt::Result { let s = self.to_ss58check(); write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) } @@ -142,8 +152,8 @@ impl<'de> Deserialize<'de> for Public { } #[cfg(feature = "std")] -impl ::std::hash::Hash for Public { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for Public { + fn hash(&self, state: &mut H) { self.0.hash(state); } } @@ -154,6 +164,20 @@ impl ::std::hash::Hash for Public { #[derive(Encode, Decode)] pub struct Signature(pub [u8; 64]); +impl rstd::convert::TryFrom<&[u8]> for Signature { + type Error = (); + + fn try_from(data: &[u8]) -> Result { + if data.len() == 64 { + let mut inner = [0u8; 64]; + inner.copy_from_slice(data); + Ok(Signature(inner)) + } else { + Err(()) + } + } +} + impl Clone for Signature { fn clone(&self) -> Self { let mut r = [0u8; 64]; @@ -170,7 +194,7 @@ impl Default for Signature { impl PartialEq for Signature { fn eq(&self, b: &Self) -> bool { - &self.0[..] == &b.0[..] + self.0[..] == b.0[..] } } @@ -268,11 +292,11 @@ impl Signature { } } -#[cfg(feature = "std")] impl Derive for Public { /// Derive a child key from a series of given junctions. /// /// `None` if there are any hard junctions in there. + #[cfg(feature = "std")] fn derive>(&self, path: Iter) -> Option { let mut acc = PublicKey::from_bytes(self.as_ref()).ok()?; for j in path { @@ -318,30 +342,12 @@ impl TraitPublic for Public { r.copy_from_slice(data); Public(r) } - - /// Return a `Vec` filled with raw data. - #[cfg(feature = "std")] - fn to_raw_vec(&self) -> Vec { - self.0.to_vec() - } - - /// Return a slice filled with raw data. - fn as_slice(&self) -> &[u8] { - &self.0 - } -} - -#[cfg(feature = "std")] -impl AsRef for Pair { - fn as_ref(&self) -> &Pair { - &self - } } #[cfg(feature = "std")] impl From for Pair { fn from(sec: MiniSecretKey) -> Pair { - Pair(sec.expand_to_keypair()) + Pair(sec.expand_to_keypair(ExpansionMode::Ed25519)) } } @@ -376,7 +382,7 @@ impl AsRef for Pair { /// Derive a single hard junction. #[cfg(feature = "std")] fn derive_hard_junction(secret: &SecretKey, cc: &[u8; CHAIN_CODE_LENGTH]) -> SecretKey { - secret.hard_derive_mini_secret_key(Some(ChainCode(cc.clone())), b"").0.expand() + secret.hard_derive_mini_secret_key(Some(ChainCode(cc.clone())), b"").0.expand(ExpansionMode::Ed25519) } /// The raw secret seed, which can be used to recreate the `Pair`. @@ -417,7 +423,7 @@ impl TraitPair for Pair { Ok(Pair( MiniSecretKey::from_bytes(seed) .map_err(|_| SecretStringError::InvalidSeed)? - .expand_to_keypair() + .expand_to_keypair(ExpansionMode::Ed25519) )) } SECRET_KEY_LENGTH => { @@ -475,29 +481,19 @@ impl TraitPair for Pair { } /// Verify a signature on a message. Returns true if the signature is good. - fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { - let signature: schnorrkel::Signature = match schnorrkel::Signature::from_bytes(&sig.as_ref()) { - Ok(some_signature) => some_signature, - Err(_) => return false - }; - match PublicKey::from_bytes(pubkey.as_ref().as_slice()) { - Ok(pk) => pk.verify( - signing_context(SIGNING_CTX).bytes(message.as_ref()), &signature - ), - Err(_) => false, - } + fn verify>(sig: &Self::Signature, message: M, pubkey: &Self::Public) -> bool { + Self::verify_weak(&sig.0[..], message, pubkey) } /// Verify a signature on a message. Returns true if the signature is good. fn verify_weak, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool { - let signature: schnorrkel::Signature = match schnorrkel::Signature::from_bytes(sig) { - Ok(some_signature) => some_signature, - Err(_) => return false - }; + // Match both schnorrkel 0.1.1 and 0.8.0+ signatures, supporting both wallets + // that have not been upgraded and those that have. To swap to 0.8.0 only, + // create `schnorrkel::Signature` and pass that into `verify_simple` match PublicKey::from_bytes(pubkey.as_ref()) { - Ok(pk) => pk.verify( - signing_context(SIGNING_CTX).bytes(message.as_ref()), &signature - ), + Ok(pk) => pk.verify_simple_preaudit_deprecated( + SIGNING_CTX, message.as_ref(), &sig, + ).is_ok(), Err(_) => false, } } @@ -518,22 +514,61 @@ impl Pair { let mini_key: MiniSecretKey = mini_secret_from_entropy(entropy, password.unwrap_or("")) .expect("32 bytes can always build a key; qed"); - let kp = mini_key.expand_to_keypair(); + let kp = mini_key.expand_to_keypair(ExpansionMode::Ed25519); (Pair(kp), mini_key.to_bytes()) } } -impl TypedKey for Public { - const KEY_TYPE: KeyTypeId = key_types::SR25519; +impl CryptoType for Public { + #[cfg(feature="std")] + type Pair = Pair; } -impl TypedKey for Signature { - const KEY_TYPE: KeyTypeId = key_types::SR25519; +impl CryptoType for Signature { + #[cfg(feature="std")] + type Pair = Pair; } #[cfg(feature = "std")] -impl TypedKey for Pair { - const KEY_TYPE: KeyTypeId = key_types::SR25519; +impl CryptoType for Pair { + type Pair = Pair; +} + +#[cfg(test)] +mod compatibility_test { + use super::*; + use crate::crypto::{DEV_PHRASE}; + use hex_literal::hex; + + // NOTE: tests to ensure addresses that are created with the `0.1.x` version (pre-audit) are + // still functional. + + #[test] + fn derive_soft_known_pair_should_work() { + let pair = Pair::from_string(&format!("{}/Alice", DEV_PHRASE), None).unwrap(); + // known address of DEV_PHRASE with 1.1 + let known = hex!("d6c71059dbbe9ad2b0ed3f289738b800836eb425544ce694825285b958ca755e"); + assert_eq!(pair.public().to_raw_vec(), known); + } + + #[test] + fn derive_hard_known_pair_should_work() { + let pair = Pair::from_string(&format!("{}//Alice", DEV_PHRASE), None).unwrap(); + // known address of DEV_PHRASE with 1.1 + let known = hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); + assert_eq!(pair.public().to_raw_vec(), known); + } + + #[test] + fn verify_known_message_should_work() { + let public = Public::from_raw(hex!("b4bfa1f7a5166695eb75299fd1c4c03ea212871c342f2c5dfea0902b2c246918")); + // signature generated by the 1.1 version with the same ^^ public key. + let signature = Signature::from_raw(hex!( + "5a9755f069939f45d96aaf125cf5ce7ba1db998686f87f2fb3cbdea922078741a73891ba265f70c31436e18a9acd14d189d73c12317ab6c313285cd938453202" + )); + let message = b"Verifying that I am the owner of 5G9hQLdsKQswNPgB499DeA5PkFBbgkLPJWkkS6FAM6xGQ8xD. Hash: 221455a3\n"; + assert!(Pair::verify(&signature, &message[..], &public)); + } } #[cfg(test)] @@ -646,7 +681,6 @@ mod test { #[test] fn seeded_pair_should_work() { - let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); assert_eq!( @@ -679,9 +713,9 @@ mod test { &hex!("0000000000000000000000000000000000000000000000000000000000000000") ); let public = pk.public(); - let js_signature = Signature::from_raw( - hex!("28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00") - ); - assert!(Pair::verify(&js_signature, b"SUBSTRATE", public)); + let js_signature = Signature::from_raw(hex!( + "28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00" + )); + assert!(Pair::verify(&js_signature, b"SUBSTRATE", &public)); } } diff --git a/core/primitives/src/testing.rs b/core/primitives/src/testing.rs new file mode 100644 index 0000000000000000000000000000000000000000..932c8b9cb1e75707b10beb5870d39486e3e2d722 --- /dev/null +++ b/core/primitives/src/testing.rs @@ -0,0 +1,166 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Types that should only be used for testing! + +#[cfg(feature = "std")] +use crate::{ed25519, sr25519, crypto::{Public, Pair, KeyTypeId}}; + +/// A keystore implementation usable in tests. +#[cfg(feature = "std")] +#[derive(Default)] +pub struct KeyStore { + /// `KeyTypeId` maps to public keys and public keys map to private keys. + keys: std::collections::HashMap, String>>, +} + +#[cfg(feature = "std")] +impl KeyStore { + /// Creates a new instance of `Self`. + pub fn new() -> std::sync::Arc> { + std::sync::Arc::new(parking_lot::RwLock::new(Self::default())) + } +} + +#[cfg(feature = "std")] +impl crate::traits::BareCryptoStore for KeyStore { + fn sr25519_public_keys(&self, id: KeyTypeId) -> Vec { + self.keys.get(&id) + .map(|keys| + keys.values() + .map(|s| sr25519::Pair::from_string(s, None).expect("`sr25519` seed slice is valid")) + .map(|p| p.public()) + .collect() + ) + .unwrap_or_default() + } + + fn sr25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> Result { + match seed { + Some(seed) => { + let pair = sr25519::Pair::from_string(seed, None).expect("Generates an `sr25519` pair."); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), seed.into()); + Ok(pair.public()) + }, + None => { + let (pair, phrase, _) = sr25519::Pair::generate_with_phrase(None); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), phrase); + Ok(pair.public()) + } + } + } + + fn sr25519_key_pair(&self, id: KeyTypeId, pub_key: &sr25519::Public) -> Option { + self.keys.get(&id) + .and_then(|inner| + inner.get(pub_key.as_slice()) + .map(|s| sr25519::Pair::from_string(s, None).expect("`sr25519` seed slice is valid")) + ) + } + + fn ed25519_public_keys(&self, id: KeyTypeId) -> Vec { + self.keys.get(&id) + .map(|keys| + keys.values() + .map(|s| ed25519::Pair::from_string(s, None).expect("`ed25519` seed slice is valid")) + .map(|p| p.public()) + .collect() + ) + .unwrap_or_default() + } + + fn ed25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> Result { + match seed { + Some(seed) => { + let pair = ed25519::Pair::from_string(seed, None).expect("Generates an `ed25519` pair."); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), seed.into()); + Ok(pair.public()) + }, + None => { + let (pair, phrase, _) = ed25519::Pair::generate_with_phrase(None); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), phrase); + Ok(pair.public()) + } + } + } + + fn ed25519_key_pair(&self, id: KeyTypeId, pub_key: &ed25519::Public) -> Option { + self.keys.get(&id) + .and_then(|inner| + inner.get(pub_key.as_slice()) + .map(|s| ed25519::Pair::from_string(s, None).expect("`ed25519` seed slice is valid")) + ) + } + + fn insert_unknown(&mut self, id: KeyTypeId, suri: &str, public: &[u8]) -> Result<(), ()> { + self.keys.entry(id).or_default().insert(public.to_owned(), suri.to_string()); + Ok(()) + } + + fn password(&self) -> Option<&str> { + None + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{sr25519, crypto::key_types, traits::BareCryptoStore}; + + #[test] + fn store_key_and_extract() { + let store = KeyStore::new(); + + let public = store.write() + .ed25519_generate_new(key_types::ED25519, None) + .expect("Genrates key"); + + let store_key_pair = store.read() + .ed25519_key_pair(key_types::ED25519, &public) + .expect("Key should exists in store"); + + assert_eq!(public, store_key_pair.public()); + } + + #[test] + fn store_unknown_and_extract_it() { + let store = KeyStore::new(); + + let secret_uri = "//Alice"; + let key_pair = sr25519::Pair::from_string(secret_uri, None).expect("Generates key pair"); + + store.write().insert_unknown( + key_types::SR25519, + secret_uri, + key_pair.public().as_ref(), + ).expect("Inserts unknown key"); + + let store_key_pair = store.read().sr25519_key_pair( + key_types::SR25519, + &key_pair.public(), + ).expect("Gets key pair from keystore"); + + assert_eq!(key_pair.public(), store_key_pair.public()); + } +} diff --git a/core/primitives/src/traits.rs b/core/primitives/src/traits.rs new file mode 100644 index 0000000000000000000000000000000000000000..8e2f0c0213a13b26ed290b685ed014d3e99f32fd --- /dev/null +++ b/core/primitives/src/traits.rs @@ -0,0 +1,70 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Shareable Substrate traits. + +#[cfg(feature = "std")] +use crate::{crypto::KeyTypeId, ed25519, sr25519}; + +/// Something that generates, stores and provides access to keys. +#[cfg(feature = "std")] +pub trait BareCryptoStore: Send + Sync { + /// Returns all sr25519 public keys for the given key type. + fn sr25519_public_keys(&self, id: KeyTypeId) -> Vec; + /// Generate a new sr25519 key pair for the given key type and an optional seed. + /// + /// If the given seed is `Some(_)`, the key pair will only be stored in memory. + /// + /// Returns the public key of the generated key pair. + fn sr25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> Result; + /// Returns the sr25519 key pair for the given key type and public key combination. + fn sr25519_key_pair(&self, id: KeyTypeId, pub_key: &sr25519::Public) -> Option; + + /// Returns all ed25519 public keys for the given key type. + fn ed25519_public_keys(&self, id: KeyTypeId) -> Vec; + /// Generate a new ed25519 key pair for the given key type and an optional seed. + /// + /// If the given seed is `Some(_)`, the key pair will only be stored in memory. + /// + /// Returns the public key of the generated key pair. + fn ed25519_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> Result; + + /// Returns the ed25519 key pair for the given key type and public key combination. + fn ed25519_key_pair(&self, id: KeyTypeId, pub_key: &ed25519::Public) -> Option; + + /// Insert a new key. This doesn't require any known of the crypto; but a public key must be + /// manually provided. + /// + /// Places it into the file system store. + /// + /// `Err` if there's some sort of weird filesystem error, but should generally be `Ok`. + fn insert_unknown(&mut self, _key_type: KeyTypeId, _suri: &str, _public: &[u8]) -> Result<(), ()>; + + /// Get the password for this store. + fn password(&self) -> Option<&str>; +} + +/// A pointer to the key store. +#[cfg(feature = "std")] +pub type BareCryptoStorePtr = std::sync::Arc>; diff --git a/core/primitives/src/uint.rs b/core/primitives/src/uint.rs index dfea51921dc331ef5936fac83746da014fa0b5b1..b41596a91032626bfbdb25367e32879d4384c926 100644 --- a/core/primitives/src/uint.rs +++ b/core/primitives/src/uint.rs @@ -21,7 +21,7 @@ pub use primitive_types::U256; #[cfg(test)] mod tests { use super::*; - use parity_codec::{Encode, Decode}; + use codec::{Encode, Decode}; use substrate_serializer as ser; macro_rules! test { @@ -78,10 +78,10 @@ mod tests { res2); assert_eq!( U256::decode(&mut &res1[..]), - Some(U256::from(120))); + Ok(U256::from(120))); assert_eq!( U256::decode(&mut &res2[..]), - Some(U256::max_value())); + Ok(U256::max_value())); } #[test] diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index 181cbdfd8ea5f28ab7a361161e7a6859192aba6a..957fe5be0b32703b4f1cb84003631fbb7eef8b6e 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -7,24 +7,26 @@ edition = "2018" [dependencies] derive_more = "0.14.0" futures = "0.1" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17", features = ["compat"] } jsonrpc-core = "12.0.0" jsonrpc-core-client = "12.0.0" jsonrpc-pubsub = "12.0.0" jsonrpc-derive = "12.0.0" log = "0.4" -parking_lot = "0.8.0" -parity-codec = "4.1.1" +parking_lot = "0.9.0" +codec = { package = "parity-scale-codec", version = "1.0.0" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" client = { package = "substrate-client", path = "../client" } substrate-executor = { path = "../executor" } network = { package = "substrate-network", path = "../network" } primitives = { package = "substrate-primitives", path = "../primitives" } +session = { package = "substrate-session", path = "../session" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } transaction_pool = { package = "substrate-transaction-pool", path = "../transaction-pool" } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } +sr-primitives = { path = "../sr-primitives" } runtime_version = { package = "sr-version", path = "../sr-version" } +substrate-keystore = { path = "../keystore" } [dev-dependencies] assert_matches = "1.1" diff --git a/core/rpc/src/author/error.rs b/core/rpc/src/author/error.rs index 82ace88b84b997122eeefbf69db326a87f0e2e85..2fcc8c780dfdb59dac5b69d49a11b68852601ee5 100644 --- a/core/rpc/src/author/error.rs +++ b/core/rpc/src/author/error.rs @@ -19,7 +19,6 @@ use client; use transaction_pool::txpool; use crate::rpc; - use crate::errors; /// Author RPC Result type. @@ -36,8 +35,20 @@ pub enum Error { #[display(fmt="Extrinsic verification error: {}", _0)] Verification(Box), /// Incorrect extrinsic format. - #[display(fmt="Invalid extrinsic format")] - BadFormat, + #[display(fmt="Invalid extrinsic format: {}", _0)] + BadFormat(codec::Error), + /// Incorrect seed phrase. + #[display(fmt="Invalid seed phrase/SURI")] + BadSeedPhrase, + /// Key type ID has an unknown format. + #[display(fmt="Invalid key type ID format (should be of length four)")] + BadKeyType, + /// Key type ID has some unsupported crypto. + #[display(fmt="The crypto of key type ID is unknown")] + UnsupportedKeyType, + /// Some random issue with the key store. Shouldn't happen. + #[display(fmt="The key store is unavailable")] + KeyStoreUnavailable, } impl std::error::Error for Error { @@ -78,9 +89,9 @@ impl From for rpc::Error { use txpool::error::{Error as PoolError}; match e { - Error::BadFormat => rpc::Error { + Error::BadFormat(e) => rpc::Error { code: rpc::ErrorCode::ServerError(BAD_FORMAT), - message: "Extrinsic has invalid format.".into(), + message: format!("Extrinsic has invalid format: {}", e).into(), data: None, }, Error::Verification(e) => rpc::Error { diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index 5594984d0ea7f016461f49b507e8d65b783a1f50..d797e87da57760dfff6bc5ba18b70f7a362c2cb8 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -22,7 +22,7 @@ pub mod hash; #[cfg(test)] mod tests; -use std::sync::Arc; +use std::{sync::Arc, convert::TryInto}; use client::{self, Client}; use crate::rpc::futures::{Sink, Stream, Future}; @@ -30,10 +30,13 @@ use crate::subscriptions::Subscriptions; use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; use log::warn; -use parity_codec::{Encode, Decode}; -use primitives::{Bytes, Blake2Hasher, H256}; -use runtime_primitives::{generic, traits}; -use self::error::Result; +use codec::{Encode, Decode}; +use primitives::{ + Bytes, Blake2Hasher, H256, ed25519, sr25519, crypto::{Pair, Public, key_types}, + traits::BareCryptoStorePtr, +}; +use sr_primitives::{generic, traits::{self, ProvideRuntimeApi}}; +use self::error::{Error, Result}; use transaction_pool::{ txpool::{ ChainApi as PoolChainApi, @@ -44,6 +47,7 @@ use transaction_pool::{ watcher::Status, }, }; +use session::SessionKeys; pub use self::gen_client::Client as AuthorClient; @@ -57,21 +61,50 @@ pub trait AuthorApi { #[rpc(name = "author_submitExtrinsic")] fn submit_extrinsic(&self, extrinsic: Bytes) -> Result; + /// Insert a key into the keystore. + #[rpc(name = "author_insertKey")] + fn insert_key(&self, + key_type: String, + suri: String, + maybe_public: Option + ) -> Result; + + /// Generate new session keys and returns the corresponding public keys. + #[rpc(name = "author_rotateKeys")] + fn rotate_keys(&self) -> Result; + /// Returns all pending extrinsics, potentially grouped by sender. #[rpc(name = "author_pendingExtrinsics")] fn pending_extrinsics(&self) -> Result>; /// Remove given extrinsic from the pool and temporarily ban it to prevent reimporting. #[rpc(name = "author_removeExtrinsic")] - fn remove_extrinsic(&self, bytes_or_hash: Vec>) -> Result>; + fn remove_extrinsic(&self, + bytes_or_hash: Vec> + ) -> Result>; /// Submit an extrinsic to watch. - #[pubsub(subscription = "author_extrinsicUpdate", subscribe, name = "author_submitAndWatchExtrinsic")] - fn watch_extrinsic(&self, metadata: Self::Metadata, subscriber: Subscriber>, bytes: Bytes); + #[pubsub( + subscription = "author_extrinsicUpdate", + subscribe, + name = "author_submitAndWatchExtrinsic" + )] + fn watch_extrinsic(&self, + metadata: Self::Metadata, + subscriber: Subscriber>, + bytes: Bytes + ); /// Unsubscribe from extrinsic watching. - #[pubsub(subscription = "author_extrinsicUpdate", unsubscribe, name = "author_unwatchExtrinsic")] - fn unwatch_extrinsic(&self, metadata: Option, id: SubscriptionId) -> Result; + #[pubsub( + subscription = "author_extrinsicUpdate", + unsubscribe, + name = "author_unwatchExtrinsic" + )] + fn unwatch_extrinsic(&self, + metadata: Option, + id: SubscriptionId + ) -> Result; } /// Authoring API @@ -82,6 +115,8 @@ pub struct Author where P: PoolChainApi + Sync + Send + 'static { pool: Arc>, /// Subscriptions manager subscriptions: Subscriptions, + /// The key store. + keystore: BareCryptoStorePtr, } impl Author where P: PoolChainApi + Sync + Send + 'static { @@ -90,11 +125,13 @@ impl Author where P: PoolChainApi + Sync + Send + 'sta client: Arc::Block, RA>>, pool: Arc>, subscriptions: Subscriptions, + keystore: BareCryptoStorePtr, ) -> Self { Author { client, pool, subscriptions, + keystore, } } } @@ -105,12 +142,51 @@ impl AuthorApi, BlockHash

> for Author whe P: PoolChainApi + Sync + Send + 'static, P::Block: traits::Block, P::Error: 'static, - RA: Send + Sync + 'static + RA: Send + Sync + 'static, + Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: SessionKeys, { type Metadata = crate::metadata::Metadata; + fn insert_key( + &self, + key_type: String, + suri: String, + maybe_public: Option, + ) -> Result { + let key_type = key_type.as_str().try_into().map_err(|_| Error::BadKeyType)?; + let mut keystore = self.keystore.write(); + let maybe_password = keystore.password(); + let public = match maybe_public { + Some(public) => public.0, + None => { + let maybe_public = match key_type { + key_types::BABE | key_types::IM_ONLINE | key_types::SR25519 => + sr25519::Pair::from_string(&suri, maybe_password) + .map(|pair| pair.public().to_raw_vec()), + key_types::GRANDPA | key_types::ED25519 => + ed25519::Pair::from_string(&suri, maybe_password) + .map(|pair| pair.public().to_raw_vec()), + _ => Err(Error::UnsupportedKeyType)?, + }; + maybe_public.map_err(|_| Error::BadSeedPhrase)? + } + }; + keystore.insert_unknown(key_type, &suri, &public[..]) + .map_err(|_| Error::KeyStoreUnavailable)?; + Ok(public.into()) + } + + fn rotate_keys(&self) -> Result { + let best_block_hash = self.client.info().chain.best_hash; + self.client.runtime_api().generate_session_keys( + &generic::BlockId::Hash(best_block_hash), + None, + ).map(Into::into).map_err(Into::into) + } + fn submit_extrinsic(&self, ext: Bytes) -> Result> { - let xt = Decode::decode(&mut &ext[..]).ok_or(error::Error::BadFormat)?; + let xt = Decode::decode(&mut &ext[..])?; let best_block_hash = self.client.info().chain.best_hash; self.pool .submit_one(&generic::BlockId::hash(best_block_hash), xt) @@ -124,12 +200,14 @@ impl AuthorApi, BlockHash

> for Author whe Ok(self.pool.ready().map(|tx| tx.data.encode().into()).collect()) } - fn remove_extrinsic(&self, bytes_or_hash: Vec>>) -> Result>> { + fn remove_extrinsic(&self, + bytes_or_hash: Vec>> + ) -> Result>> { let hashes = bytes_or_hash.into_iter() .map(|x| match x { hash::ExtrinsicOrHash::Hash(h) => Ok(h), hash::ExtrinsicOrHash::Extrinsic(bytes) => { - let xt = Decode::decode(&mut &bytes[..]).ok_or(error::Error::BadFormat)?; + let xt = Decode::decode(&mut &bytes[..])?; Ok(self.pool.hash_of(&xt)) }, }) @@ -143,11 +221,14 @@ impl AuthorApi, BlockHash

> for Author whe ) } - fn watch_extrinsic(&self, _metadata: Self::Metadata, subscriber: Subscriber, BlockHash

>>, xt: Bytes) { + fn watch_extrinsic(&self, + _metadata: Self::Metadata, + subscriber: Subscriber, BlockHash

>>, + xt: Bytes + ) { let submit = || -> Result<_> { let best_block_hash = self.client.info().chain.best_hash; - let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..]) - .ok_or(error::Error::BadFormat)?; + let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..])?; self.pool .submit_and_watch(&generic::BlockId::hash(best_block_hash), dxt) .map_err(|e| e.into_pool_error() diff --git a/core/rpc/src/author/tests.rs b/core/rpc/src/author/tests.rs index cf320ee1442e7aff950850143d65155137c62d49..0fdff9989b1cab11b74cfa18f73598842ac6b93e 100644 --- a/core/rpc/src/author/tests.rs +++ b/core/rpc/src/author/tests.rs @@ -18,13 +18,19 @@ use super::*; use std::sync::Arc; use assert_matches::assert_matches; -use parity_codec::Encode; +use codec::Encode; use transaction_pool::{ txpool::Pool, ChainApi, }; -use primitives::{H256, blake2_256, hexdisplay::HexDisplay}; -use test_client::{self, AccountKeyring, runtime::{Extrinsic, Transfer}}; +use primitives::{ + H256, blake2_256, hexdisplay::HexDisplay, traits::BareCryptoStore, testing::KeyStore, + ed25519, crypto::key_types, +}; +use test_client::{ + self, AccountKeyring, runtime::{Extrinsic, Transfer, SessionKeys}, DefaultTestClientBuilderExt, + TestClientBuilderExt, +}; use tokio::runtime; fn uxt(sender: AccountKeyring, nonce: u64) -> Extrinsic { @@ -41,10 +47,12 @@ fn uxt(sender: AccountKeyring, nonce: u64) -> Extrinsic { fn submit_transaction_should_not_cause_error() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); + let keystore = KeyStore::new(); let p = Author { client: client.clone(), pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client))), subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), }; let xt = uxt(AccountKeyring::Alice, 1).encode(); let h: H256 = blake2_256(&xt).into(); @@ -62,10 +70,12 @@ fn submit_transaction_should_not_cause_error() { fn submit_rich_transaction_should_not_cause_error() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); + let keystore = KeyStore::new(); let p = Author { client: client.clone(), pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))), subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), }; let xt = uxt(AccountKeyring::Alice, 0).encode(); let h: H256 = blake2_256(&xt).into(); @@ -85,10 +95,12 @@ fn should_watch_extrinsic() { let mut runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); + let keystore = KeyStore::new(); let p = Author { client, pool: pool.clone(), subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), }; let (subscriber, id_rx, data) = ::jsonrpc_pubsub::typed::Subscriber::new_test("test"); @@ -125,10 +137,12 @@ fn should_return_pending_extrinsics() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); + let keystore = KeyStore::new(); let p = Author { client, pool: pool.clone(), subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), }; let ex = uxt(AccountKeyring::Alice, 0); AuthorApi::submit_extrinsic(&p, ex.encode().into()).unwrap(); @@ -143,10 +157,12 @@ fn should_remove_extrinsics() { let runtime = runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); + let keystore = KeyStore::new(); let p = Author { client, pool: pool.clone(), subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), }; let ex1 = uxt(AccountKeyring::Alice, 0); p.submit_extrinsic(ex1.encode().into()).unwrap(); @@ -165,3 +181,60 @@ fn should_remove_extrinsics() { assert_eq!(removed.len(), 3); } + +#[test] +fn should_insert_key() { + let runtime = runtime::Runtime::new().unwrap(); + let client = Arc::new(test_client::new()); + let keystore = KeyStore::new(); + let p = Author { + client: client.clone(), + pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client))), + subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), + }; + + let suri = "//Alice"; + let key_pair = ed25519::Pair::from_string(suri, None).expect("Generates keypair"); + p.insert_key( + String::from_utf8(key_types::ED25519.0.to_vec()).expect("Keytype is a valid string"), + suri.to_string(), + Some(key_pair.public().0.to_vec().into()), + ).expect("Insert key"); + + let store_key_pair = keystore.read() + .ed25519_key_pair(key_types::ED25519, &key_pair.public()).expect("Key exists in store"); + + assert_eq!(key_pair.public(), store_key_pair.public()); +} + +#[test] +fn should_rotate_keys() { + let runtime = runtime::Runtime::new().unwrap(); + let keystore = KeyStore::new(); + let client = Arc::new(test_client::TestClientBuilder::new().set_keystore(keystore.clone()).build()); + let p = Author { + client: client.clone(), + pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client))), + subscriptions: Subscriptions::new(Arc::new(runtime.executor())), + keystore: keystore.clone(), + }; + + let new_public_keys = p.rotate_keys().expect("Rotates the keys"); + + let session_keys = SessionKeys::decode(&mut &new_public_keys[..]) + .expect("SessionKeys decode successfully"); + + let ed25519_key_pair = keystore.read().ed25519_key_pair( + key_types::ED25519, + &session_keys.ed25519.clone().into(), + ).expect("ed25519 key exists in store"); + + let sr25519_key_pair = keystore.read().sr25519_key_pair( + key_types::SR25519, + &session_keys.sr25519.clone().into(), + ).expect("sr25519 key exists in store"); + + assert_eq!(session_keys.ed25519, ed25519_key_pair.public().into()); + assert_eq!(session_keys.sr25519, sr25519_key_pair.public().into()); +} \ No newline at end of file diff --git a/core/rpc/src/chain/mod.rs b/core/rpc/src/chain/mod.rs index d1d476c3ab43dbf3656b4eedbff4112bb71f0da6..9b8192e660e9be207c19c0b639ddccec88f5130a 100644 --- a/core/rpc/src/chain/mod.rs +++ b/core/rpc/src/chain/mod.rs @@ -33,8 +33,8 @@ use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; use log::warn; use primitives::{H256, Blake2Hasher}; -use runtime_primitives::generic::{BlockId, SignedBlock}; -use runtime_primitives::traits::{Block as BlockT, Header, NumberFor}; +use sr_primitives::generic::{BlockId, SignedBlock}; +use sr_primitives::traits::{Block as BlockT, Header, NumberFor}; use self::error::Result; pub use self::gen_client::Client as ChainClient; diff --git a/core/rpc/src/helpers.rs b/core/rpc/src/helpers.rs index ccfde6afb5cfc17dd6db483b38cec6c989ec7f57..2c69ead76caae134688da85c6a86e1551a3c7622 100644 --- a/core/rpc/src/helpers.rs +++ b/core/rpc/src/helpers.rs @@ -14,11 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use futures::{prelude::*, sync::oneshot}; +use futures::prelude::*; +use futures03::{channel::oneshot, compat::Compat}; /// Wraps around `oneshot::Receiver` and adjusts the error type to produce an internal error if the /// sender gets dropped. -pub struct Receiver(pub oneshot::Receiver); +pub struct Receiver(pub Compat>); impl Future for Receiver { type Item = T; diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs index 40ee94fdb292e6b6217e14d44bd351661c2c73ab..0044ad77b8000a4f14e7b1fa45807c0c8096560c 100644 --- a/core/rpc/src/state/mod.rs +++ b/core/rpc/src/state/mod.rs @@ -38,8 +38,8 @@ use log::{warn, trace}; use primitives::hexdisplay::HexDisplay; use primitives::storage::{self, StorageKey, StorageData, StorageChangeSet}; use primitives::{H256, Blake2Hasher, Bytes}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ Block as BlockT, Header, ProvideRuntimeApi, NumberFor, SaturatedConversion }; diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 6a8eefa10b660d2785e16740e7e064a959963e83..6b4ddc9b920bc9b0dbf9eb0c219e9c4cb3a4aef7 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -260,7 +260,8 @@ fn should_return_runtime_version() { \"specVersion\":1,\"implVersion\":1,\"apis\":[[\"0xdf6acb689907609b\",2],\ [\"0x37e397fc7c91f5e4\",1],[\"0xd2bc9897eed08f15\",1],[\"0x40fe3ad401f8959a\",3],\ [\"0xc6e9a76309f39b09\",1],[\"0xdd718d5cc53262d4\",1],[\"0xcbca25e39f142387\",1],\ - [\"0xf78b278be53f454c\",1]]}"; + [\"0xf78b278be53f454c\",1],[\"0xab3c0572291feb8b\",1]]}"; + assert_eq!( serde_json::to_string(&api.runtime_version(None.into()).unwrap()).unwrap(), result, diff --git a/core/rpc/src/system/mod.rs b/core/rpc/src/system/mod.rs index d0578590ae5e5a4d0b5d547588034ced5497c4f3..59ed73b588a5da6d41897b8e1efa156986054044 100644 --- a/core/rpc/src/system/mod.rs +++ b/core/rpc/src/system/mod.rs @@ -23,10 +23,10 @@ pub mod helpers; mod tests; use crate::helpers::Receiver; -use futures::sync::{mpsc, oneshot}; +use futures03::{channel::{mpsc, oneshot}, compat::Compat}; use jsonrpc_derive::rpc; use network; -use runtime_primitives::traits::{self, Header as HeaderT}; +use sr_primitives::traits::{self, Header as HeaderT}; use self::error::Result; pub use self::helpers::{Properties, SystemInfo, Health, PeerInfo}; @@ -124,18 +124,18 @@ impl SystemApi::Number> for Sy fn system_health(&self) -> Receiver { let (tx, rx) = oneshot::channel(); let _ = self.send_back.unbounded_send(Request::Health(tx)); - Receiver(rx) + Receiver(Compat::new(rx)) } fn system_peers(&self) -> Receiver::Number>>> { let (tx, rx) = oneshot::channel(); let _ = self.send_back.unbounded_send(Request::Peers(tx)); - Receiver(rx) + Receiver(Compat::new(rx)) } fn system_network_state(&self) -> Receiver { let (tx, rx) = oneshot::channel(); let _ = self.send_back.unbounded_send(Request::NetworkState(tx)); - Receiver(rx) + Receiver(Compat::new(rx)) } } diff --git a/core/rpc/src/system/tests.rs b/core/rpc/src/system/tests.rs index 2dc4139da301928235db071cf78acb0be295a184..70e8b4b95b67608451d33cd35217b448852660f4 100644 --- a/core/rpc/src/system/tests.rs +++ b/core/rpc/src/system/tests.rs @@ -20,7 +20,7 @@ use network::{self, PeerId}; use network::config::Roles; use test_client::runtime::Block; use assert_matches::assert_matches; -use futures::{prelude::*, sync::mpsc}; +use futures03::{prelude::*, channel::mpsc}; use std::thread; struct Status { @@ -46,7 +46,7 @@ fn api>>(sync: T) -> System { let should_have_peers = !status.is_dev; let (tx, rx) = mpsc::unbounded(); thread::spawn(move || { - tokio::run(rx.for_each(move |request| { + futures03::executor::block_on(rx.for_each(move |request| { match request { Request::Health(sender) => { let _ = sender.send(Health { @@ -82,7 +82,7 @@ fn api>>(sync: T) -> System { } }; - Ok(()) + future::ready(()) })) }); System::new(SystemInfo { diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 8be5002d2d48554da02dad1ee5e775c3ec76582e..bd04cd670e5b2ad2c6a7f28eda42c9c4f78185a4 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -7,8 +7,8 @@ edition = "2018" [dependencies] derive_more = "0.14.0" futures = "0.1.17" -futures03 = { package = "futures-preview", version = "0.3.0-alpha.17", features = ["compat"] } -parking_lot = "0.8.0" +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17", features = ["compat"] } +parking_lot = "0.9.0" lazy_static = "1.0" log = "0.4" slog = {version = "^2", features = ["nested-values"]} @@ -21,22 +21,27 @@ sysinfo = "0.9.0" target_info = "0.1" keystore = { package = "substrate-keystore", path = "../../core/keystore" } sr-io = { path = "../../core/sr-io" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } -primitives = { package = "substrate-primitives", path = "../../core/primitives" } +sr-primitives = { path = "../../core/sr-primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } +session = { package = "substrate-session", path = "../session" } +app-crypto = { package = "substrate-application-crypto", path = "../application-crypto" } consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } network = { package = "substrate-network", path = "../../core/network" } client = { package = "substrate-client", path = "../../core/client" } client_db = { package = "substrate-client-db", path = "../../core/client/db", features = ["kvdb-rocksdb"] } -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } substrate-executor = { path = "../../core/executor" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } rpc = { package = "substrate-rpc-servers", path = "../../core/rpc-servers" } tel = { package = "substrate-telemetry", path = "../../core/telemetry" } offchain = { package = "substrate-offchain", path = "../../core/offchain" } +parity-multiaddr = { package = "parity-multiaddr", version = "0.5.0" } [dev-dependencies] substrate-test-runtime-client = { path = "../test-runtime/client" } node-executor = { path = "../../node/executor" } node-primitives = { path = "../../node/primitives" } node-runtime = { path = "../../node/runtime" } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives" } grandpa = { package = "substrate-finality-grandpa", path = "../../core/finality-grandpa" } +grandpa-primitives = { package = "substrate-finality-grandpa-primitives", path = "../../core/finality-grandpa/primitives" } diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index dd2d26f8a3d8d55786d6713c8bb512710c916147..c801b81186f18cda9495bd6466f13788263b0e10 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -16,19 +16,20 @@ //! Chain utilities. -use std::{self, io::{Read, Write}}; +use std::{self, io::{Read, Write, Seek}}; use futures::prelude::*; +use futures03::TryFutureExt as _; use log::{info, warn}; -use runtime_primitives::generic::{SignedBlock, BlockId}; -use runtime_primitives::traits::{SaturatedConversion, Zero, One, Block, Header, NumberFor}; +use sr_primitives::generic::{SignedBlock, BlockId}; +use sr_primitives::traits::{SaturatedConversion, Zero, One, Block, Header, NumberFor}; use consensus_common::import_queue::{ImportQueue, IncomingBlock, Link, BlockImportError, BlockImportResult}; use network::message; use consensus_common::BlockOrigin; use crate::components::{self, Components, ServiceFactory, FactoryFullConfiguration, FactoryBlockNumber, RuntimeGenesis}; use crate::new_client; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode, IoReader}; use crate::error; use crate::chain_spec::ChainSpec; @@ -100,12 +101,14 @@ pub fn export_blocks( struct WaitLink { imported_blocks: u64, + has_error: bool, } impl WaitLink { fn new() -> WaitLink { WaitLink { imported_blocks: 0, + has_error: false, } } } @@ -114,12 +117,17 @@ impl Link for WaitLink { fn blocks_processed( &mut self, imported: usize, - count: usize, + _count: usize, results: Vec<(Result>, BlockImportError>, B::Hash)> ) { self.imported_blocks += imported as u64; - if results.iter().any(|(r, _)| r.is_err()) { - warn!("There was an error importing {} blocks", count); + + for result in results { + if let (Err(err), hash) = result { + warn!("There was an error importing block with hash {:?}: {:?}", hash, err); + self.has_error = true; + break; + } } } } @@ -128,9 +136,9 @@ impl Link for WaitLink { pub fn import_blocks( mut config: FactoryFullConfiguration, exit: E, - mut input: R + input: R ) -> error::Result> - where F: ServiceFactory, E: Future + Send + 'static, R: Read, + where F: ServiceFactory, E: Future + Send + 'static, R: Read + Seek, { let client = new_client::(&config)?; // FIXME #1134 this shouldn't need a mutable config. @@ -138,7 +146,8 @@ pub fn import_blocks( let (mut queue, _) = components::FullComponents::::build_import_queue( &mut config, client.clone(), - select_chain + select_chain, + None, )?; let (exit_send, exit_recv) = std::sync::mpsc::channel(); @@ -147,37 +156,42 @@ pub fn import_blocks( let _ = exit_send.send(()); }); - let count: u64 = Decode::decode(&mut input).ok_or("Error reading file")?; + let mut io_reader_input = IoReader(input); + let count: u64 = Decode::decode(&mut io_reader_input) + .map_err(|e| format!("Error reading file: {}", e))?; info!("Importing {} blocks", count); let mut block_count = 0; for b in 0 .. count { if exit_recv.try_recv().is_ok() { break; } - if let Some(signed) = SignedBlock::::decode(&mut input) { - let (header, extrinsics) = signed.block.deconstruct(); - let hash = header.hash(); - let block = message::BlockData:: { - hash, - justification: signed.justification, - header: Some(header), - body: Some(extrinsics), - receipt: None, - message_queue: None - }; - // import queue handles verification and importing it into the client - queue.import_blocks(BlockOrigin::File, vec![ - IncomingBlock::{ - hash: block.hash, - header: block.header, - body: block.body, - justification: block.justification, - origin: None, - } - ]); - } else { - warn!("Error reading block data at {}.", b); - break; + match SignedBlock::::decode(&mut io_reader_input) { + Ok(signed) => { + let (header, extrinsics) = signed.block.deconstruct(); + let hash = header.hash(); + let block = message::BlockData:: { + hash, + justification: signed.justification, + header: Some(header), + body: Some(extrinsics), + receipt: None, + message_queue: None + }; + // import queue handles verification and importing it into the client + queue.import_blocks(BlockOrigin::File, vec![ + IncomingBlock:: { + hash: block.hash, + header: block.header, + body: block.body, + justification: block.justification, + origin: None, + } + ]); + } + Err(e) => { + warn!("Error reading block data at {}: {}", b, e); + break; + } } block_count = b; @@ -193,7 +207,17 @@ pub fn import_blocks( } let blocks_before = link.imported_blocks; - queue.poll_actions(&mut link); + let _ = futures03::future::poll_fn(|cx| { + queue.poll_actions(cx, &mut link); + std::task::Poll::Pending::> + }).compat().poll(); + if link.has_error { + info!( + "Stopping after #{} blocks because of an error", + link.imported_blocks, + ); + return Ok(Async::Ready(())); + } if link.imported_blocks / 1000 != blocks_before / 1000 { info!( "#{} blocks were imported (#{} left)", diff --git a/core/service/src/chain_spec.rs b/core/service/src/chain_spec.rs index 6af0f5766e80c3e0bf7ffd6fcaa9c587ba31e30a..8d84b4880cc3e65fcd0f48f8537d025173b487fa 100644 --- a/core/service/src/chain_spec.rs +++ b/core/service/src/chain_spec.rs @@ -16,12 +16,13 @@ //! Substrate chain configurations. +use std::borrow::Cow; use std::collections::HashMap; use std::fs::File; use std::path::PathBuf; use serde::{Serialize, Deserialize}; use primitives::storage::{StorageKey, StorageData}; -use runtime_primitives::{BuildStorage, StorageOverlay, ChildrenStorageOverlay}; +use sr_primitives::{BuildStorage, StorageOverlay, ChildrenStorageOverlay}; use serde_json as json; use crate::components::RuntimeGenesis; use network::Multiaddr; @@ -29,15 +30,15 @@ use tel::TelemetryEndpoints; enum GenesisSource { File(PathBuf), - Embedded(&'static [u8]), + Binary(Cow<'static, [u8]>), Factory(fn() -> G), } -impl Clone for GenesisSource { +impl Clone for GenesisSource { fn clone(&self) -> Self { match *self { GenesisSource::File(ref path) => GenesisSource::File(path.clone()), - GenesisSource::Embedded(d) => GenesisSource::Embedded(d), + GenesisSource::Binary(ref d) => GenesisSource::Binary(d.clone()), GenesisSource::Factory(f) => GenesisSource::Factory(f), } } @@ -50,14 +51,16 @@ impl GenesisSource { genesis: Genesis, } - match *self { - GenesisSource::File(ref path) => { + match self { + GenesisSource::File(path) => { let file = File::open(path).map_err(|e| format!("Error opening spec file: {}", e))?; - let genesis: GenesisContainer = json::from_reader(file).map_err(|e| format!("Error parsing spec file: {}", e))?; + let genesis: GenesisContainer = + json::from_reader(file).map_err(|e| format!("Error parsing spec file: {}", e))?; Ok(genesis.genesis) }, - GenesisSource::Embedded(buf) => { - let genesis: GenesisContainer = json::from_reader(buf).map_err(|e| format!("Error parsing embedded file: {}", e))?; + GenesisSource::Binary(buf) => { + let genesis: GenesisContainer = + json::from_reader(buf.as_ref()).map_err(|e| format!("Error parsing embedded file: {}", e))?; Ok(genesis.genesis) }, GenesisSource::Factory(f) => Ok(Genesis::Runtime(f())), @@ -69,10 +72,16 @@ impl<'a, G: RuntimeGenesis> BuildStorage for &'a ChainSpec { fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { match self.genesis.resolve()? { Genesis::Runtime(gc) => gc.build_storage(), - Genesis::Raw(map) => Ok((map.into_iter().map(|(k, v)| (k.0, v.0)).collect(), Default::default())), + Genesis::Raw(map, children_map) => Ok(( + map.into_iter().map(|(k, v)| (k.0, v.0)).collect(), + children_map.into_iter().map(|(sk, map)| ( + sk.0, + map.into_iter().map(|(k, v)| (k.0, v.0)).collect(), + )).collect(), + )), } } - fn assimilate_storage(self, _: &mut StorageOverlay, _: &mut ChildrenStorageOverlay) -> Result<(), String> { + fn assimilate_storage(self, _: &mut (StorageOverlay, ChildrenStorageOverlay)) -> Result<(), String> { Err("`assimilate_storage` not implemented for `ChainSpec`.".into()) } } @@ -82,7 +91,10 @@ impl<'a, G: RuntimeGenesis> BuildStorage for &'a ChainSpec { #[serde(deny_unknown_fields)] enum Genesis { Runtime(G), - Raw(HashMap), + Raw( + HashMap, + HashMap>, + ), } #[derive(Serialize, Deserialize, Clone)] @@ -101,12 +113,12 @@ struct ChainSpecFile { pub type Properties = json::map::Map; /// A configuration of a chain. Can be used to build a genesis block. -pub struct ChainSpec { +pub struct ChainSpec { spec: ChainSpecFile, genesis: GenesisSource, } -impl Clone for ChainSpec { +impl Clone for ChainSpec { fn clone(&self) -> Self { ChainSpec { spec: self.spec.clone(), @@ -115,7 +127,7 @@ impl Clone for ChainSpec { } } -impl ChainSpec { +impl ChainSpec { /// A list of bootnode addresses. pub fn boot_nodes(&self) -> &[String] { &self.spec.boot_nodes @@ -158,11 +170,12 @@ impl ChainSpec { } /// Parse json content into a `ChainSpec` - pub fn from_embedded(json: &'static [u8]) -> Result { - let spec = json::from_slice(json).map_err(|e| format!("Error parsing spec file: {}", e))?; + pub fn from_json_bytes(json: impl Into>) -> Result { + let json = json.into(); + let spec = json::from_slice(json.as_ref()).map_err(|e| format!("Error parsing spec file: {}", e))?; Ok(ChainSpec { spec, - genesis: GenesisSource::Embedded(json), + genesis: GenesisSource::Binary(json), }) } @@ -202,7 +215,9 @@ impl ChainSpec { genesis: GenesisSource::Factory(constructor), } } +} +impl ChainSpec { /// Dump to json string. pub fn to_json(self, raw: bool) -> Result { #[derive(Serialize, Deserialize)] @@ -214,11 +229,20 @@ impl ChainSpec { }; let genesis = match (raw, self.genesis.resolve()?) { (true, Genesis::Runtime(g)) => { - let storage = g.build_storage()?.0.into_iter() + let storage = g.build_storage()?; + let top = storage.0.into_iter() .map(|(k, v)| (StorageKey(k), StorageData(v))) .collect(); + let children = storage.1.into_iter() + .map(|(sk, child)| ( + StorageKey(sk), + child.into_iter() + .map(|(k, v)| (StorageKey(k), StorageData(v))) + .collect(), + )) + .collect(); - Genesis::Raw(storage) + Genesis::Raw(top, children) }, (_, genesis) => genesis, }; diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 54c94730b0b3f3ceb41ee5d4edfe002bf9c3e498..b88abd4a98b03e6811edb8103af73abdc4c90423 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -19,20 +19,24 @@ use std::{sync::Arc, ops::Deref, ops::DerefMut}; use serde::{Serialize, de::DeserializeOwned}; use crate::chain_spec::ChainSpec; +use keystore::KeyStorePtr; use client_db; use client::{self, Client, runtime_api}; -use crate::{error, Service, AuthorityKeyProvider}; +use crate::{error, Service}; use consensus_common::{import_queue::ImportQueue, SelectChain}; -use network::{self, OnDemand, FinalityProofProvider, config::BoxFinalityProofRequestBuilder}; +use network::{ + self, OnDemand, FinalityProofProvider, NetworkStateInfo, config::BoxFinalityProofRequestBuilder +}; use substrate_executor::{NativeExecutor, NativeExecutionDispatch}; use transaction_pool::txpool::{self, Options as TransactionPoolOptions, Pool as TransactionPool}; -use runtime_primitives::{ +use sr_primitives::{ BuildStorage, traits::{Block as BlockT, Header as HeaderT, ProvideRuntimeApi}, generic::BlockId }; use crate::config::Configuration; -use primitives::{Blake2Hasher, H256}; +use primitives::{Blake2Hasher, H256, traits::BareCryptoStorePtr}; use rpc::{self, apis::system::SystemInfo}; -use futures::{prelude::*, future::Executor, sync::mpsc}; +use futures::{prelude::*, future::Executor}; +use futures03::{FutureExt as _, channel::mpsc, compat::Compat}; // Type aliases. // These exist mainly to avoid typing `::Foo` all over the code. @@ -141,6 +145,28 @@ pub type PoolApi = ::TransactionPoolApi; pub trait RuntimeGenesis: Serialize + DeserializeOwned + BuildStorage {} impl RuntimeGenesis for T {} +/// Something that can create and store initial session keys from given seeds. +pub trait InitialSessionKeys { + /// Generate the initial session keys for the given seeds and store them in + /// an internal keystore. + fn generate_initial_session_keys( + client: Arc>, + seeds: Vec, + ) -> error::Result<()>; +} + +impl InitialSessionKeys for C where + ComponentClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: session::SessionKeys>, +{ + fn generate_initial_session_keys( + client: Arc>, + seeds: Vec, + ) -> error::Result<()> { + session::generate_initial_session_keys(client, seeds).map_err(Into::into) + } +} + /// Something that can start the RPC service. pub trait StartRPC { fn start_rpc( @@ -149,12 +175,14 @@ pub trait StartRPC { system_info: SystemInfo, task_executor: TaskExecutor, transaction_pool: Arc>, + keystore: KeyStorePtr, ) -> rpc::RpcHandler; } impl StartRPC for C where ComponentClient: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: runtime_api::Metadata>, + as ProvideRuntimeApi>::Api: + runtime_api::Metadata> + session::SessionKeys>, { fn start_rpc( client: Arc>, @@ -162,11 +190,17 @@ impl StartRPC for C where rpc_system_info: SystemInfo, task_executor: TaskExecutor, transaction_pool: Arc>, + keystore: KeyStorePtr, ) -> rpc::RpcHandler { let subscriptions = rpc::apis::Subscriptions::new(task_executor.clone()); let chain = rpc::apis::chain::Chain::new(client.clone(), subscriptions.clone()); let state = rpc::apis::state::State::new(client.clone(), subscriptions.clone()); - let author = rpc::apis::author::Author::new(client, transaction_pool, subscriptions); + let author = rpc::apis::author::Author::new( + client, + transaction_pool, + subscriptions, + keystore, + ); let system = rpc::apis::system::System::new(rpc_system_info, system_send_back); rpc::rpc_handler::, ComponentExHash, _, _, _, _>( state, @@ -231,10 +265,11 @@ pub trait OffchainWorker { offchain: &offchain::OffchainWorkers< ComponentClient, ComponentOffchainStorage, - AuthorityKeyProvider, ComponentBlock >, pool: &Arc>, + network_state: &Arc, + is_validator: bool, ) -> error::Result + Send>>; } @@ -247,12 +282,15 @@ impl OffchainWorker for C where offchain: &offchain::OffchainWorkers< ComponentClient, ComponentOffchainStorage, - AuthorityKeyProvider, ComponentBlock >, pool: &Arc>, + network_state: &Arc, + is_validator: bool, ) -> error::Result + Send>> { - Ok(Box::new(offchain.on_block_imported(number, pool))) + let future = offchain.on_block_imported(number, pool, network_state.clone(), is_validator) + .map(|()| Ok(())); + Ok(Box::new(Compat::new(future))) } } @@ -264,6 +302,7 @@ pub trait ServiceTrait: + StartRPC + MaintainTransactionPool + OffchainWorker + + InitialSessionKeys {} impl ServiceTrait for T where T: Deref> @@ -272,6 +311,7 @@ impl ServiceTrait for T where + StartRPC + MaintainTransactionPool + OffchainWorker + + InitialSessionKeys {} /// Alias for a an implementation of `futures::future::Executor`. @@ -341,6 +381,7 @@ pub trait ServiceFactory: 'static + Sized { config: &mut FactoryFullConfiguration, _client: Arc>, _select_chain: Self::SelectChain, + _transaction_pool: Option>>, ) -> Result { if let Some(name) = config.chain_spec.consensus_engine() { match name { @@ -395,6 +436,7 @@ pub trait Components: Sized + 'static { fn build_client( config: &FactoryFullConfiguration, executor: CodeExecutor, + keystore: Option, ) -> Result< ( Arc>, @@ -413,6 +455,7 @@ pub trait Components: Sized + 'static { config: &mut FactoryFullConfiguration, client: Arc>, select_chain: Option, + _transaction_pool: Option>>, ) -> Result<(Self::ImportQueue, Option>>), error::Error>; /// Finality proof provider for serving network requests. @@ -461,13 +504,23 @@ impl DerefMut for FullComponents { impl Future for FullComponents { type Item = (); - type Error = (); + type Error = super::Error; fn poll(&mut self) -> Poll { self.service.poll() } } +impl Executor + Send>> +for FullComponents { + fn execute( + &self, + future: Box + Send> + ) -> Result<(), futures::future::ExecuteError + Send>>> { + self.service.execute(future) + } +} + impl Components for FullComponents { type Factory = Factory; type Executor = FullExecutor; @@ -481,11 +534,11 @@ impl Components for FullComponents { fn build_client( config: &FactoryFullConfiguration, executor: CodeExecutor, - ) - -> Result<( - Arc>, - Option>>> - ), error::Error> + keystore: Option, + ) -> Result< + (Arc>, Option>>>), + error::Error, + > { let db_settings = client_db::DatabaseSettings { cache_size: config.database_cache_size.map(|u| u as usize), @@ -495,12 +548,19 @@ impl Components for FullComponents { path: config.database_path.clone(), pruning: config.pruning.clone(), }; - Ok((Arc::new(client_db::new_client( - db_settings, - executor, - &config.chain_spec, - config.execution_strategies.clone(), - )?), None)) + + Ok(( + Arc::new( + client_db::new_client( + db_settings, + executor, + &config.chain_spec, + config.execution_strategies.clone(), + keystore, + )? + ), + None, + )) } fn build_transaction_pool( @@ -514,10 +574,11 @@ impl Components for FullComponents { config: &mut FactoryFullConfiguration, client: Arc>, select_chain: Option, + transaction_pool: Option>>, ) -> Result<(Self::ImportQueue, Option>>), error::Error> { let select_chain = select_chain .ok_or(error::Error::SelectChainRequired)?; - Factory::build_full_import_queue(config, client, select_chain) + Factory::build_full_import_queue(config, client, select_chain, transaction_pool) .map(|queue| (queue, None)) } @@ -561,15 +622,31 @@ impl Deref for LightComponents { } } +impl DerefMut for LightComponents { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.service + } +} + impl Future for LightComponents { type Item = (); - type Error = (); + type Error = super::Error; fn poll(&mut self) -> Poll { self.service.poll() } } +impl Executor + Send>> +for LightComponents { + fn execute( + &self, + future: Box + Send> + ) -> Result<(), futures::future::ExecuteError + Send>>> { + self.service.execute(future) + } +} + impl Components for LightComponents { type Factory = Factory; type Executor = LightExecutor; @@ -583,6 +660,7 @@ impl Components for LightComponents { fn build_client( config: &FactoryFullConfiguration, executor: CodeExecutor, + _: Option, ) -> Result< ( @@ -598,9 +676,12 @@ impl Components for LightComponents { path: config.database_path.clone(), pruning: config.pruning.clone(), }; + let db_storage = client_db::light::LightStorage::new(db_settings)?; let light_blockchain = client::light::new_light_blockchain(db_storage); - let fetch_checker = Arc::new(client::light::new_fetch_checker(light_blockchain.clone(), executor.clone())); + let fetch_checker = Arc::new( + client::light::new_fetch_checker(light_blockchain.clone(), executor.clone()) + ); let fetcher = Arc::new(network::OnDemand::new(fetch_checker)); let client_backend = client::light::new_light_backend(light_blockchain, fetcher.clone()); let client = client::light::new_light(client_backend, fetcher.clone(), &config.chain_spec, executor)?; @@ -617,6 +698,7 @@ impl Components for LightComponents { config: &mut FactoryFullConfiguration, client: Arc>, _select_chain: Option, + _transaction_pool: Option>>, ) -> Result<(Self::ImportQueue, Option>>), error::Error> { Factory::build_light_import_queue(config, client) .map(|(queue, builder)| (queue, Some(builder))) diff --git a/core/service/src/config.rs b/core/service/src/config.rs index 6f2f51ebfb6ea6a69bf61f899adcedb8f940585f..97eba357e3fead57a6fab1911bcffe192fb23094 100644 --- a/core/service/src/config.rs +++ b/core/service/src/config.rs @@ -24,14 +24,14 @@ use std::{path::PathBuf, net::SocketAddr}; use transaction_pool; use crate::chain_spec::ChainSpec; use primitives::crypto::Protected; -use runtime_primitives::BuildStorage; +use sr_primitives::BuildStorage; use serde::{Serialize, de::DeserializeOwned}; use target_info::Target; use tel::TelemetryEndpoints; /// Service configuration. #[derive(Clone)] -pub struct Configuration { +pub struct Configuration { /// Implementation name pub impl_name: &'static str, /// Implementation version @@ -45,7 +45,7 @@ pub struct Configuration { /// Network configuration. pub network: NetworkConfiguration, /// Path to key files. - pub keystore_path: Option, + pub keystore_path: PathBuf, /// Path to the database. pub database_path: PathBuf, /// Cache Size for internal database in MiB @@ -56,8 +56,6 @@ pub struct Configuration { pub state_cache_child_ratio: Option, /// Pruning settings. pub pruning: PruningMode, - /// Additional key seeds. - pub keys: Vec, /// Chain configuration. pub chain_spec: ChainSpec, /// Custom configuration. @@ -87,11 +85,14 @@ pub struct Configuration { pub force_authoring: bool, /// Disable GRANDPA when running in validator mode pub disable_grandpa: bool, - /// Run GRANDPA voter even when no additional key seed is specified. This can for example be of interest when - /// running a sentry node in front of a validator, thus needing to forward GRANDPA gossip messages. - pub grandpa_voter: bool, /// Node keystore's password - pub password: Protected, + pub keystore_password: Option>, + /// Development key seed. + /// + /// When running in development mode, the seed will be used to generate authority keys by the keystore. + /// + /// Should only be set when `node` is running development mode. + pub dev_key_seed: Option, } impl Configuration { @@ -111,7 +112,6 @@ impl Configuration Configuration { NetworkStatus>, NetworkState )>>>>, transaction_pool: Arc>, - keystore: AuthorityKeyProvider, - exit: ::exit_future::Exit, + /// A future that resolves when the service has exited, this is useful to + /// make sure any internally spawned futures stop when the service does. + exit: exit_future::Exit, + /// A signal that makes the exit future above resolve, fired on service drop. signal: Option, + /// Set to `true` when a spawned essential task has failed. The next time + /// the service future is polled it should complete with an error. + essential_failed: Arc, /// Sender for futures that must be spawned as background tasks. to_spawn_tx: mpsc::UnboundedSender + Send>>, /// Receiver for futures that must be spawned as background tasks. @@ -94,7 +100,7 @@ pub struct Service { /// The elements must then be polled manually. to_poll: Vec + Send>>, /// Configuration of this Service - pub config: FactoryFullConfiguration, + config: FactoryFullConfiguration, rpc_handlers: rpc::RpcHandler, _rpc: Box, _telemetry: Option, @@ -102,21 +108,22 @@ pub struct Service { _offchain_workers: Option, ComponentOffchainStorage, - AuthorityKeyProvider, ComponentBlock> >>, + keystore: keystore::KeyStorePtr, } /// Creates bare client without any networking. -pub fn new_client(config: &FactoryFullConfiguration) - -> Result>>, error::Error> -{ +pub fn new_client( + config: &FactoryFullConfiguration, +) -> Result>>, error::Error> { let executor = NativeExecutor::new(config.default_heap_pages); - let (client, _) = components::FullComponents::::build_client( + + components::FullComponents::::build_client( config, executor, - )?; - Ok(client) + None, + ).map(|r| r.0) } /// An handle for spawning tasks in the service. @@ -149,18 +156,11 @@ pub struct TelemetryOnConnect { } impl Service { - /// Get event stream for telemetry connection established events. - pub fn telemetry_on_connect_stream(&self) -> TelemetryOnConnectNotifications { - let (sink, stream) = mpsc::unbounded(); - self._telemetry_on_connect_sinks.lock().push(sink); - stream - } - /// Creates a new service. pub fn new( mut config: FactoryFullConfiguration, ) -> Result { - let (signal, exit) = ::exit_future::signal(); + let (signal, exit) = exit_future::signal(); // List of asynchronous tasks to spawn. We collect them, then spawn them all at once. let (to_spawn_tx, to_spawn_rx) = @@ -169,68 +169,45 @@ impl Service { // Create client let executor = NativeExecutor::new(config.default_heap_pages); - let mut keystore = if let Some(keystore_path) = config.keystore_path.as_ref() { - match Keystore::open(keystore_path.clone()) { - Ok(ks) => Some(ks), - Err(err) => { - error!("Failed to initialize keystore: {}", err); - None - } - } - } else { - None - }; + let keystore = Keystore::open(config.keystore_path.clone(), config.keystore_password.clone())?; - // Keep the public key for telemetry - let public_key: String; - - // This is meant to be for testing only - // FIXME #1063 remove this - if let Some(keystore) = keystore.as_mut() { - for seed in &config.keys { - keystore.generate_from_seed::(seed)?; - } + let (client, on_demand) = Components::build_client(&config, executor, Some(keystore.clone()))?; + let select_chain = Components::build_select_chain(&mut config, client.clone())?; - public_key = match keystore.contents::()?.get(0) { - Some(public_key) => public_key.to_string(), - None => { - let key: ed25519::Pair = keystore.generate(&config.password.as_ref())?; - let public_key = key.public(); - info!("Generated a new keypair: {:?}", public_key); - public_key.to_string() - } - } - } else { - public_key = format!(""); - } + let transaction_pool = Arc::new( + Components::build_transaction_pool(config.transaction_pool.clone(), client.clone())? + ); + let transaction_pool_adapter = Arc::new(TransactionPoolAdapter { + imports_external_transactions: !config.roles.is_light(), + pool: transaction_pool.clone(), + client: client.clone(), + }); - let (client, on_demand) = Components::build_client(&config, executor)?; - let select_chain = Components::build_select_chain(&mut config, client.clone())?; let (import_queue, finality_proof_request_builder) = Components::build_import_queue( &mut config, client.clone(), select_chain.clone(), + Some(transaction_pool.clone()), )?; let import_queue = Box::new(import_queue); let finality_proof_provider = Components::build_finality_proof_provider(client.clone())?; let chain_info = client.info().chain; + Components::RuntimeServices::generate_initial_session_keys( + client.clone(), + config.dev_key_seed.clone().map(|s| vec![s]).unwrap_or_default(), + )?; + let version = config.full_version(); info!("Highest known block at #{}", chain_info.best_number); - telemetry!(SUBSTRATE_INFO; "node.start"; + telemetry!( + SUBSTRATE_INFO; + "node.start"; "height" => chain_info.best_number.saturated_into::(), "best" => ?chain_info.best_hash ); let network_protocol = ::build_network_protocol(&config)?; - let transaction_pool = Arc::new( - Components::build_transaction_pool(config.transaction_pool.clone(), client.clone())? - ); - let transaction_pool_adapter = Arc::new(TransactionPoolAdapter:: { - imports_external_transactions: !config.roles.is_light(), - pool: transaction_pool.clone(), - client: client.clone(), - }); let protocol_id = { let protocol_id_full = match config.chain_spec.protocol_id() { @@ -263,22 +240,11 @@ impl Service { let network = network_mut.service().clone(); let network_status_sinks = Arc::new(Mutex::new(Vec::new())); - let keystore_authority_key = AuthorityKeyProvider { - roles: config.roles, - password: config.password.clone(), - keystore: keystore.map(Arc::new), - }; - #[allow(deprecated)] let offchain_storage = client.backend().offchain_storage(); let offchain_workers = match (config.offchain_worker, offchain_storage) { (true, Some(db)) => { - Some(Arc::new(offchain::OffchainWorkers::new( - client.clone(), - db, - keystore_authority_key.clone(), - config.password.clone(), - ))) + Some(Arc::new(offchain::OffchainWorkers::new(client.clone(), db))) }, (true, None) => { log::warn!("Offchain workers disabled, due to lack of offchain storage support in backend."); @@ -293,6 +259,8 @@ impl Service { let wclient = Arc::downgrade(&client); let offchain = offchain_workers.as_ref().map(Arc::downgrade); let to_spawn_tx_ = to_spawn_tx.clone(); + let network_state_info: Arc = network.clone(); + let is_validator = config.roles.is_authority(); let events = client.import_notification_stream() .map(|v| Ok::<_, ()>(v)).compat() @@ -312,6 +280,8 @@ impl Service { &number, &offchain, &txpool, + &network_state_info, + is_validator, ).map_err(|e| warn!("Offchain workers error processing new block: {:?}", e))?; let _ = to_spawn_tx_.unbounded_send(future); } @@ -400,7 +370,7 @@ impl Service { let _ = to_spawn_tx.unbounded_send(Box::new(tel_task)); // RPC - let (system_rpc_tx, system_rpc_rx) = mpsc::unbounded(); + let (system_rpc_tx, system_rpc_rx) = futures03::channel::mpsc::unbounded(); let gen_handler = || { let system_info = rpc::apis::system::SystemInfo { chain_name: config.chain_spec.name().into(), @@ -414,12 +384,13 @@ impl Service { system_info.clone(), Arc::new(SpawnTaskHandle { sender: to_spawn_tx.clone() }), transaction_pool.clone(), + keystore.clone(), ) }; let rpc_handlers = gen_handler(); - let rpc = start_rpc_servers::(&config, gen_handler)?; + let rpc = start_rpc_servers(&config, gen_handler)?; - let _ = to_spawn_tx.unbounded_send(Box::new(build_network_future::( + let _ = to_spawn_tx.unbounded_send(Box::new(build_network_future( network_mut, client.clone(), network_status_sinks.clone(), @@ -434,7 +405,7 @@ impl Service { // Telemetry let telemetry = config.telemetry_endpoints.clone().map(|endpoints| { - let is_authority = config.roles == Roles::AUTHORITY; + let is_authority = config.roles.is_authority(); let network_id = network.local_peer_id().to_base58(); let name = config.name.clone(); let impl_name = config.impl_name.to_owned(); @@ -458,7 +429,6 @@ impl Service { "version" => version.clone(), "config" => "", "chain" => chain_name.clone(), - "pubkey" => &public_key, "authority" => is_authority, "network_id" => network_id.clone() ); @@ -480,38 +450,71 @@ impl Service { network_status_sinks, select_chain, transaction_pool, + exit, signal: Some(signal), + essential_failed: Arc::new(AtomicBool::new(false)), to_spawn_tx, to_spawn_rx, to_poll: Vec::new(), - keystore: keystore_authority_key, config, - exit, rpc_handlers, _rpc: rpc, _telemetry: telemetry, _offchain_workers: offchain_workers, _telemetry_on_connect_sinks: telemetry_connection_sinks.clone(), + keystore, }) } - /// give the authority key, if we are an authority and have a key - pub fn authority_key(&self) -> Option { - use offchain::AuthorityKeyProvider; + /// Returns a reference to the config passed at initialization. + pub fn config(&self) -> &FactoryFullConfiguration { + &self.config + } - self.keystore.authority_key() + /// Returns a reference to the config passed at initialization. + /// + /// > **Note**: This method is currently necessary because we extract some elements from the + /// > configuration at the end of the service initialization. It is intended to be + /// > removed. + pub fn config_mut(&mut self) -> &mut FactoryFullConfiguration { + &mut self.config } - /// return a shared instance of Telemetry (if enabled) + /// Get event stream for telemetry connection established events. + pub fn telemetry_on_connect_stream(&self) -> TelemetryOnConnectNotifications { + let (sink, stream) = mpsc::unbounded(); + self._telemetry_on_connect_sinks.lock().push(sink); + stream + } + + /// Return a shared instance of Telemetry (if enabled) pub fn telemetry(&self) -> Option { self._telemetry.as_ref().map(|t| t.clone()) } + /// Returns the keystore instance. + pub fn keystore(&self) -> keystore::KeyStorePtr { + self.keystore.clone() + } + /// Spawns a task in the background that runs the future passed as parameter. pub fn spawn_task(&self, task: impl Future + Send + 'static) { let _ = self.to_spawn_tx.unbounded_send(Box::new(task)); } + /// Spawns a task in the background that runs the future passed as + /// parameter. The given task is considered essential, i.e. if it errors we + /// trigger a service exit. + pub fn spawn_essential_task(&self, task: impl Future + Send + 'static) { + let essential_failed = self.essential_failed.clone(); + let essential_task = Box::new(task.map_err(move |_| { + error!("Essential task failed. Shutting down service."); + essential_failed.store(true, Ordering::Relaxed); + })); + + let _ = self.to_spawn_tx.unbounded_send(essential_task); + } + /// Returns a handle for spawning tasks. pub fn spawn_task_handle(&self) -> SpawnTaskHandle { SpawnTaskHandle { @@ -529,7 +532,8 @@ impl Service { /// If the request subscribes you to events, the `Sender` in the `RpcSession` object is used to /// send back spontaneous events. pub fn rpc_query(&self, mem: &RpcSession, request: &str) - -> impl Future, Error = ()> { + -> impl Future, Error = ()> + { self.rpc_handlers.handle_request(request, mem.metadata.clone()) } @@ -568,9 +572,13 @@ impl Service { impl Future for Service where Components: components::Components { type Item = (); - type Error = (); + type Error = Error; fn poll(&mut self) -> Poll { + if self.essential_failed.load(Ordering::Relaxed) { + return Err(Error::Other("Essential task failed.".into())); + } + while let Ok(Async::Ready(Some(task_to_spawn))) = self.to_spawn_rx.poll() { let executor = tokio_executor::DefaultExecutor::current(); if let Err(err) = executor.execute(task_to_spawn) { @@ -613,16 +621,21 @@ impl Executor + Send>> /// /// The `status_sink` contain a list of senders to send a periodic network status to. fn build_network_future< - Components: components::Components, - S: network::specialization::NetworkSpecialization>, + B: BlockT, + C: client::BlockchainEvents, + S: network::specialization::NetworkSpecialization, H: network::ExHashT > ( - mut network: network::NetworkWorker, S, H>, - client: Arc>, - status_sinks: Arc>, NetworkState)>>>>, - mut rpc_rx: mpsc::UnboundedReceiver>>, + mut network: network::NetworkWorker, + client: Arc, + status_sinks: Arc, NetworkState)>>>>, + rpc_rx: futures03::channel::mpsc::UnboundedReceiver>, should_have_peers: bool, ) -> impl Future { + // Compatibility shim while we're transitionning to stable Futures. + // See https://github.com/paritytech/substrate/issues/3099 + let mut rpc_rx = futures03::compat::Compat::new(rpc_rx.map(|v| Ok::<_, ()>(v))); + // Interval at which we send status updates on the status stream. const STATUS_INTERVAL: Duration = Duration::from_millis(5000); let mut status_interval = tokio_timer::Interval::new_interval(STATUS_INTERVAL); @@ -633,6 +646,8 @@ fn build_network_future< .map(|v| Ok::<_, ()>(v)).compat(); futures::future::poll_fn(move || { + let before_polling = Instant::now(); + // We poll `imported_blocks_stream`. while let Ok(Async::Ready(Some(notification))) = imported_blocks_stream.poll() { network.on_block_imported(notification.hash, notification.header); @@ -691,10 +706,22 @@ fn build_network_future< } // Main network polling. - network.poll() - .map_err(|err| { - warn!(target: "service", "Error in network: {:?}", err); - }) + match network.poll() { + Ok(Async::NotReady) => {} + Err(err) => warn!(target: "service", "Error in network: {:?}", err), + Ok(Async::Ready(())) => warn!(target: "service", "Network service finished"), + } + + // Now some diagnostic for performances. + let polling_dur = before_polling.elapsed(); + log!( + target: "service", + if polling_dur >= Duration::from_millis(50) { Level::Debug } else { Level::Trace }, + "Polling the network future took {:?}", + polling_dur + ); + + Ok(Async::NotReady) }) } @@ -728,10 +755,10 @@ impl Drop for Service where Components: components::Comp /// Starts RPC servers that run in their own thread, and returns an opaque object that keeps them alive. #[cfg(not(target_os = "unknown"))] -fn start_rpc_servers rpc::RpcHandler>( - config: &FactoryFullConfiguration, +fn start_rpc_servers rpc::RpcHandler>( + config: &Configuration, mut gen_handler: H -) -> Result, error::Error> { +) -> Result, error::Error> { fn maybe_start_server(address: Option, mut start: F) -> Result, io::Error> where F: FnMut(&SocketAddr) -> Result, { @@ -769,8 +796,8 @@ fn start_rpc_servers rpc::RpcHandler>( /// Starts RPC servers that run in their own thread, and returns an opaque object that keeps them alive. #[cfg(target_os = "unknown")] -fn start_rpc_servers rpc::RpcHandler>( - _: &FactoryFullConfiguration, +fn start_rpc_servers rpc::RpcHandler>( + _: &Configuration, _: H ) -> Result, error::Error> { Ok(Box::new(())) @@ -797,16 +824,10 @@ impl RpcSession { } /// Transaction pool adapter. -pub struct TransactionPoolAdapter { +pub struct TransactionPoolAdapter { imports_external_transactions: bool, - pool: Arc>, - client: Arc>, -} - -impl TransactionPoolAdapter { - fn best_block_id(&self) -> Option>> { - Some(BlockId::hash(self.client.info().chain.best_hash)) - } + pool: Arc

, + client: Arc, } /// Get transactions for propagation. @@ -817,7 +838,7 @@ fn transactions_to_propagate(pool: &TransactionPool) where PoolApi: ChainApi, B: BlockT, - H: std::hash::Hash + Eq + runtime_primitives::traits::Member + serde::Serialize, + H: std::hash::Hash + Eq + sr_primitives::traits::Member + serde::Serialize, E: txpool::error::IntoPoolError + From, { pool.ready() @@ -830,83 +851,59 @@ where .collect() } -impl network::TransactionPool, ComponentBlock> for - TransactionPoolAdapter where ::RuntimeApi: Send + Sync +impl network::TransactionPool for + TransactionPoolAdapter> +where + C: network::ClientHandle + Send + Sync, + PoolApi: ChainApi, + B: BlockT, + H: std::hash::Hash + Eq + sr_primitives::traits::Member + serde::Serialize, + E: txpool::error::IntoPoolError + From, { - fn transactions(&self) -> Vec<(ComponentExHash, ComponentExtrinsic)> { + fn transactions(&self) -> Vec<(H, ::Extrinsic)> { transactions_to_propagate(&self.pool) } - fn import(&self, transaction: &ComponentExtrinsic) -> Option> { + fn import(&self, transaction: &::Extrinsic) -> Option { if !self.imports_external_transactions { debug!("Transaction rejected"); return None; } let encoded = transaction.encode(); - if let Some(uxt) = Decode::decode(&mut &encoded[..]) { - let best_block_id = self.best_block_id()?; - match self.pool.submit_one(&best_block_id, uxt) { - Ok(hash) => Some(hash), - Err(e) => match e.into_pool_error() { - Ok(txpool::error::Error::AlreadyImported(hash)) => { - hash.downcast::>().ok() - .map(|x| x.as_ref().clone()) - }, - Ok(e) => { - debug!("Error adding transaction to the pool: {:?}", e); - None - }, - Err(e) => { - debug!("Error converting pool error: {:?}", e); - None - }, + match Decode::decode(&mut &encoded[..]) { + Ok(uxt) => { + let best_block_id = BlockId::hash(self.client.info().chain.best_hash); + match self.pool.submit_one(&best_block_id, uxt) { + Ok(hash) => Some(hash), + Err(e) => match e.into_pool_error() { + Ok(txpool::error::Error::AlreadyImported(hash)) => { + hash.downcast::().ok() + .map(|x| x.as_ref().clone()) + }, + Ok(e) => { + debug!("Error adding transaction to the pool: {:?}", e); + None + }, + Err(e) => { + debug!("Error converting pool error: {:?}", e); + None + }, + } } } - } else { - debug!("Error decoding transaction"); - None + Err(e) => { + debug!("Error decoding transaction {}", e); + None + } } } - fn on_broadcasted(&self, propagations: HashMap, Vec>) { + fn on_broadcasted(&self, propagations: HashMap>) { self.pool.on_broadcasted(propagations) } } -/// A provider of current authority key. -#[derive(Clone)] -pub struct AuthorityKeyProvider { - roles: Roles, - keystore: Option>, - password: crypto::Protected, -} - -impl offchain::AuthorityKeyProvider for AuthorityKeyProvider { - fn authority_key(&self) -> Option { - if self.roles != Roles::AUTHORITY { - return None - } - - let keystore = match self.keystore { - Some(ref keystore) => keystore, - None => return None - }; - - let loaded_key = keystore - .contents() - .map(|keys| keys.get(0) - .map(|k| keystore.load(k, self.password.as_ref())) - ); - - if let Ok(Some(Ok(key))) = loaded_key { - Some(key) - } else { - None - } - } -} - /// Constructs a service factory with the given name that implements the `ServiceFactory` trait. /// The required parameters are required to be given in the exact order. Some parameters are followed /// by `{}` blocks. These blocks are required and used to initialize the given parameter. @@ -924,12 +921,14 @@ impl offchain::AuthorityKeyProvider for AuthorityKeyProvider { /// # use network::{config::DummyFinalityProofRequestBuilder, construct_simple_protocol}; /// # use client::{self, LongestChain}; /// # use consensus_common::import_queue::{BasicQueue, Verifier}; -/// # use consensus_common::{BlockOrigin, ImportBlock, well_known_cache_keys::Id as CacheKeyId}; +/// # use consensus_common::{BlockOrigin, BlockImportParams, well_known_cache_keys::Id as CacheKeyId}; /// # use node_runtime::{GenesisConfig, RuntimeApi}; /// # use std::sync::Arc; /// # use node_primitives::Block; -/// # use runtime_primitives::Justification; -/// # use runtime_primitives::traits::Block as BlockT; +/// # use babe_primitives::AuthorityPair as BabePair; +/// # use grandpa_primitives::AuthorityPair as GrandpaPair; +/// # use sr_primitives::Justification; +/// # use sr_primitives::traits::Block as BlockT; /// # use grandpa; /// # construct_simple_protocol! { /// # pub struct NodeProtocol where Block = Block { } @@ -937,12 +936,12 @@ impl offchain::AuthorityKeyProvider for AuthorityKeyProvider { /// # struct MyVerifier; /// # impl Verifier for MyVerifier { /// # fn verify( -/// # &self, +/// # &mut self, /// # origin: BlockOrigin, /// # header: B::Header, /// # justification: Option, /// # body: Option>, -/// # ) -> Result<(ImportBlock, Option)>>), String> { +/// # ) -> Result<(BlockImportParams, Option)>>), String> { /// # unimplemented!(); /// # } /// # } @@ -975,11 +974,11 @@ impl offchain::AuthorityKeyProvider for AuthorityKeyProvider { /// LightService = LightComponents /// { |config| >::new(config) }, /// FullImportQueue = BasicQueue -/// { |_, client, _| Ok(BasicQueue::new(Arc::new(MyVerifier), Box::new(client), None, None)) }, +/// { |_, client, _, _| Ok(BasicQueue::new(MyVerifier, Box::new(client), None, None)) }, /// LightImportQueue = BasicQueue /// { |_, client| { /// let fprb = Box::new(DummyFinalityProofRequestBuilder::default()) as Box<_>; -/// Ok((BasicQueue::new(Arc::new(MyVerifier), Box::new(client), None, None), fprb)) +/// Ok((BasicQueue::new(MyVerifier, Box::new(client), None, None), fprb)) /// }}, /// SelectChain = LongestChain, Self::Block> /// { |config: &FactoryFullConfiguration, client: Arc>| { @@ -1068,9 +1067,10 @@ macro_rules! construct_service_factory { fn build_full_import_queue( config: &mut $crate::FactoryFullConfiguration, client: $crate::Arc<$crate::FullClient>, - select_chain: Self::SelectChain + select_chain: Self::SelectChain, + transaction_pool: Option>>, ) -> $crate::Result { - ( $( $full_import_queue_init )* ) (config, client, select_chain) + ( $( $full_import_queue_init )* ) (config, client, select_chain, transaction_pool) } fn build_light_import_queue( @@ -1109,7 +1109,7 @@ macro_rules! construct_service_factory { mod tests { use super::*; use consensus_common::SelectChain; - use runtime_primitives::traits::BlindCheckable; + use sr_primitives::traits::BlindCheckable; use substrate_test_runtime_client::{prelude::*, runtime::{Extrinsic, Transfer}}; #[test] diff --git a/core/service/test/Cargo.toml b/core/service/test/Cargo.toml index 38cdd042d6b22cd6cfce80027547c46ef83bcd10..aa3dddfc1851e77580fad547ee561d404c0c65d1 100644 --- a/core/service/test/Cargo.toml +++ b/core/service/test/Cargo.toml @@ -14,6 +14,6 @@ fdlimit = "0.1" service = { package = "substrate-service", path = "../../../core/service" } network = { package = "substrate-network", path = "../../../core/network" } consensus = { package = "substrate-consensus-common", path = "../../../core/consensus/common" } -primitives = { package = "substrate-primitives", path = "../../../core/primitives" } client = { package = "substrate-client", path = "../../../core/client" } sr-primitives = { path = "../../../core/sr-primitives" } +primitives = { package = "substrate-primitives", path = "../../../core/primitives" } diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index adfee10029a021efe687d73bc8b852856bf4aa78..1b3c43dae74bbfd446e64f5470b9c4b271d06064 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -37,7 +37,7 @@ use service::{ use network::{multiaddr, Multiaddr}; use network::config::{NetworkConfiguration, TransportConfig, NodeKeyConfig, Secret, NonReservedPeerMode}; use sr_primitives::generic::BlockId; -use consensus::{ImportBlock, BlockImport}; +use consensus::{BlockImportParams, BlockImport}; /// Maximum duration of single wait call. const MAX_WAIT_TIME: Duration = Duration::from_secs(60 * 3); @@ -73,9 +73,9 @@ impl From for SyncService { } } -impl> Future for SyncService { +impl> Future for SyncService { type Item = (); - type Error = (); + type Error = service::Error; fn poll(&mut self) -> Poll { self.0.lock().unwrap().poll() @@ -135,10 +135,6 @@ fn node_config ( ) -> FactoryFullConfiguration { let root = root.path().join(format!("node-{}", index)); - let mut keys = Vec::new(); - if let Some(seed) = key_seed { - keys.push(seed); - } let config_path = Some(String::from(root.join("network").to_str().unwrap())); let net_config_path = config_path.clone(); @@ -173,13 +169,13 @@ fn node_config ( roles: role, transaction_pool: Default::default(), network: network_config, - keystore_path: Some(root.join("key")), + keystore_path: root.join("key"), + keystore_password: None, database_path: root.join("db"), database_cache_size: None, state_cache_size: 16777216, state_cache_child_ratio: None, pruning: Default::default(), - keys: keys, chain_spec: (*spec).clone(), custom: Default::default(), name: format!("Node {}", index), @@ -194,14 +190,13 @@ fn node_config ( offchain_worker: false, force_authoring: false, disable_grandpa: false, - grandpa_voter: false, - password: "".to_string().into(), + dev_key_seed: key_seed, } } impl TestNet where - F::FullService: Future, - F::LightService: Future + F::FullService: Future, + F::LightService: Future, { fn new( temp: &TempDir, @@ -244,7 +239,7 @@ impl TestNet where let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); let service = SyncService::from(F::new_full(node_config).expect("Error creating test node service")); - executor.spawn(service.clone()); + executor.spawn(service.clone().map_err(|_| ())); let addr = addr.with(multiaddr::Protocol::P2p(service.get().network().local_peer_id().into())); ((index + nodes), service, addr) })); @@ -255,7 +250,7 @@ impl TestNet where let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); let service = SyncService::from(F::new_full(node_config).expect("Error creating test node service")); - executor.spawn(service.clone()); + executor.spawn(service.clone().map_err(|_| ())); let addr = addr.with(multiaddr::Protocol::P2p(service.get().network().local_peer_id().into())); (index, service, addr) })); @@ -266,7 +261,7 @@ impl TestNet where let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); let service = SyncService::from(F::new_light(node_config).expect("Error creating test node service")); - executor.spawn(service.clone()); + executor.spawn(service.clone().map_err(|_| ())); let addr = addr.with(multiaddr::Protocol::P2p(service.get().network().local_peer_id().into())); (index, service, addr) })); @@ -277,8 +272,8 @@ impl TestNet where } pub fn connectivity(spec: FactoryChainSpec) where - F::FullService: Future, - F::LightService: Future, + F::FullService: Future, + F::LightService: Future, { const NUM_FULL_NODES: usize = 5; const NUM_LIGHT_NODES: usize = 5; @@ -352,13 +347,14 @@ pub fn connectivity(spec: FactoryChainSpec) where pub fn sync(spec: FactoryChainSpec, mut block_factory: B, mut extrinsic_factory: E) where F: ServiceFactory, - F::FullService: Future, - F::LightService: Future, - B: FnMut(&SyncService) -> ImportBlock, + F::FullService: Future, + F::LightService: Future, + B: FnMut(&SyncService) -> BlockImportParams, E: FnMut(&SyncService) -> FactoryExtrinsic, { const NUM_FULL_NODES: usize = 10; - const NUM_LIGHT_NODES: usize = 10; + // FIXME: BABE light client support is currently not working. + const NUM_LIGHT_NODES: usize = 0; const NUM_BLOCKS: usize = 512; let temp = TempDir::new("substrate-sync-test").expect("Error creating test dir"); let mut network = TestNet::::new( @@ -410,8 +406,8 @@ pub fn sync(spec: FactoryChainSpec, mut block_factory: B, mut extrin pub fn consensus(spec: FactoryChainSpec, authorities: Vec) where F: ServiceFactory, - F::FullService: Future, - F::LightService: Future, + F::FullService: Future, + F::LightService: Future, { const NUM_FULL_NODES: usize = 10; const NUM_LIGHT_NODES: usize = 0; diff --git a/core/session/Cargo.toml b/core/session/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..5d8cb3f0001ba597feebf73a5f1489c0e1303346 --- /dev/null +++ b/core/session/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "substrate-session" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +client = { package = "substrate-client", path = "../client", default-features = false } +rstd = { package = "sr-std", path = "../sr-std", default-features = false } +sr-primitives = { path = "../sr-primitives", optional = true } +primitives = { package = "substrate-primitives", path = "../primitives", optional = true } + +[features] +default = [ "std" ] +std = [ "client/std", "rstd/std", "sr-primitives", "primitives" ] diff --git a/core/session/src/lib.rs b/core/session/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..1b40d2d9ba815a6485f2e5012d6cf10567649dc8 --- /dev/null +++ b/core/session/src/lib.rs @@ -0,0 +1,67 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Substrate core types around sessions. + +#![cfg_attr(not(feature = "std"), no_std)] + +use rstd::vec::Vec; + +#[cfg(feature = "std")] +use sr_primitives::traits::{ProvideRuntimeApi, Block as BlockT}; +#[cfg(feature = "std")] +use primitives::{H256, Blake2Hasher}; + +client::decl_runtime_apis! { + /// Session keys runtime api. + pub trait SessionKeys { + /// Generate a set of session keys with optionally using the given seed. + /// The keys should be stored within the keystore exposed via runtime + /// externalities. + /// + /// The seed needs to be a valid `utf8` string. + /// + /// Returns the concatenated SCALE encoded public keys. + fn generate_session_keys(seed: Option>) -> Vec; + } +} + +/// Generate the initial session keys with the given seeds and store them in +/// the client's keystore. +#[cfg(feature = "std")] +pub fn generate_initial_session_keys( + client: std::sync::Arc>, + seeds: Vec, +) -> Result<(), client::error::Error> +where + B: client::backend::Backend, + E: client::CallExecutor, + Block: BlockT, + client::Client: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: SessionKeys, +{ + let info = client.info().chain; + let runtime_api = client.runtime_api(); + + for seed in seeds { + runtime_api.generate_session_keys( + &sr_primitives::generic::BlockId::Number(info.best_number), + Some(seed.as_bytes().to_vec()), + )?; + } + + Ok(()) +} diff --git a/core/sr-api-macros/Cargo.toml b/core/sr-api-macros/Cargo.toml index c9a91e74914cab57a7c721b42b94a6530cd337f2..3301b2fdc7ab3d6f505f477ce86d5401a736be5b 100644 --- a/core/sr-api-macros/Cargo.toml +++ b/core/sr-api-macros/Cargo.toml @@ -18,12 +18,12 @@ proc-macro-crate = "0.1.3" client = { package = "substrate-client", path = "../client" } test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } +sr-primitives = { path = "../sr-primitives" } sr-version = { path = "../sr-version" } -substrate-primitives = { path = "../primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } criterion = "0.2" consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } -codec = { package = "parity-codec", version = "4.1.1" } +codec = { package = "parity-scale-codec", version = "1.0.0" } trybuild = "1.0" [[bench]] diff --git a/core/sr-api-macros/benches/bench.rs b/core/sr-api-macros/benches/bench.rs index 054f73c3d4fbf841c6b6e70729e57b6407050979..9aba38c2d1820dd26a3fa885a6251f79e82832de 100644 --- a/core/sr-api-macros/benches/bench.rs +++ b/core/sr-api-macros/benches/bench.rs @@ -19,7 +19,7 @@ use test_client::{ DefaultTestClientBuilderExt, TestClientBuilder, TestClientBuilderExt, runtime::TestAPI, }; -use runtime_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; +use sr_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; use state_machine::ExecutionStrategy; fn sr_api_benchmark(c: &mut Criterion) { diff --git a/core/sr-api-macros/src/decl_runtime_apis.rs b/core/sr-api-macros/src/decl_runtime_apis.rs index c2501220b6193641467d4a0f081199dabed54d56..27f102740b83b650aa6affb84d17d50ee8f6b0ec 100644 --- a/core/sr-api-macros/src/decl_runtime_apis.rs +++ b/core/sr-api-macros/src/decl_runtime_apis.rs @@ -192,7 +192,7 @@ fn generate_native_call_generators(decl: &ItemTrait) -> Result { { ::decode( &mut &#crate_::runtime_api::Encode::encode(input)[..] - ).ok_or_else(|| error_desc) + ).map_err(|_| error_desc) } )); @@ -682,9 +682,9 @@ impl<'a> ToClientSideDecl<'a> { }, #crate_::runtime_api::NativeOrEncoded::Encoded(r) => { <#ret_type as #crate_::runtime_api::Decode>::decode(&mut &r[..]) - .ok_or_else(|| + .map_err(|err| #crate_::error::Error::CallResultDecode( - #function_name + #function_name, err ).into() ) } diff --git a/core/sr-api-macros/src/impl_runtime_apis.rs b/core/sr-api-macros/src/impl_runtime_apis.rs index 530405068a13d197161d86e750860431709a46a6..973fa0558a85cd1eaf29fe450b27142c9c28fd26 100644 --- a/core/sr-api-macros/src/impl_runtime_apis.rs +++ b/core/sr-api-macros/src/impl_runtime_apis.rs @@ -77,8 +77,8 @@ fn generate_impl_call( quote!( #( let #pnames : #ptypes = match #c_iter::runtime_api::Decode::decode(&mut #input) { - Some(input) => input, - None => panic!("Bad input data provided to {}", #fn_name_str), + Ok(input) => input, + Err(e) => panic!("Bad input data provided to {}: {}", #fn_name_str, e.what()), }; )* diff --git a/core/sr-api-macros/src/lib.rs b/core/sr-api-macros/src/lib.rs index 1a315f44ddd5d37e40f82e66da2fd5a121543d4a..d88fb09d1b11a2b15807b4a58ee43339126b1a41 100644 --- a/core/sr-api-macros/src/lib.rs +++ b/core/sr-api-macros/src/lib.rs @@ -50,10 +50,10 @@ mod utils; /// /// use version::create_runtime_str; /// # extern crate test_client; -/// # extern crate runtime_primitives; -/// # extern crate substrate_primitives; +/// # extern crate sr_primitives; +/// # extern crate primitives; /// # -/// # use runtime_primitives::traits::GetNodeBlockType; +/// # use sr_primitives::traits::GetNodeBlockType; /// # use test_client::runtime::{Block, Header}; /// # /// # /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` diff --git a/core/sr-api-macros/tests/decl_and_impl.rs b/core/sr-api-macros/tests/decl_and_impl.rs index ba7ef23b99c983c16e9850da0c8317887aa2e181..36091d1f85062e6c693e0780383d0d9680b1d258 100644 --- a/core/sr-api-macros/tests/decl_and_impl.rs +++ b/core/sr-api-macros/tests/decl_and_impl.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use runtime_primitives::traits::{GetNodeBlockType, Block as BlockT}; -use runtime_primitives::generic::BlockId; +use sr_primitives::traits::{GetNodeBlockType, Block as BlockT}; +use sr_primitives::generic::BlockId; use client::runtime_api::{self, RuntimeApiInfo}; use client::{error::Result, decl_runtime_apis, impl_runtime_apis}; use test_client::runtime::Block; diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index 6fa155437b83371ce29abe52b2f97c1ffd7631a8..6b79e52ee21d01e46c71c8dabe8e53f722ce4353 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -16,9 +16,10 @@ use test_client::{ prelude::*, + DefaultTestClientBuilderExt, TestClientBuilder, runtime::{TestAPI, DecodeFails, Transfer, Header}, }; -use runtime_primitives::{ +use sr_primitives::{ generic::BlockId, traits::{ProvideRuntimeApi, Header as HeaderT, Hash as HashT}, }; @@ -104,7 +105,7 @@ fn calling_with_both_strategy_and_fail_on_native_should_work() { #[test] -fn calling_with_native_else_wasm_and_faild_on_wasm_should_work() { +fn calling_with_native_else_wasm_and_fail_on_wasm_should_work() { let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeElseWasm).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); @@ -189,5 +190,6 @@ fn record_proof_works() { &executor, "Core_execute_block", &block.encode(), + None, ).expect("Executes block while using the proof backend"); } diff --git a/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs b/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs index 27aa60c624e63be142bcc5fbe0cb9ddfcbe1dcc5..127236200517f801b2789d4071c50c083aca0dc2 100644 --- a/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs +++ b/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::decl_runtime_apis; diff --git a/core/sr-api-macros/tests/ui/declaring_old_block.rs b/core/sr-api-macros/tests/ui/declaring_old_block.rs index 6b7f380ef208a31ff0af5f6f0d7d4e9e485856bd..78d35579fae0c5554f36821839cfa28d71505d3b 100644 --- a/core/sr-api-macros/tests/ui/declaring_old_block.rs +++ b/core/sr-api-macros/tests/ui/declaring_old_block.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; use client::decl_runtime_apis; decl_runtime_apis! { diff --git a/core/sr-api-macros/tests/ui/declaring_old_block.stderr b/core/sr-api-macros/tests/ui/declaring_old_block.stderr index 2ab1cc675d109e146d766ea7f355e9cc16a54213..181aa2a3ca7834eebc40cbb0b6b6f83a7380dcbc 100644 --- a/core/sr-api-macros/tests/ui/declaring_old_block.stderr +++ b/core/sr-api-macros/tests/ui/declaring_old_block.stderr @@ -10,10 +10,10 @@ error: `Block: BlockT` generic parameter will be added automatically by the `dec 5 | pub trait Api { | ^^^^^^ -warning: unused import: `runtime_primitives::traits::Block as BlockT` +warning: unused import: `sr_primitives::traits::Block as BlockT` --> $DIR/declaring_old_block.rs:1:5 | -1 | use runtime_primitives::traits::Block as BlockT; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +1 | use sr_primitives::traits::Block as BlockT; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: #[warn(unused_imports)] on by default diff --git a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs index 1371295cc0ebb89f55ecc70d489502c807336b4b..d63eadc1e4b735107b1a5125af4f061248d98b72 100644 --- a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs +++ b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::Block as BlockT; +use sr_primitives::traits::Block as BlockT; use client::decl_runtime_apis; decl_runtime_apis! { diff --git a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr index cf5fe0f53ff5af3425e9bb7da29767808f2ac9a3..a591d0448c50d7c03bc48b46fe071ea4c6b13ccd 100644 --- a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr +++ b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr @@ -4,10 +4,10 @@ error: `Block: BlockT` generic parameter will be added automatically by the `dec 5 | pub trait Api { | ^^^^^^ -warning: unused import: `runtime_primitives::traits::Block as BlockT` +warning: unused import: `sr_primitives::traits::Block as BlockT` --> $DIR/declaring_own_block_with_different_name.rs:1:5 | -1 | use runtime_primitives::traits::Block as BlockT; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +1 | use sr_primitives::traits::Block as BlockT; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: #[warn(unused_imports)] on by default diff --git a/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs index 4cf56bf54bdd1d601bf20df6fc2c37a594e334c5..c9c334f6fdcb5647b7dc43c93718a35f1452729d 100644 --- a/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs +++ b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs index 91ffdd798ad0499783ac21320ad6a19227adbd3e..774d017c190e926e1a4e4d55e6ab9aa6ab46214e 100644 --- a/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs +++ b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs index 0871b0ff3398eeb80c82fccdbc4534a6c3c36f3c..acca97a73df5bd2464fb736c733d84116b07c994 100644 --- a/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs +++ b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs index eafe53e23b875e5728a22b4f9fa20c743206aab1..99755144f755690feb7b7cc9195b2ffb5567dbb6 100644 --- a/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs +++ b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-api-macros/tests/ui/missing_path_for_trait.rs b/core/sr-api-macros/tests/ui/missing_path_for_trait.rs index cbf339e73bd3b3b9adcc58b1f233cd1995c75469..f6f6e3dfb3c432156e4ef2d7232e21124ee8514d 100644 --- a/core/sr-api-macros/tests/ui/missing_path_for_trait.rs +++ b/core/sr-api-macros/tests/ui/missing_path_for_trait.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs index 014b7bd1e84f51e63298314c35024cab83d98e0c..0e7dc56951647264d532ee41c4a917883e9f5b22 100644 --- a/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs +++ b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs @@ -1,4 +1,4 @@ -use runtime_primitives::traits::GetNodeBlockType; +use sr_primitives::traits::GetNodeBlockType; use test_client::runtime::Block; use client::{decl_runtime_apis, impl_runtime_apis}; diff --git a/core/sr-io/Cargo.toml b/core/sr-io/Cargo.toml index 0172d3ac75783509e8e3b41038b974a04bbd4e88..0e6fba5bd73d2c960244c30e9da5e07b5c50dc9e 100644 --- a/core/sr-io/Cargo.toml +++ b/core/sr-io/Cargo.toml @@ -11,8 +11,8 @@ rustc_version = "0.2" [dependencies] rstd = { package = "sr-std", path = "../sr-std", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } -codec = { package = "parity-codec", version = "4.1.1", default-features = false } -hash-db = { version = "0.14.0", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } +hash-db = { version = "0.15.0", default-features = false } libsecp256k1 = { version = "0.2.1", optional = true } tiny-keccak = { version = "1.4.2", optional = true } environmental = { version = "1.0.1", optional = true } diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 826b6964ca65fb003bcc347596c1c2401669ab74..e9c673254d49c6320e6ea6f90e8a7c11f37ddd59 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -33,11 +33,11 @@ use rstd::vec::Vec; pub use codec; pub use primitives::Blake2Hasher; -use primitives::offchain::{ - Timestamp, - HttpRequestId, HttpRequestStatus, HttpError, - CryptoKind, CryptoKeyId, - StorageKind, +use primitives::{ + crypto::KeyTypeId, ed25519, sr25519, + offchain::{ + Timestamp, HttpRequestId, HttpRequestStatus, HttpError, StorageKind, OpaqueNetworkState, + }, }; /// Error verifying ECDSA signature @@ -74,7 +74,7 @@ macro_rules! export_api { $( #[$attr:meta] )* fn $name:ident $(< $( $g_name:ident $( : $g_ty:path )? ),+ >)? - ( $( $arg:ident : $arg_ty:ty ),* ) + ( $( $arg:ident : $arg_ty:ty ),* $(,)? ) $( -> $ret:ty )? $( where $( $w_name:path : $w_ty:path ),+ )?; )* @@ -109,16 +109,18 @@ export_api! { /// Get `key` from child storage and return a `Vec`, empty if there's a problem. fn child_storage(storage_key: &[u8], key: &[u8]) -> Option>; - /// Get `key` from storage, placing the value into `value_out` (as much of it as possible) and return - /// the number of bytes that the entry in storage had beyond the offset or None if the storage entry - /// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned - /// number of bytes is not equal to the number of bytes written to the `value_out`. + /// Get `key` from storage, placing the value into `value_out` and return the number of + /// bytes that the entry in storage has beyond the offset or `None` if the storage entry + /// doesn't exist at all. + /// If `value_out` length is smaller than the returned length, only `value_out` length bytes + /// are copied into `value_out`. fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option; - /// Get `key` from child storage, placing the value into `value_out` (as much of it as possible) and return - /// the number of bytes that the entry in storage had beyond the offset or None if the storage entry - /// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned - /// number of bytes is not equal to the number of bytes written to the `value_out`. + /// Get `key` from child storage, placing the value into `value_out` and return the number + /// of bytes that the entry in storage has beyond the offset or `None` if the storage entry + /// doesn't exist at all. + /// If `value_out` length is smaller than the returned length, only `value_out` length bytes + /// are copied into `value_out`. fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option; /// Set the storage of some particular key to Some value. @@ -145,6 +147,9 @@ export_api! { /// Clear the storage entries with a key that starts with the given prefix. fn clear_prefix(prefix: &[u8]); + /// Clear the child storage entries with a key that starts with the given prefix. + fn clear_child_prefix(storage_key: &[u8], prefix: &[u8]); + /// "Commit" all existing operations and compute the resultant storage root. fn storage_root() -> [u8; 32]; @@ -154,15 +159,6 @@ export_api! { /// "Commit" all existing operations and get the resultant storage change root. fn storage_changes_root(parent_hash: [u8; 32]) -> Option<[u8; 32]>; - /// A trie root formed from the enumerated items. - /// TODO [#2382] remove (just use `ordered_trie_root` (NOTE currently not implemented for without_std)) - fn enumerated_trie_root(input: &[&[u8]]) -> H::Out - where - H: Hasher, - H: self::imp::HasherBounds, - H::Out: Ord - ; - /// A trie root formed from the iterated items. fn trie_root(input: I) -> H::Out where @@ -203,11 +199,45 @@ export_api! { export_api! { pub(crate) trait CryptoApi { - /// Verify a ed25519 signature. - fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool; + /// Returns all ed25519 public keys for the given key id from the keystore. + fn ed25519_public_keys(id: KeyTypeId) -> Vec; + /// Generate an ed22519 key for the given key type and store it in the keystore. + /// + /// Returns the raw public key. + fn ed25519_generate(id: KeyTypeId, seed: Option<&str>) -> ed25519::Public; + /// Sign the given `msg` with the ed25519 key that corresponds to the given public key and + /// key type in the keystore. + /// + /// Returns the raw signature. + fn ed25519_sign>( + id: KeyTypeId, + pubkey: &ed25519::Public, + msg: &M, + ) -> Option; + /// Verify an ed25519 signature. + /// + /// Returns `true` when the verification in successful. + fn ed25519_verify(sig: &ed25519::Signature, msg: &[u8], pubkey: &ed25519::Public) -> bool; + /// Returns all sr25519 public keys for the given key id from the keystore. + fn sr25519_public_keys(id: KeyTypeId) -> Vec; + /// Generate an sr22519 key for the given key type and store it in the keystore. + /// + /// Returns the raw public key. + fn sr25519_generate(id: KeyTypeId, seed: Option<&str>) -> sr25519::Public; + /// Sign the given `msg` with the sr25519 key that corresponds to the given public key and + /// key type in the keystore. + /// + /// Returns the raw signature. + fn sr25519_sign>( + id: KeyTypeId, + pubkey: &sr25519::Public, + msg: &M, + ) -> Option; /// Verify an sr25519 signature. - fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool; + /// + /// Returns `true` when the verification in successful. + fn sr25519_verify(sig: &sr25519::Signature, msg: &[u8], pubkey: &sr25519::Public) -> bool; /// Verify and recover a SECP256k1 ECDSA signature. /// - `sig` is passed in RSV format. V should be either 0/1 or 27/28. @@ -240,48 +270,18 @@ export_api! { export_api! { pub(crate) trait OffchainApi { + /// Returns if the local node is a potential validator. + /// + /// Even if this function returns `true`, it does not mean that any keys are configured + /// and that the validator is registered in the chain. + fn is_validator() -> bool; /// Submit transaction to the pool. /// /// The transaction will end up in the pool. fn submit_transaction(data: &T) -> Result<(), ()>; - /// Create new key(pair) for signing/encryption/decryption. - /// - /// Returns an error if given crypto kind is not supported. - fn new_crypto_key(crypto: CryptoKind) -> Result; - - /// Encrypt a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key. - /// - /// Returns an error if `key` is not available or does not exist. - fn encrypt(key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; - - /// Decrypt a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key. - /// - /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist. - fn decrypt(key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; - - /// Sign a piece of data using given crypto key. - /// - /// If `key` is `None`, it will attempt to use current authority key. - /// - /// Returns an error if `key` is not available or does not exist. - fn sign(key: Option, kind: CryptoKind, data: &[u8]) -> Result, ()>; - - /// Verifies that `signature` for `msg` matches given `key`. - /// - /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. - /// Returns an error in case the key is not available or does not exist or the parameters - /// lengths are incorrect. - fn verify( - key: Option, - kind: CryptoKind, - msg: &[u8], - signature: &[u8] - ) -> Result; + /// Returns information about the local node's network state. + fn network_state() -> Result; /// Returns current UNIX timestamp (in millis) fn timestamp() -> Timestamp; @@ -310,7 +310,12 @@ export_api! { /// /// Note this storage is not part of the consensus, it's only accessible by /// offchain worker tasks running on the same machine. It IS persisted between runs. - fn local_storage_compare_and_set(kind: StorageKind, key: &[u8], old_value: &[u8], new_value: &[u8]) -> bool; + fn local_storage_compare_and_set( + kind: StorageKind, + key: &[u8], + old_value: Option<&[u8]>, + new_value: &[u8] + ) -> bool; /// Gets a value from the local storage. /// @@ -319,9 +324,9 @@ export_api! { /// offchain worker tasks running on the same machine. It IS persisted between runs. fn local_storage_get(kind: StorageKind, key: &[u8]) -> Option>; - /// Initiaties a http request given HTTP verb and the URL. + /// Initiates a http request given HTTP verb and the URL. /// - /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. + /// Meta is a future-reserved field containing additional, parity-scale-codec encoded parameters. /// Returns the id of newly started request. fn http_request_start( method: &str, @@ -401,7 +406,7 @@ mod imp { #[cfg(feature = "std")] pub use self::imp::{ - StorageOverlay, ChildrenStorageOverlay, with_storage, with_storage_and_children, + StorageOverlay, ChildrenStorageOverlay, with_storage, with_externalities }; #[cfg(not(feature = "std"))] diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 8e6c9b533c132d541e361ee997f880af549c29bd..60ca6688d2e1ab4ec5547ccecf5433b712542182 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -15,23 +15,19 @@ // along with Substrate. If not, see . use primitives::{ - blake2_128, blake2_256, twox_128, twox_256, twox_64, ed25519, Blake2Hasher, - sr25519, Pair + blake2_128, blake2_256, twox_128, twox_256, twox_64, ed25519, Blake2Hasher, sr25519, Pair, }; // Switch to this after PoC-3 // pub use primitives::BlakeHasher; pub use substrate_state_machine::{ - Externalities, - BasicExternalities, - TestExternalities, - ChildStorageKey + Externalities, BasicExternalities, TestExternalities, ChildStorageKey, }; use environmental::environmental; use primitives::{offchain, hexdisplay::HexDisplay, H256}; +use trie::{TrieConfiguration, trie_types::Layout}; -#[cfg(feature = "std")] -use std::collections::HashMap; +use std::{collections::HashMap, convert::TryFrom}; environmental!(ext: trait Externalities); @@ -145,6 +141,13 @@ impl StorageApi for () { ); } + fn clear_child_prefix(storage_key: &[u8], prefix: &[u8]) { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.clear_child_prefix(storage_key, prefix) + }); + } + fn storage_root() -> [u8; 32] { ext::with(|ext| ext.storage_root() @@ -164,14 +167,6 @@ impl StorageApi for () { ).unwrap_or(Ok(None)).expect("Invalid parent hash passed to storage_changes_root") } - fn enumerated_trie_root(input: &[&[u8]]) -> H::Out - where - H: Hasher, - H::Out: Ord, - { - trie::ordered_trie_root::(input.iter()) - } - fn trie_root(input: I) -> H::Out where I: IntoIterator, @@ -180,7 +175,7 @@ impl StorageApi for () { H: Hasher, H::Out: Ord, { - trie::trie_root::(input) + Layout::::trie_root(input) } fn ordered_trie_root(input: I) -> H::Out @@ -190,7 +185,7 @@ impl StorageApi for () { H: Hasher, H::Out: Ord, { - trie::ordered_trie_root::(input) + Layout::::ordered_trie_root(input) } } @@ -207,12 +202,82 @@ impl OtherApi for () { } impl CryptoApi for () { - fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - ed25519::Pair::verify_weak(sig, msg, pubkey) + fn ed25519_public_keys(id: KeyTypeId) -> Vec { + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .write() + .ed25519_public_keys(id) + }).expect("`ed25519_public_keys` cannot be called outside of an Externalities-provided environment.") } - fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - sr25519::Pair::verify_weak(sig, msg, pubkey) + fn ed25519_generate(id: KeyTypeId, seed: Option<&str>) -> ed25519::Public { + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .write() + .ed25519_generate_new(id, seed) + .expect("`ed25519_generate` failed") + }).expect("`ed25519_generate` cannot be called outside of an Externalities-provided environment.") + } + + fn ed25519_sign>( + id: KeyTypeId, + pubkey: &ed25519::Public, + msg: &M, + ) -> Option { + let pub_key = ed25519::Public::try_from(pubkey.as_ref()).ok()?; + + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .read() + .ed25519_key_pair(id, &pub_key) + .map(|k| k.sign(msg.as_ref()).into()) + }).expect("`ed25519_sign` cannot be called outside of an Externalities-provided environment.") + } + + fn ed25519_verify(sig: &ed25519::Signature, msg: &[u8], pubkey: &ed25519::Public) -> bool { + ed25519::Pair::verify(sig, msg, pubkey) + } + + fn sr25519_public_keys(id: KeyTypeId) -> Vec { + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .write() + .sr25519_public_keys(id) + }).expect("`sr25519_public_keys` cannot be called outside of an Externalities-provided environment.") + } + + fn sr25519_generate(id: KeyTypeId, seed: Option<&str>) -> sr25519::Public { + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .write() + .sr25519_generate_new(id, seed) + .expect("`sr25519_generate` failed") + }).expect("`sr25519_generate` cannot be called outside of an Externalities-provided environment.") + } + + fn sr25519_sign>( + id: KeyTypeId, + pubkey: &sr25519::Public, + msg: &M, + ) -> Option { + let pub_key = sr25519::Public::try_from(pubkey.as_ref()).ok()?; + + ext::with(|ext| { + ext.keystore() + .expect("No `keystore` associated for the current context!") + .read() + .sr25519_key_pair(id, &pub_key) + .map(|k| k.sign(msg.as_ref()).into()) + }).expect("`sr25519_sign` cannot be called outside of an Externalities-provided environment.") + } + + fn sr25519_verify(sig: &sr25519::Signature, msg: &[u8], pubkey: &sr25519::Public) -> bool { + sr25519::Pair::verify(sig, msg, pubkey) } fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { @@ -263,57 +328,22 @@ fn with_offchain(f: impl FnOnce(&mut dyn offchain::Externalities) -> R, msg: } impl OffchainApi for () { - fn submit_transaction(data: &T) -> Result<(), ()> { - with_offchain(|ext| { - ext.submit_transaction(codec::Encode::encode(data)) - }, "submit_transaction can be called only in the offchain worker context") - } - - fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { - with_offchain(|ext| { - ext.new_crypto_key(crypto) - }, "new_crypto_key can be called only in the offchain worker context") - } - - fn encrypt( - key: Option, - kind: offchain::CryptoKind, - data: &[u8], - ) -> Result, ()> { + fn is_validator() -> bool { with_offchain(|ext| { - ext.encrypt(key, kind, data) - }, "encrypt can be called only in the offchain worker context") + ext.is_validator() + }, "is_validator can be called only in the offchain worker context") } - fn decrypt( - key: Option, - kind: offchain::CryptoKind, - data: &[u8], - ) -> Result, ()> { - with_offchain(|ext| { - ext.decrypt(key, kind, data) - }, "decrypt can be called only in the offchain worker context") - } - - fn sign( - key: Option, - kind: offchain::CryptoKind, - data: &[u8], - ) -> Result, ()> { + fn submit_transaction(data: &T) -> Result<(), ()> { with_offchain(|ext| { - ext.sign(key, kind, data) - }, "sign can be called only in the offchain worker context") + ext.submit_transaction(codec::Encode::encode(data)) + }, "submit_transaction can be called only in the offchain worker context") } - fn verify( - key: Option, - kind: offchain::CryptoKind, - msg: &[u8], - signature: &[u8], - ) -> Result { + fn network_state() -> Result { with_offchain(|ext| { - ext.verify(key, kind, msg, signature) - }, "verify can be called only in the offchain worker context") + ext.network_state() + }, "network_state can be called only in the offchain worker context") } fn timestamp() -> offchain::Timestamp { @@ -343,7 +373,7 @@ impl OffchainApi for () { fn local_storage_compare_and_set( kind: offchain::StorageKind, key: &[u8], - old_value: &[u8], + old_value: Option<&[u8]>, new_value: &[u8], ) -> bool { with_offchain(|ext| { @@ -430,36 +460,20 @@ pub type StorageOverlay = HashMap, Vec>; /// A set of key value pairs for children storage; pub type ChildrenStorageOverlay = HashMap, StorageOverlay>; -/// Execute the given closure with global functions available whose functionality routes into -/// externalities that draw from and populate `storage`. Forwards the value that the closure returns. -pub fn with_storage R>(storage: &mut StorageOverlay, f: F) -> R { - let mut alt_storage = Default::default(); - rstd::mem::swap(&mut alt_storage, storage); - let mut ext = BasicExternalities::new(alt_storage); - let r = ext::using(&mut ext, f); - *storage = ext.into_storages().0; - r -} - /// Execute the given closure with global functions available whose functionality routes into /// externalities that draw from and populate `storage` and `children_storage`. /// Forwards the value that the closure returns. -pub fn with_storage_and_children R>( - storage: &mut StorageOverlay, - children_storage: &mut ChildrenStorageOverlay, +pub fn with_storage R>( + storage: &mut (StorageOverlay, ChildrenStorageOverlay), f: F ) -> R { let mut alt_storage = Default::default(); - let mut alt_children_storage = Default::default(); rstd::mem::swap(&mut alt_storage, storage); - rstd::mem::swap(&mut alt_children_storage, children_storage); - let mut ext = BasicExternalities::new_with_children(alt_storage, alt_children_storage); + let mut ext = BasicExternalities::new(alt_storage.0, alt_storage.1); let r = ext::using(&mut ext, f); - let storage_tuple = ext.into_storages(); - *storage = storage_tuple.0; - *children_storage = storage_tuple.1; + *storage = ext.into_storages(); r } @@ -499,7 +513,7 @@ mod std_tests { true })); - t = BasicExternalities::new(map![b"foo".to_vec() => b"bar".to_vec()]); + t = BasicExternalities::new(map![b"foo".to_vec() => b"bar".to_vec()], map![]); assert!(!with_externalities(&mut t, || { assert_eq!(storage(b"hello"), None); @@ -512,7 +526,7 @@ mod std_tests { fn read_storage_works() { let mut t = BasicExternalities::new(map![ b":test".to_vec() => b"\x0b\0\0\0Hello world".to_vec() - ]); + ], map![]); with_externalities(&mut t, || { let mut v = [0u8; 4]; @@ -531,7 +545,7 @@ mod std_tests { b":abcd".to_vec() => b"\x0b\0\0\0Hello world".to_vec(), b":abc".to_vec() => b"\x0b\0\0\0Hello world".to_vec(), b":abdd".to_vec() => b"\x0b\0\0\0Hello world".to_vec() - ]); + ], map![]); with_externalities(&mut t, || { clear_prefix(b":abc"); diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 58f6dcf468c6fd1dc8009aa3b4a4a1586f61d495..5d9bc12813786c0f503cf6bb3c0cdb8d565dec13 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -21,6 +21,7 @@ pub use rstd::{mem, slice}; use core::{intrinsics, panic::PanicInfo}; use rstd::{vec::Vec, cell::Cell, convert::TryInto}; use primitives::{offchain, Blake2Hasher}; +use codec::Decode; #[cfg(not(feature = "no_panic_handler"))] #[panic_handler] @@ -127,8 +128,11 @@ pub mod ext { /// Ensures we use the right crypto when calling into native pub trait ExternTrieCrypto: Hasher { - /// Calculate enumerated trie root. - fn enumerated_trie_root(values: &[&[u8]]) -> Self::Out; + /// A trie root formed from the enumerated items. + fn ordered_trie_root< + A: AsRef<[u8]>, + I: IntoIterator + >(values: I) -> Self::Out; } /// Additional bounds for Hasher trait for without_std. @@ -137,9 +141,16 @@ pub mod ext { // Ensures we use a Blake2_256-flavored Hasher when calling into native impl ExternTrieCrypto for Blake2Hasher { - fn enumerated_trie_root(values: &[&[u8]]) -> Self::Out { - let lengths = values.iter().map(|v| (v.len() as u32).to_le()).collect::>(); - let values = values.iter().fold(Vec::new(), |mut acc, sl| { acc.extend_from_slice(sl); acc }); + fn ordered_trie_root< + A: AsRef<[u8]>, + I: IntoIterator + >(items: I) -> Self::Out { + let mut values = Vec::new(); + let mut lengths = Vec::new(); + for v in items.into_iter() { + values.extend_from_slice(v.as_ref()); + lengths.push((v.as_ref().len() as u32).to_le()); + } let mut result: [u8; 32] = Default::default(); unsafe { ext_blake2_256_enumerated_trie_root.get()( @@ -158,7 +169,7 @@ pub mod ext { ( $( $( #[$attr:meta] )* - fn $name:ident ( $( $arg:ident : $arg_ty:ty ),* ) $( -> $ret:ty )?; + fn $name:ident ( $( $arg:ident : $arg_ty:ty ),* $(,)? ) $( -> $ret:ty )?; )* ) => { $( @@ -212,6 +223,13 @@ pub mod ext { fn ext_exists_storage(key_data: *const u8, key_len: u32) -> u32; /// Remove storage entries which key starts with given prefix. fn ext_clear_prefix(prefix_data: *const u8, prefix_len: u32); + /// Remove child storage entries which key starts with given prefix. + fn ext_clear_child_prefix( + storage_key_data: *const u8, + storage_key_len: u32, + prefix_data: *const u8, + prefix_len: u32 + ); /// Gets the value of the given key from storage. /// /// The host allocates the memory for storing the value. @@ -352,31 +370,84 @@ pub mod ext { fn ext_twox_256(data: *const u8, len: u32, out: *mut u8); /// Keccak256 hash fn ext_keccak_256(data: *const u8, len: u32, out: *mut u8); - /// Note: ext_ed25519_verify returns 0 if the signature is correct, nonzero otherwise. + + /// Returns all `ed25519` public keys for the given key type from the keystore. + fn ext_ed25519_public_keys(id: *const u8, result_len: *mut u32) -> *mut u8; + + /// Note: `ext_ed25519_verify` returns `0` if the signature is correct, nonzero otherwise. fn ext_ed25519_verify( msg_data: *const u8, msg_len: u32, sig_data: *const u8, - pubkey_data: *const u8 + pubkey_data: *const u8, + ) -> u32; + + /// Generate an `ed25519` key pair for the given key type id and store the public key + /// in `out`. + fn ext_ed25519_generate(id: *const u8, seed: *const u8, seed_len: u32, out: *mut u8); + + /// Sign the given `msg` with the `ed25519` key pair that corresponds to then given key + /// type id and public key. The raw signature is stored in `out`. + /// + /// # Returns + /// + /// - `0` on success + /// - nonezero if something failed, e.g. retrieving of the key. + fn ext_ed25519_sign( + id: *const u8, + pubkey: *const u8, + msg: *const u8, + msg_len: u32, + out: *mut u8, ) -> u32; - /// Note: ext_sr25519_verify returns 0 if the signature is correct, nonzero otherwise. + + /// Returns all `sr25519` public keys for the given key type from the keystore. + fn ext_sr25519_public_keys(id: *const u8, result_len: *mut u32) -> *mut u8; + + /// Note: `ext_sr25519_verify` returns 0 if the signature is correct, nonzero otherwise. fn ext_sr25519_verify( msg_data: *const u8, msg_len: u32, sig_data: *const u8, - pubkey_data: *const u8 + pubkey_data: *const u8, ) -> u32; + + /// Generate an `sr25519` key pair for the given key type id and store the public + /// key in `out`. + fn ext_sr25519_generate(id: *const u8, seed: *const u8, seed_len: u32, out: *mut u8); + + /// Sign the given `msg` with the `sr25519` key pair that corresponds to then given key + /// type id and public key. The raw signature is stored in `out`. + /// + /// # Returns + /// + /// - `0` on success + /// - nonezero if something failed, e.g. retrieving of the key. + fn ext_sr25519_sign( + id: *const u8, + pubkey: *const u8, + msg: *const u8, + msg_len: u32, + out: *mut u8, + ) -> u32; + /// Note: ext_secp256k1_ecdsa_recover returns 0 if the signature is correct, nonzero otherwise. fn ext_secp256k1_ecdsa_recover( msg_data: *const u8, sig_data: *const u8, - pubkey_data: *mut u8 + pubkey_data: *mut u8, ) -> u32; //================================ // Offchain-worker Context //================================ + /// Returns if the local node is a potential validator. + /// + /// - `1` == `true` + /// - `0` == `false` + fn ext_is_validator() -> u32; + /// Submit transaction. /// /// # Returns @@ -385,83 +456,18 @@ pub mod ext { /// - nonzero otherwise. fn ext_submit_transaction(data: *const u8, len: u32) -> u32; - /// Create new key(pair) for signing/encryption/decryption. - /// - /// # Returns - /// - /// - A crypto key id (if the value is less than u16::max_value) - /// - `u32::max_value` in case the crypto is not supported - fn ext_new_crypto_key(crypto: u32) -> u32; - - /// Encrypt a piece of data using given crypto key. - /// - /// If `key` is `0`, it will attempt to use current authority key of given `kind`. - /// - /// # Returns - /// - /// - `0` in case the key is invalid, `msg_len` is set to `u32::max_value` - /// - Otherwise, pointer to the encrypted message in memory, - /// `msg_len` contains the length of the message. - fn ext_encrypt( - key: u32, - kind: u32, - data: *const u8, - data_len: u32, - msg_len: *mut u32 - ) -> *mut u8; - - /// Decrypt a piece of data using given crypto key. - /// - /// If `key` is `0`, it will attempt to use current authority key of given `kind`. + /// Returns information about the local node's network state. /// /// # Returns /// - /// - `0` in case the key is invalid or data couldn't be decrypted, - /// `msg_len` is set to `u32::max_value` - /// - Otherwise, pointer to the decrypted message in memory, - /// `msg_len` contains the length of the message. - fn ext_decrypt( - key: u32, - kind: u32, - data: *const u8, - data_len: u32, - msg_len: *mut u32 - ) -> *mut u8; - - /// Sign a piece of data using given crypto key. - /// - /// If `key` is `0`, it will attempt to use current authority key of given `kind`. - /// - /// # Returns + /// The encoded `Result`. + /// `written_out` contains the length of the message. /// - /// - `0` in case the key is invalid, - /// `sig_data_len` is set to `u32::max_value` - /// - Otherwise, pointer to the signature in memory, - /// `sig_data_len` contains the length of the signature. - fn ext_sign( - key: u32, - kind: u32, - data: *const u8, - data_len: u32, - sig_data_len: *mut u32 - ) -> *mut u8; - - /// Verifies that `signature` for `msg` matches given `key`. - /// - /// If `key` is `0`, it will attempt to use current authority key of given `kind`. - /// - /// # Returns - /// - `0` in case the signature is correct - /// - `1` in case it doesn't match the key - /// - `u32::max_value` if the key is invalid. - fn ext_verify( - key: u32, - kind: u32, - msg: *const u8, - msg_len: u32, - signature: *const u8, - signature_len: u32 - ) -> u32; + /// The ownership of the returned buffer is transferred to the runtime + /// code and the runtime is responsible for freeing it. This is always + /// a properly allocated pointer (which cannot be NULL), hence the + /// runtime code can always rely on it. + fn ext_network_state(written_out: *mut u32) -> *mut u8; /// Returns current UNIX timestamp (milliseconds) fn ext_timestamp() -> u64; @@ -504,9 +510,9 @@ pub mod ext { /// - Otherwise, pointer to the value in memory. `value_len` contains the length of the value. fn ext_local_storage_get(kind: u32, key: *const u8, key_len: u32, value_len: *mut u32) -> *mut u8; - /// Initiaties a http request. + /// Initiates a http request. /// - /// `meta` is parity-codec encoded additional parameters to the request (like redirection policy, + /// `meta` is parity-scale-codec encoded additional parameters to the request (like redirection policy, /// timeouts, certificates policy, etc). The format is not yet specified and the field is currently /// only reserved for future use. /// @@ -573,7 +579,7 @@ pub mod ext { /// /// # Returns /// - /// - A pointer to parity-codec encoded vector of pairs `(HeaderKey, HeaderValue)`. + /// - A pointer to parity-scale-codec encoded vector of pairs `(HeaderKey, HeaderValue)`. /// - In case invalid `id` is passed it returns a pointer to parity-encoded empty vector. fn ext_http_response_headers( id: u32, @@ -720,6 +726,15 @@ impl StorageApi for () { } } + fn clear_child_prefix(storage_key: &[u8], prefix: &[u8]) { + unsafe { + ext_clear_child_prefix.get()( + storage_key.as_ptr(), storage_key.len() as u32, + prefix.as_ptr(), prefix.len() as u32 + ); + } + } + fn kill_child_storage(storage_key: &[u8]) { unsafe { ext_kill_child_storage.get()( @@ -762,10 +777,6 @@ impl StorageApi for () { } } - fn enumerated_trie_root(values: &[&[u8]]) -> H::Out { - H::enumerated_trie_root(values) - } - fn trie_root< H: Hasher + ExternTrieCrypto, I: IntoIterator, @@ -779,8 +790,8 @@ impl StorageApi for () { H: Hasher + ExternTrieCrypto, I: IntoIterator, A: AsRef<[u8]> - >(_input: I) -> H::Out { - unimplemented!() + >(values: I) -> H::Out { + H::ordered_trie_root(values) } } @@ -848,15 +859,105 @@ impl HashingApi for () { } impl CryptoApi for () { - fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + fn ed25519_public_keys(id: KeyTypeId) -> Vec { + let mut res_len = 0u32; + unsafe { + let res_ptr = ext_ed25519_public_keys.get()(id.0.as_ptr(), &mut res_len); + Vec::decode(&mut rstd::slice::from_raw_parts(res_ptr, res_len as usize)).unwrap_or_default() + } + } + + fn ed25519_generate(id: KeyTypeId, seed: Option<&str>) -> ed25519::Public { + let mut res = [0u8; 32]; + let seed = seed.as_ref().map(|s| s.as_bytes()).unwrap_or(&[]); + unsafe { + ext_ed25519_generate.get()(id.0.as_ptr(), seed.as_ptr(), seed.len() as u32, res.as_mut_ptr()) + }; + ed25519::Public(res) + } + + fn ed25519_sign>( + id: KeyTypeId, + pubkey: &ed25519::Public, + msg: &M, + ) -> Option { + let mut res = [0u8; 64]; + let success = unsafe { + ext_ed25519_sign.get()( + id.0.as_ptr(), + pubkey.0.as_ptr(), + msg.as_ref().as_ptr(), + msg.as_ref().len() as u32, + res.as_mut_ptr(), + ) == 0 + }; + + if success { + Some(ed25519::Signature(res)) + } else { + None + } + } + + fn ed25519_verify(sig: &ed25519::Signature, msg: &[u8], pubkey: &ed25519::Public) -> bool { unsafe { - ext_ed25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + ext_ed25519_verify.get()( + msg.as_ptr(), + msg.len() as u32, + sig.0.as_ptr(), + pubkey.0.as_ptr(), + ) == 0 } } - fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + fn sr25519_public_keys(id: KeyTypeId) -> Vec { + let mut res_len = 0u32; unsafe { - ext_sr25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + let res_ptr = ext_sr25519_public_keys.get()(id.0.as_ptr(), &mut res_len); + Vec::decode(&mut rstd::slice::from_raw_parts(res_ptr, res_len as usize)).unwrap_or_default() + } + } + + fn sr25519_generate(id: KeyTypeId, seed: Option<&str>) -> sr25519::Public { + let mut res = [0u8;32]; + let seed = seed.as_ref().map(|s| s.as_bytes()).unwrap_or(&[]); + unsafe { + ext_sr25519_generate.get()(id.0.as_ptr(), seed.as_ptr(), seed.len() as u32, res.as_mut_ptr()) + }; + sr25519::Public(res) + } + + fn sr25519_sign>( + id: KeyTypeId, + pubkey: &sr25519::Public, + msg: &M, + ) -> Option { + let mut res = [0u8; 64]; + let success = unsafe { + ext_sr25519_sign.get()( + id.0.as_ptr(), + pubkey.0.as_ptr(), + msg.as_ref().as_ptr(), + msg.as_ref().len() as u32, + res.as_mut_ptr(), + ) == 0 + }; + + if success { + Some(sr25519::Signature(res)) + } else { + None + } + } + + fn sr25519_verify(sig: &sr25519::Signature, msg: &[u8], pubkey: &sr25519::Public) -> bool { + unsafe { + ext_sr25519_verify.get()( + msg.as_ptr(), + msg.len() as u32, + sig.0.as_ptr(), + pubkey.0.as_ptr(), + ) == 0 } } @@ -875,6 +976,10 @@ impl CryptoApi for () { } impl OffchainApi for () { + fn is_validator() -> bool { + unsafe { ext_is_validator.get()() == 1 } + } + fn submit_transaction(data: &T) -> Result<(), ()> { let encoded_data = codec::Encode::encode(data); let ret = unsafe { @@ -888,87 +993,17 @@ impl OffchainApi for () { } } - fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { - let crypto = crypto.into(); - let ret = unsafe { - ext_new_crypto_key.get()(crypto) - }; - - if ret > u16::max_value() as u32 { - Err(()) - } else { - Ok(offchain::CryptoKeyId(ret as u16)) - } - } - - fn encrypt( - key: Option, - kind: offchain::CryptoKind, - data: &[u8], - ) -> Result, ()> { - let key = key.map(Into::into).unwrap_or(0); - let kind = kind.into(); - let mut len = 0_u32; - unsafe { - let ptr = ext_encrypt.get()(key, kind, data.as_ptr(), data.len() as u32, &mut len); - - from_raw_parts(ptr, len).ok_or(()) - } - } - - fn decrypt( - key: Option, - kind: offchain::CryptoKind, - data: &[u8], - ) -> Result, ()> { - let key = key.map(Into::into).unwrap_or(0); - let kind = kind.into(); + fn network_state() -> Result { let mut len = 0_u32; - unsafe { - let ptr = ext_decrypt.get()(key, kind, data.as_ptr(), data.len() as u32, &mut len); - - from_raw_parts(ptr, len).ok_or(()) - } - } - - fn sign( - key: Option, - kind: offchain::CryptoKind, - data: &[u8], - ) -> Result, ()> { - let key = key.map(Into::into).unwrap_or(0); - let kind = kind.into(); - let mut len = 0_u32; - unsafe { - let ptr = ext_sign.get()(key, kind, data.as_ptr(), data.len() as u32, &mut len); - - from_raw_parts(ptr, len).ok_or(()) - } - } + let raw_result = unsafe { + let ptr = ext_network_state.get()(&mut len); - fn verify( - key: Option, - kind: offchain::CryptoKind, - msg: &[u8], - signature: &[u8], - ) -> Result { - let key = key.map(Into::into).unwrap_or(0); - let kind = kind.into(); - let val = unsafe { - ext_verify.get()( - key, - kind, - msg.as_ptr(), - msg.len() as u32, - signature.as_ptr(), - signature.len() as u32, - ) + from_raw_parts(ptr, len) }; - match val { - 0 => Ok(true), - 1 => Ok(false), - _ => Err(()), + match raw_result { + Some(raw_result) => codec::Decode::decode(&mut &*raw_result).unwrap_or(Err(())), + None => Err(()) } } @@ -1004,14 +1039,27 @@ impl OffchainApi for () { } } - fn local_storage_compare_and_set(kind: offchain::StorageKind, key: &[u8], old_value: &[u8], new_value: &[u8]) -> bool { + fn local_storage_compare_and_set( + kind: offchain::StorageKind, + key: &[u8], + old_value: Option<&[u8]>, + new_value: &[u8], + ) -> bool { + let (ptr, len) = match old_value { + Some(old_value) => ( + old_value.as_ptr(), + old_value.len() as u32, + ), + None => (0 as *const u8, u32::max_value()), + }; + unsafe { ext_local_storage_compare_and_set.get()( kind.into(), key.as_ptr(), key.len() as u32, - old_value.as_ptr(), - old_value.len() as u32, + ptr, + len, new_value.as_ptr(), new_value.len() as u32, ) == 0 diff --git a/core/sr-primitives/Cargo.toml b/core/sr-primitives/Cargo.toml index a5399eb5f73ba9d3229c39bcd3875d8db756b251..d3510e6baa8340a5ed89d09534de7cfa43b61746 100644 --- a/core/sr-primitives/Cargo.toml +++ b/core/sr-primitives/Cargo.toml @@ -8,16 +8,18 @@ edition = "2018" num-traits = { version = "0.2", default-features = false } integer-sqrt = { version = "0.1.2" } serde = { version = "1.0", optional = true, features = ["derive"] } -codec = { package = "parity-codec", version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../application-crypto", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } log = { version = "0.4", optional = true } paste = { version = "0.1"} +rand = { version = "0.7.0", optional = true } [dev-dependencies] serde_json = "1.0" -primitive-types = "0.4" +primitive-types = "0.5.0" [features] default = ["std"] @@ -28,5 +30,7 @@ std = [ "rstd/std", "runtime_io/std", "codec/std", - "substrate-primitives/std", + "primitives/std", + "app-crypto/std", + "rand", ] diff --git a/core/sr-primitives/src/generic/block.rs b/core/sr-primitives/src/generic/block.rs index f0f3c88fe7ea2f937fba51572f35a29094c7146d..736ad0cbbb6368199ce4fa046c253bdddf66f0a3 100644 --- a/core/sr-primitives/src/generic/block.rs +++ b/core/sr-primitives/src/generic/block.rs @@ -20,7 +20,7 @@ use std::fmt; #[cfg(feature = "std")] -use serde::Serialize; +use serde::{Deserialize, Serialize}; use rstd::prelude::*; use crate::codec::{Codec, Encode, Decode}; @@ -62,7 +62,7 @@ impl fmt::Display for BlockId { /// Abstraction over a substrate block. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Block { @@ -97,7 +97,7 @@ where /// Abstraction over a substrate block and justification. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct SignedBlock { diff --git a/core/sr-primitives/src/generic/checked_extrinsic.rs b/core/sr-primitives/src/generic/checked_extrinsic.rs index ee43b3af2e951ef78e63ff396d22edd3c0a5f2ea..08d7b10386721764ca2bad5cf627961b723a6b6a 100644 --- a/core/sr-primitives/src/generic/checked_extrinsic.rs +++ b/core/sr-primitives/src/generic/checked_extrinsic.rs @@ -17,50 +17,84 @@ //! Generic implementation of an extrinsic that has passed the verification //! stage. -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay}; -use crate::weights::{Weighable, Weight}; +use rstd::result::Result; +use crate::traits::{ + self, Member, MaybeDisplay, SignedExtension, DispatchError, Dispatchable, DispatchResult, + ValidateUnsigned +}; +use crate::weights::{GetDispatchInfo, DispatchInfo}; +use crate::transaction_validity::TransactionValidity; /// Definition of something that the external world might want to say; its /// existence implies that it has been checked and is good, particularly with /// regards to the signature. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct CheckedExtrinsic { +pub struct CheckedExtrinsic { /// Who this purports to be from and the number of extrinsics have come before /// from the same signer, if anyone (note this is not a signature). - pub signed: Option<(AccountId, Index)>, + pub signed: Option<(AccountId, Extra)>, + /// The function that should be called. pub function: Call, } -impl traits::Applyable for CheckedExtrinsic +impl traits::Applyable +for + CheckedExtrinsic where AccountId: Member + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, + Call: Member + Dispatchable, + Extra: SignedExtension, + Origin: From>, { - type Index = Index; type AccountId = AccountId; type Call = Call; - fn index(&self) -> Option<&Self::Index> { - self.signed.as_ref().map(|x| &x.1) - } - fn sender(&self) -> Option<&Self::AccountId> { self.signed.as_ref().map(|x| &x.0) } - fn deconstruct(self) -> (Self::Call, Option) { - (self.function, self.signed.map(|x| x.0)) + fn validate>(&self, + info: DispatchInfo, + len: usize, + ) -> TransactionValidity { + if let Some((ref id, ref extra)) = self.signed { + Extra::validate(extra, id, &self.function, info, len).into() + } else { + match Extra::validate_unsigned(&self.function, info, len) { + Ok(extra) => match U::validate_unsigned(&self.function) { + TransactionValidity::Valid(v) => + TransactionValidity::Valid(v.combine_with(extra)), + x => x, + }, + x => x.into(), + } + } + } + + fn dispatch(self, + info: DispatchInfo, + len: usize, + ) -> Result { + let (maybe_who, pre) = if let Some((id, extra)) = self.signed { + let pre = Extra::pre_dispatch(extra, &id, &self.function, info, len)?; + (Some(id), pre) + } else { + let pre = Extra::pre_dispatch_unsigned(&self.function, info, len)?; + (None, pre) + }; + let res = self.function.dispatch(Origin::from(maybe_who)); + Extra::post_dispatch(pre, info, len); + Ok(res) } } -impl Weighable for CheckedExtrinsic +impl GetDispatchInfo for CheckedExtrinsic where - Call: Weighable, + Call: GetDispatchInfo, { - fn weight(&self, len: usize) -> Weight { - self.function.weight(len) + fn get_dispatch_info(&self) -> DispatchInfo { + self.function.get_dispatch_info() } } diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index 5edb370e50c4e14e651512be20c2defe824a89d8..d2974444e231b48a270c6c3d715408fe7b213639 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -17,16 +17,16 @@ //! Generic implementation of a digest. #[cfg(feature = "std")] -use serde::Serialize; +use serde::{Deserialize, Serialize}; use rstd::prelude::*; use crate::ConsensusEngineId; -use crate::codec::{Decode, Encode, Input}; +use crate::codec::{Decode, Encode, Input, Error}; /// Generic header digest. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct Digest { /// A list of logs in the digest. pub logs: Vec>, @@ -102,14 +102,25 @@ pub enum DigestItem { } #[cfg(feature = "std")] -impl ::serde::Serialize for DigestItem { - fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { +impl serde::Serialize for DigestItem { + fn serialize(&self, seq: S) -> Result where S: serde::Serializer { self.using_encoded(|bytes| { - ::substrate_primitives::bytes::serialize(bytes, seq) + primitives::bytes::serialize(bytes, seq) }) } } +#[cfg(feature = "std")] +impl<'a, Hash: Decode> serde::Deserialize<'a> for DigestItem { + fn deserialize(de: D) -> Result where + D: serde::Deserializer<'a>, + { + let r = primitives::bytes::deserialize(de)?; + Decode::decode(&mut &r[..]) + .map_err(|e| serde::de::Error::custom(format!("Decode error: {}", e))) + } +} + /// A 'referencing view' for digest item. Does not own its contents. Used by /// final runtime implementations for encoding/decoding its log items. #[derive(PartialEq, Eq, Clone)] @@ -221,27 +232,29 @@ impl Encode for DigestItem { } } +impl codec::EncodeLike for DigestItem {} + impl Decode for DigestItem { #[allow(deprecated)] - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> Result { let item_type: DigestItemType = Decode::decode(input)?; match item_type { - DigestItemType::ChangesTrieRoot => Some(DigestItem::ChangesTrieRoot( + DigestItemType::ChangesTrieRoot => Ok(DigestItem::ChangesTrieRoot( Decode::decode(input)?, )), DigestItemType::PreRuntime => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; - Some(DigestItem::PreRuntime(vals.0, vals.1)) + Ok(DigestItem::PreRuntime(vals.0, vals.1)) }, DigestItemType::Consensus => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; - Some(DigestItem::Consensus(vals.0, vals.1)) + Ok(DigestItem::Consensus(vals.0, vals.1)) } DigestItemType::Seal => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; - Some(DigestItem::Seal(vals.0, vals.1)) + Ok(DigestItem::Seal(vals.0, vals.1)) }, - DigestItemType::Other => Some(DigestItem::Other( + DigestItemType::Other => Ok(DigestItem::Other( Decode::decode(input)?, )), } @@ -305,7 +318,7 @@ impl<'a, Hash> DigestItemRef<'a, Hash> { /// Try to match this digest item to the given opaque item identifier; if it matches, then /// try to cast to the given datatype; if that works, return it. pub fn try_to(&self, id: OpaqueDigestItemId) -> Option { - self.try_as_raw(id).and_then(|mut x| Decode::decode(&mut x)) + self.try_as_raw(id).and_then(|mut x| Decode::decode(&mut x).ok()) } } @@ -340,6 +353,8 @@ impl<'a, Hash: Encode> Encode for DigestItemRef<'a, Hash> { } } +impl<'a, Hash: Encode> codec::EncodeLike for DigestItemRef<'a, Hash> {} + #[cfg(test)] mod tests { use super::*; diff --git a/core/sr-primitives/src/generic/era.rs b/core/sr-primitives/src/generic/era.rs index c41d3eedfc24ecb7c64906ce67778618e87faad8..7308a8adc5cd5d97a43adfc10869008be7c8285b 100644 --- a/core/sr-primitives/src/generic/era.rs +++ b/core/sr-primitives/src/generic/era.rs @@ -19,7 +19,7 @@ #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; -use crate::codec::{Decode, Encode, Input, Output}; +use crate::codec::{Decode, Encode, Input, Output, Error}; /// Era period pub type Period = u64; @@ -111,20 +111,22 @@ impl Encode for Era { } } +impl codec::EncodeLike for Era {} + impl Decode for Era { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> Result { let first = input.read_byte()?; if first == 0 { - Some(Era::Immortal) + Ok(Era::Immortal) } else { let encoded = first as u64 + ((input.read_byte()? as u64) << 8); let period = 2 << (encoded % (1 << 4)); let quantize_factor = (period >> 12).max(1); let phase = (encoded >> 4) * quantize_factor; if period >= 4 && phase < period { - Some(Era::Mortal(period, phase)) + Ok(Era::Mortal(period, phase)) } else { - None + Err("Invalid period and phase".into()) } } } diff --git a/core/sr-primitives/src/generic/header.rs b/core/sr-primitives/src/generic/header.rs index 887aedc81807deae1a8913b95a5d6db8941d6fe0..e9a8405fe21b0a45d62f9bcc341b14ee1712982b 100644 --- a/core/sr-primitives/src/generic/header.rs +++ b/core/sr-primitives/src/generic/header.rs @@ -17,51 +17,62 @@ //! Generic implementation of a block header. #[cfg(feature = "std")] -use serde::Serialize; +use serde::{Deserialize, Serialize}; #[cfg(feature = "std")] use log::debug; -use crate::codec::{Decode, Encode, Codec, Input, Output, HasCompact, EncodeAsRef}; +use crate::codec::{Decode, Encode, Codec, Input, Output, HasCompact, EncodeAsRef, Error}; use crate::traits::{ self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, Hash as HashT, MaybeSerializeDebug, MaybeSerializeDebugButNotDeserialize }; use crate::generic::Digest; +use primitives::U256; +use core::convert::TryFrom; /// Abstraction over a block header for a substrate chain. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header, Hash: HashT> { +pub struct Header + TryFrom, Hash: HashT> { /// The parent hash. - pub parent_hash: ::Output, + pub parent_hash: Hash::Output, /// The block number. - #[cfg_attr(feature = "std", serde(serialize_with = "serialize_number"))] + #[cfg_attr(feature = "std", serde( + serialize_with = "serialize_number", + deserialize_with = "deserialize_number"))] pub number: Number, /// The state trie merkle root - pub state_root: ::Output, + pub state_root: Hash::Output, /// The merkle root of the extrinsics. - pub extrinsics_root: ::Output, + pub extrinsics_root: Hash::Output, /// A chain-specific digest of data useful for light clients or referencing auxiliary data. - pub digest: Digest<::Output>, + pub digest: Digest, } #[cfg(feature = "std")] -pub fn serialize_number>(val: &T, s: S) -> Result where S: ::serde::Serializer { - use substrate_primitives::uint::U256; - let v: u128 = (*val).into(); - let lower = U256::from(v as u64); - let upper = U256::from(v.rotate_left(64) as u64) << 64; - ::serde::Serialize::serialize(&(upper + lower), s) +pub fn serialize_number + TryFrom>( + val: &T, s: S, +) -> Result where S: serde::Serializer { + let u256: U256 = (*val).into(); + serde::Serialize::serialize(&u256, s) +} + +#[cfg(feature = "std")] +pub fn deserialize_number<'a, D, T: Copy + Into + TryFrom>( + d: D, +) -> Result where D: serde::Deserializer<'a> { + let u256: U256 = serde::Deserialize::deserialize(d)?; + TryFrom::try_from(u256).map_err(|_| serde::de::Error::custom("Try from failed")) } impl Decode for Header where - Number: HasCompact + Copy + Into, + Number: HasCompact + Copy + Into + TryFrom, Hash: HashT, Hash::Output: Decode, { - fn decode(input: &mut I) -> Option { - Some(Header { + fn decode(input: &mut I) -> Result { + Ok(Header { parent_hash: Decode::decode(input)?, number: <::Type>::decode(input)?.into(), state_root: Decode::decode(input)?, @@ -72,7 +83,7 @@ impl Decode for Header where } impl Encode for Header where - Number: HasCompact + Copy + Into, + Number: HasCompact + Copy + Into + TryFrom, Hash: HashT, Hash::Output: Encode, { @@ -85,10 +96,18 @@ impl Encode for Header where } } +impl codec::EncodeLike for Header where + Number: HasCompact + Copy + Into + TryFrom, + Hash: HashT, + Hash::Output: Encode, +{} + impl traits::Header for Header where - Number: Member + MaybeSerializeDebug + ::rstd::hash::Hash + MaybeDisplay + SimpleArithmetic + Codec + Copy + Into, + Number: Member + MaybeSerializeDebug + rstd::hash::Hash + MaybeDisplay + + SimpleArithmetic + Codec + Copy + Into + TryFrom, Hash: HashT, - Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeSerializeDebugButNotDeserialize + MaybeDisplay + SimpleBitOps + Codec, + Hash::Output: Default + rstd::hash::Hash + Copy + Member + + MaybeSerializeDebugButNotDeserialize + MaybeDisplay + SimpleBitOps + Codec, { type Number = Number; type Hash = ::Output; @@ -135,9 +154,9 @@ impl traits::Header for Header where } impl Header where - Number: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec + Into, + Number: Member + rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec + Into + TryFrom, Hash: HashT, - Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, + Hash::Output: Default + rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, { /// Convenience helper for computing the hash of the header without having /// to import the trait. @@ -155,7 +174,7 @@ mod tests { fn serialize(num: u128) -> String { let mut v = vec![]; { - let mut ser = ::serde_json::Serializer::new(::std::io::Cursor::new(&mut v)); + let mut ser = serde_json::Serializer::new(std::io::Cursor::new(&mut v)); serialize_number(&num, &mut ser).unwrap(); } String::from_utf8(v).unwrap() @@ -167,4 +186,16 @@ mod tests { assert_eq!(serialize(u64::max_value() as u128 + 1), "\"0x10000000000000000\"".to_owned()); } + #[test] + fn should_deserialize_number() { + fn deserialize(num: &str) -> u128 { + let mut der = serde_json::Deserializer::new(serde_json::de::StrRead::new(num)); + deserialize_number(&mut der).unwrap() + } + + assert_eq!(deserialize("\"0x0\""), 0); + assert_eq!(deserialize("\"0x1\""), 1); + assert_eq!(deserialize("\"0xffffffffffffffff\""), u64::max_value() as u128); + assert_eq!(deserialize("\"0x10000000000000000\""), u64::max_value() as u128 + 1); + } } diff --git a/core/sr-primitives/src/generic/mod.rs b/core/sr-primitives/src/generic/mod.rs index a4e4106780efcf4c58926a9cc5c5f8a05438268c..1511753d2c5241981e7910c618fa76d18cea5062 100644 --- a/core/sr-primitives/src/generic/mod.rs +++ b/core/sr-primitives/src/generic/mod.rs @@ -19,8 +19,6 @@ // end::description[] mod unchecked_extrinsic; -mod unchecked_mortal_extrinsic; -mod unchecked_mortal_compact_extrinsic; mod era; mod checked_extrinsic; mod header; @@ -30,8 +28,6 @@ mod digest; mod tests; pub use self::unchecked_extrinsic::UncheckedExtrinsic; -pub use self::unchecked_mortal_extrinsic::UncheckedMortalExtrinsic; -pub use self::unchecked_mortal_compact_extrinsic::UncheckedMortalCompactExtrinsic; pub use self::era::{Era, Phase}; pub use self::checked_extrinsic::CheckedExtrinsic; pub use self::header::Header; diff --git a/core/sr-primitives/src/generic/tests.rs b/core/sr-primitives/src/generic/tests.rs index fe2ec2fe56ea5b530df16bb59186f2972f9a408e..67e85da374533f67ae3f004ae88497e675e3ab8c 100644 --- a/core/sr-primitives/src/generic/tests.rs +++ b/core/sr-primitives/src/generic/tests.rs @@ -17,7 +17,7 @@ //! Tests for the generic implementations of Extrinsic/Header/Block. use crate::codec::{Decode, Encode}; -use substrate_primitives::H256; +use primitives::H256; use super::DigestItem; #[test] diff --git a/core/sr-primitives/src/generic/unchecked_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_extrinsic.rs index d11561a4158362950570dab855f6fcbfae57ff07..f570548969c365b1fd4360cdc65cc0248a5c2b28 100644 --- a/core/sr-primitives/src/generic/unchecked_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_extrinsic.rs @@ -20,49 +20,40 @@ use std::fmt; use rstd::prelude::*; -use crate::codec::{Decode, Encode, Codec, Input, HasCompact}; -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, Lookup, Extrinsic}; -use crate::PrimitiveError; +use runtime_io::blake2_256; +use crate::codec::{Decode, Encode, Input, Error}; +use crate::traits::{self, Member, MaybeDisplay, SignedExtension, Checkable, Extrinsic}; use super::CheckedExtrinsic; -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -pub struct SignatureContent -where - Address: Codec, - Index: HasCompact + Codec, - Signature: Codec, -{ - signed: Address, - signature: Signature, - index: Index, -} +const TRANSACTION_VERSION: u8 = 3; /// A extrinsic right from the external world. This is unchecked and so /// can contain a signature. #[derive(PartialEq, Eq, Clone)] -pub struct UncheckedExtrinsic +pub struct UncheckedExtrinsic where - Address: Codec, - Index: HasCompact + Codec, - Signature: Codec, + Extra: SignedExtension { - /// The signature, address and number of extrinsics have come before from - /// the same signer, if this is a signed extrinsic. - pub signature: Option>, + /// The signature, address, number of extrinsics have come before from + /// the same signer and an era describing the longevity of this transaction, + /// if this is a signed extrinsic. + pub signature: Option<(Address, Signature, Extra)>, /// The function that should be called. pub function: Call, } -impl UncheckedExtrinsic -where - Address: Codec, - Index: HasCompact + Codec, - Signature: Codec, +impl + UncheckedExtrinsic { /// New instance of a signed extrinsic aka "transaction". - pub fn new_signed(index: Index, function: Call, signed: Address, signature: Signature) -> Self { + pub fn new_signed( + function: Call, + signed: Address, + signature: Signature, + extra: Extra + ) -> Self { UncheckedExtrinsic { - signature: Some(SignatureContent{signed, signature, index}), + signature: Some((signed, signature, extra)), function, } } @@ -76,30 +67,53 @@ where } } -impl traits::Checkable - for UncheckedExtrinsic +impl Extrinsic + for UncheckedExtrinsic +{ + type Call = Call; + + fn is_signed(&self) -> Option { + Some(self.signature.is_some()) + } + + fn new_unsigned(function: Call) -> Option { + Some(UncheckedExtrinsic::new_unsigned(function)) + } +} + +impl + Checkable +for + UncheckedExtrinsic where - Address: Member + MaybeDisplay + Codec, - Index: Member + MaybeDisplay + SimpleArithmetic + Codec, + Address: Member + MaybeDisplay, Call: Encode + Member, - Signature: Member + traits::Verify + Codec, + Signature: Member + traits::Verify, + Extra: SignedExtension, AccountId: Member + MaybeDisplay, - Context: Lookup + Lookup: traits::Lookup { - type Checked = CheckedExtrinsic; + type Checked = CheckedExtrinsic; type Error = PrimitiveError; - fn check(self, context: &Context) -> Result { + fn check(self, lookup: &Lookup) -> Result { Ok(match self.signature { - Some(SignatureContent{signed, signature, index}) => { - let payload = (index, self.function); - let signed = context.lookup(signed)?; - if !crate::verify_encoded_lazy(&signature, &payload, &signed) { + Some((signed, signature, extra)) => { + let additional_signed = extra.additional_signed()?; + let raw_payload = (self.function, extra, additional_signed); + let signed = lookup.lookup(signed)?; + if !raw_payload.using_encoded(|payload| { + if payload.len() > 256 { + signature.verify(&blake2_256(payload)[..], &signed) + } else { + signature.verify(payload, &signed) + } + }) { return Err(PrimitiveError::BadSignature) } CheckedExtrinsic { - signed: Some((signed, payload.0)), - function: payload.1, + signed: Some((signed, raw_payload.1)), + function: raw_payload.0, } } None => CheckedExtrinsic { @@ -110,91 +124,200 @@ where } } -impl< - Address: Codec, - Index: HasCompact + Codec, - Signature: Codec, - Call, -> Extrinsic for UncheckedExtrinsic { - fn is_signed(&self) -> Option { - Some(self.signature.is_some()) - } -} - -impl Decode - for UncheckedExtrinsic +impl Decode + for UncheckedExtrinsic +where + Address: Decode, + Signature: Decode, + Call: Decode, + Extra: SignedExtension, { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> Result { // This is a little more complicated than usual since the binary format must be compatible // with substrate's generic `Vec` type. Basically this just means accepting that there // will be a prefix of vector length (we don't need // to use this). let _length_do_not_remove_me_see_above: Vec<()> = Decode::decode(input)?; - Some(UncheckedExtrinsic { - signature: Decode::decode(input)?, + let version = input.read_byte()?; + + let is_signed = version & 0b1000_0000 != 0; + let version = version & 0b0111_1111; + if version != TRANSACTION_VERSION { + return Err("Invalid transaction version".into()); + } + + Ok(UncheckedExtrinsic { + signature: if is_signed { Some(Decode::decode(input)?) } else { None }, function: Decode::decode(input)?, }) } } -impl Encode - for UncheckedExtrinsic +impl Encode + for UncheckedExtrinsic +where + Address: Encode, + Signature: Encode, + Call: Encode, + Extra: SignedExtension, { fn encode(&self) -> Vec { super::encode_with_vec_prefix::(|v| { - self.signature.encode_to(v); + // 1 byte version id. + match self.signature.as_ref() { + Some(s) => { + v.push(TRANSACTION_VERSION | 0b1000_0000); + s.encode_to(v); + } + None => { + v.push(TRANSACTION_VERSION & 0b0111_1111); + } + } self.function.encode_to(v); }) } } #[cfg(feature = "std")] -impl serde::Serialize - for UncheckedExtrinsic +impl serde::Serialize + for UncheckedExtrinsic { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { - self.using_encoded(|bytes| ::substrate_primitives::bytes::serialize(bytes, seq)) + self.using_encoded(|bytes| seq.serialize_bytes(bytes)) } } #[cfg(feature = "std")] -impl fmt::Debug - for UncheckedExtrinsic +impl fmt::Debug + for UncheckedExtrinsic where - Address: fmt::Debug + Codec, - Index: fmt::Debug + HasCompact + Codec, - Signature: Codec, + Address: fmt::Debug, Call: fmt::Debug, + Extra: SignedExtension, { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedExtrinsic({:?}, {:?})", self.signature.as_ref().map(|x| (&x.signed, &x.index)), self.function) + write!(f, "UncheckedExtrinsic({:?}, {:?})", self.signature.as_ref().map(|x| (&x.0, &x.2)), self.function) } } #[cfg(test)] -mod test { - use crate::codec::{Decode, Encode}; - use super::UncheckedExtrinsic; +mod tests { + use super::*; + use runtime_io::blake2_256; + use crate::codec::{Encode, Decode}; + use crate::traits::{SignedExtension, Lookup}; + use serde::{Serialize, Deserialize}; + + struct TestContext; + impl Lookup for TestContext { + type Source = u64; + type Target = u64; + fn lookup(&self, s: u64) -> Result { Ok(s) } + } + + #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize, Encode, Decode)] + struct TestSig(u64, Vec); + impl traits::Verify for TestSig { + type Signer = u64; + fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { + *signer == self.0 && msg.get() == &self.1[..] + } + } + + type TestAccountId = u64; + type TestCall = Vec; + + const TEST_ACCOUNT: TestAccountId = 0; + + // NOTE: this is demonstration. One can simply use `()` for testing. + #[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, Ord, PartialOrd)] + struct TestExtra; + impl SignedExtension for TestExtra { + type AccountId = u64; + type Call = (); + type AdditionalSigned = (); + type Pre = (); + + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } + } + + type Ex = UncheckedExtrinsic; + type CEx = CheckedExtrinsic; #[test] - fn encoding_matches_vec() { - type Extrinsic = UncheckedExtrinsic; - let ex = Extrinsic::new_unsigned(42); - let encoded = ex.encode(); - let decoded = Extrinsic::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(decoded, ex); - let as_vec: Vec = Decode::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(as_vec.encode(), encoded); + fn unsigned_codec_should_work() { + let ux = Ex::new_unsigned(vec![0u8; 0]); + let encoded = ux.encode(); + assert_eq!(Ex::decode(&mut &encoded[..]), Ok(ux)); + } + + #[test] + fn signed_codec_should_work() { + let ux = Ex::new_signed( + vec![0u8; 0], + TEST_ACCOUNT, + TestSig(TEST_ACCOUNT, (vec![0u8; 0], TestExtra).encode()), + TestExtra + ); + let encoded = ux.encode(); + assert_eq!(Ex::decode(&mut &encoded[..]), Ok(ux)); } + #[test] + fn large_signed_codec_should_work() { + let ux = Ex::new_signed( + vec![0u8; 0], + TEST_ACCOUNT, + TestSig(TEST_ACCOUNT, (vec![0u8; 257], TestExtra) + .using_encoded(blake2_256)[..].to_owned()), + TestExtra + ); + let encoded = ux.encode(); + assert_eq!(Ex::decode(&mut &encoded[..]), Ok(ux)); + } + + #[test] + fn unsigned_check_should_work() { + let ux = Ex::new_unsigned(vec![0u8; 0]); + assert!(!ux.is_signed().unwrap_or(false)); + assert!(>::check(ux, &TestContext).is_ok()); + } #[test] - #[cfg(feature = "std")] - fn serialization_of_unchecked_extrinsics() { - type Extrinsic = UncheckedExtrinsic; - let ex = Extrinsic::new_unsigned(42); + fn badly_signed_check_should_fail() { + let ux = Ex::new_signed( + vec![0u8; 0], + TEST_ACCOUNT, + TestSig(TEST_ACCOUNT, vec![0u8; 0]), + TestExtra + ); + assert!(ux.is_signed().unwrap_or(false)); + assert_eq!(>::check(ux, &TestContext), Err(crate::BAD_SIGNATURE)); + } - assert_eq!(serde_json::to_string(&ex).unwrap(), "\"0x14002a000000\""); + #[test] + fn signed_check_should_work() { + let ux = Ex::new_signed( + vec![0u8; 0], + TEST_ACCOUNT, + TestSig(TEST_ACCOUNT, (vec![0u8; 0], TestExtra).encode()), + TestExtra + ); + assert!(ux.is_signed().unwrap_or(false)); + assert_eq!( + >::check(ux, &TestContext), + Ok(CEx { signed: Some((TEST_ACCOUNT, TestExtra)), function: vec![0u8; 0] }) + ); + } + + #[test] + fn encoding_matches_vec() { + let ex = Ex::new_unsigned(vec![0u8; 0]); + let encoded = ex.encode(); + let decoded = Ex::decode(&mut encoded.as_slice()).unwrap(); + assert_eq!(decoded, ex); + let as_vec: Vec = Decode::decode(&mut encoded.as_slice()).unwrap(); + assert_eq!(as_vec.encode(), encoded); } } diff --git a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs deleted file mode 100644 index 2cd52b386662aba8c65996270c21b6da85ade25a..0000000000000000000000000000000000000000 --- a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Generic implementation of an unchecked (pre-verification) extrinsic. - -#[cfg(feature = "std")] -use std::fmt; - -use rstd::prelude::*; -use runtime_io::blake2_256; -use crate::codec::{Decode, Encode, Input, Compact}; -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, - Lookup, Checkable, Extrinsic, SaturatedConversion}; -use crate::PrimitiveError; -use super::{CheckedExtrinsic, Era}; - -const TRANSACTION_VERSION: u8 = 1; - -/// A extrinsic right from the external world. This is unchecked and so -/// can contain a signature. -#[derive(PartialEq, Eq, Clone)] -pub struct UncheckedMortalCompactExtrinsic { - /// The signature, address, number of extrinsics have come before from - /// the same signer and an era describing the longevity of this transaction, - /// if this is a signed extrinsic. - pub signature: Option<(Address, Signature, Compact, Era)>, - /// The function that should be called. - pub function: Call, -} - -impl UncheckedMortalCompactExtrinsic { - /// New instance of a signed extrinsic aka "transaction". - pub fn new_signed(index: Index, function: Call, signed: Address, signature: Signature, era: Era) -> Self { - UncheckedMortalCompactExtrinsic { - signature: Some((signed, signature, index.into(), era)), - function, - } - } - - /// New instance of an unsigned extrinsic aka "inherent". - pub fn new_unsigned(function: Call) -> Self { - UncheckedMortalCompactExtrinsic { - signature: None, - function, - } - } -} - -impl Extrinsic for UncheckedMortalCompactExtrinsic { - fn is_signed(&self) -> Option { - Some(self.signature.is_some()) - } -} - -impl Checkable - for UncheckedMortalCompactExtrinsic -where - Address: Member + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Compact: Encode, - Call: Encode + Member, - Signature: Member + traits::Verify, - AccountId: Member + MaybeDisplay, - BlockNumber: SimpleArithmetic, - Hash: Encode, - Context: Lookup - + CurrentHeight - + BlockNumberToHash, -{ - type Checked = CheckedExtrinsic; - type Error = PrimitiveError; - - fn check(self, context: &Context) -> Result { - Ok(match self.signature { - Some((signed, signature, index, era)) => { - let current_u64 = context.current_height().saturated_into::(); - let h = context.block_number_to_hash(era.birth(current_u64).saturated_into()) - .ok_or("transaction birth block ancient")?; - let signed = context.lookup(signed)?; - let raw_payload = (index, self.function, era, h); - if !raw_payload.using_encoded(|payload| { - if payload.len() > 256 { - signature.verify(&blake2_256(payload)[..], &signed) - } else { - signature.verify(payload, &signed) - } - }) { - return Err(PrimitiveError::BadSignature) - } - CheckedExtrinsic { - signed: Some((signed, (raw_payload.0).0)), - function: raw_payload.1, - } - } - None => CheckedExtrinsic { - signed: None, - function: self.function, - }, - }) - } -} - -impl Decode - for UncheckedMortalCompactExtrinsic -where - Address: Decode, - Signature: Decode, - Compact: Decode, - Call: Decode, -{ - fn decode(input: &mut I) -> Option { - // This is a little more complicated than usual since the binary format must be compatible - // with substrate's generic `Vec` type. Basically this just means accepting that there - // will be a prefix of vector length (we don't need - // to use this). - let _length_do_not_remove_me_see_above: Vec<()> = Decode::decode(input)?; - - let version = input.read_byte()?; - - let is_signed = version & 0b1000_0000 != 0; - let version = version & 0b0111_1111; - if version != TRANSACTION_VERSION { - return None - } - - Some(UncheckedMortalCompactExtrinsic { - signature: if is_signed { Some(Decode::decode(input)?) } else { None }, - function: Decode::decode(input)?, - }) - } -} - -impl Encode - for UncheckedMortalCompactExtrinsic -where - Address: Encode, - Signature: Encode, - Compact: Encode, - Call: Encode, -{ - fn encode(&self) -> Vec { - super::encode_with_vec_prefix::(|v| { - // 1 byte version id. - match self.signature.as_ref() { - Some(s) => { - v.push(TRANSACTION_VERSION | 0b1000_0000); - s.encode_to(v); - } - None => { - v.push(TRANSACTION_VERSION & 0b0111_1111); - } - } - self.function.encode_to(v); - }) - } -} - -#[cfg(feature = "std")] -impl serde::Serialize - for UncheckedMortalCompactExtrinsic - where Compact: Encode -{ - fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { - self.using_encoded(|bytes| seq.serialize_bytes(bytes)) - } -} - -#[cfg(feature = "std")] -impl fmt::Debug for UncheckedMortalCompactExtrinsic where - Address: fmt::Debug, - Index: fmt::Debug, - Call: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedMortalCompactExtrinsic({:?}, {:?})", self.signature.as_ref().map(|x| (&x.0, &x.2)), self.function) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::blake2_256; - use crate::codec::{Encode, Decode}; - use serde::{Serialize, Deserialize}; - - struct TestContext; - impl Lookup for TestContext { - type Source = u64; - type Target = u64; - type Error = &'static str; - fn lookup(&self, s: u64) -> Result { Ok(s) } - } - impl CurrentHeight for TestContext { - type BlockNumber = u64; - fn current_height(&self) -> u64 { 42 } - } - impl BlockNumberToHash for TestContext { - type BlockNumber = u64; - type Hash = u64; - fn block_number_to_hash(&self, n: u64) -> Option { Some(n) } - } - - #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize, Encode, Decode)] - struct TestSig(u64, Vec); - impl traits::Verify for TestSig { - type Signer = u64; - fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { - *signer == self.0 && msg.get() == &self.1[..] - } - } - - const DUMMY_ACCOUNTID: u64 = 0; - - type Ex = UncheckedMortalCompactExtrinsic, TestSig>; - type CEx = CheckedExtrinsic>; - - #[test] - fn unsigned_codec_should_work() { - let ux = Ex::new_unsigned(vec![0u8;0]); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn signed_codec_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::immortal(), 0u64).encode()), Era::immortal()); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn large_signed_codec_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8; 257], Era::immortal(), 0u64).using_encoded(blake2_256)[..].to_owned()), Era::immortal()); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn unsigned_check_should_work() { - let ux = Ex::new_unsigned(vec![0u8;0]); - assert!(!ux.is_signed().unwrap_or(false)); - assert!(>::check(ux, &TestContext).is_ok()); - } - - #[test] - fn badly_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, vec![0u8]), Era::immortal()); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(PrimitiveError::BadSignature)); - } - - #[test] - fn immortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (Compact::from(DUMMY_ACCOUNTID), vec![0u8;0], Era::immortal(), 0u64).encode()), Era::immortal()); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn mortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (Compact::from(DUMMY_ACCOUNTID), vec![0u8;0], Era::mortal(32, 42), 42u64).encode()), Era::mortal(32, 42)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn later_mortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (Compact::from(DUMMY_ACCOUNTID), vec![0u8;0], Era::mortal(32, 11), 11u64).encode()), Era::mortal(32, 11)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn too_late_mortal_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 10), 10u64).encode()), Era::mortal(32, 10)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(PrimitiveError::BadSignature)); - } - - #[test] - fn too_early_mortal_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 43), 43u64).encode()), Era::mortal(32, 43)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(PrimitiveError::BadSignature)); - } - - #[test] - fn encoding_matches_vec() { - let ex = Ex::new_unsigned(vec![0u8;0]); - let encoded = ex.encode(); - let decoded = Ex::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(decoded, ex); - let as_vec: Vec = Decode::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(as_vec.encode(), encoded); - } -} diff --git a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs deleted file mode 100644 index 38f88b65a1cfe3182a1ba186cb5cc1f172f7e364..0000000000000000000000000000000000000000 --- a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs +++ /dev/null @@ -1,310 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Generic implementation of an unchecked (pre-verification) extrinsic. - -#[cfg(feature = "std")] -use std::fmt; - -use rstd::prelude::*; -use runtime_io::blake2_256; -use crate::codec::{Decode, Encode, Input}; -use crate::traits::{ - self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, - Lookup, Checkable, Extrinsic, SaturatedConversion -}; -use crate::PrimitiveError; -use super::{CheckedExtrinsic, Era}; - -const TRANSACTION_VERSION: u8 = 1; - -/// A extrinsic right from the external world. This is unchecked and so -/// can contain a signature. -#[derive(PartialEq, Eq, Clone)] -pub struct UncheckedMortalExtrinsic { - /// The signature, address, number of extrinsics have come before from - /// the same signer and an era describing the longevity of this transaction, - /// if this is a signed extrinsic. - pub signature: Option<(Address, Signature, Index, Era)>, - /// The function that should be called. - pub function: Call, -} - -impl UncheckedMortalExtrinsic { - /// New instance of a signed extrinsic aka "transaction". - pub fn new_signed(index: Index, function: Call, signed: Address, signature: Signature, era: Era) -> Self { - UncheckedMortalExtrinsic { - signature: Some((signed, signature, index, era)), - function, - } - } - - /// New instance of an unsigned extrinsic aka "inherent". - pub fn new_unsigned(function: Call) -> Self { - UncheckedMortalExtrinsic { - signature: None, - function, - } - } -} - -impl Extrinsic for UncheckedMortalExtrinsic { - fn is_signed(&self) -> Option { - Some(self.signature.is_some()) - } -} - -impl Checkable - for UncheckedMortalExtrinsic -where - Address: Member + MaybeDisplay, - Index: Encode + Member + MaybeDisplay + SimpleArithmetic, - Call: Encode + Member, - Signature: Member + traits::Verify, - AccountId: Member + MaybeDisplay, - BlockNumber: SimpleArithmetic, - Hash: Encode, - Context: Lookup - + CurrentHeight - + BlockNumberToHash, -{ - type Checked = CheckedExtrinsic; - type Error = PrimitiveError; - - fn check(self, context: &Context) -> Result { - Ok(match self.signature { - Some((signed, signature, index, era)) => { - let current_u64 = context.current_height().saturated_into::(); - let h = context.block_number_to_hash(era.birth(current_u64).saturated_into()) - .ok_or("transaction birth block ancient")?; - let signed = context.lookup(signed)?; - let raw_payload = (index, self.function, era, h); - - if !raw_payload.using_encoded(|payload| { - if payload.len() > 256 { - signature.verify(&blake2_256(payload)[..], &signed) - } else { - signature.verify(payload, &signed) - } - }) { - return Err(PrimitiveError::BadSignature) - } - CheckedExtrinsic { - signed: Some((signed, raw_payload.0)), - function: raw_payload.1, - } - } - None => CheckedExtrinsic { - signed: None, - function: self.function, - }, - }) - } -} - -impl Decode - for UncheckedMortalExtrinsic -where - Address: Decode, - Signature: Decode, - Index: Decode, - Call: Decode, -{ - fn decode(input: &mut I) -> Option { - // This is a little more complicated than usual since the binary format must be compatible - // with substrate's generic `Vec` type. Basically this just means accepting that there - // will be a prefix of vector length (we don't need - // to use this). - let _length_do_not_remove_me_see_above: Vec<()> = Decode::decode(input)?; - - let version = input.read_byte()?; - - let is_signed = version & 0b1000_0000 != 0; - let version = version & 0b0111_1111; - if version != TRANSACTION_VERSION { - return None - } - - Some(UncheckedMortalExtrinsic { - signature: if is_signed { Some(Decode::decode(input)?) } else { None }, - function: Decode::decode(input)?, - }) - } -} - -impl Encode - for UncheckedMortalExtrinsic -where - Address: Encode, - Signature: Encode, - Index: Encode, - Call: Encode, -{ - fn encode(&self) -> Vec { - super::encode_with_vec_prefix::(|v| { - // 1 byte version id. - match self.signature.as_ref() { - Some(s) => { - v.push(TRANSACTION_VERSION | 0b1000_0000); - s.encode_to(v); - } - None => { - v.push(TRANSACTION_VERSION & 0b0111_1111); - } - } - self.function.encode_to(v); - }) - } -} - -#[cfg(feature = "std")] -impl serde::Serialize - for UncheckedMortalExtrinsic -{ - fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { - self.using_encoded(|bytes| seq.serialize_bytes(bytes)) - } -} - -#[cfg(feature = "std")] -impl fmt::Debug for UncheckedMortalExtrinsic where - Address: fmt::Debug, - Index: fmt::Debug, - Call: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedMortalExtrinsic({:?}, {:?})", self.signature.as_ref().map(|x| (&x.0, &x.2)), self.function) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::blake2_256; - use crate::codec::{Encode, Decode}; - use serde::{Serialize, Deserialize}; - - struct TestContext; - impl Lookup for TestContext { - type Source = u64; - type Target = u64; - type Error = &'static str; - fn lookup(&self, s: u64) -> Result { Ok(s) } - } - impl CurrentHeight for TestContext { - type BlockNumber = u64; - fn current_height(&self) -> u64 { 42 } - } - impl BlockNumberToHash for TestContext { - type BlockNumber = u64; - type Hash = u64; - fn block_number_to_hash(&self, n: u64) -> Option { Some(n) } - } - - #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize, Encode, Decode)] - struct TestSig(u64, Vec); - impl traits::Verify for TestSig { - type Signer = u64; - fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { - *signer == self.0 && msg.get() == &self.1[..] - } - } - - const DUMMY_ACCOUNTID: u64 = 0; - - type Ex = UncheckedMortalExtrinsic, TestSig>; - type CEx = CheckedExtrinsic>; - - #[test] - fn unsigned_codec_should_work() { - let ux = Ex::new_unsigned(vec![0u8;0]); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn signed_codec_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::immortal(), 0u64).encode()), Era::immortal()); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn large_signed_codec_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8; 257], Era::immortal(), 0u64).using_encoded(blake2_256)[..].to_owned()), Era::immortal()); - let encoded = ux.encode(); - assert_eq!(Ex::decode(&mut &encoded[..]), Some(ux)); - } - - #[test] - fn unsigned_check_should_work() { - let ux = Ex::new_unsigned(vec![0u8;0]); - assert!(!ux.is_signed().unwrap_or(false)); - assert!(>::check(ux, &TestContext).is_ok()); - } - - #[test] - fn badly_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, vec![0u8]), Era::immortal()); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(PrimitiveError::BadSignature)); - } - - #[test] - fn immortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::immortal(), 0u64).encode()), Era::immortal()); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn mortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 42), 42u64).encode()), Era::mortal(32, 42)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn later_mortal_signed_check_should_work() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 11), 11u64).encode()), Era::mortal(32, 11)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Ok(CEx { signed: Some((DUMMY_ACCOUNTID, 0)), function: vec![0u8;0] })); - } - - #[test] - fn too_late_mortal_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 10), 10u64).encode()), Era::mortal(32, 10)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(PrimitiveError::BadSignature)); - } - - #[test] - fn too_early_mortal_signed_check_should_fail() { - let ux = Ex::new_signed(0, vec![0u8;0], DUMMY_ACCOUNTID, TestSig(DUMMY_ACCOUNTID, (DUMMY_ACCOUNTID, vec![0u8;0], Era::mortal(32, 43), 43u64).encode()), Era::mortal(32, 43)); - assert!(ux.is_signed().unwrap_or(false)); - assert_eq!(>::check(ux, &TestContext), Err(PrimitiveError::BadSignature)); - } - - #[test] - fn encoding_matches_vec() { - let ex = Ex::new_unsigned(vec![0u8;0]); - let encoded = ex.encode(); - let decoded = Ex::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(decoded, ex); - let as_vec: Vec = Decode::decode(&mut encoded.as_slice()).unwrap(); - assert_eq!(as_vec.encode(), encoded); - } -} diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index c4d5b9e305d5ef6b6188d84daa1f4045e30c0125..0bdfad52fb73b99bdbfdbbd16732c6dbc06750a5 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -31,19 +31,22 @@ pub use rstd; #[doc(hidden)] pub use paste; +#[doc(hidden)] +pub use app_crypto; + #[cfg(feature = "std")] pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; -use rstd::{prelude::*, ops}; -use substrate_primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; -use codec::{Encode, Decode}; +use rstd::{prelude::*, ops, convert::{TryInto, TryFrom}}; +use primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; +use codec::{Encode, Decode, CompactAs}; #[cfg(feature = "std")] pub mod testing; pub mod weights; pub mod traits; -use traits::{SaturatedConversion, UniqueSaturatedInto}; +use traits::{SaturatedConversion, UniqueSaturatedInto, Saturating, Bounded, CheckedSub, CheckedAdd}; pub mod generic; pub mod transaction_validity; @@ -52,7 +55,8 @@ pub mod transaction_validity; pub use generic::{DigestItem, Digest}; /// Re-export this since it's part of the API of this crate. -pub use substrate_primitives::crypto::{key_types, KeyTypeId}; +pub use primitives::crypto::{key_types, KeyTypeId, CryptoType}; +pub use app_crypto::AppKey; #[cfg_attr(test, derive(PartialEq, Debug))] /// Primitive Error type @@ -132,16 +136,14 @@ pub use serde::{Serialize, Deserialize, de::DeserializeOwned}; pub trait BuildStorage: Sized { /// Build the storage out of this builder. fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { - let mut storage = Default::default(); - let mut child_storage = Default::default(); - self.assimilate_storage(&mut storage, &mut child_storage)?; - Ok((storage, child_storage)) + let mut storage = (Default::default(), Default::default()); + self.assimilate_storage(&mut storage)?; + Ok(storage) } /// Assimilate the storage for this module into pre-existing overlays. fn assimilate_storage( self, - storage: &mut StorageOverlay, - child_storage: &mut ChildrenStorageOverlay + storage: &mut (StorageOverlay, ChildrenStorageOverlay), ) -> Result<(), String>; } @@ -151,26 +153,10 @@ pub trait BuildModuleGenesisStorage: Sized { /// Create the module genesis storage into the given `storage` and `child_storage`. fn build_module_genesis_storage( self, - storage: &mut StorageOverlay, - child_storage: &mut ChildrenStorageOverlay + storage: &mut (StorageOverlay, ChildrenStorageOverlay), ) -> Result<(), String>; } -#[cfg(feature = "std")] -impl BuildStorage for StorageOverlay { - fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { - Ok((self, Default::default())) - } - fn assimilate_storage( - self, - storage: &mut StorageOverlay, - _child_storage: &mut ChildrenStorageOverlay - ) -> Result<(), String> { - storage.extend(self); - Ok(()) - } -} - #[cfg(feature = "std")] impl BuildStorage for (StorageOverlay, ChildrenStorageOverlay) { fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { @@ -178,11 +164,16 @@ impl BuildStorage for (StorageOverlay, ChildrenStorageOverlay) { } fn assimilate_storage( self, - storage: &mut StorageOverlay, - child_storage: &mut ChildrenStorageOverlay + storage: &mut (StorageOverlay, ChildrenStorageOverlay), )-> Result<(), String> { - storage.extend(self.0); - child_storage.extend(self.1); + storage.0.extend(self.0); + for (k, other_map) in self.1.into_iter() { + if let Some(map) = storage.1.get_mut(&k) { + map.extend(other_map); + } else { + storage.1.insert(k, other_map); + } + } Ok(()) } } @@ -191,8 +182,8 @@ impl BuildStorage for (StorageOverlay, ChildrenStorageOverlay) { pub type ConsensusEngineId = [u8; 4]; /// Permill is parts-per-million (i.e. after multiplying by this, divide by 1000000). -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Ord, PartialOrd))] +#[derive(Encode, Decode, CompactAs, Default, Copy, Clone, PartialEq, Eq)] pub struct Permill(u32); impl Permill { @@ -205,11 +196,16 @@ impl Permill { /// Everything. pub fn one() -> Self { Self(1_000_000) } + /// create a new raw instance. This can be called at compile time. + pub const fn from_const_parts(parts: u32) -> Self { + Self([parts, 1_000_000][(parts > 1_000_000) as usize]) + } + /// From an explicitly defined number of parts per maximum of the type. - pub fn from_parts(x: u32) -> Self { Self(x.min(1_000_000)) } + pub fn from_parts(parts: u32) -> Self { Self::from_const_parts(parts) } /// Converts from a percent. Equal to `x / 100`. - pub fn from_percent(x: u32) -> Self { Self(x.min(100) * 10_000) } + pub const fn from_percent(x: u32) -> Self { Self([x, 100][(x > 100) as usize] * 10_000) } /// Converts a fraction into `Permill`. #[cfg(feature = "std")] @@ -277,26 +273,10 @@ impl From for Permill { } } -impl codec::CompactAs for Permill { - type As = u32; - fn encode_as(&self) -> &u32 { - &self.0 - } - fn decode_from(x: u32) -> Permill { - Permill(x) - } -} - -impl From> for Permill { - fn from(x: codec::Compact) -> Permill { - x.0 - } -} - /// Perbill is parts-per-billion. It stores a value between 0 and 1 in fixed point and /// provides a means to multiply some other value by that. #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq)] +#[derive(Encode, Decode, CompactAs, Default, Copy, Clone, PartialEq, Eq, Ord, PartialOrd)] pub struct Perbill(u32); impl Perbill { @@ -309,11 +289,16 @@ impl Perbill { /// Everything. pub fn one() -> Self { Self(1_000_000_000) } + /// create a new raw instance. This can be called at compile time. + pub const fn from_const_parts(parts: u32) -> Self { + Self([parts, 1_000_000_000][(parts > 1_000_000_000) as usize]) + } + /// From an explicitly defined number of parts per maximum of the type. - pub fn from_parts(x: u32) -> Self { Self(x.min(1_000_000_000)) } + pub fn from_parts(parts: u32) -> Self { Self::from_const_parts(parts) } /// Converts from a percent. Equal to `x / 100`. - pub fn from_percent(x: u32) -> Self { Self(x.min(100) * 10_000_000) } + pub const fn from_percent(x: u32) -> Self { Self([x, 100][(x > 100) as usize] * 10_000_000) } /// Construct new instance where `x` is in millionths. Value equivalent to `x / 1,000,000`. pub fn from_millionths(x: u32) -> Self { Self(x.min(1_000_000) * 1000) } @@ -384,25 +369,131 @@ impl From for Perbill { } } -impl codec::CompactAs for Perbill { - type As = u32; - fn encode_as(&self) -> &u32 { - &self.0 +/// A fixed point number by the scale of 1 billion. +/// +/// cannot hold a value larger than +-`9223372036854775807 / 1_000_000_000` (~9 billion). +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub struct Fixed64(i64); + +/// The maximum value of the `Fixed64` type +const DIV: i64 = 1_000_000_000; + +impl Fixed64 { + /// creates self from a natural number. + /// + /// Note that this might be lossy. + pub fn from_natural(int: i64) -> Self { + Self(int.saturating_mul(DIV)) + } + + /// Return the accuracy of the type. Given that this function returns the value `X`, it means + /// that an instance composed of `X` parts (`Fixed64::from_parts(X)`) is equal to `1`. + pub fn accuracy() -> i64 { + DIV + } + + /// creates self from a rational number. Equal to `n/d`. + /// + /// Note that this might be lossy. + pub fn from_rational(n: i64, d: u64) -> Self { + Self((n as i128 * DIV as i128 / (d as i128).max(1)).try_into().unwrap_or(Bounded::max_value())) + } + + /// Performs a saturated multiply and accumulate. + /// + /// Returns a saturated `n + (self * n)`. + /// TODO: generalize this to any weight type. #3189 + pub fn saturated_multiply_accumulate(&self, int: u32) -> u32 { + let parts = self.0; + let positive = parts > 0; + + // natural parts might overflow. + let natural_parts = self.clone().saturated_into::(); + // fractional parts can always fit into u32. + let perbill_parts = (parts.abs() % DIV) as u32; + + let n = int.saturating_mul(natural_parts); + let p = Perbill::from_parts(perbill_parts) * int; + // everything that needs to be either added or subtracted from the original weight. + let excess = n.saturating_add(p); + + if positive { + int.saturating_add(excess) + } else { + int.saturating_sub(excess) + } + } + + /// Raw constructor. Equal to `parts / 1_000_000_000`. + pub fn from_parts(parts: i64) -> Self { + Self(parts) + } +} + +impl UniqueSaturatedInto for Fixed64 { + /// Note that the maximum value of Fixed64 might be more than what can fit in u32. This is hence, + /// expected to be lossy. + fn unique_saturated_into(self) -> u32 { + (self.0.abs() / DIV).try_into().unwrap_or(Bounded::max_value()) + } +} + +impl Saturating for Fixed64 { + fn saturating_add(self, rhs: Self) -> Self { + Self(self.0.saturating_add(rhs.0)) + } + fn saturating_mul(self, rhs: Self) -> Self { + Self(self.0.saturating_mul(rhs.0) / DIV) } - fn decode_from(x: u32) -> Perbill { - Perbill(x) + fn saturating_sub(self, rhs: Self) -> Self { + Self(self.0.saturating_sub(rhs.0)) } } -impl From> for Perbill { - fn from(x: codec::Compact) -> Perbill { - x.0 +/// Note that this is a standard, _potentially-panicking_, implementation. Use `Saturating` trait +/// for safe addition. +impl ops::Add for Fixed64 { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Self(self.0 + rhs.0) + } +} + +/// Note that this is a standard, _potentially-panicking_, implementation. Use `Saturating` trait +/// for safe subtraction. +impl ops::Sub for Fixed64 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + Self(self.0 - rhs.0) + } +} + +impl CheckedSub for Fixed64 { + fn checked_sub(&self, rhs: &Self) -> Option { + if let Some(v) = self.0.checked_sub(rhs.0) { + Some(Self(v)) + } else { + None + } + } +} + +impl CheckedAdd for Fixed64 { + fn checked_add(&self, rhs: &Self) -> Option { + if let Some(v) = self.0.checked_add(rhs.0) { + Some(Self(v)) + } else { + None + } } } /// PerU128 is parts-per-u128-max-value. It stores a value between 0 and 1 in fixed point. #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq)] +#[derive(Encode, Decode, CompactAs, Default, Copy, Clone, PartialEq, Eq)] pub struct PerU128(u128); const U128: u128 = u128::max_value(); @@ -432,22 +523,6 @@ impl ::rstd::ops::Deref for PerU128 { } } -impl codec::CompactAs for PerU128 { - type As = u128; - fn encode_as(&self) -> &u128 { - &self.0 - } - fn decode_from(x: u128) -> PerU128 { - Self(x) - } -} - -impl From> for PerU128 { - fn from(x: codec::Compact) -> PerU128 { - x.0 - } -} - /// Signature verify that can work with any known signature types.. #[derive(Eq, PartialEq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug))] @@ -550,8 +625,13 @@ pub struct AnySignature(H512); impl Verify for AnySignature { type Signer = sr25519::Public; fn verify>(&self, mut msg: L, signer: &sr25519::Public) -> bool { - runtime_io::sr25519_verify(self.0.as_fixed_bytes(), msg.get(), &signer.0) || - runtime_io::ed25519_verify(self.0.as_fixed_bytes(), msg.get(), &signer.0) + sr25519::Signature::try_from(self.0.as_fixed_bytes().as_ref()) + .map(|s| runtime_io::sr25519_verify(&s, msg.get(), &signer)) + .unwrap_or(false) + || ed25519::Signature::try_from(self.0.as_fixed_bytes().as_ref()) + .and_then(|s| ed25519::Public::try_from(signer.0.as_ref()).map(|p| (s, p))) + .map(|(s, p)| runtime_io::ed25519_verify(&s, msg.get(), &p)) + .unwrap_or(false) } } @@ -577,6 +657,8 @@ pub enum ApplyOutcome { Fail(DispatchError), } +impl codec::EncodeLike for ApplyOutcome {} + #[derive(Eq, PartialEq, Clone, Copy, Decode)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[repr(u8)] @@ -600,6 +682,8 @@ impl Encode for ApplyError { } } +impl codec::EncodeLike for ApplyError {} + #[derive(Eq, PartialEq, Clone, Copy)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] /// Reason why a dispatch call failed @@ -742,8 +826,7 @@ macro_rules! impl_outer_config { impl $crate::BuildStorage for $main { fn assimilate_storage( self, - top: &mut $crate::StorageOverlay, - children: &mut $crate::ChildrenStorageOverlay + storage: &mut ($crate::StorageOverlay, $crate::ChildrenStorageOverlay), ) -> std::result::Result<(), String> { $( if let Some(extra) = self.[< $snake $(_ $instance )? >] { @@ -753,8 +836,7 @@ macro_rules! impl_outer_config { $snake; $( $instance )?; extra; - top; - children; + storage; } } )* @@ -768,13 +850,11 @@ macro_rules! impl_outer_config { $module:ident; $instance:ident; $extra:ident; - $top:ident; - $children:ident; + $storage:ident; ) => { $crate::BuildModuleGenesisStorage::<$runtime, $module::$instance>::build_module_genesis_storage( $extra, - $top, - $children, + $storage, )?; }; (@CALL_FN @@ -782,13 +862,11 @@ macro_rules! impl_outer_config { $module:ident; ; $extra:ident; - $top:ident; - $children:ident; + $storage:ident; ) => { $crate::BuildModuleGenesisStorage::<$runtime, $module::__InherentHiddenInstance>::build_module_genesis_storage( $extra, - $top, - $children, + $storage, )?; } } @@ -801,27 +879,41 @@ pub struct OpaqueExtrinsic(pub Vec); #[cfg(feature = "std")] impl std::fmt::Debug for OpaqueExtrinsic { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(fmt, "{}", substrate_primitives::hexdisplay::HexDisplay::from(&self.0)) + write!(fmt, "{}", primitives::hexdisplay::HexDisplay::from(&self.0)) } } #[cfg(feature = "std")] impl ::serde::Serialize for OpaqueExtrinsic { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { - codec::Encode::using_encoded(&self.0, |bytes| ::substrate_primitives::bytes::serialize(bytes, seq)) + codec::Encode::using_encoded(&self.0, |bytes| ::primitives::bytes::serialize(bytes, seq)) + } +} + +#[cfg(feature = "std")] +impl<'a> ::serde::Deserialize<'a> for OpaqueExtrinsic { + fn deserialize(de: D) -> Result where D: ::serde::Deserializer<'a> { + let r = ::primitives::bytes::deserialize(de)?; + Decode::decode(&mut &r[..]) + .map_err(|e| ::serde::de::Error::custom(format!("Decode error: {}", e))) } } impl traits::Extrinsic for OpaqueExtrinsic { + type Call = (); + fn is_signed(&self) -> Option { None } + + fn new_unsigned(_call: Self::Call) -> Option { None } } #[cfg(test)] mod tests { use super::DispatchError; use crate::codec::{Encode, Decode}; + use super::{Perbill, Permill}; macro_rules! per_thing_upper_test { ($num_type:tt, $per:tt) => { @@ -865,19 +957,19 @@ mod tests { fn compact_permill_perbill_encoding() { let tests = [(0u32, 1usize), (63, 1), (64, 2), (16383, 2), (16384, 4), (1073741823, 4), (1073741824, 5), (u32::max_value(), 5)]; for &(n, l) in &tests { - let compact: crate::codec::Compact = super::Permill(n).into(); + let compact: crate::codec::Compact = Permill(n).into(); let encoded = compact.encode(); assert_eq!(encoded.len(), l); - let decoded = >::decode(&mut & encoded[..]).unwrap(); - let permill: super::Permill = decoded.into(); - assert_eq!(permill, super::Permill(n)); + let decoded = >::decode(&mut & encoded[..]).unwrap(); + let permill: Permill = decoded.into(); + assert_eq!(permill, Permill(n)); - let compact: crate::codec::Compact = super::Perbill(n).into(); + let compact: crate::codec::Compact = Perbill(n).into(); let encoded = compact.encode(); assert_eq!(encoded.len(), l); - let decoded = >::decode(&mut & encoded[..]).unwrap(); - let perbill: super::Perbill = decoded.into(); - assert_eq!(perbill, super::Perbill(n)); + let decoded = >::decode(&mut & encoded[..]).unwrap(); + let perbill: Perbill = decoded.into(); + assert_eq!(perbill, Perbill(n)); } } @@ -888,16 +980,16 @@ mod tests { #[test] fn test_has_compact_permill() { - let data = WithCompact { data: super::Permill(1) }; + let data = WithCompact { data: Permill(1) }; let encoded = data.encode(); - assert_eq!(data, WithCompact::::decode(&mut &encoded[..]).unwrap()); + assert_eq!(data, WithCompact::::decode(&mut &encoded[..]).unwrap()); } #[test] fn test_has_compact_perbill() { - let data = WithCompact { data: super::Perbill(1) }; + let data = WithCompact { data: Perbill(1) }; let encoded = data.encode(); - assert_eq!(data, WithCompact::::decode(&mut &encoded[..]).unwrap()); + assert_eq!(data, WithCompact::::decode(&mut &encoded[..]).unwrap()); } #[test] @@ -917,7 +1009,7 @@ mod tests { #[test] fn per_things_operate_in_output_type() { - assert_eq!(super::Perbill::one() * 255_u64, 255); + assert_eq!(Perbill::one() * 255_u64, 255); } #[test] @@ -925,12 +1017,12 @@ mod tests { use primitive_types::U256; assert_eq!( - super::Perbill::from_parts(999_999_999) * std::u128::MAX, + Perbill::from_parts(999_999_999) * std::u128::MAX, ((Into::::into(std::u128::MAX) * 999_999_999u32) / 1_000_000_000u32).as_u128() ); assert_eq!( - super::Permill::from_parts(999_999) * std::u128::MAX, + Permill::from_parts(999_999) * std::u128::MAX, ((Into::::into(std::u128::MAX) * 999_999u32) / 1_000_000u32).as_u128() ); } diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index f146161219dc02f61381aa5b8452da57abc92492..7b6f17901751935652a6fb370ed41bfce3a9c795 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -19,36 +19,85 @@ use serde::{Serialize, Serializer, Deserialize, de::Error as DeError, Deserializer}; use std::{fmt::Debug, ops::Deref, fmt}; use crate::codec::{Codec, Encode, Decode}; -use crate::traits::{self, Checkable, Applyable, BlakeTwo256, OpaqueKeys, TypedKey}; +use crate::traits::{ + self, Checkable, Applyable, BlakeTwo256, OpaqueKeys, DispatchError, DispatchResult, + ValidateUnsigned, SignedExtension, Dispatchable, +}; use crate::{generic, KeyTypeId}; -use crate::weights::{Weighable, Weight}; -use crate::PrimitiveError; -pub use substrate_primitives::H256; -use substrate_primitives::U256; -use substrate_primitives::ed25519::{Public as AuthorityId}; +use crate::weights::{GetDispatchInfo, DispatchInfo}; +pub use primitives::H256; +use primitives::{crypto::{CryptoType, Dummy, key_types, Public}, U256}; +use crate::transaction_validity::TransactionValidity; /// Authority Id -#[derive(Default, PartialEq, Eq, Clone, Encode, Decode, Debug)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Default, PartialEq, Eq, Clone, Encode, Decode, Debug, Hash, Serialize, Deserialize)] pub struct UintAuthorityId(pub u64); -impl Into for UintAuthorityId { - fn into(self) -> AuthorityId { + +impl UintAuthorityId { + /// Convert this authority id into a public key. + pub fn to_public_key(&self) -> T { let bytes: [u8; 32] = U256::from(self.0).into(); - AuthorityId(bytes) + T::from_slice(&bytes) } } -/// The key-type of the `UintAuthorityId` -pub const UINT_DUMMY_KEY: KeyTypeId = 0xdeadbeef; +impl CryptoType for UintAuthorityId { + type Pair = Dummy; +} -impl TypedKey for UintAuthorityId { - const KEY_TYPE: KeyTypeId = UINT_DUMMY_KEY; +impl AsRef<[u8]> for UintAuthorityId { + fn as_ref(&self) -> &[u8] { + unsafe { + std::slice::from_raw_parts(&self.0 as *const u64 as *const _, std::mem::size_of::()) + } + } +} + +impl app_crypto::RuntimeAppPublic for UintAuthorityId { + type Signature = u64; + + fn all() -> Vec { + unimplemented!("`all()` not available for `UintAuthorityId`.") + } + + #[cfg(feature = "std")] + fn generate_pair(_: Option<&str>) -> Self { + use rand::RngCore; + UintAuthorityId(rand::thread_rng().next_u64()) + } + + #[cfg(not(feature = "std"))] + fn generate_pair(_: Option<&str>) -> Self { + unimplemented!("`generate_pair` not implemented for `UIntAuthorityId` on `no_std`.") + } + + fn sign>(&self, msg: &M) -> Option { + let mut signature = [0u8; 8]; + msg.as_ref().iter() + .chain(rstd::iter::repeat(&42u8)) + .take(8) + .enumerate() + .for_each(|(i, v)| { signature[i] = *v; }); + + Some(u64::from_le_bytes(signature)) + } + + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { + let mut msg_signature = [0u8; 8]; + msg.as_ref().iter() + .chain(rstd::iter::repeat(&42)) + .take(8) + .enumerate() + .for_each(|(i, v)| { msg_signature[i] = *v; }); + + u64::from_le_bytes(msg_signature) == *signature + } } impl OpaqueKeys for UintAuthorityId { type KeyTypeIds = std::iter::Cloned>; - fn key_ids() -> Self::KeyTypeIds { [UINT_DUMMY_KEY].iter().cloned() } + fn key_ids() -> Self::KeyTypeIds { [key_types::DUMMY].iter().cloned() } // Unsafe, i know, but it's test code and it's just there because it's really convenient to // keep `UintAuthorityId` as a u64 under the hood. fn get_raw(&self, _: KeyTypeId) -> &[u8] { @@ -59,7 +108,9 @@ impl OpaqueKeys for UintAuthorityId { ) } } - fn get(&self, _: KeyTypeId) -> Option { self.0.using_encoded(|mut x| T::decode(&mut x)) } + fn get(&self, _: KeyTypeId) -> Option { + self.0.using_encoded(|mut x| T::decode(&mut x)).ok() + } } /// Digest item @@ -125,7 +176,8 @@ impl traits::Header for Header { impl<'a> Deserialize<'a> for Header { fn deserialize>(de: D) -> Result { let r = >::deserialize(de)?; - Decode::decode(&mut &r[..]).ok_or(DeError::custom("Invalid value passed into decode")) + Decode::decode(&mut &r[..]) + .map_err(|e| DeError::custom(format!("Invalid value passed into decode: {}", e.what()))) } } @@ -134,13 +186,14 @@ impl<'a> Deserialize<'a> for Header { pub struct ExtrinsicWrapper(Xt); impl traits::Extrinsic for ExtrinsicWrapper { + type Call = (); + fn is_signed(&self) -> Option { None } } -impl serde::Serialize for ExtrinsicWrapper -{ +impl serde::Serialize for ExtrinsicWrapper { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { self.using_encoded(|bytes| seq.serialize_bytes(bytes)) } @@ -191,55 +244,88 @@ impl Deserialize<'a> for Block where Block: Decode { fn deserialize>(de: D) -> Result { let r = >::deserialize(de)?; - Decode::decode(&mut &r[..]).ok_or(DeError::custom("Invalid value passed into decode")) + Decode::decode(&mut &r[..]) + .map_err(|e| DeError::custom(format!("Invalid value passed into decode: {}", e.what()))) } } -/// Test transaction, tuple of (sender, index, call) +/// Test transaction, tuple of (sender, call, signed_extra) /// with index only used if sender is some. /// /// If sender is some then the transaction is signed otherwise it is unsigned. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -pub struct TestXt(pub Option, pub u64, pub Call); +pub struct TestXt(pub Option<(u64, Extra)>, pub Call); -impl Serialize for TestXt where TestXt: Encode -{ +impl Serialize for TestXt where TestXt: Encode { fn serialize(&self, seq: S) -> Result where S: Serializer { self.using_encoded(|bytes| seq.serialize_bytes(bytes)) } } -impl Debug for TestXt { +impl Debug for TestXt { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "TestXt({:?}, {:?})", self.0, self.1) + write!(f, "TestXt({:?}, ...)", self.0.as_ref().map(|x| &x.0)) } } -impl Checkable for TestXt { +impl Checkable for TestXt { type Checked = Self; type Error = PrimitiveError; fn check(self, _: &Context) -> Result { Ok(self) } } -impl traits::Extrinsic for TestXt { +impl traits::Extrinsic for TestXt { + type Call = Call; + fn is_signed(&self) -> Option { Some(self.0.is_some()) } + + fn new_unsigned(_c: Call) -> Option { + None + } } -impl Applyable for TestXt where - Call: 'static + Sized + Send + Sync + Clone + Eq + Codec + Debug, + +impl Applyable for TestXt where + Call: 'static + Sized + Send + Sync + Clone + Eq + Codec + Debug + Dispatchable, + Extra: SignedExtension, + Origin: From> { type AccountId = u64; - type Index = u64; type Call = Call; - fn sender(&self) -> Option<&u64> { self.0.as_ref() } - fn index(&self) -> Option<&u64> { self.0.as_ref().map(|_| &self.1) } - fn deconstruct(self) -> (Self::Call, Option) { - (self.2, self.0) + + fn sender(&self) -> Option<&Self::AccountId> { self.0.as_ref().map(|x| &x.0) } + + /// Checks to see if this is a valid *transaction*. It returns information on it if so. + fn validate>(&self, + _info: DispatchInfo, + _len: usize, + ) -> TransactionValidity { + TransactionValidity::Valid(Default::default()) + } + + /// Executes all necessary logic needed prior to dispatch and deconstructs into function call, + /// index and sender. + fn dispatch(self, + info: DispatchInfo, + len: usize, + ) -> Result { + let maybe_who = if let Some((who, extra)) = self.0 { + Extra::pre_dispatch(extra, &who, &self.1, info, len)?; + Some(who) + } else { + Extra::pre_dispatch_unsigned(&self.1, info, len)?; + None + }; + Ok(self.1.dispatch(maybe_who.into())) } } -impl Weighable for TestXt { - fn weight(&self, len: usize) -> Weight { + +impl GetDispatchInfo for TestXt { + fn get_dispatch_info(&self) -> DispatchInfo { // for testing: weight == size. - len as Weight + DispatchInfo { + weight: self.encode().len() as _, + ..Default::default() + } } } diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 42421c63070eddfb505d8fded8f5a3feb1a6a279..5830a0ee90dcc2b6ae5abab0cab9ee8494b2838e 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -21,11 +21,11 @@ use rstd::{self, result, marker::PhantomData, convert::{TryFrom, TryInto}}; use runtime_io; #[cfg(feature = "std")] use std::fmt::{Debug, Display}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize, de::DeserializeOwned}; -use substrate_primitives::{self, Hasher, Blake2Hasher}; +use primitives::{self, Hasher, Blake2Hasher}; use crate::codec::{Codec, Encode, Decode, HasCompact}; -use crate::transaction_validity::TransactionValidity; +use crate::transaction_validity::{ValidTransaction, TransactionValidity}; use crate::generic::{Digest, DigestItem}; -pub use substrate_primitives::crypto::TypedKey; +use crate::weights::DispatchInfo; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{ Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, @@ -35,6 +35,7 @@ use rstd::ops::{ Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign, Shl, Shr }; +use crate::AppKey; /// A lazy value. pub trait Lazy { @@ -56,17 +57,39 @@ pub trait Verify { fn verify>(&self, msg: L, signer: &Self::Signer) -> bool; } -impl Verify for substrate_primitives::ed25519::Signature { - type Signer = substrate_primitives::ed25519::Public; +impl Verify for primitives::ed25519::Signature { + type Signer = primitives::ed25519::Public; fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { - runtime_io::ed25519_verify(self.as_ref(), msg.get(), signer) + runtime_io::ed25519_verify(self, msg.get(), signer) } } -impl Verify for substrate_primitives::sr25519::Signature { - type Signer = substrate_primitives::sr25519::Public; +impl Verify for primitives::sr25519::Signature { + type Signer = primitives::sr25519::Public; fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { - runtime_io::sr25519_verify(self.as_ref(), msg.get(), signer) + runtime_io::sr25519_verify(self, msg.get(), signer) + } +} + +/// Means of signature verification of an application key. +pub trait AppVerify { + /// Type of the signer. + type Signer; + /// Verify a signature. Return `true` if signature is valid for the value. + fn verify>(&self, msg: L, signer: &Self::Signer) -> bool; +} + +impl< + S: Verify::Public as app_crypto::AppPublic>::Generic> + From, + T: app_crypto::Wraps + app_crypto::AppKey + app_crypto::AppSignature + + AsRef + AsMut + From, +> AppVerify for T { + type Signer = ::Public; + fn verify>(&self, msg: L, signer: &Self::Signer) -> bool { + use app_crypto::IsWrappedBy; + let inner: &S = self.as_ref(); + let inner_pubkey = ::Generic::from_ref(&signer); + Verify::verify(inner, msg, inner_pubkey) } } @@ -143,32 +166,6 @@ impl Lookup for IdentityLookup { fn lookup(&self, x: T) -> result::Result { Ok(x) } } -/// Get the "current" block number. -pub trait CurrentHeight { - /// The type of the block number. - type BlockNumber; - - /// Return the current block number. Not allowed to fail. - fn current_height(&self) -> Self::BlockNumber; -} - -/// Translate a block number into a hash. -pub trait BlockNumberToHash { - /// The type of the block number. - type BlockNumber: Zero; - - /// The type of the hash. - type Hash: Encode; - - /// Get the hash for a given block number, or `None` if unknown. - fn block_number_to_hash(&self, n: Self::BlockNumber) -> Option; - - /// Get the genesis block hash; this should always be known. - fn genesis_hash(&self) -> Self::Hash { - self.block_number_to_hash(Zero::zero()).expect("All blockchains must know their genesis block hash; qed") - } -} - /// Extensible conversion trait. Generic over both source and destination types. pub trait Convert { /// Make conversion. @@ -187,7 +184,6 @@ impl Convert for Identity { /// A structure that performs standard conversion using the standard Rust conversion traits. pub struct ConvertInto; - impl> Convert for ConvertInto { fn convert(a: A) -> B { a.into() } } @@ -329,6 +325,47 @@ pub trait CheckedConversion { } impl CheckedConversion for T {} +/// Multiply and divide by a number that isn't necessarily the same type. Basically just the same +/// as `Mul` and `Div` except it can be used for all basic numeric types. +pub trait Scale { + /// The output type of the product of `self` and `Other`. + type Output; + + /// @return the product of `self` and `other`. + fn mul(self, other: Other) -> Self::Output; + + /// @return the integer division of `self` and `other`. + fn div(self, other: Other) -> Self::Output; + + /// @return the modulo remainder of `self` and `other`. + fn rem(self, other: Other) -> Self::Output; +} +macro_rules! impl_scale { + ($self:ty, $other:ty) => { + impl Scale<$other> for $self { + type Output = Self; + fn mul(self, other: $other) -> Self::Output { self * (other as Self) } + fn div(self, other: $other) -> Self::Output { self / (other as Self) } + fn rem(self, other: $other) -> Self::Output { self % (other as Self) } + } + } +} +impl_scale!(u128, u128); +impl_scale!(u128, u64); +impl_scale!(u128, u32); +impl_scale!(u128, u16); +impl_scale!(u128, u8); +impl_scale!(u64, u64); +impl_scale!(u64, u32); +impl_scale!(u64, u16); +impl_scale!(u64, u8); +impl_scale!(u32, u32); +impl_scale!(u32, u16); +impl_scale!(u32, u8); +impl_scale!(u16, u16); +impl_scale!(u16, u8); +impl_scale!(u8, u8); + /// Trait for things that can be clear (have no bits set). For numeric types, essentially the same /// as `Zero`. pub trait Clear { @@ -447,16 +484,13 @@ pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stup fn hash(s: &[u8]) -> Self::Output; /// Produce the hash of some codec-encodable value. - fn hash_of(s: &S) -> Self::Output { + fn hash_of(s: &S) -> Self::Output { Encode::using_encoded(s, Self::hash) } - /// Produce the trie-db root of a mapping from indices to byte slices. - fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output; - - /// Iterator-based version of `enumerated_trie_root`. + /// Iterator-based version of `ordered_trie_root`. fn ordered_trie_root< - I: IntoIterator + Iterator, + I: IntoIterator, A: AsRef<[u8]> >(input: I) -> Self::Output; @@ -480,14 +514,11 @@ pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stup pub struct BlakeTwo256; impl Hash for BlakeTwo256 { - type Output = substrate_primitives::H256; + type Output = primitives::H256; type Hasher = Blake2Hasher; fn hash(s: &[u8]) -> Self::Output { runtime_io::blake2_256(s).into() } - fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output { - runtime_io::enumerated_trie_root::(items).into() - } fn trie_root< I: IntoIterator, A: AsRef<[u8]> + Ord, @@ -496,7 +527,7 @@ impl Hash for BlakeTwo256 { runtime_io::trie_root::(input).into() } fn ordered_trie_root< - I: IntoIterator + Iterator, + I: IntoIterator, A: AsRef<[u8]> >(input: I) -> Self::Output { runtime_io::ordered_trie_root::(input).into() @@ -515,10 +546,10 @@ pub trait CheckEqual { fn check_equal(&self, other: &Self); } -impl CheckEqual for substrate_primitives::H256 { +impl CheckEqual for primitives::H256 { #[cfg(feature = "std")] fn check_equal(&self, other: &Self) { - use substrate_primitives::hexdisplay::HexDisplay; + use primitives::hexdisplay::HexDisplay; if self != other { println!("Hash: given={}, expected={}", HexDisplay::from(self.as_fixed_bytes()), HexDisplay::from(other.as_fixed_bytes())); } @@ -644,6 +675,12 @@ pub trait RandomnessBeacon { pub trait Member: Send + Sync + Sized + MaybeDebug + Eq + PartialEq + Clone + 'static {} impl Member for T {} +/// Determine if a `MemberId` is a valid member. +pub trait IsMember { + /// Is the given `MemberId` a valid member? + fn is_member(member_id: &MemberId) -> bool; +} + /// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, /// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and /// `parent_hash`, as well as a `digest` and a block `number`. @@ -724,10 +761,17 @@ pub trait Block: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebugButNotDes } /// Something that acts like an `Extrinsic`. -pub trait Extrinsic { +pub trait Extrinsic: Sized { + /// The function call. + type Call; + /// Is this `Extrinsic` signed? /// If no information are available about signed/unsigned, `None` should be returned. fn is_signed(&self) -> Option { None } + + /// New instance of an unsigned extrinsic aka "inherent". `None` if this is an opaque + /// extrinsic type. + fn new_unsigned(_call: Self::Call) -> Option { None } } /// Extract the hashing type for a block. @@ -777,6 +821,222 @@ impl Checkable for T { } } +/// An abstract error concerning an attempt to verify, check or dispatch the transaction. This +/// cannot be more concrete because it's designed to work reasonably well over a broad range of +/// possible transaction types. +#[cfg_attr(feature = "std", derive(Debug))] +pub enum DispatchError { + /// General error to do with the inability to pay some fees (e.g. account balance too low). + Payment, + + /// General error to do with the exhaustion of block resources. + Exhausted, + + /// General error to do with the permissions of the sender. + NoPermission, + + /// General error to do with the state of the system in general. + BadState, + + /// General error to do with the transaction being outdated (e.g. nonce too low). + Stale, + + /// General error to do with the transaction not yet being valid (e.g. nonce too high). + Future, + + /// General error to do with the transaction's proofs (e.g. signature). + BadProof, +} + +impl From for i8 { + fn from(e: DispatchError) -> i8 { + match e { + DispatchError::Payment => -64, + DispatchError::Exhausted => -65, + DispatchError::NoPermission => -66, + DispatchError::BadState => -67, + DispatchError::Stale => -68, + DispatchError::Future => -69, + DispatchError::BadProof => -70, + } + } +} + +/// Result of a module function call; either nothing (functions are only called for "side effects") +/// or an error message. +pub type DispatchResult = result::Result<(), &'static str>; + +/// A lazy call (module function and argument values) that can be executed via its `dispatch` +/// method. +pub trait Dispatchable { + /// Every function call from your runtime has an origin, which specifies where the extrinsic was + /// generated from. In the case of a signed extrinsic (transaction), the origin contains an + /// identifier for the caller. The origin can be empty in the case of an inherent extrinsic. + type Origin; + /// ... + type Trait; + /// Actually dispatch this call and result the result of it. + fn dispatch(self, origin: Self::Origin) -> DispatchResult; +} + +/// Means by which a transaction may be extended. This type embodies both the data and the logic +/// that should be additionally associated with the transaction. It should be plain old data. +pub trait SignedExtension: + Codec + MaybeDebug + Sync + Send + Clone + Eq + PartialEq +{ + /// The type which encodes the sender identity. + type AccountId; + + /// The type which encodes the call to be dispatched. + type Call; + + /// Any additional data that will go into the signed payload. This may be created dynamically + /// from the transaction using the `additional_signed` function. + type AdditionalSigned: Encode; + + /// The type that encodes information that can be passed from pre_dispatch to post-dispatch. + type Pre: Default; + + /// Construct any additional data that should be in the signed payload of the transaction. Can + /// also perform any pre-signature-verification checks and return an error if needed. + fn additional_signed(&self) -> Result; + + /// Validate a signed transaction for the transaction queue. + fn validate( + &self, + _who: &Self::AccountId, + _call: &Self::Call, + _info: DispatchInfo, + _len: usize, + ) -> Result { + Ok(Default::default()) + } + + /// Do any pre-flight stuff for a signed transaction. + fn pre_dispatch( + self, + who: &Self::AccountId, + call: &Self::Call, + info: DispatchInfo, + len: usize, + ) -> Result { + self.validate(who, call, info, len).map(|_| Self::Pre::default()) + } + + /// Validate an unsigned transaction for the transaction queue. Normally the default + /// implementation is fine since `ValidateUnsigned` is a better way of recognising and + /// validating unsigned transactions. + fn validate_unsigned( + _call: &Self::Call, + _info: DispatchInfo, + _len: usize, + ) -> Result { Ok(Default::default()) } + + /// Do any pre-flight stuff for a unsigned transaction. + fn pre_dispatch_unsigned( + call: &Self::Call, + info: DispatchInfo, + len: usize, + ) -> Result { + Self::validate_unsigned(call, info, len).map(|_| Self::Pre::default()) + } + + /// Do any post-flight stuff for a transaction. + fn post_dispatch( + _pre: Self::Pre, + _info: DispatchInfo, + _len: usize, + ) { } +} + +macro_rules! tuple_impl_indexed { + ($first:ident, $($rest:ident,)+ ; $first_index:tt, $($rest_index:tt,)+) => { + tuple_impl_indexed!([$first] [$($rest)+] ; [$first_index,] [$($rest_index,)+]); + }; + ([$($direct:ident)+] ; [$($index:tt,)+]) => { + impl< + AccountId, + Call, + $($direct: SignedExtension),+ + > SignedExtension for ($($direct),+,) { + type AccountId = AccountId; + type Call = Call; + type AdditionalSigned = ($($direct::AdditionalSigned,)+); + type Pre = ($($direct::Pre,)+); + fn additional_signed(&self) -> Result { + Ok(( $(self.$index.additional_signed()?,)+ )) + } + fn validate( + &self, + who: &Self::AccountId, + call: &Self::Call, + info: DispatchInfo, + len: usize, + ) -> Result { + let aggregator = vec![$(<$direct as SignedExtension>::validate(&self.$index, who, call, info, len)?),+]; + Ok(aggregator.into_iter().fold(ValidTransaction::default(), |acc, a| acc.combine_with(a))) + } + fn pre_dispatch( + self, + who: &Self::AccountId, + call: &Self::Call, + info: DispatchInfo, + len: usize, + ) -> Result { + Ok(($(self.$index.pre_dispatch(who, call, info, len)?,)+)) + } + fn validate_unsigned( + call: &Self::Call, + info: DispatchInfo, + len: usize, + ) -> Result { + let aggregator = vec![$($direct::validate_unsigned(call, info, len)?),+]; + Ok(aggregator.into_iter().fold(ValidTransaction::default(), |acc, a| acc.combine_with(a))) + } + fn pre_dispatch_unsigned( + call: &Self::Call, + info: DispatchInfo, + len: usize, + ) -> Result { + Ok(($($direct::pre_dispatch_unsigned(call, info, len)?,)+)) + } + fn post_dispatch( + pre: Self::Pre, + info: DispatchInfo, + len: usize, + ) { + $($direct::post_dispatch(pre.$index, info, len);)+ + } + } + + }; + ([$($direct:ident)+] [] ; [$($index:tt,)+] []) => { + tuple_impl_indexed!([$($direct)+] ; [$($index,)+]); + }; + ( + [$($direct:ident)+] [$first:ident $($rest:ident)*] + ; + [$($index:tt,)+] [$first_index:tt, $($rest_index:tt,)*] + ) => { + tuple_impl_indexed!([$($direct)+] ; [$($index,)+]); + tuple_impl_indexed!([$($direct)+ $first] [$($rest)*] ; [$($index,)+ $first_index,] [$($rest_index,)*]); + }; +} + +// TODO: merge this into `tuple_impl` once codec supports `trait Codec` for longer tuple lengths. #3152 +#[allow(non_snake_case)] +tuple_impl_indexed!(A, B, C, D, E, F, G, H, I, J, ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,); + +/// Only for bare bone testing when you don't care about signed extensions at all. +#[cfg(feature = "std")] +impl SignedExtension for () { + type AccountId = u64; + type AdditionalSigned = (); + type Call = (); + type Pre = (); + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } +} + /// An "executable" piece of information, used by the standard Substrate Executive in order to /// enact a piece of extrinsic information by marshalling and dispatching to a named function /// call. @@ -786,16 +1046,25 @@ impl Checkable for T { pub trait Applyable: Sized + Send + Sync { /// Id of the account that is responsible for this piece of information (sender). type AccountId: Member + MaybeDisplay; - /// Index allowing to disambiguate other `Applyable`s from the same `AccountId`. - type Index: Member + MaybeDisplay + SimpleArithmetic; - /// Function call. - type Call: Member; - /// Returns a reference to the index if any. - fn index(&self) -> Option<&Self::Index>; + + /// Type by which we can dispatch. Restricts the UnsignedValidator type. + type Call; + /// Returns a reference to the sender if any. fn sender(&self) -> Option<&Self::AccountId>; - /// Deconstructs into function call and sender. - fn deconstruct(self) -> (Self::Call, Option); + + /// Checks to see if this is a valid *transaction*. It returns information on it if so. + fn validate>(&self, + info: DispatchInfo, + len: usize, + ) -> TransactionValidity; + + /// Executes all necessary logic needed prior to dispatch and deconstructs into function call, + /// index and sender. + fn dispatch(self, + info: DispatchInfo, + len: usize, + ) -> Result; } /// Auxiliary wrapper that holds an api instance and binds it to the given lifetime. @@ -879,21 +1148,30 @@ pub trait OpaqueKeys: Clone { /// Get the raw bytes of key with key-type ID `i`. fn get_raw(&self, i: super::KeyTypeId) -> &[u8]; /// Get the decoded key with index `i`. - fn get(&self, i: super::KeyTypeId) -> Option { T::decode(&mut self.get_raw(i)) } + fn get(&self, i: super::KeyTypeId) -> Option { + T::decode(&mut self.get_raw(i)).ok() + } /// Verify a proof of ownership for the keys. fn ownership_proof_is_valid(&self, _proof: &[u8]) -> bool { true } } +/// Input that adds infinite number of zero after wrapped input. struct TrailingZeroInput<'a>(&'a [u8]); + impl<'a> codec::Input for TrailingZeroInput<'a> { - fn read(&mut self, into: &mut [u8]) -> usize { - let len = into.len().min(self.0.len()); - into[..len].copy_from_slice(&self.0[..len]); - for i in &mut into[len..] { + fn remaining_len(&mut self) -> Result, codec::Error> { + Ok(None) + } + + fn read(&mut self, into: &mut [u8]) -> Result<(), codec::Error> { + let len_from_inner = into.len().min(self.0.len()); + into[..len_from_inner].copy_from_slice(&self.0[..len_from_inner]); + for i in &mut into[len_from_inner..] { *i = 0; } - self.0 = &self.0[len..]; - into.len() + self.0 = &self.0[len_from_inner..]; + + Ok(()) } } @@ -941,7 +1219,7 @@ impl AccountIdConver x.using_encoded(|d| { if &d[0..4] != Id::TYPE_ID { return None } let mut cursor = &d[4..]; - let result = Decode::decode(&mut cursor)?; + let result = Decode::decode(&mut cursor).ok()?; if cursor.iter().all(|x| *x == 0) { Some(result) } else { @@ -954,7 +1232,7 @@ impl AccountIdConver #[cfg(test)] mod tests { use super::AccountIdConversion; - use crate::codec::{Encode, Decode}; + use crate::codec::{Encode, Decode, Input}; #[derive(Encode, Decode, Default, PartialEq, Debug)] struct U32Value(u32); @@ -1003,6 +1281,22 @@ mod tests { let r = U16Value::try_from_account(&0x0100_c0da_f00dcafe_u64); assert!(r.is_none()); } + + #[test] + fn trailing_zero_should_work() { + let mut t = super::TrailingZeroInput(&[1, 2, 3]); + assert_eq!(t.remaining_len(), Ok(None)); + let mut buffer = [0u8; 2]; + assert_eq!(t.read(&mut buffer), Ok(())); + assert_eq!(t.remaining_len(), Ok(None)); + assert_eq!(buffer, [1, 2]); + assert_eq!(t.read(&mut buffer), Ok(())); + assert_eq!(t.remaining_len(), Ok(None)); + assert_eq!(buffer, [3, 0]); + assert_eq!(t.read(&mut buffer), Ok(())); + assert_eq!(t.remaining_len(), Ok(None)); + assert_eq!(buffer, [0, 0]); + } } /// Calls a given macro a number of times with a set of fixed params and an incrementing numeral. @@ -1033,14 +1327,14 @@ macro_rules! count { /// just the bytes of the key. /// /// ```rust -/// use sr_primitives::{impl_opaque_keys, key_types, KeyTypeId}; +/// use sr_primitives::{impl_opaque_keys, key_types, KeyTypeId, app_crypto::{sr25519, ed25519}}; /// /// impl_opaque_keys! { /// pub struct Keys { /// #[id(key_types::ED25519)] -/// pub ed25519: [u8; 32], +/// pub ed25519: ed25519::AppPublic, /// #[id(key_types::SR25519)] -/// pub sr25519: [u8; 32], +/// pub sr25519: sr25519::AppPublic, /// } /// } /// ``` @@ -1062,22 +1356,34 @@ macro_rules! impl_opaque_keys { )* } + impl $name { + /// Generate a set of keys with optionally using the given seed. + /// + /// The generated key pairs are stored in the keystore. + /// + /// Returns the concatenated SCALE encoded public keys. + pub fn generate(seed: Option<&str>) -> $crate::rstd::vec::Vec { + let keys = Self{ + $( + $field: <$type as $crate::app_crypto::RuntimeAppPublic>::generate_pair(seed), + )* + }; + $crate::codec::Encode::encode(&keys) + } + } + impl $crate::traits::OpaqueKeys for $name { type KeyTypeIds = $crate::rstd::iter::Cloned< $crate::rstd::slice::Iter<'static, $crate::KeyTypeId> >; fn key_ids() -> Self::KeyTypeIds { - [ - $($key_id),* - ].iter().cloned() + [ $($key_id),* ].iter().cloned() } fn get_raw(&self, i: $crate::KeyTypeId) -> &[u8] { match i { - $( - i if i == $key_id => self.$field.as_ref(), - )* + $( i if i == $key_id => self.$field.as_ref(), )* _ => &[], } } diff --git a/core/sr-primitives/src/transaction_validity.rs b/core/sr-primitives/src/transaction_validity.rs index f36599b67b42c35c52752ed9e9dfd3dee6e22e27..4d5d53baf199f103a877198b824dbe94a42634d4 100644 --- a/core/sr-primitives/src/transaction_validity.rs +++ b/core/sr-primitives/src/transaction_validity.rs @@ -17,7 +17,8 @@ //! Transaction validity interface. use rstd::prelude::*; -use crate::codec::{Encode, Decode}; +use crate::codec::{Encode, Decode, Error}; +use crate::traits::DispatchError; /// Priority for a transaction. Additive. Higher is better. pub type TransactionPriority = u64; @@ -36,44 +37,85 @@ pub enum TransactionValidity { /// Transaction is invalid. Details are described by the error code. Invalid(i8), /// Transaction is valid. - Valid { - /// Priority of the transaction. - /// - /// Priority determines the ordering of two transactions that have all - /// their dependencies (required tags) satisfied. - priority: TransactionPriority, - /// Transaction dependencies - /// - /// A non-empty list signifies that some other transactions which provide - /// given tags are required to be included before that one. - requires: Vec, - /// Provided tags - /// - /// A list of tags this transaction provides. Successfully importing the transaction - /// will enable other transactions that depend on (require) those tags to be included as well. - /// Provided and required tags allow Substrate to build a dependency graph of transactions - /// and import them in the right (linear) order. - provides: Vec, - /// Transaction longevity - /// - /// Longevity describes minimum number of blocks the validity is correct. - /// After this period transaction should be removed from the pool or revalidated. - longevity: TransactionLongevity, - /// A flag indicating if the transaction should be propagated to other peers. - /// - /// By setting `false` here the transaction will still be considered for - /// including in blocks that are authored on the current node, but will - /// never be sent to other peers. - propagate: bool, - }, + Valid(ValidTransaction), /// Transaction validity can't be determined. Unknown(i8), } +impl From> for TransactionValidity { + fn from(r: Result) -> Self { + match r { + Ok(v) => TransactionValidity::Valid(v), + Err(e) => TransactionValidity::Invalid(e.into()), + } + } +} + +/// Information concerning a valid transaction. +#[derive(Clone, PartialEq, Eq, Encode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct ValidTransaction { + /// Priority of the transaction. + /// + /// Priority determines the ordering of two transactions that have all + /// their dependencies (required tags) satisfied. + pub priority: TransactionPriority, + /// Transaction dependencies + /// + /// A non-empty list signifies that some other transactions which provide + /// given tags are required to be included before that one. + pub requires: Vec, + /// Provided tags + /// + /// A list of tags this transaction provides. Successfully importing the transaction + /// will enable other transactions that depend on (require) those tags to be included as well. + /// Provided and required tags allow Substrate to build a dependency graph of transactions + /// and import them in the right (linear) order. + pub provides: Vec, + /// Transaction longevity + /// + /// Longevity describes minimum number of blocks the validity is correct. + /// After this period transaction should be removed from the pool or revalidated. + pub longevity: TransactionLongevity, + /// A flag indicating if the transaction should be propagated to other peers. + /// + /// By setting `false` here the transaction will still be considered for + /// including in blocks that are authored on the current node, but will + /// never be sent to other peers. + pub propagate: bool, +} + +impl Default for ValidTransaction { + fn default() -> Self { + ValidTransaction { + priority: 0, + requires: vec![], + provides: vec![], + longevity: TransactionLongevity::max_value(), + propagate: true, + } + } +} + +impl ValidTransaction { + /// Combine two instances into one, as a best effort. This will take the superset of each of the + /// `provides` and `requires` tags, it will sum the priorities, take the minimum longevity and + /// the logic *And* of the propagate flags. + pub fn combine_with(mut self, mut other: ValidTransaction) -> Self { + ValidTransaction { + priority: self.priority.saturating_add(other.priority), + requires: { self.requires.append(&mut other.requires); self.requires }, + provides: { self.provides.append(&mut other.provides); self.provides }, + longevity: self.longevity.min(other.longevity), + propagate: self.propagate && other.propagate, + } + } +} + impl Decode for TransactionValidity { - fn decode(value: &mut I) -> Option { + fn decode(value: &mut I) -> Result { match value.read_byte()? { - 0 => Some(TransactionValidity::Invalid(i8::decode(value)?)), + 0 => Ok(TransactionValidity::Invalid(i8::decode(value)?)), 1 => { let priority = TransactionPriority::decode(value)?; let requires = Vec::decode(value)?; @@ -81,12 +123,12 @@ impl Decode for TransactionValidity { let longevity = TransactionLongevity::decode(value)?; let propagate = bool::decode(value).unwrap_or(true); - Some(TransactionValidity::Valid { + Ok(TransactionValidity::Valid(ValidTransaction { priority, requires, provides, longevity, propagate, - }) + })) }, - 2 => Some(TransactionValidity::Unknown(i8::decode(value)?)), - _ => None, + 2 => Ok(TransactionValidity::Unknown(i8::decode(value)?)), + _ => Err("Invalid transaction validity variant".into()), } } } @@ -101,24 +143,24 @@ mod tests { 1, 5, 0, 0, 0, 0, 0, 0, 0, 4, 16, 1, 2, 3, 4, 4, 12, 4, 5, 6, 42, 0, 0, 0, 0, 0, 0, 0 ]; - assert_eq!(TransactionValidity::decode(&mut &*old_encoding), Some(TransactionValidity::Valid { + assert_eq!(TransactionValidity::decode(&mut &*old_encoding), Ok(TransactionValidity::Valid(ValidTransaction { priority: 5, requires: vec![vec![1, 2, 3, 4]], provides: vec![vec![4, 5, 6]], longevity: 42, propagate: true, - })); + }))); } #[test] fn should_encode_and_decode() { - let v = TransactionValidity::Valid { + let v = TransactionValidity::Valid(ValidTransaction { priority: 5, requires: vec![vec![1, 2, 3, 4]], provides: vec![vec![4, 5, 6]], longevity: 42, propagate: false, - }; + }); let encoded = v.encode(); assert_eq!( @@ -127,6 +169,6 @@ mod tests { ); // decode back - assert_eq!(TransactionValidity::decode(&mut &*encoded), Some(v)); + assert_eq!(TransactionValidity::decode(&mut &*encoded), Ok(v)); } } diff --git a/core/sr-primitives/src/weights.rs b/core/sr-primitives/src/weights.rs index 3443992c7396bb109b402b48a4bcd77b182ee291..45ac59e0d5489c5ded68bd14c1344e8a9e7f19ff 100644 --- a/core/sr-primitives/src/weights.rs +++ b/core/sr-primitives/src/weights.rs @@ -16,61 +16,227 @@ //! Primitives for transaction weighting. //! -//! Each dispatch function within `decl_module!` can now have an optional -//! `#[weight = $x]` attribute. $x can be any object that implements the -//! `Weighable` trait. By default, All transactions are annotated by -//! `#[weight = TransactionWeight::default()]`. +//! Each dispatch function within `decl_module!` can have an optional `#[weight = $x]` attribute. +//! `$x` can be any type that implements the `ClassifyDispatch` and `WeighData` traits. By +//! default, All transactions are annotated with `#[weight = SimpleDispatchInfo::default()]`. //! -//! Note that the decl_module macro _cannot_ enforce this and will simply fail -//! if an invalid struct is passed in. +//! Note that the decl_module macro _cannot_ enforce this and will simply fail if an invalid struct +//! (something that does not implement `Weighable`) is passed in. -/// The final type that each `#[weight = $x:expr]`'s -/// expression must evaluate to. +use crate::{Fixed64, traits::Saturating}; +use crate::codec::{Encode, Decode}; + +pub use crate::transaction_validity::TransactionPriority; +use crate::traits::Bounded; + +/// Numeric range of a transaction weight. pub type Weight = u32; -/// A `Call` enum (aka transaction) that can be weighted using the custom weight attribute of -/// its dispatchable functions. Is implemented by default in the `decl_module!`. -/// -/// Both the outer Call enum and the per-module individual ones will implement this. -/// The outer enum simply calls the inner ones based on call type. -pub trait Weighable { - /// Return the weight of this call. - /// The `len` argument is the encoded length of the transaction/call. - fn weight(&self, len: usize) -> Weight; +/// A generalized group of dispatch types. This is only distinguishing normal, user-triggered transactions +/// (`Normal`) and anything beyond which serves a higher purpose to the system (`Operational`). +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(PartialEq, Eq, Clone, Copy)] +pub enum DispatchClass { + /// A normal dispatch. + Normal, + /// An operational dispatch. + Operational, +} + +impl Default for DispatchClass { + fn default() -> Self { + DispatchClass::Normal + } +} + +impl From for DispatchClass { + fn from(tx: SimpleDispatchInfo) -> Self { + match tx { + SimpleDispatchInfo::FixedOperational(_) => DispatchClass::Operational, + SimpleDispatchInfo::MaxOperational => DispatchClass::Operational, + SimpleDispatchInfo::FreeOperational => DispatchClass::Operational, + + SimpleDispatchInfo::FixedNormal(_) => DispatchClass::Normal, + SimpleDispatchInfo::MaxNormal => DispatchClass::Normal, + SimpleDispatchInfo::FreeNormal => DispatchClass::Normal, + } + } +} + +/// A bundle of static information collected from the `#[weight = $x]` attributes. +#[cfg_attr(feature = "std", derive(PartialEq, Eq, Debug))] +#[derive(Clone, Copy, Default)] +pub struct DispatchInfo { + /// Weight of this transaction. + pub weight: Weight, + /// Class of this transaction. + pub class: DispatchClass, } -/// Default type used as the weight representative in a `#[weight = x]` attribute. +impl DispatchInfo { + /// Determine if this dispatch should pay the base length-related fee or not. + pub fn pay_length_fee(&self) -> bool { + match self.class { + DispatchClass::Normal => true, + // For now we assume all operational transactions don't pay the length fee. + DispatchClass::Operational => false, + } + } +} + +/// A `Dispatchable` function (aka transaction) that can carry some static information along with it, using the +/// `#[weight]` attribute. +pub trait GetDispatchInfo { + /// Return a `DispatchInfo`, containing relevant information of this dispatch. + /// + /// This is done independently of its encoded size. + fn get_dispatch_info(&self) -> DispatchInfo; +} + +/// Means of weighing some particular kind of data (`T`). +pub trait WeighData { + /// Weigh the data `T` given by `target`. + fn weigh_data(&self, target: T) -> Weight; +} + +/// Means of classifying a dispatchable function. +pub trait ClassifyDispatch { + /// Classify the dispatch function based on input data `target` of type `T`. + fn classify_dispatch(&self, target: T) -> DispatchClass; +} + +/// Default type used with the `#[weight = x]` attribute in a substrate chain. +/// +/// A user may pass in any other type that implements the correct traits. If not, the `Default` +/// implementation of [`SimpleDispatchInfo`] is used. /// -/// A user may pass in any other type that implements [`Weighable`]. If not, the `Default` -/// implementation of [`TransactionWeight`] is used. -pub enum TransactionWeight { - /// Basic weight (base, byte). - /// The values contained are the base weight and byte weight respectively. - Basic(Weight, Weight), - /// Maximum fee. This implies that this transaction _might_ get included but - /// no more transaction can be added. This can be done by setting the - /// implementation to _maximum block weight_. - Max, - /// Free. The transaction does not increase the total weight - /// (i.e. is not included in weight calculation). - Free, +/// For each generalized group (`Normal` and `Operation`): +/// - A `Fixed` variant means weight fee is charged normally and the weight is the number +/// specified in the inner value of the variant. +/// - A `Free` variant is equal to `::Fixed(0)`. Note that this does not guarantee inclusion. +/// - A `Max` variant is equal to `::Fixed(Weight::max_value())`. +/// +/// Based on the final weight value, based on the above variants: +/// - A _weight-fee_ is deducted. +/// - The block weight is consumed proportionally. +/// +/// As for the generalized groups themselves: +/// - `Normal` variants will be assigned a priority proportional to their weight. They can only +/// consume a portion (1/4) of the maximum block resource limits. +/// - `Operational` variants will be assigned the maximum priority. They can potentially consume +/// the entire block resource limit. +#[derive(Clone, Copy)] +pub enum SimpleDispatchInfo { + /// A normal dispatch with fixed weight. + FixedNormal(Weight), + /// A normal dispatch with the maximum weight. + MaxNormal, + /// A normal dispatch with no weight. + FreeNormal, + /// An operational dispatch with fixed weight. + FixedOperational(Weight), + /// An operational dispatch with the maximum weight. + MaxOperational, + /// An operational dispatch with no weight. + FreeOperational, } -impl Weighable for TransactionWeight { - fn weight(&self, len: usize) -> Weight { +impl WeighData for SimpleDispatchInfo { + fn weigh_data(&self, _: T) -> Weight { match self { - TransactionWeight::Basic(base, byte) => base + byte * len as Weight, - TransactionWeight::Max => 3 * 1024 * 1024, - TransactionWeight::Free => 0, + SimpleDispatchInfo::FixedNormal(w) => *w, + SimpleDispatchInfo::MaxNormal => Bounded::max_value(), + SimpleDispatchInfo::FreeNormal => Bounded::min_value(), + + SimpleDispatchInfo::FixedOperational(w) => *w, + SimpleDispatchInfo::MaxOperational => Bounded::max_value(), + SimpleDispatchInfo::FreeOperational => Bounded::min_value(), } } } -impl Default for TransactionWeight { +impl ClassifyDispatch for SimpleDispatchInfo { + fn classify_dispatch(&self, _: T) -> DispatchClass { + DispatchClass::from(*self) + } +} + +impl Default for SimpleDispatchInfo { fn default() -> Self { - // This implies that the weight is currently equal to tx-size, nothing more - // for all substrate transactions that do NOT explicitly annotate weight. - // TODO #2431 needs to be updated with proper max values. - TransactionWeight::Basic(0, 1) + // Default weight of all transactions. + SimpleDispatchInfo::FixedNormal(10_000) + } +} + +/// Representation of a weight multiplier. This represents how a fee value can be computed from a +/// weighted transaction. +/// +/// This is basically a wrapper for the `Fixed64` type a slightly tailored multiplication to u32 +/// in the form of the `apply_to` method. +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub struct WeightMultiplier(Fixed64); + +impl WeightMultiplier { + /// Apply the inner Fixed64 as a weight multiplier to a weight value. + /// + /// This will perform a saturated `weight + weight * self.0`. + pub fn apply_to(&self, weight: Weight) -> Weight { + self.0.saturated_multiply_accumulate(weight) + } + + /// build self from raw parts per billion. + #[cfg(feature = "std")] + pub fn from_parts(parts: i64) -> Self { + Self(Fixed64(parts)) + } + + /// build self from a fixed64 value. + pub fn from_fixed(f: Fixed64) -> Self { + Self(f) + } + + /// Approximate the fraction `n/d`. + pub fn from_rational(n: i64, d: u64) -> Self { + Self(Fixed64::from_rational(n, d)) + } +} + +impl Saturating for WeightMultiplier { + fn saturating_add(self, rhs: Self) -> Self { + Self(self.0.saturating_add(rhs.0)) + } + fn saturating_mul(self, rhs: Self) -> Self { + Self(self.0.saturating_mul(rhs.0)) + + } + fn saturating_sub(self, rhs: Self) -> Self { + Self(self.0.saturating_sub(rhs.0)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn multiplier_apply_to_works() { + let test_set = vec![0, 1, 10, 1000, 1_000_000_000]; + + // negative (1/2) + let mut fm = WeightMultiplier::from_rational(-1, 2); + test_set.clone().into_iter().for_each(|i| { assert_eq!(fm.apply_to(i) as i32, i as i32 - i as i32 / 2); }); + + // unit (1) multiplier + fm = WeightMultiplier::from_parts(0); + test_set.clone().into_iter().for_each(|i| { assert_eq!(fm.apply_to(i), i); }); + + // i.5 multiplier + fm = WeightMultiplier::from_rational(1, 2); + test_set.clone().into_iter().for_each(|i| { assert_eq!(fm.apply_to(i), i * 3 / 2); }); + + // dual multiplier + fm = WeightMultiplier::from_rational(1, 1); + test_set.clone().into_iter().for_each(|i| { assert_eq!(fm.apply_to(i), i * 2); }); } } diff --git a/core/sr-sandbox/Cargo.toml b/core/sr-sandbox/Cargo.toml index 748bc543623e3d0bad0f46392cc97baeee0961f4..da80b2f213c7ef53074a2f34884ef9b4813946f6 100755 --- a/core/sr-sandbox/Cargo.toml +++ b/core/sr-sandbox/Cargo.toml @@ -9,10 +9,10 @@ edition = "2018" rustc_version = "0.2" [dependencies] -wasmi = { version = "0.4.3", optional = true } +wasmi = { version = "0.5.0", optional = true } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } -codec = { package = "parity-codec", version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } [dev-dependencies] wabt = "~0.7.4" diff --git a/core/sr-sandbox/src/lib.rs b/core/sr-sandbox/src/lib.rs index 9cb39236b0e265eb6bfc4b58706aad3e74194547..e814a51acedf692b5df4082db9fce73408d5308e 100755 --- a/core/sr-sandbox/src/lib.rs +++ b/core/sr-sandbox/src/lib.rs @@ -53,8 +53,7 @@ mod imp { /// Error that can occur while using this crate. #[cfg_attr(feature = "std", derive(Debug))] pub enum Error { - /// Module is not valid, couldn't be instantiated or it's `start` function trapped - /// when executed. + /// Module is not valid, couldn't be instantiated. Module, /// Access to a memory or table was made with an address or an index which is out of bounds. @@ -62,7 +61,7 @@ pub enum Error { /// Note that if wasm module makes an out-of-bounds access then trap will occur. OutOfBounds, - /// Failed to invoke an exported function for some reason. + /// Failed to invoke the start function or an exported function for some reason. Execution, } diff --git a/core/sr-sandbox/without_std.rs b/core/sr-sandbox/without_std.rs index 9fb255a5230f6cb076c769b7ff9ca2e20beae9e5..ee5f7697fe71d4d26bdd18a9df7dca6250da372d 100755 --- a/core/sr-sandbox/without_std.rs +++ b/core/sr-sandbox/without_std.rs @@ -304,7 +304,7 @@ impl Instance { match result { sandbox_primitives::ERR_OK => { let return_val = sandbox_primitives::ReturnValue::decode(&mut &return_val[..]) - .ok_or(Error::Execution)?; + .map_err(|_| Error::Execution)?; Ok(return_val) } sandbox_primitives::ERR_EXECUTION => Err(Error::Execution), diff --git a/core/sr-version/Cargo.toml b/core/sr-version/Cargo.toml index fb9b0a468875c382321cc1eab635e901f8aae774..a83d1f6415dd072ef6093b60e61675ce3ce06cd3 100644 --- a/core/sr-version/Cargo.toml +++ b/core/sr-version/Cargo.toml @@ -7,16 +7,16 @@ edition = "2018" [dependencies] impl-serde = { version = "0.1", optional = true } serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } +sr-primitives = { path = "../sr-primitives", default-features = false } [features] default = ["std"] std = [ "impl-serde", "serde", - "parity-codec/std", + "codec/std", "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", ] diff --git a/core/sr-version/src/lib.rs b/core/sr-version/src/lib.rs index 179146cc8464d110cb0fab6d4cc53a0c63e0bc9d..cf96fe70e219faaed1e98ef5ae5a6e12445b768e 100644 --- a/core/sr-version/src/lib.rs +++ b/core/sr-version/src/lib.rs @@ -25,13 +25,13 @@ use std::fmt; #[cfg(feature = "std")] use std::collections::HashSet; #[cfg(feature = "std")] -use runtime_primitives::traits::RuntimeApiInfo; +use sr_primitives::traits::RuntimeApiInfo; -use parity_codec::Encode; +use codec::Encode; #[cfg(feature = "std")] -use parity_codec::Decode; -use runtime_primitives::RuntimeString; -pub use runtime_primitives::create_runtime_str; +use codec::Decode; +use sr_primitives::RuntimeString; +pub use sr_primitives::create_runtime_str; /// The identity of a particular API interface that the runtime might provide. pub type ApiId = [u8; 8]; diff --git a/core/state-db/Cargo.toml b/core/state-db/Cargo.toml index a8dad1e84e0393c274f7ea8a0095399d579e7d21..332751c927f5d1ca65398def6578fe4489c5f877 100644 --- a/core/state-db/Cargo.toml +++ b/core/state-db/Cargo.toml @@ -5,10 +5,10 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.8.0" +parking_lot = "0.9.0" log = "0.4" primitives = { package = "substrate-primitives", path = "../../core/primitives" } -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } [dev-dependencies] env_logger = "0.6" diff --git a/core/state-db/src/lib.rs b/core/state-db/src/lib.rs index 8986dda32d7ca007a3c2e678e62faebf288ee0d5..81772e554bc572849a79d257a1e9a420b4b2644d 100644 --- a/core/state-db/src/lib.rs +++ b/core/state-db/src/lib.rs @@ -35,9 +35,8 @@ mod pruning; use std::fmt; use parking_lot::RwLock; -use parity_codec as codec; use codec::Codec; -use std::collections::{VecDeque, HashMap, hash_map::Entry}; +use std::collections::{HashMap, hash_map::Entry}; use noncanonical::NonCanonicalOverlay; use pruning::RefWindow; use log::trace; @@ -71,26 +70,35 @@ pub enum Error { /// Database backend error. Db(E), /// `Codec` decoding error. - Decoding, + Decoding(codec::Error), /// Trying to canonicalize invalid block. InvalidBlock, /// Trying to insert block with invalid number. InvalidBlockNumber, /// Trying to insert block with unknown parent. InvalidParent, - /// Canonicalization would discard pinned state. - DiscardingPinned, +} + +/// Pinning error type. +pub enum PinError { + /// Trying to pin invalid block. + InvalidBlock, +} + +impl From for Error { + fn from(x: codec::Error) -> Self { + Error::Decoding(x) + } } impl fmt::Debug for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Error::Db(e) => e.fmt(f), - Error::Decoding => write!(f, "Error decoding slicable value"), + Error::Decoding(e) => write!(f, "Error decoding slicable value: {}", e.what()), Error::InvalidBlock => write!(f, "Trying to canonicalize invalid block"), Error::InvalidBlockNumber => write!(f, "Trying to insert block with invalid number"), Error::InvalidParent => write!(f, "Trying to insert block with unknown parent"), - Error::DiscardingPinned => write!(f, "Trying to discard pinned state"), } } } @@ -168,7 +176,6 @@ fn to_meta_key(suffix: &[u8], data: &S) -> Vec { struct StateDbSync { mode: PruningMode, non_canonical: NonCanonicalOverlay, - canonicalization_queue: VecDeque, pruning: Option>, pinned: HashMap, } @@ -190,7 +197,6 @@ impl StateDbSync { non_canonical, pruning, pinned: Default::default(), - canonicalization_queue: Default::default(), }) } @@ -215,26 +221,16 @@ impl StateDbSync { if self.mode == PruningMode::ArchiveAll { return Ok(commit) } - self.canonicalization_queue.push_back(hash.clone()); - while let Some(hash) = self.canonicalization_queue.front().cloned() { - if self.pinned.contains_key(&hash) { - break; - } - match self.non_canonical.canonicalize(&hash, &self.pinned, &mut commit) { - Ok(()) => { - self.canonicalization_queue.pop_front(); - if self.mode == PruningMode::ArchiveCanonical { - commit.data.deleted.clear(); - } - } - Err(Error::DiscardingPinned) => { - break; + match self.non_canonical.canonicalize(&hash, &mut commit) { + Ok(()) => { + if self.mode == PruningMode::ArchiveCanonical { + commit.data.deleted.clear(); } - Err(e) => return Err(e), - }; - if let Some(ref mut pruning) = self.pruning { - pruning.note_canonical(&hash, &mut commit); } + Err(e) => return Err(e), + }; + if let Some(ref mut pruning) = self.pruning { + pruning.note_canonical(&hash, &mut commit); } self.prune(&mut commit); Ok(commit) @@ -291,9 +287,25 @@ impl StateDbSync { } } - pub fn pin(&mut self, hash: &BlockHash) { - trace!(target: "state-db", "Pinned block: {:?}", hash); - *self.pinned.entry(hash.clone()).or_default() += 1; + pub fn pin(&mut self, hash: &BlockHash) -> Result<(), PinError> { + match self.mode { + PruningMode::ArchiveAll => Ok(()), + PruningMode::ArchiveCanonical | PruningMode::Constrained(_) => { + if self.non_canonical.have_block(hash) || + self.pruning.as_ref().map_or(false, |pruning| pruning.have_block(hash)) + { + let refs = self.pinned.entry(hash.clone()).or_default(); + if *refs == 0 { + trace!(target: "state-db", "Pinned block: {:?}", hash); + self.non_canonical.pin(hash); + } + *refs += 1; + Ok(()) + } else { + Err(PinError::InvalidBlock) + } + } + } } pub fn unpin(&mut self, hash: &BlockHash) { @@ -303,6 +315,7 @@ impl StateDbSync { if *entry.get() == 0 { trace!(target: "state-db", "Unpinned block: {:?}", hash); entry.remove(); + self.non_canonical.unpin(hash); } else { trace!(target: "state-db", "Releasing reference for {:?}", hash); } @@ -367,7 +380,7 @@ impl StateDb { } /// Prevents pruning of specified block and its descendants. - pub fn pin(&self, hash: &BlockHash) { + pub fn pin(&self, hash: &BlockHash) -> Result<(), PinError> { self.db.write().pin(hash) } diff --git a/core/state-db/src/noncanonical.rs b/core/state-db/src/noncanonical.rs index 0d43389a0be975f1f7b502536aedb0edc622d6ef..58715715ccdd230c7acb8c315896a25b55159046 100644 --- a/core/state-db/src/noncanonical.rs +++ b/core/state-db/src/noncanonical.rs @@ -23,7 +23,7 @@ use std::fmt; use std::collections::{HashMap, VecDeque, hash_map::Entry}; use super::{Error, DBValue, ChangeSet, CommitSet, MetaDb, Hash, to_meta_key}; -use crate::codec::{Encode, Decode}; +use codec::{Encode, Decode}; use log::trace; const NON_CANONICAL_JOURNAL: &[u8] = b"noncanonical_journal"; @@ -37,6 +37,7 @@ pub struct NonCanonicalOverlay { pending_canonicalizations: Vec, pending_insertions: Vec, values: HashMap, //ref counted + pinned: HashMap>, //would be deleted but kept around because block is pinned } #[derive(Encode, Decode)] @@ -67,14 +68,21 @@ fn insert_values(values: &mut HashMap, inserted: } } -fn discard_values(values: &mut HashMap, inserted: Vec) { +fn discard_values( + values: &mut HashMap, + inserted: Vec, + mut into: Option<&mut HashMap>, +) { for k in inserted { match values.entry(k) { Entry::Occupied(mut e) => { let (ref mut counter, _) = e.get_mut(); *counter -= 1; if *counter == 0 { - e.remove(); + let (key, (_, value)) = e.remove_entry(); + if let Some(ref mut into) = into { + into.insert(key, value); + } } }, Entry::Vacant(_) => { @@ -89,8 +97,9 @@ fn discard_descendants( mut values: &mut HashMap, index: usize, parents: &mut HashMap, + pinned: &mut HashMap>, hash: &BlockHash, - ) { +) { let mut discarded = Vec::new(); if let Some(level) = levels.get_mut(index) { *level = level.drain(..).filter_map(|overlay| { @@ -98,7 +107,7 @@ fn discard_descendants( if parent == *hash { parents.remove(&overlay.hash); discarded.push(overlay.hash); - discard_values(&mut values, overlay.inserted); + discard_values(&mut values, overlay.inserted, pinned.get_mut(hash)); None } else { Some(overlay) @@ -106,7 +115,7 @@ fn discard_descendants( }).collect(); } for hash in discarded { - discard_descendants(levels, values, index + 1, parents, &hash); + discard_descendants(levels, values, index + 1, parents, pinned, &hash); } } @@ -116,7 +125,7 @@ impl NonCanonicalOverlay { let last_canonicalized = db.get_meta(&to_meta_key(LAST_CANONICAL, &())) .map_err(|e| Error::Db(e))?; let last_canonicalized = match last_canonicalized { - Some(buffer) => Some(<(BlockHash, u64)>::decode(&mut buffer.as_slice()).ok_or(Error::Decoding)?), + Some(buffer) => Some(<(BlockHash, u64)>::decode(&mut buffer.as_slice())?), None => None, }; let mut levels = VecDeque::new(); @@ -134,7 +143,7 @@ impl NonCanonicalOverlay { let journal_key = to_journal_key(block, index); match db.get_meta(&journal_key).map_err(|e| Error::Db(e))? { Some(record) => { - let record: JournalRecord = Decode::decode(&mut record.as_slice()).ok_or(Error::Decoding)?; + let record: JournalRecord = Decode::decode(&mut record.as_slice())?; let inserted = record.inserted.iter().map(|(k, _)| k.clone()).collect(); let overlay = BlockOverlay { hash: record.hash.clone(), @@ -166,6 +175,7 @@ impl NonCanonicalOverlay { parents, pending_canonicalizations: Default::default(), pending_insertions: Default::default(), + pinned: Default::default(), values: values, }) } @@ -278,7 +288,6 @@ impl NonCanonicalOverlay { pub fn canonicalize( &mut self, hash: &BlockHash, - pinned: &HashMap, commit: &mut CommitSet, ) -> Result<(), Error> { trace!(target: "state-db", "Canonicalizing {:?}", hash); @@ -303,13 +312,6 @@ impl NonCanonicalOverlay { discarded_blocks.push(overlay.hash.clone()); } - for hash in discarded_blocks.into_iter() { - if pinned.contains_key(&hash) { - trace!(target: "state-db", "Refusing to discard pinned state {:?}", hash); - return Err(Error::DiscardingPinned) - } - } - // get the one we need to canonicalize let overlay = &level[index]; commit.data.inserted.extend(overlay.inserted.iter() @@ -339,9 +341,16 @@ impl NonCanonicalOverlay { for (i, overlay) in level.into_iter().enumerate() { self.parents.remove(&overlay.hash); if i != index { - discard_descendants(&mut self.levels, &mut self.values, 0, &mut self.parents, &overlay.hash); + discard_descendants( + &mut self.levels, + &mut self.values, + 0, + &mut self.parents, + &mut self.pinned, + &overlay.hash, + ); } - discard_values(&mut self.values, overlay.inserted); + discard_values(&mut self.values, overlay.inserted, self.pinned.get_mut(&overlay.hash)); } } if let Some(hash) = last { @@ -355,6 +364,11 @@ impl NonCanonicalOverlay { if let Some((_, value)) = self.values.get(&key) { return Some(value.clone()); } + for pinned in self.pinned.values() { + if let Some(value) = pinned.get(&key) { + return Some(value.clone()); + } + } None } @@ -371,7 +385,7 @@ impl NonCanonicalOverlay { for overlay in level.into_iter() { commit.meta.deleted.push(overlay.journal_key); self.parents.remove(&overlay.hash); - discard_values(&mut self.values, overlay.inserted); + discard_values(&mut self.values, overlay.inserted, None); } commit }) @@ -388,7 +402,7 @@ impl NonCanonicalOverlay { .expect("Hash is added in insert"); let overlay = self.levels[level_index].pop().expect("Empty levels are not allowed in self.levels"); - discard_values(&mut self.values, overlay.inserted); + discard_values(&mut self.values, overlay.inserted, None); if self.levels[level_index].is_empty() { debug_assert_eq!(level_index, self.levels.len() - 1); self.levels.pop_back(); @@ -407,11 +421,21 @@ impl NonCanonicalOverlay { self.pending_canonicalizations.clear(); self.revert_insertions(); } + + /// Pin state values in memory + pub fn pin(&mut self, hash: &BlockHash) { + self.pinned.insert(hash.clone(), HashMap::default()); + } + + /// Discard pinned state + pub fn unpin(&mut self, hash: &BlockHash) { + self.pinned.remove(hash); + } } #[cfg(test)] mod tests { - use std::{collections::HashMap, io}; + use std::io; use primitives::H256; use super::{NonCanonicalOverlay, to_journal_key}; use crate::{ChangeSet, CommitSet}; @@ -436,7 +460,7 @@ mod tests { let db = make_db(&[]); let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); let mut commit = CommitSet::default(); - overlay.canonicalize::(&H256::default(), &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&H256::default(), &mut commit).unwrap(); } #[test] @@ -481,7 +505,7 @@ mod tests { let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); overlay.insert::(&h1, 1, &H256::default(), ChangeSet::default()).unwrap(); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h2, &mut commit).unwrap(); } #[test] @@ -497,7 +521,7 @@ mod tests { assert_eq!(insertion.meta.deleted.len(), 0); db.commit(&insertion); let mut finalization = CommitSet::default(); - overlay.canonicalize::(&h1, &HashMap::default(), &mut finalization).unwrap(); + overlay.canonicalize::(&h1, &mut finalization).unwrap(); assert_eq!(finalization.data.inserted.len(), changeset.inserted.len()); assert_eq!(finalization.data.deleted.len(), changeset.deleted.len()); assert_eq!(finalization.meta.inserted.len(), 1); @@ -531,7 +555,7 @@ mod tests { db.commit(&overlay.insert::(&h1, 10, &H256::default(), make_changeset(&[3, 4], &[2])).unwrap()); db.commit(&overlay.insert::(&h2, 11, &h1, make_changeset(&[5], &[3])).unwrap()); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h1, &mut commit).unwrap(); db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); @@ -558,7 +582,7 @@ mod tests { assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 2); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h1, &mut commit).unwrap(); db.commit(&commit); assert!(contains(&overlay, 5)); assert_eq!(overlay.levels.len(), 2); @@ -569,7 +593,7 @@ mod tests { assert!(!contains(&overlay, 5)); assert!(contains(&overlay, 7)); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h2, &mut commit).unwrap(); db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); @@ -588,7 +612,7 @@ mod tests { db.commit(&overlay.insert::(&h_2, 1, &H256::default(), c_2).unwrap()); assert!(contains(&overlay, 1)); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h_1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h_1, &mut commit).unwrap(); db.commit(&commit); assert!(contains(&overlay, 1)); overlay.apply_pending(); @@ -607,8 +631,8 @@ mod tests { db.commit(&overlay.insert::(&h2, 2, &h1, changeset.clone()).unwrap()); overlay.apply_pending(); let mut commit = CommitSet::default(); - overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); - overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h1, &mut commit).unwrap(); + overlay.canonicalize::(&h2, &mut commit).unwrap(); db.commit(&commit); db.commit(&overlay.insert::(&h3, 3, &h2, changeset.clone()).unwrap()); overlay.apply_pending(); @@ -679,7 +703,7 @@ mod tests { // canonicalize 1. 2 and all its children should be discarded let mut commit = CommitSet::default(); - overlay.canonicalize::(&h_1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h_1, &mut commit).unwrap(); db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 2); @@ -698,14 +722,9 @@ mod tests { assert!(db.get_meta(&to_journal_key(2, 2)).unwrap().is_none()); assert!(db.get_meta(&to_journal_key(2, 3)).unwrap().is_none()); - // check that discarding pinned state produces an error. - let mut commit = CommitSet::default(); - let pinned = vec![(h_1_1_1, 1)].into_iter().collect(); - assert!(overlay.canonicalize::(&h_1_2, &pinned, &mut commit).is_err()); - // canonicalize 1_2. 1_1 and all its children should be discarded let mut commit = CommitSet::default(); - overlay.canonicalize::(&h_1_2, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h_1_2, &mut commit).unwrap(); db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); @@ -722,7 +741,7 @@ mod tests { // canonicalize 1_2_2 let mut commit = CommitSet::default(); - overlay.canonicalize::(&h_1_2_2, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h_1_2_2, &mut commit).unwrap(); db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); @@ -777,5 +796,29 @@ mod tests { assert_eq!(overlay.levels.len(), 0); assert_eq!(overlay.parents.len(), 0); } -} + #[test] + fn keeps_pinned() { + let mut db = make_db(&[]); + + // - 1 - 1_1 + // \ 1_2 + + let (h_1, c_1) = (H256::random(), make_changeset(&[1], &[])); + let (h_2, c_2) = (H256::random(), make_changeset(&[2], &[])); + + let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); + db.commit(&overlay.insert::(&h_1, 1, &H256::default(), c_1).unwrap()); + db.commit(&overlay.insert::(&h_2, 1, &H256::default(), c_2).unwrap()); + + overlay.pin(&h_1); + + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_2, &mut commit).unwrap(); + db.commit(&commit); + overlay.apply_pending(); + assert!(contains(&overlay, 1)); + overlay.unpin(&h_1); + assert!(!contains(&overlay, 1)); + } +} diff --git a/core/state-db/src/pruning.rs b/core/state-db/src/pruning.rs index 078745c7a264464b4ed58fb3ac3c90224602a9bd..21f472fe69da9e18561d22b090019fa6fee1b9b1 100644 --- a/core/state-db/src/pruning.rs +++ b/core/state-db/src/pruning.rs @@ -23,7 +23,7 @@ //! The changes are journaled in the DB. use std::collections::{HashMap, HashSet, VecDeque}; -use crate::codec::{Encode, Decode}; +use codec::{Encode, Decode}; use crate::{CommitSet, Error, MetaDb, to_meta_key, Hash}; use log::{trace, warn}; @@ -69,7 +69,7 @@ impl RefWindow { let last_pruned = db.get_meta(&to_meta_key(LAST_PRUNED, &())) .map_err(|e| Error::Db(e))?; let pending_number: u64 = match last_pruned { - Some(buffer) => u64::decode(&mut buffer.as_slice()).ok_or(Error::Decoding)? + 1, + Some(buffer) => u64::decode(&mut buffer.as_slice())? + 1, None => 0, }; let mut block = pending_number; @@ -86,7 +86,7 @@ impl RefWindow { let journal_key = to_journal_key(block); match db.get_meta(&journal_key).map_err(|e| Error::Db(e))? { Some(record) => { - let record: JournalRecord = Decode::decode(&mut record.as_slice()).ok_or(Error::Decoding)?; + let record: JournalRecord = Decode::decode(&mut record.as_slice())?; trace!(target: "state-db", "Pruning journal entry {} ({} inserted, {} deleted)", block, record.inserted.len(), record.deleted.len()); pruning.import(&record.hash, journal_key, record.inserted.into_iter(), record.deleted); }, diff --git a/core/state-machine/Cargo.toml b/core/state-machine/Cargo.toml index bcb471d5306db5c76a9228606de83c590d72085c..bf5b96e43675a70ed12ce00f53b314dfb0b8d71e 100644 --- a/core/state-machine/Cargo.toml +++ b/core/state-machine/Cargo.toml @@ -7,15 +7,18 @@ edition = "2018" [dependencies] log = "0.4" -parking_lot = "0.8.0" -hash-db = "0.14.0" -trie-db = "0.14.0" -trie-root = "0.14.0" +parking_lot = "0.9.0" +hash-db = "0.15.0" +trie-db = "0.15.0" +trie-root = "0.15.0" trie = { package = "substrate-trie", path = "../trie" } primitives = { package = "substrate-primitives", path = "../primitives" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } num-traits = "0.2" [dev-dependencies] hex-literal = "0.2.0" + +[features] +default = [] diff --git a/core/state-machine/src/backend.rs b/core/state-machine/src/backend.rs index c86c802bfbd1b1cf3195eee30a86ec5fa14ca6cd..0feb6e84d039e2102ac278c46fec09c2153647ac 100644 --- a/core/state-machine/src/backend.rs +++ b/core/state-machine/src/backend.rs @@ -24,7 +24,8 @@ use log::warn; use hash_db::Hasher; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::TrieBackendStorage; -use trie::{TrieDBMut, TrieMut, MemoryDB, trie_root, child_trie_root, default_child_trie_root}; +use trie::{TrieMut, MemoryDB, child_trie_root, default_child_trie_root, TrieConfiguration}; +use trie::trie_types::{TrieDBMut, Layout}; /// A state backend is used to read state data and can have changes committed /// to it. @@ -69,10 +70,14 @@ pub trait Backend { /// Retrieve all entries keys of child storage and call `f` for each of those keys. fn for_keys_in_child_storage(&self, storage_key: &[u8], f: F); - /// Retrieve all entries keys of which start with the given prefix and + /// Retrieve all entries keys which start with the given prefix and /// call `f` for each of those keys. fn for_keys_with_prefix(&self, prefix: &[u8], f: F); + /// Retrieve all child entries keys which start with the given prefix and + /// call `f` for each of those keys. + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F); + /// Calculate the storage root, with given delta over what is already stored in /// the backend, and produce a "transaction" that can be used to commit. /// Does not include child storage updates. @@ -102,11 +107,7 @@ pub trait Backend { /// Get all keys of child storage with given prefix fn child_keys(&self, child_storage_key: &[u8], prefix: &[u8]) -> Vec> { let mut all = Vec::new(); - self.for_keys_in_child_storage(child_storage_key, |k| { - if k.starts_with(prefix) { - all.push(k.to_vec()); - } - }); + self.for_child_keys_with_prefix(child_storage_key, prefix, |k| all.push(k.to_vec())); all } @@ -247,6 +248,25 @@ impl From>, HashMap, Vec>>> for In } } +impl From<( + HashMap, Vec>, + HashMap, HashMap, Vec>>, +)> for InMemory { + fn from(inners: ( + HashMap, Vec>, + HashMap, HashMap, Vec>>, + )) -> Self { + let mut inner: HashMap>, HashMap, Vec>> + = inners.1.into_iter().map(|(k, v)| (Some(k), v)).collect(); + inner.insert(None, inners.0); + InMemory { + inner: inner, + trie: None, + _hasher: PhantomData, + } + } +} + impl From, Vec>> for InMemory { fn from(inner: HashMap, Vec>) -> Self { let mut expanded = HashMap::new(); @@ -305,6 +325,11 @@ impl Backend for InMemory { self.inner.get(&Some(storage_key.to_vec())).map(|map| map.keys().for_each(|k| f(&k))); } + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + self.inner.get(&Some(storage_key.to_vec())) + .map(|map| map.keys().filter(|key| key.starts_with(prefix)).map(|k| &**k).for_each(f)); + } + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)>, @@ -315,7 +340,7 @@ impl Backend for InMemory { .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); let transaction: Vec<_> = delta.into_iter().collect(); - let root = trie_root::(existing_pairs.chain(transaction.iter().cloned()) + let root = Layout::::trie_root(existing_pairs.chain(transaction.iter().cloned()) .collect::>() .into_iter() .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) @@ -338,7 +363,7 @@ impl Backend for InMemory { .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); let transaction: Vec<_> = delta.into_iter().collect(); - let root = child_trie_root::( + let root = child_trie_root::, _, _, _>( &storage_key, existing_pairs.chain(transaction.iter().cloned()) .collect::>() @@ -348,7 +373,7 @@ impl Backend for InMemory { let full_transaction = transaction.into_iter().map(|(k, v)| (Some(storage_key.clone()), k, v)).collect(); - let is_default = root == default_child_trie_root::(&storage_key); + let is_default = root == default_child_trie_root::>(&storage_key); (root, is_default, full_transaction) } diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index e922db260cf02bb1344b8c0c786b29efd32173f9..1d36a0ddad51d1afe6d87cee6594031dc6c53a1d 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -20,10 +20,10 @@ use std::collections::HashMap; use std::iter::FromIterator; use crate::backend::{Backend, InMemory}; use hash_db::Hasher; -use trie::trie_root; +use trie::{TrieConfiguration, default_child_trie_root}; +use trie::trie_types::Layout; use primitives::offchain; -use primitives::storage::well_known_keys::{HEAP_PAGES, is_child_storage_key}; -use parity_codec::Encode; +use primitives::storage::well_known_keys::is_child_storage_key; use super::{ChildStorageKey, Externalities}; use log::warn; @@ -35,17 +35,12 @@ pub struct BasicExternalities { } impl BasicExternalities { - /// Create a new instance of `BasicExternalities` - pub fn new(top: HashMap, Vec>) -> Self { - Self::new_with_children(top, Default::default()) - } - /// Create a new instance of `BasicExternalities` with children - pub fn new_with_children( - mut top: HashMap, Vec>, + /// Create a new instance of `BasicExternalities` + pub fn new( + top: HashMap, Vec>, children: HashMap, HashMap, Vec>>, ) -> Self { - top.insert(HEAP_PAGES.to_vec(), 8u64.encode()); BasicExternalities { top, children, @@ -81,7 +76,7 @@ impl FromIterator<(Vec, Vec)> for BasicExternalities { } impl Default for BasicExternalities { - fn default() -> Self { Self::new(Default::default()) } + fn default() -> Self { Self::new(Default::default(), Default::default()) } } impl From, Vec>> for BasicExternalities { @@ -106,6 +101,10 @@ impl Externalities for BasicExternalities where H::Out: Ord { self.children.get(storage_key.as_ref()).and_then(|child| child.get(key)).cloned() } + fn original_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { + Externalities::::child_storage(self, storage_key, key) + } + fn place_storage(&mut self, key: Vec, maybe_value: Option>) { if is_child_storage_key(&key) { warn!(target: "trie", "Refuse to set child storage key via main storage"); @@ -148,10 +147,33 @@ impl Externalities for BasicExternalities where H::Out: Ord { self.top.retain(|key, _| !key.starts_with(prefix)); } + fn clear_child_prefix(&mut self, storage_key: ChildStorageKey, prefix: &[u8]) { + if let Some(child) = self.children.get_mut(storage_key.as_ref()) { + child.retain(|key, _| !key.starts_with(prefix)); + } + } + fn chain_id(&self) -> u64 { 42 } fn storage_root(&mut self) -> H::Out { - trie_root::(self.top.clone()) + let mut top = self.top.clone(); + let keys: Vec<_> = self.children.keys().map(|k| k.to_vec()).collect(); + // Single child trie implementation currently allows using the same child + // empty root for all child trie. Using null storage key until multiple + // type of child trie support. + let empty_hash = default_child_trie_root::>(&[]); + for storage_key in keys { + let child_root = self.child_storage_root( + ChildStorageKey::::from_slice(storage_key.as_slice()) + .expect("Map only feed by valid keys; qed") + ); + if &empty_hash[..] == &child_root[..] { + top.remove(&storage_key); + } else { + top.insert(storage_key, child_root); + } + } + Layout::::trie_root(self.top.clone()) } fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec { @@ -160,7 +182,7 @@ impl Externalities for BasicExternalities where H::Out: Ord { InMemory::::default().child_storage_root(storage_key.as_ref(), delta).0 } else { - vec![] + default_child_trie_root::>(storage_key.as_ref()) } } @@ -169,7 +191,12 @@ impl Externalities for BasicExternalities where H::Out: Ord { } fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { - warn!("Call to non-existent out offchain externalities set."); + warn!("Call to non-existent offchain externalities set."); + None + } + + fn keystore(&self) -> Option { + warn!("Call to non-existent keystore."); None } } @@ -188,7 +215,8 @@ mod tests { ext.set_storage(b"doe".to_vec(), b"reindeer".to_vec()); ext.set_storage(b"dog".to_vec(), b"puppy".to_vec()); ext.set_storage(b"dogglesworth".to_vec(), b"cat".to_vec()); - const ROOT: [u8; 32] = hex!("0b33ed94e74e0f8e92a55923bece1ed02d16cf424e124613ddebc53ac3eeeabe"); + const ROOT: [u8; 32] = hex!("39245109cef3758c2eed2ccba8d9b370a917850af3824bc8348d505df2c298fa"); + assert_eq!(ext.storage_root(), H256::from(ROOT)); } @@ -207,7 +235,7 @@ mod tests { fn children_works() { let child_storage = b":child_storage:default:test".to_vec(); - let mut ext = BasicExternalities::new_with_children( + let mut ext = BasicExternalities::new( Default::default(), map![ child_storage.clone() => map![ @@ -231,4 +259,15 @@ mod tests { ext.kill_child_storage(child()); assert_eq!(ext.child_storage(child(), b"doe"), None); } + + #[test] + fn basic_externalities_is_empty() { + // Make sure no values are set by default in `BasicExternalities`. + let (storage, child_storage) = BasicExternalities::new( + Default::default(), + Default::default(), + ).into_storages(); + assert!(storage.is_empty()); + assert!(child_storage.is_empty()); + } } diff --git a/core/state-machine/src/changes_trie/build.rs b/core/state-machine/src/changes_trie/build.rs index d32d28906fb48eb0f37345df3c32877800b1d66e..e1e3f6a808e34102fcd21e92deaa2b3c39e59f4d 100644 --- a/core/state-machine/src/changes_trie/build.rs +++ b/core/state-machine/src/changes_trie/build.rs @@ -18,7 +18,7 @@ use std::collections::BTreeMap; use std::collections::btree_map::Entry; -use parity_codec::Decode; +use codec::Decode; use hash_db::Hasher; use num_traits::One; use crate::backend::Backend; @@ -156,13 +156,13 @@ fn prepare_digest_input<'a, S, H, Number>( let extrinsic_prefix = ExtrinsicIndex::key_neutral_prefix(digest_build_block.clone()); trie_storage.for_keys_with_prefix(&extrinsic_prefix, |key| - if let Some(InputKey::ExtrinsicIndex::(trie_key)) = Decode::decode(&mut &key[..]) { + if let Ok(InputKey::ExtrinsicIndex::(trie_key)) = Decode::decode(&mut &key[..]) { insert_to_map(trie_key.key); }); let digest_prefix = DigestIndex::key_neutral_prefix(digest_build_block.clone()); trie_storage.for_keys_with_prefix(&digest_prefix, |key| - if let Some(InputKey::DigestIndex::(trie_key)) = Decode::decode(&mut &key[..]) { + if let Ok(InputKey::DigestIndex::(trie_key)) = Decode::decode(&mut &key[..]) { insert_to_map(trie_key.key); }); @@ -173,7 +173,7 @@ fn prepare_digest_input<'a, S, H, Number>( #[cfg(test)] mod test { - use parity_codec::Encode; + use codec::Encode; use primitives::Blake2Hasher; use primitives::storage::well_known_keys::EXTRINSIC_INDEX; use crate::backend::InMemory; diff --git a/core/state-machine/src/changes_trie/changes_iterator.rs b/core/state-machine/src/changes_trie/changes_iterator.rs index ee4b9cc19b8f00089dd682d756a1e0b44adfdfb2..f7342cc60ff32dfc31c8f9cc2832a911a3360f17 100644 --- a/core/state-machine/src/changes_trie/changes_iterator.rs +++ b/core/state-machine/src/changes_trie/changes_iterator.rs @@ -19,8 +19,8 @@ use std::cell::RefCell; use std::collections::VecDeque; -use parity_codec::{Decode, Encode}; -use hash_db::{HashDB, Hasher}; +use codec::{Decode, Encode}; +use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; use num_traits::One; use trie::{Recorder, MemoryDB}; use crate::changes_trie::{AnchorBlockId, Configuration, RootsStorage, Storage, BlockNumber}; @@ -115,7 +115,7 @@ pub fn key_changes_proof_check, H: Hasher, Number: Bl let mut proof_db = MemoryDB::::default(); for item in proof { - proof_db.insert(&[], &item); + proof_db.insert(EMPTY_PREFIX, &item); } let proof_db = InMemoryStorage::with_db(proof_db); @@ -249,8 +249,7 @@ impl<'a, RS, S, H, Number> DrilldownIteratorEssence<'a, RS, S, H, Number> let extrinsics_key = ExtrinsicIndex { block: block.clone(), key: self.key.to_vec() }.encode(); let extrinsics = trie_reader(&self.storage, trie_root, &extrinsics_key); if let Some(extrinsics) = extrinsics? { - let extrinsics: Option = Decode::decode(&mut &extrinsics[..]); - if let Some(extrinsics) = extrinsics { + if let Ok(extrinsics) = ExtrinsicIndexValue::decode(&mut &extrinsics[..]) { self.extrinsics.extend(extrinsics.into_iter().rev().map(|e| (block.clone(), e))); } } @@ -259,8 +258,7 @@ impl<'a, RS, S, H, Number> DrilldownIteratorEssence<'a, RS, S, H, Number> let blocks_key = DigestIndex { block: block.clone(), key: self.key.to_vec() }.encode(); let blocks = trie_reader(&self.storage, trie_root, &blocks_key); if let Some(blocks) = blocks? { - let blocks: Option> = Decode::decode(&mut &blocks[..]); - if let Some(blocks) = blocks { + if let Ok(blocks) = >::decode(&mut &blocks[..]) { // filter level0 blocks here because we tend to use digest blocks, // AND digest block changes could also include changes for out-of-range blocks let begin = self.begin.clone(); diff --git a/core/state-machine/src/changes_trie/input.rs b/core/state-machine/src/changes_trie/input.rs index ae939c028b3e1e02aaf4e504eb5e8db3820a459e..8da4f1a3862cb0cb813cf36287ce122cfa0c3d71 100644 --- a/core/state-machine/src/changes_trie/input.rs +++ b/core/state-machine/src/changes_trie/input.rs @@ -16,7 +16,7 @@ //! Different types of changes trie input pairs. -use parity_codec::{Decode, Encode, Input, Output}; +use codec::{Decode, Encode, Input, Output, Error}; use crate::changes_trie::BlockNumber; /// Key of { changed key => set of extrinsic indices } mapping. @@ -95,6 +95,8 @@ impl Encode for ExtrinsicIndex { } } +impl codec::EncodeLike for ExtrinsicIndex {} + impl DigestIndex { pub fn key_neutral_prefix(block: Number) -> Vec { let mut prefix = vec![2]; @@ -112,18 +114,20 @@ impl Encode for DigestIndex { } } +impl codec::EncodeLike for DigestIndex {} + impl Decode for InputKey { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> Result { match input.read_byte()? { - 1 => Some(InputKey::ExtrinsicIndex(ExtrinsicIndex { + 1 => Ok(InputKey::ExtrinsicIndex(ExtrinsicIndex { block: Decode::decode(input)?, key: Decode::decode(input)?, })), - 2 => Some(InputKey::DigestIndex(DigestIndex { + 2 => Ok(InputKey::DigestIndex(DigestIndex { block: Decode::decode(input)?, key: Decode::decode(input)?, })), - _ => None, + _ => Err("Invalid input key variant".into()), } } } diff --git a/core/state-machine/src/changes_trie/mod.rs b/core/state-machine/src/changes_trie/mod.rs index ab36eb6423b2e4fd865341be77ee7372c67905da..b29a515d74b4a3e2eb22afe6725e635e28ce1c0c 100644 --- a/core/state-machine/src/changes_trie/mod.rs +++ b/core/state-machine/src/changes_trie/mod.rs @@ -46,14 +46,15 @@ pub use self::storage::InMemoryStorage; pub use self::changes_iterator::{key_changes, key_changes_proof, key_changes_proof_check}; pub use self::prune::{prune, oldest_non_pruned_trie}; -use hash_db::Hasher; +use hash_db::{Hasher, Prefix}; use crate::backend::Backend; use num_traits::{One, Zero}; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use primitives; use crate::changes_trie::build::prepare_input; use crate::overlayed_changes::OverlayedChanges; -use trie::{MemoryDB, TrieDBMut, TrieMut, DBValue}; +use trie::{MemoryDB, DBValue, TrieMut}; +use trie::trie_types::TrieDBMut; /// Changes that are made outside of extrinsics are marked with this index; pub const NO_EXTRINSIC_INDEX: u32 = 0xffffffff; @@ -108,7 +109,7 @@ pub trait RootsStorage: Send + Sync { /// Changes trie storage. Provides access to trie roots and trie nodes. pub trait Storage: RootsStorage { /// Get a trie node. - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String>; } /// Changes trie storage -> trie backend essence adapter. @@ -117,7 +118,7 @@ pub struct TrieBackendStorageAdapter<'a, H: Hasher, Number: BlockNumber>(pub &'a impl<'a, H: Hasher, N: BlockNumber> crate::TrieBackendStorage for TrieBackendStorageAdapter<'a, H, N> { type Overlay = trie::MemoryDB; - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { self.0.get(key, prefix) } } diff --git a/core/state-machine/src/changes_trie/storage.rs b/core/state-machine/src/changes_trie/storage.rs index 8da205251532c595b986a71d54f65873f12382f9..bb2256235a1a719bb6312b95b9248d9b3c96f5d4 100644 --- a/core/state-machine/src/changes_trie/storage.rs +++ b/core/state-machine/src/changes_trie/storage.rs @@ -17,7 +17,7 @@ //! Changes trie storage utilities. use std::collections::BTreeMap; -use hash_db::Hasher; +use hash_db::{Hasher, Prefix}; use trie::DBValue; use trie::MemoryDB; use parking_lot::RwLock; @@ -101,7 +101,7 @@ impl InMemoryStorage { pub fn remove_from_storage(&self, keys: &HashSet) { let mut data = self.data.write(); for key in keys { - data.mdb.remove_and_purge(key, &[]); + data.mdb.remove_and_purge(key, hash_db::EMPTY_PREFIX); } } @@ -132,7 +132,7 @@ impl RootsStorage for InMemoryStorage } impl Storage for InMemoryStorage { - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { MemoryDB::::get(&self.data.read().mdb, key, prefix) } } @@ -151,7 +151,7 @@ impl<'a, H, Number, S> TrieBackendStorage for TrieBackendAdapter<'a, H, Numbe { type Overlay = MemoryDB; - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { self.storage.get(key, prefix) } } diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index 4ade53a6f1ae39af034b3ec9b566379b098c98bb..896b07c6473ffe93fb49fbe37e1b6e0ce196c425 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -22,9 +22,9 @@ use crate::backend::Backend; use crate::changes_trie::{Storage as ChangesTrieStorage, build_changes_trie}; use crate::{Externalities, OverlayedChanges, ChildStorageKey}; use hash_db::Hasher; -use primitives::offchain; -use primitives::storage::well_known_keys::is_child_storage_key; +use primitives::{offchain, storage::well_known_keys::is_child_storage_key, traits::BareCryptoStorePtr}; use trie::{MemoryDB, default_child_trie_root}; +use trie::trie_types::Layout; const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within runtime"; @@ -81,8 +81,10 @@ where changes_trie_transaction: Option<(MemoryDB, H::Out)>, /// Additional externalities for offchain workers. /// - /// If None, some methods from the trait might not supported. + /// If None, some methods from the trait might not be supported. offchain_externalities: Option<&'a mut O>, + /// The keystore that manages the keys of the node. + keystore: Option, /// Dummy usage of N arg. _phantom: ::std::marker::PhantomData, } @@ -102,6 +104,7 @@ where backend: &'a B, changes_trie_storage: Option<&'a T>, offchain_externalities: Option<&'a mut O>, + keystore: Option, ) -> Self { Ext { overlay, @@ -110,6 +113,7 @@ where changes_trie_storage, changes_trie_transaction: None, offchain_externalities, + keystore, _phantom: Default::default(), } } @@ -173,35 +177,51 @@ where N: crate::changes_trie::BlockNumber, { fn storage(&self, key: &[u8]) -> Option> { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.overlay.storage(key).map(|x| x.map(|x| x.to_vec())).unwrap_or_else(|| self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } fn storage_hash(&self, key: &[u8]) -> Option { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.overlay.storage(key).map(|x| x.map(|x| H::hash(x))).unwrap_or_else(|| self.backend.storage_hash(key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } fn original_storage(&self, key: &[u8]) -> Option> { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL) } fn original_storage_hash(&self, key: &[u8]) -> Option { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.backend.storage_hash(key).expect(EXT_NOT_ALLOWED_TO_FAIL) } fn child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.overlay.child_storage(storage_key.as_ref(), key).map(|x| x.map(|x| x.to_vec())).unwrap_or_else(|| self.backend.child_storage(storage_key.as_ref(), key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } + fn child_storage_hash(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option { + let _guard = panic_handler::AbortGuard::force_abort(); + self.overlay.child_storage(storage_key.as_ref(), key).map(|x| x.map(|x| H::hash(x))).unwrap_or_else(|| + self.backend.storage_hash(key).expect(EXT_NOT_ALLOWED_TO_FAIL)) + } + + fn original_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { + let _guard = panic_handler::AbortGuard::force_abort(); + self.backend.child_storage(storage_key.as_ref(), key).expect(EXT_NOT_ALLOWED_TO_FAIL) + } + + fn original_child_storage_hash(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option { + let _guard = panic_handler::AbortGuard::force_abort(); + self.backend.child_storage_hash(storage_key.as_ref(), key).expect(EXT_NOT_ALLOWED_TO_FAIL) + } + fn exists_storage(&self, key: &[u8]) -> bool { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); match self.overlay.storage(key) { Some(x) => x.is_some(), _ => self.backend.exists_storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL), @@ -209,7 +229,7 @@ where } fn exists_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> bool { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); match self.overlay.child_storage(storage_key.as_ref(), key) { Some(x) => x.is_some(), @@ -218,7 +238,7 @@ where } fn place_storage(&mut self, key: Vec, value: Option>) { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); if is_child_storage_key(&key) { warn!(target: "trie", "Refuse to directly set child storage key"); return; @@ -229,14 +249,14 @@ where } fn place_child_storage(&mut self, storage_key: ChildStorageKey, key: Vec, value: Option>) { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.mark_dirty(); self.overlay.set_child_storage(storage_key.into_owned(), key, value); } fn kill_child_storage(&mut self, storage_key: ChildStorageKey) { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.mark_dirty(); self.overlay.clear_child_storage(storage_key.as_ref()); @@ -246,7 +266,7 @@ where } fn clear_prefix(&mut self, prefix: &[u8]) { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); if is_child_storage_key(prefix) { warn!(target: "trie", "Refuse to directly clear prefix that is part of child storage key"); return; @@ -259,12 +279,22 @@ where }); } + fn clear_child_prefix(&mut self, storage_key: ChildStorageKey, prefix: &[u8]) { + let _guard = panic_handler::AbortGuard::force_abort(); + + self.mark_dirty(); + self.overlay.clear_child_prefix(storage_key.as_ref(), prefix); + self.backend.for_child_keys_with_prefix(storage_key.as_ref(), prefix, |key| { + self.overlay.set_child_storage(storage_key.as_ref().to_vec(), key.to_vec(), None); + }); + } + fn chain_id(&self) -> u64 { 42 } fn storage_root(&mut self) -> H::Out { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); if let Some((_, ref root)) = self.storage_transaction { return root.clone(); } @@ -272,7 +302,6 @@ where let child_storage_keys = self.overlay.prospective.children.keys() .chain(self.overlay.committed.children.keys()); - let child_delta_iter = child_storage_keys.map(|storage_key| (storage_key.clone(), self.overlay.committed.children.get(storage_key) .into_iter() @@ -292,12 +321,12 @@ where } fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); if self.storage_transaction.is_some() { self .storage(storage_key.as_ref()) .unwrap_or( - default_child_trie_root::(storage_key.as_ref()) + default_child_trie_root::>(storage_key.as_ref()) ) } else { let storage_key = storage_key.as_ref(); @@ -319,7 +348,7 @@ where } fn storage_changes_root(&mut self, parent_hash: H::Out) -> Result, ()> { - let _guard = panic_handler::AbortGuard::new(true); + let _guard = panic_handler::AbortGuard::force_abort(); self.changes_trie_transaction = build_changes_trie::<_, T, H, N>( self.backend, self.changes_trie_storage.clone(), @@ -332,12 +361,16 @@ where fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { self.offchain_externalities.as_mut().map(|x| &mut **x as _) } + + fn keystore(&self) -> Option { + self.keystore.clone() + } } #[cfg(test)] mod tests { use hex_literal::hex; - use parity_codec::Encode; + use codec::Encode; use primitives::{Blake2Hasher}; use primitives::storage::well_known_keys::EXTRINSIC_INDEX; use crate::backend::InMemory; @@ -374,7 +407,7 @@ mod tests { fn storage_changes_root_is_none_when_storage_is_not_provided() { let mut overlay = prepare_overlay_with_changes(); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, None, None); + let mut ext = TestExt::new(&mut overlay, &backend, None, None, None); assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None); } @@ -384,7 +417,7 @@ mod tests { overlay.changes_trie_config = None; let storage = TestChangesTrieStorage::with_blocks(vec![(100, Default::default())]); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); + let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None, None); assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None); } @@ -393,9 +426,11 @@ mod tests { let mut overlay = prepare_overlay_with_changes(); let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), - Some(hex!("5b829920b9c8d554a19ee2a1ba593c4f2ee6fc32822d083e04236d693e8358d5").into())); + let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None, None); + assert_eq!( + ext.storage_changes_root(Default::default()).unwrap(), + Some(hex!("bb0c2ef6e1d36d5490f9766cfcc7dfe2a6ca804504c3bb206053890d6dd02376").into()), + ); } #[test] @@ -404,8 +439,10 @@ mod tests { overlay.prospective.top.get_mut(&vec![1]).unwrap().value = None; let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), - Some(hex!("bcf494e41e29a15c9ae5caa053fe3cb8b446ee3e02a254efbdec7a19235b76e4").into())); + let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None, None); + assert_eq!( + ext.storage_changes_root(Default::default()).unwrap(), + Some(hex!("96f5aae4690e7302737b6f9b7f8567d5bbb9eac1c315f80101235a92d9ec27f4").into()), + ); } } diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index f151fedaf5132ba8d6a6ff7a357d52a896c0f06b..8c2046e5917c60a356b6b3af4c1614016e65b908 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -22,9 +22,10 @@ use std::{fmt, panic::UnwindSafe, result, marker::PhantomData}; use std::borrow::Cow; use log::warn; use hash_db::Hasher; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use primitives::{ - storage::well_known_keys, NativeOrEncoded, NeverNativeValue, offchain + storage::well_known_keys, NativeOrEncoded, NeverNativeValue, offchain, + traits::BareCryptoStorePtr, }; pub mod backend; @@ -38,7 +39,8 @@ mod trie_backend; mod trie_backend_essence; use overlayed_changes::OverlayedChangeSet; -pub use trie::{TrieMut, TrieDBMut, DBValue, MemoryDB}; +pub use trie::{TrieMut, DBValue, MemoryDB}; +pub use trie::trie_types::{Layout, TrieDBMut}; pub use testing::TestExternalities; pub use basic::BasicExternalities; pub use ext::Ext; @@ -60,6 +62,7 @@ pub use proving_backend::{ pub use trie_backend_essence::{TrieBackendStorage, Storage}; pub use trie_backend::TrieBackend; + /// A wrapper around a child storage key. /// /// This wrapper ensures that the child storage key is correct and properly used. It is @@ -71,7 +74,7 @@ pub struct ChildStorageKey<'a, H: Hasher> { impl<'a, H: Hasher> ChildStorageKey<'a, H> { fn new(storage_key: Cow<'a, [u8]>) -> Option { - if !trie::is_child_trie_key_valid::(&storage_key) { + if !trie::is_child_trie_key_valid::>(&storage_key) { return None; } @@ -152,15 +155,33 @@ pub trait Externalities { self.storage(key).map(|v| H::hash(&v)) } + /// Get child storage value hash. This may be optimized for large values. + fn child_storage_hash(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option { + self.child_storage(storage_key, key).map(|v| H::hash(&v)) + } + /// Read original runtime storage, ignoring any overlayed changes. fn original_storage(&self, key: &[u8]) -> Option>; + /// Read original runtime child storage, ignoring any overlayed changes. + fn original_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option>; + /// Get original storage value hash, ignoring any overlayed changes. /// This may be optimized for large values. fn original_storage_hash(&self, key: &[u8]) -> Option { self.original_storage(key).map(|v| H::hash(&v)) } + /// Get original child storage value hash, ignoring any overlayed changes. + /// This may be optimized for large values. + fn original_child_storage_hash( + &self, + storage_key: ChildStorageKey, + key: &[u8], + ) -> Option { + self.original_child_storage(storage_key, key).map(|v| H::hash(&v)) + } + /// Read child runtime storage. fn child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option>; @@ -200,6 +221,9 @@ pub trait Externalities { /// Clear storage entries which keys are start with the given prefix. fn clear_prefix(&mut self, prefix: &[u8]); + /// Clear child storage entries which keys are start with the given prefix. + fn clear_child_prefix(&mut self, storage_key: ChildStorageKey, prefix: &[u8]); + /// Set or clear a storage entry (`key`) of current contract being called (effective immediately). fn place_storage(&mut self, key: Vec, value: Option>); @@ -223,6 +247,9 @@ pub trait Externalities { /// Returns offchain externalities extension if present. fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities>; + + /// Returns the keystore. + fn keystore(&self) -> Option; } /// An implementation of offchain extensions that should never be triggered. @@ -236,51 +263,17 @@ impl NeverOffchainExt { } impl offchain::Externalities for NeverOffchainExt { - fn submit_transaction(&mut self, _extrinsic: Vec) -> Result<(), ()> { - unreachable!() - } - - fn new_crypto_key( - &mut self, - _crypto: offchain::CryptoKind, - ) -> Result { + fn is_validator(&self) -> bool { unreachable!() } - fn encrypt( - &mut self, - _key: Option, - _kind: offchain::CryptoKind, - _data: &[u8], - ) -> Result, ()> { - unreachable!() - } - - fn decrypt( - &mut self, - _key: Option, - _kind: offchain::CryptoKind, - _data: &[u8], - ) -> Result, ()> { - unreachable!() - } - - fn sign( - &mut self, - _key: Option, - _kind: offchain::CryptoKind, - _data: &[u8], - ) -> Result, ()> { + fn submit_transaction(&mut self, _extrinsic: Vec) -> Result<(), ()> { unreachable!() } - fn verify( - &mut self, - _key: Option, - _kind: offchain::CryptoKind, - _msg: &[u8], - _signature: &[u8], - ) -> Result { + fn network_state( + &self, + ) -> Result { unreachable!() } @@ -304,7 +297,7 @@ impl offchain::Externalities for NeverOffchainExt { &mut self, _kind: offchain::StorageKind, _key: &[u8], - _old_value: &[u8], + _old_value: Option<&[u8]>, _new_value: &[u8], ) -> bool { unreachable!() @@ -471,6 +464,7 @@ pub fn new<'a, H, N, B, T, O, Exec>( exec: &'a Exec, method: &'a str, call_data: &'a [u8], + keystore: Option, ) -> StateMachine<'a, H, N, B, T, O, Exec> { StateMachine { backend, @@ -480,6 +474,7 @@ pub fn new<'a, H, N, B, T, O, Exec>( exec, method, call_data, + keystore, _hasher: PhantomData, } } @@ -493,6 +488,7 @@ pub struct StateMachine<'a, H, N, B, T, O, Exec> { exec: &'a Exec, method: &'a str, call_data: &'a [u8], + keystore: Option, _hasher: PhantomData<(H, N)>, } @@ -550,6 +546,7 @@ impl<'a, H, N, B, T, O, Exec> StateMachine<'a, H, N, B, T, O, Exec> where self.backend, self.changes_trie_storage, self.offchain_ext.as_mut().map(|x| &mut **x), + self.keystore.clone(), ); let (result, was_native) = self.exec.call( &mut externalities, @@ -697,6 +694,7 @@ pub fn prove_execution( exec: &Exec, method: &str, call_data: &[u8], + keystore: Option, ) -> Result<(Vec, Vec>), Box> where B: Backend, @@ -706,7 +704,7 @@ where { let trie_backend = backend.as_trie_backend() .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; - prove_execution_on_trie_backend(trie_backend, overlay, exec, method, call_data) + prove_execution_on_trie_backend(trie_backend, overlay, exec, method, call_data, keystore) } /// Prove execution using the given trie backend, overlayed changes, and call executor. @@ -724,6 +722,7 @@ pub fn prove_execution_on_trie_backend( exec: &Exec, method: &str, call_data: &[u8], + keystore: Option, ) -> Result<(Vec, Vec>), Box> where S: trie_backend_essence::TrieBackendStorage, @@ -740,6 +739,7 @@ where exec, method, call_data, + keystore, _hasher: PhantomData, }; let (result, _, _) = sm.execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( @@ -759,6 +759,7 @@ pub fn execution_proof_check( exec: &Exec, method: &str, call_data: &[u8], + keystore: Option, ) -> Result, Box> where H: Hasher, @@ -766,7 +767,7 @@ where H::Out: Ord + 'static, { let trie_backend = create_proof_check_backend::(root.into(), proof)?; - execution_proof_check_on_trie_backend(&trie_backend, overlay, exec, method, call_data) + execution_proof_check_on_trie_backend(&trie_backend, overlay, exec, method, call_data, keystore) } /// Check execution proof on proving backend, generated by `prove_execution` call. @@ -776,6 +777,7 @@ pub fn execution_proof_check_on_trie_backend( exec: &Exec, method: &str, call_data: &[u8], + keystore: Option, ) -> Result, Box> where H: Hasher, @@ -790,6 +792,7 @@ where exec, method, call_data, + keystore, _hasher: PhantomData, }; sm.execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( @@ -928,7 +931,7 @@ pub(crate) fn set_changes_trie_config( ) -> Result<(), Box> { let config = match config { Some(v) => Some(Decode::decode(&mut &v[..]) - .ok_or_else(|| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), + .map_err(|_| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), None => None, }; @@ -962,7 +965,7 @@ where #[cfg(test)] mod tests { use std::collections::HashMap; - use parity_codec::Encode; + use codec::Encode; use overlayed_changes::OverlayedValue; use super::*; use super::backend::InMemory; @@ -1040,6 +1043,7 @@ mod tests { }, "test", &[], + None, ).execute( ExecutionStrategy::NativeWhenPossible ).unwrap().0, vec![66]); @@ -1061,6 +1065,7 @@ mod tests { }, "test", &[], + None, ).execute( ExecutionStrategy::NativeElseWasm ).unwrap().0, vec![66]); @@ -1082,6 +1087,7 @@ mod tests { }, "test", &[], + None, ).execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( ExecutionManager::Both(|we, _ne| { consensus_failed = true; @@ -1104,13 +1110,26 @@ mod tests { // fetch execution proof from 'remote' full node let remote_backend = trie_backend::tests::test_trie(); - let remote_root = remote_backend.storage_root(::std::iter::empty()).0; - let (remote_result, remote_proof) = prove_execution(remote_backend, - &mut Default::default(), &executor, "test", &[]).unwrap(); + let remote_root = remote_backend.storage_root(std::iter::empty()).0; + let (remote_result, remote_proof) = prove_execution( + remote_backend, + &mut Default::default(), + &executor, + "test", + &[], + None, + ).unwrap(); // check proof locally - let local_result = execution_proof_check::(remote_root, remote_proof, - &mut Default::default(), &executor, "test", &[]).unwrap(); + let local_result = execution_proof_check::( + remote_root, + remote_proof, + &mut Default::default(), + &executor, + "test", + &[], + None, + ).unwrap(); // check that both results are correct assert_eq!(remote_result, vec![66]); @@ -1141,7 +1160,13 @@ mod tests { { let changes_trie_storage = InMemoryChangesTrieStorage::::new(); - let mut ext = Ext::new(&mut overlay, backend, Some(&changes_trie_storage), NeverOffchainExt::new()); + let mut ext = Ext::new( + &mut overlay, + backend, + Some(&changes_trie_storage), + NeverOffchainExt::new(), + None, + ); ext.clear_prefix(b"ab"); } overlay.commit_prospective(); @@ -1170,7 +1195,8 @@ mod tests { &mut overlay, backend, Some(&changes_trie_storage), - NeverOffchainExt::new() + NeverOffchainExt::new(), + None, ); ext.set_child_storage( @@ -1242,41 +1268,47 @@ mod tests { #[test] fn cannot_change_changes_trie_config() { - assert!(new( - &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::::new()), - NeverOffchainExt::new(), - &mut Default::default(), - &DummyCodeExecutor { - change_changes_trie_config: true, - native_available: false, - native_succeeds: true, - fallback_succeeds: true, - }, - "test", - &[], - ).execute( - ExecutionStrategy::NativeWhenPossible - ).is_err()); + assert!( + new( + &trie_backend::tests::test_trie(), + Some(&InMemoryChangesTrieStorage::::new()), + NeverOffchainExt::new(), + &mut Default::default(), + &DummyCodeExecutor { + change_changes_trie_config: true, + native_available: false, + native_succeeds: true, + fallback_succeeds: true, + }, + "test", + &[], + None, + ) + .execute(ExecutionStrategy::NativeWhenPossible) + .is_err() + ); } #[test] fn cannot_change_changes_trie_config_with_native_else_wasm() { - assert!(new( - &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::::new()), - NeverOffchainExt::new(), - &mut Default::default(), - &DummyCodeExecutor { - change_changes_trie_config: true, - native_available: false, - native_succeeds: true, - fallback_succeeds: true, - }, - "test", - &[], - ).execute( - ExecutionStrategy::NativeElseWasm - ).is_err()); + assert!( + new( + &trie_backend::tests::test_trie(), + Some(&InMemoryChangesTrieStorage::::new()), + NeverOffchainExt::new(), + &mut Default::default(), + &DummyCodeExecutor { + change_changes_trie_config: true, + native_available: false, + native_succeeds: true, + fallback_succeeds: true, + }, + "test", + &[], + None, + ) + .execute(ExecutionStrategy::NativeElseWasm) + .is_err() + ); } } diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index c6d7ab89d3b37ea9f05ccb016f01fa7429d31634..9efafab20f57cdff0fc351e14efa1e4cf62ee5aa 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -18,7 +18,7 @@ #[cfg(test)] use std::iter::FromIterator; use std::collections::{HashMap, BTreeSet}; -use parity_codec::Decode; +use codec::Decode; use crate::changes_trie::{NO_EXTRINSIC_INDEX, Configuration as ChangesTrieConfig}; use primitives::storage::well_known_keys::EXTRINSIC_INDEX; @@ -220,6 +220,38 @@ impl OverlayedChanges { } } + pub(crate) fn clear_child_prefix(&mut self, storage_key: &[u8], prefix: &[u8]) { + let extrinsic_index = self.extrinsic_index(); + let map_entry = self.prospective.children.entry(storage_key.to_vec()).or_default(); + + for (key, entry) in map_entry.1.iter_mut() { + if key.starts_with(prefix) { + *entry = None; + + if let Some(extrinsic) = extrinsic_index { + map_entry.0.get_or_insert_with(Default::default) + .insert(extrinsic); + } + } + } + + if let Some(child_committed) = self.committed.children.get(storage_key) { + // Then do the same with keys from commited changes. + // NOTE that we are making changes in the prospective change set. + for key in child_committed.1.keys() { + if key.starts_with(prefix) { + let entry = map_entry.1.entry(key.clone()).or_default(); + *entry = None; + + if let Some(extrinsic) = extrinsic_index { + map_entry.0.get_or_insert_with(Default::default) + .insert(extrinsic); + } + } + } + } + } + /// Discard prospective changes to state. pub fn discard_prospective(&mut self) { self.prospective.clear(); @@ -267,7 +299,7 @@ impl OverlayedChanges { /// Inserts storage entry responsible for current extrinsic index. #[cfg(test)] pub(crate) fn set_extrinsic_index(&mut self, extrinsic_index: u32) { - use parity_codec::Encode; + use codec::Encode; self.prospective.top.insert(EXTRINSIC_INDEX.to_vec(), OverlayedValue { value: Some(extrinsic_index.encode()), extrinsics: None, @@ -284,7 +316,7 @@ impl OverlayedChanges { match self.changes_trie_config.is_some() { true => Some( self.storage(EXTRINSIC_INDEX) - .and_then(|idx| idx.and_then(|idx| Decode::decode(&mut &*idx))) + .and_then(|idx| idx.and_then(|idx| Decode::decode(&mut &*idx).ok())) .unwrap_or(NO_EXTRINSIC_INDEX)), false => None, } @@ -371,8 +403,10 @@ mod tests { &backend, Some(&changes_trie_storage), crate::NeverOffchainExt::new(), + None, ); - const ROOT: [u8; 32] = hex!("0b41e488cccbd67d1f1089592c2c235f5c5399b053f7fe9152dd4b5f279914cd"); + const ROOT: [u8; 32] = hex!("39245109cef3758c2eed2ccba8d9b370a917850af3824bc8348d505df2c298fa"); + assert_eq!(ext.storage_root(), H256::from(ROOT)); } diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index 19f779e067b2cc3b214703da3282f05a8de5daf6..5e8f618c826466a0b798e9f3512f4e1c2982e767 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -18,13 +18,13 @@ use std::{cell::RefCell, rc::Rc}; use log::debug; -use hash_db::Hasher; -use hash_db::HashDB; +use hash_db::{Hasher, HashDB, EMPTY_PREFIX}; use trie::{ - MemoryDB, PrefixedMemoryDB, TrieError, default_child_trie_root, + MemoryDB, PrefixedMemoryDB, default_child_trie_root, read_trie_value_with, read_child_trie_value_with, record_all_keys }; pub use trie::Recorder; +pub use trie::trie_types::{Layout, TrieError}; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::{Ephemeral, TrieBackendEssence, TrieBackendStorage}; use crate::{Error, ExecutionError, Backend}; @@ -50,11 +50,21 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> let map_e = |e| format!("Trie lookup error: {}", e); - read_trie_value_with::>(&eph, self.backend.root(), key, &mut *self.proof_recorder).map_err(map_e) + read_trie_value_with::, _, Ephemeral>( + &eph, + self.backend.root(), + key, + &mut *self.proof_recorder + ).map_err(map_e) } - pub fn child_storage(&mut self, storage_key: &[u8], key: &[u8]) -> Result>, String> { - let root = self.storage(storage_key)?.unwrap_or(default_child_trie_root::(storage_key)); + pub fn child_storage( + &mut self, + storage_key: &[u8], + key: &[u8] + ) -> Result>, String> { + let root = self.storage(storage_key)? + .unwrap_or(default_child_trie_root::>(storage_key)); let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new( @@ -64,7 +74,13 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> let map_e = |e| format!("Trie lookup error: {}", e); - read_child_trie_value_with(storage_key, &eph, &root, key, &mut *self.proof_recorder).map_err(map_e) + read_child_trie_value_with::, _, _>( + storage_key, + &eph, + &root, + key, + &mut *self.proof_recorder + ).map_err(map_e) } pub fn record_all_keys(&mut self) { @@ -76,7 +92,7 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> let mut iter = move || -> Result<(), Box>> { let root = self.backend.root(); - record_all_keys::(&eph, root, &mut *self.proof_recorder) + record_all_keys::, _>(&eph, root, &mut *self.proof_recorder) }; if let Err(e) = iter() { @@ -158,6 +174,10 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.backend.for_keys_with_prefix(prefix, f) } + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + self.backend.for_child_keys_with_prefix(storage_key, prefix, f) + } + fn pairs(&self) -> Vec<(Vec, Vec)> { self.backend.pairs() } @@ -199,7 +219,7 @@ where { let db = create_proof_check_backend_storage(proof); - if db.contains(&root, &[]) { + if db.contains(&root, EMPTY_PREFIX) { Ok(TrieBackend::new(db, root)) } else { Err(Box::new(ExecutionError::InvalidProof)) @@ -215,7 +235,7 @@ where { let mut db = MemoryDB::default(); for item in proof { - db.insert(&[], &item); + db.insert(EMPTY_PREFIX, &item); } db } @@ -307,7 +327,7 @@ mod tests { let mut in_memory = in_memory.update(contents); let in_memory_root = in_memory.full_storage_root::<_, Vec<_>, _>( ::std::iter::empty(), - in_memory.child_storage_keys().map(|k|(k.to_vec(), Vec::new())) + in_memory.child_storage_keys().map(|k|(k.to_vec(), Vec::new())) ).0; (0..64).for_each(|i| assert_eq!( in_memory.storage(&[i]).unwrap().unwrap(), diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index dc19dad7b34bba61d43fc7b14a42f68443d52b0e..5026abcb2f76515cfbfc79fb2b5ffbc428a0c0cb 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -17,7 +17,6 @@ //! Test implementation for Externalities. use std::collections::{HashMap}; -use std::iter::FromIterator; use hash_db::Hasher; use crate::backend::{InMemory, Backend}; use primitives::storage::well_known_keys::is_child_storage_key; @@ -25,9 +24,10 @@ use crate::changes_trie::{ build_changes_trie, InMemoryStorage as ChangesTrieInMemoryStorage, BlockNumber as ChangesTrieBlockNumber, }; -use primitives::offchain; -use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; -use parity_codec::Encode; +use primitives::{ + storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}, traits::BareCryptoStorePtr, offchain +}; +use codec::Encode; use super::{ChildStorageKey, Externalities, OverlayedChanges}; const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within runtime"; @@ -40,26 +40,17 @@ pub struct TestExternalities { backend: InMemory, changes_trie_storage: ChangesTrieInMemoryStorage, offchain: Option>, + keystore: Option, } impl TestExternalities { /// Create a new instance of `TestExternalities` with storage. - pub fn new(storage: HashMap, Vec>) -> Self { - Self::new_with_children((storage, Default::default())) - } - - /// Create a new instance of `TestExternalities` with storage and children. - pub fn new_with_children(storage: StorageTuple) -> Self { - Self::new_with_code_with_children(&[], storage) + pub fn new(storage: StorageTuple) -> Self { + Self::new_with_code(&[], storage) } /// Create a new instance of `TestExternalities` with code and storage. - pub fn new_with_code(code: &[u8], storage: HashMap, Vec>) -> Self { - Self::new_with_code_with_children(code, (storage, Default::default())) - } - - /// Create a new instance of `TestExternalities` with code, storage and children. - pub fn new_with_code_with_children(code: &[u8], mut storage: StorageTuple) -> Self { + pub fn new_with_code(code: &[u8], mut storage: StorageTuple) -> Self { let mut overlay = OverlayedChanges::default(); assert!(storage.0.keys().all(|key| !is_child_storage_key(key))); @@ -84,6 +75,7 @@ impl TestExternalities { changes_trie_storage: ChangesTrieInMemoryStorage::new(), backend: backend.into(), offchain: None, + keystore: None, } } @@ -134,25 +126,13 @@ impl PartialEq for TestExternalities } } -impl FromIterator<(Vec, Vec)> for TestExternalities { - fn from_iter, Vec)>>(iter: I) -> Self { - Self::new(iter.into_iter().collect()) - } -} - impl Default for TestExternalities { fn default() -> Self { Self::new(Default::default()) } } -impl From, Vec>> for TestExternalities { - fn from(hashmap: HashMap, Vec>) -> Self { - Self::from_iter(hashmap) - } -} - impl From for TestExternalities { fn from(storage: StorageTuple) -> Self { - Self::new_with_children(storage) + Self::new(storage) } } @@ -181,6 +161,13 @@ impl Externalities for TestExternalities ) } + fn original_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { + self.backend + .child_storage(storage_key.as_ref(), key) + .map(|x| x.map(|x| x.to_vec())) + .expect(EXT_NOT_ALLOWED_TO_FAIL) + } + fn place_storage(&mut self, key: Vec, maybe_value: Option>) { if is_child_storage_key(&key) { panic!("Refuse to directly set child storage key"); @@ -222,20 +209,45 @@ impl Externalities for TestExternalities }); } + fn clear_child_prefix(&mut self, storage_key: ChildStorageKey, prefix: &[u8]) { + + self.overlay.clear_child_prefix(storage_key.as_ref(), prefix); + + let backend = &self.backend; + let overlay = &mut self.overlay; + backend.for_child_keys_with_prefix(storage_key.as_ref(), prefix, |key| { + overlay.set_child_storage(storage_key.as_ref().to_vec(), key.to_vec(), None); + }); + } + fn chain_id(&self) -> u64 { 42 } fn storage_root(&mut self) -> H::Out { + + let child_storage_keys = + self.overlay.prospective.children.keys() + .chain(self.overlay.committed.children.keys()); + + let child_delta_iter = child_storage_keys.map(|storage_key| + (storage_key.clone(), self.overlay.committed.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) + .chain(self.overlay.prospective.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone())))))); + + // compute and memoize let delta = self.overlay.committed.top.iter().map(|(k, v)| (k.clone(), v.value.clone())) .chain(self.overlay.prospective.top.iter().map(|(k, v)| (k.clone(), v.value.clone()))); + self.backend.full_storage_root(delta, child_delta_iter).0 - self.backend.storage_root(delta).0 } fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec { let storage_key = storage_key.as_ref(); - let (root, _, _) = { + let (root, is_empty, _) = { let delta = self.overlay.committed.children.get(storage_key) .into_iter() .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) @@ -245,7 +257,11 @@ impl Externalities for TestExternalities self.backend.child_storage_root(storage_key, delta) }; - self.overlay.set_storage(storage_key.into(), Some(root.clone())); + if is_empty { + self.overlay.set_storage(storage_key.into(), None); + } else { + self.overlay.set_storage(storage_key.into(), Some(root.clone())); + } root } @@ -263,6 +279,10 @@ impl Externalities for TestExternalities .as_mut() .map(|x| &mut **x as _) } + + fn keystore(&self) -> Option { + self.keystore.clone() + } } #[cfg(test)] @@ -277,7 +297,7 @@ mod tests { ext.set_storage(b"doe".to_vec(), b"reindeer".to_vec()); ext.set_storage(b"dog".to_vec(), b"puppy".to_vec()); ext.set_storage(b"dogglesworth".to_vec(), b"cat".to_vec()); - const ROOT: [u8; 32] = hex!("cc65c26c37ebd4abcdeb3f1ecd727527051620779a2f6c809bac0f8a87dbb816"); + const ROOT: [u8; 32] = hex!("2a340d3dfd52f5992c6b117e9e45f479e6da5afffafeb26ab619cf137a95aeb8"); assert_eq!(ext.storage_root(), H256::from(ROOT)); } diff --git a/core/state-machine/src/trie_backend.rs b/core/state-machine/src/trie_backend.rs index 0c57cf3682fba175835b875634539da969aefa06..53c293b7ad17f3de567fd5cbccc935cb4946fe8b 100644 --- a/core/state-machine/src/trie_backend.rs +++ b/core/state-machine/src/trie_backend.rs @@ -18,7 +18,8 @@ use log::{warn, debug}; use hash_db::Hasher; -use trie::{TrieDB, TrieError, Trie, delta_trie_root, default_child_trie_root, child_delta_trie_root}; +use trie::{Trie, delta_trie_root, default_child_trie_root, child_delta_trie_root}; +use trie::trie_types::{TrieDB, TrieError, Layout}; use crate::trie_backend_essence::{TrieBackendEssence, TrieBackendStorage, Ephemeral}; use crate::Backend; @@ -81,6 +82,10 @@ impl, H: Hasher> Backend for TrieBackend where self.essence.for_keys_in_child_storage(storage_key, f) } + fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + self.essence.for_child_keys_with_prefix(storage_key, prefix, f) + } + fn pairs(&self) -> Vec<(Vec, Vec)> { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); @@ -137,7 +142,7 @@ impl, H: Hasher> Backend for TrieBackend where &mut write_overlay, ); - match delta_trie_root::(&mut eph, root, delta) { + match delta_trie_root::, _, _, _, _>(&mut eph, root, delta) { Ok(ret) => root = ret, Err(e) => warn!(target: "trie", "Failed to write to trie: {}", e), } @@ -151,11 +156,11 @@ impl, H: Hasher> Backend for TrieBackend where I: IntoIterator, Option>)>, H::Out: Ord { - let default_root = default_child_trie_root::(storage_key); + let default_root = default_child_trie_root::>(storage_key); let mut write_overlay = S::Overlay::default(); let mut root = match self.storage(storage_key) { - Ok(value) => value.unwrap_or(default_child_trie_root::(storage_key)), + Ok(value) => value.unwrap_or(default_child_trie_root::>(storage_key)), Err(e) => { warn!(target: "trie", "Failed to read child storage root: {}", e); default_root.clone() @@ -168,7 +173,12 @@ impl, H: Hasher> Backend for TrieBackend where &mut write_overlay, ); - match child_delta_trie_root::(storage_key, &mut eph, root.clone(), delta) { + match child_delta_trie_root::, _, _, _, _>( + storage_key, + &mut eph, + root.clone(), + delta + ) { Ok(ret) => root = ret, Err(e) => warn!(target: "trie", "Failed to write to trie: {}", e), } @@ -188,8 +198,8 @@ impl, H: Hasher> Backend for TrieBackend where pub mod tests { use std::collections::HashSet; use primitives::{Blake2Hasher, H256}; - use parity_codec::Encode; - use trie::{TrieMut, TrieDBMut, PrefixedMemoryDB}; + use codec::Encode; + use trie::{TrieMut, PrefixedMemoryDB, trie_types::TrieDBMut}; use super::*; fn test_db() -> (PrefixedMemoryDB, H256) { diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index cad150d1bc1f660c8b992150887afa02aa22cec1..aeb265c2e2a5657c196e1aef54bb8573995d1d06 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -20,17 +20,17 @@ use std::ops::Deref; use std::sync::Arc; use log::{debug, warn}; -use hash_db::{self, Hasher}; -use trie::{ - TrieDB, Trie, MemoryDB, PrefixedMemoryDB, DBValue, TrieError, - default_child_trie_root, read_trie_value, read_child_trie_value, for_keys_in_child_trie, -}; +use hash_db::{self, Hasher, EMPTY_PREFIX, Prefix}; +use trie::{Trie, MemoryDB, PrefixedMemoryDB, DBValue, + default_child_trie_root, read_trie_value, read_child_trie_value, + for_keys_in_child_trie}; +use trie::trie_types::{TrieDB, TrieError, Layout}; use crate::backend::Consolidate; /// Patricia trie-based storage trait. pub trait Storage: Send + Sync { /// Get a trie node. - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String>; } /// Patricia trie-based pairs storage essence. @@ -73,12 +73,13 @@ impl, H: Hasher> TrieBackendEssence { let map_e = |e| format!("Trie lookup error: {}", e); - read_trie_value(&eph, &self.root, key).map_err(map_e) + read_trie_value::, _>(&eph, &self.root, key).map_err(map_e) } /// Get the value of child storage at given key. pub fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result>, String> { - let root = self.storage(storage_key)?.unwrap_or(default_child_trie_root::(storage_key)); + let root = self.storage(storage_key)? + .unwrap_or(default_child_trie_root::>(storage_key)); let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { @@ -88,13 +89,13 @@ impl, H: Hasher> TrieBackendEssence { let map_e = |e| format!("Trie lookup error: {}", e); - read_child_trie_value(storage_key, &eph, &root, key).map_err(map_e) + read_child_trie_value::, _>(storage_key, &eph, &root, key).map_err(map_e) } /// Retrieve all entries keys of child storage and call `f` for each of those keys. pub fn for_keys_in_child_storage(&self, storage_key: &[u8], f: F) { let root = match self.storage(storage_key) { - Ok(v) => v.unwrap_or(default_child_trie_root::(storage_key)), + Ok(v) => v.unwrap_or(default_child_trie_root::>(storage_key)), Err(e) => { debug!(target: "trie", "Error while iterating child storage: {}", e); return; @@ -107,13 +108,38 @@ impl, H: Hasher> TrieBackendEssence { overlay: &mut read_overlay, }; - if let Err(e) = for_keys_in_child_trie::>(storage_key, &eph, &root, f) { + if let Err(e) = for_keys_in_child_trie::, _, Ephemeral>( + storage_key, + &eph, + &root, + f, + ) { debug!(target: "trie", "Error while iterating child storage: {}", e); } } /// Execute given closure for all keys starting with prefix. - pub fn for_keys_with_prefix(&self, prefix: &[u8], mut f: F) { + pub fn for_child_keys_with_prefix(&self, storage_key: &[u8], prefix: &[u8], f: F) { + let root_vec = match self.storage(storage_key) { + Ok(v) => v.unwrap_or(default_child_trie_root::>(storage_key)), + Err(e) => { + debug!(target: "trie", "Error while iterating child storage: {}", e); + return; + } + }; + let mut root = H::Out::default(); + root.as_mut().copy_from_slice(&root_vec); + + self.keys_with_prefix_inner(&root, prefix, f) + } + + /// Execute given closure for all keys starting with prefix. + pub fn for_keys_with_prefix(&self, prefix: &[u8], f: F) { + self.keys_with_prefix_inner(&self.root, prefix, f) + } + + + fn keys_with_prefix_inner(&self, root: &H::Out, prefix: &[u8], mut f: F) { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, @@ -121,7 +147,7 @@ impl, H: Hasher> TrieBackendEssence { }; let mut iter = move || -> Result<(), Box>> { - let trie = TrieDB::::new(&eph, &self.root)?; + let trie = TrieDB::::new(&eph, root)?; let mut iter = trie.iter()?; iter.seek(prefix)?; @@ -143,6 +169,7 @@ impl, H: Hasher> TrieBackendEssence { debug!(target: "trie", "Error while iterating by prefix: {}", e); } } + } pub(crate) struct Ephemeral<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> { @@ -186,10 +213,10 @@ impl<'a, for Ephemeral<'a, S, H> { fn get(&self, key: &H::Out) -> Option { - if let Some(val) = hash_db::HashDB::get(self.overlay, key, &[]) { + if let Some(val) = hash_db::HashDB::get(self.overlay, key, EMPTY_PREFIX) { Some(val) } else { - match self.storage.get(&key, &[]) { + match self.storage.get(&key, EMPTY_PREFIX) { Ok(x) => x, Err(e) => { warn!(target: "trie", "Failed to read from DB: {}", e); @@ -200,15 +227,15 @@ impl<'a, } fn contains(&self, key: &H::Out) -> bool { - hash_db::HashDB::get(self, key, &[]).is_some() + hash_db::HashDB::get(self, key, EMPTY_PREFIX).is_some() } fn emplace(&mut self, key: H::Out, value: DBValue) { - hash_db::HashDB::emplace(self.overlay, key, &[], value) + hash_db::HashDB::emplace(self.overlay, key, EMPTY_PREFIX, value) } fn remove(&mut self, key: &H::Out) { - hash_db::HashDB::remove(self.overlay, key, &[]) + hash_db::HashDB::remove(self.overlay, key, EMPTY_PREFIX) } } @@ -228,7 +255,7 @@ impl<'a, > hash_db::HashDB for Ephemeral<'a, S, H> { - fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { + fn get(&self, key: &H::Out, prefix: Prefix) -> Option { if let Some(val) = hash_db::HashDB::get(self.overlay, key, prefix) { Some(val) } else { @@ -242,19 +269,19 @@ impl<'a, } } - fn contains(&self, key: &H::Out, prefix: &[u8]) -> bool { + fn contains(&self, key: &H::Out, prefix: Prefix) -> bool { hash_db::HashDB::get(self, key, prefix).is_some() } - fn insert(&mut self, prefix: &[u8], value: &[u8]) -> H::Out { + fn insert(&mut self, prefix: Prefix, value: &[u8]) -> H::Out { hash_db::HashDB::insert(self.overlay, prefix, value) } - fn emplace(&mut self, key: H::Out, prefix: &[u8], value: DBValue) { + fn emplace(&mut self, key: H::Out, prefix: Prefix, value: DBValue) { hash_db::HashDB::emplace(self.overlay, key, prefix, value) } - fn remove(&mut self, key: &H::Out, prefix: &[u8]) { + fn remove(&mut self, key: &H::Out, prefix: Prefix) { hash_db::HashDB::remove(self.overlay, key, prefix) } } @@ -265,8 +292,8 @@ impl<'a, > hash_db::HashDBRef for Ephemeral<'a, S, H> { - fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { hash_db::HashDB::get(self, key, prefix) } - fn contains(&self, key: &H::Out, prefix: &[u8]) -> bool { hash_db::HashDB::contains(self, key, prefix) } + fn get(&self, key: &H::Out, prefix: Prefix) -> Option { hash_db::HashDB::get(self, key, prefix) } + fn contains(&self, key: &H::Out, prefix: Prefix) -> bool { hash_db::HashDB::contains(self, key, prefix) } } /// Key-value pairs storage that is used by trie backend essence. @@ -274,14 +301,14 @@ pub trait TrieBackendStorage: Send + Sync { /// Type of in-memory overlay. type Overlay: hash_db::HashDB + Default + Consolidate; /// Get the value stored at key. - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String>; } // This implementation is used by normal storage trie clients. impl TrieBackendStorage for Arc> { type Overlay = PrefixedMemoryDB; - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { Storage::::get(self.deref(), key, prefix) } } @@ -290,7 +317,7 @@ impl TrieBackendStorage for Arc> { impl TrieBackendStorage for PrefixedMemoryDB { type Overlay = PrefixedMemoryDB; - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { Ok(hash_db::HashDB::get(self, key, prefix)) } } @@ -298,7 +325,7 @@ impl TrieBackendStorage for PrefixedMemoryDB { impl TrieBackendStorage for MemoryDB { type Overlay = MemoryDB; - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + fn get(&self, key: &H::Out, prefix: Prefix) -> Result, String> { Ok(hash_db::HashDB::get(self, key, prefix)) } } diff --git a/core/telemetry/Cargo.toml b/core/telemetry/Cargo.toml index ca95fe94e55a3ddc3ef3fc03fb44425550494471..d4332eb9ec343ec4307414fdc5dfb1c619df0b6b 100644 --- a/core/telemetry/Cargo.toml +++ b/core/telemetry/Cargo.toml @@ -7,15 +7,18 @@ edition = "2018" [dependencies] bytes = "0.4" -parking_lot = "0.8.0" +parking_lot = "0.9.0" futures01 = { package = "futures", version = "0.1" } -futures-preview = { version = "0.3.0-alpha.17", features = ["compat"] } +futures-preview = { version = "=0.3.0-alpha.17", features = ["compat"] } futures-timer = "0.2.1" -libp2p = { version = "0.10.0", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.11.0", default-features = false, features = ["libp2p-websocket"] } log = "0.4" rand = "0.6" serde = { version = "1.0.81", features = ["derive"] } slog = { version = "^2", features = ["nested-values"] } +# TODO: we're using slog-async just to be able to clone records; See https://github.com/slog-rs/slog/issues/221, +# https://github.com/paritytech/substrate/issues/2823 and https://github.com/paritytech/substrate/issues/3260 +slog-async = { git = "https://github.com/paritytech/slog-async", features = ["nested-values"] } slog-json = { version = "^2", features = ["nested-values"] } slog-scope = "^4" tokio-io = "0.1" diff --git a/core/telemetry/src/lib.rs b/core/telemetry/src/lib.rs index 88d515e5385d27697c60505ee79f63a89267ed0f..71a86defb6d3ee634a5b7531a528dd6a9b260f3c 100644 --- a/core/telemetry/src/lib.rs +++ b/core/telemetry/src/lib.rs @@ -58,12 +58,12 @@ //! ``` //! -use futures::{prelude::*, task::AtomicWaker}; +use futures::{prelude::*, channel::mpsc}; use libp2p::{Multiaddr, wasm_ext}; use log::warn; use parking_lot::Mutex; use serde::{Serialize, Deserialize}; -use std::{pin::Pin, sync::{Arc, Weak}, task::{Context, Poll}, time::{Duration, Instant}}; +use std::{pin::Pin, sync::Arc, task::{Context, Poll}, time::{Duration, Instant}}; pub use slog_scope::with_logger; pub use slog; @@ -112,31 +112,32 @@ pub const CONSENSUS_INFO: &str = "1"; /// Telemetry object. Implements `Future` and must be polled regularly. /// Contains an `Arc` and can be cloned and pass around. Only one clone needs to be polled -/// regularly. +/// regularly and should be polled regularly. /// Dropping all the clones unregisters the telemetry. #[derive(Clone)] pub struct Telemetry { - inner: Arc, + inner: Arc>, /// Slog guard so that we don't get deregistered. _guard: Arc, } -// Implementation notes: considering that logging can happen at any moment, we only have two -// options: locking a mutex (which we currently do), or using a channel (which we should do). -// At the moment, `slog` doesn't provide any easy way to serialize records in order to send them -// over a channel, but ideally that's what should be done. - -/// Shared between `Telemetry` and `TelemetryDrain`. +/// Behind the `Mutex` in `Telemetry`. +/// +/// Note that ideally we wouldn't have to make the `Telemetry` clonable, as that would remove the +/// need for a `Mutex`. However there is currently a weird hack in place in `substrate-service` +/// where we extract the telemetry registration so that it continues running during the shutdown +/// process. struct TelemetryInner { /// Worker for the telemetry. - worker: Mutex, - /// Waker to wake up when we add a log entry to the worker. - polling_waker: AtomicWaker, + worker: worker::TelemetryWorker, + /// Receives log entries for them to be dispatched to the worker. + receiver: mpsc::Receiver, } /// Implements `slog::Drain`. struct TelemetryDrain { - inner: std::panic::AssertUnwindSafe>, + /// Sends log entries. + sender: std::panic::AssertUnwindSafe>, } /// Initializes the telemetry. See the crate root documentation for more information. @@ -153,19 +154,18 @@ pub fn init_telemetry(config: TelemetryConfig) -> Telemetry { } } - let inner = Arc::new(TelemetryInner { - worker: Mutex::new(worker::TelemetryWorker::new(endpoints, config.wasm_external_transport)), - polling_waker: AtomicWaker::new(), - }); - + let (sender, receiver) = mpsc::channel(16); let guard = { - let logger = TelemetryDrain { inner: std::panic::AssertUnwindSafe(Arc::downgrade(&inner)) }; + let logger = TelemetryDrain { sender: std::panic::AssertUnwindSafe(sender) }; let root = slog::Logger::root(slog::Drain::fuse(logger), slog::o!()); slog_scope::set_global_logger(root) }; Telemetry { - inner, + inner: Arc::new(Mutex::new(TelemetryInner { + worker: worker::TelemetryWorker::new(endpoints, config.wasm_external_transport), + receiver, + })), _guard: Arc::new(guard), } } @@ -184,12 +184,42 @@ impl Stream for Telemetry { fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { let before = Instant::now(); + // Because the `Telemetry` is clonable, we need to put the actual fields behind a `Mutex`. + // However, the user is only ever supposed to poll from one instance of `Telemetry`, while + // the other instances are used only for RAII purposes. + // We assume that the user is following this advice and therefore that the `Mutex` is only + // ever locked once at a time. + let mut inner = match self.inner.try_lock() { + Some(l) => l, + None => { + warn!( + target: "telemetry", + "The telemetry seems to be polled multiple times simultaneously" + ); + // Returning `Pending` here means that we may never get polled again, but this is + // ok because we're in a situation where something else is actually currently doing + // the polling. + return Poll::Pending; + } + }; + let mut has_connected = false; - while let Poll::Ready(event) = self.inner.worker.lock().poll(cx) { - // Right now we only have one possible event. This line is here in order to not - // forget to handle any possible new event type. - let worker::TelemetryWorkerEvent::Connected = event; - has_connected = true; + + // The polling pattern is: poll the worker so that it processes its queue, then add one + // message from the receiver (if possible), then poll the worker again, and so on. + loop { + while let Poll::Ready(event) = inner.worker.poll(cx) { + // Right now we only have one possible event. This line is here in order to not + // forget to handle any possible new event type. + let worker::TelemetryWorkerEvent::Connected = event; + has_connected = true; + } + + if let Poll::Ready(Some(log_entry)) = Stream::poll_next(Pin::new(&mut inner.receiver), cx) { + log_entry.as_record_values(|rec, val| { let _ = inner.worker.log(rec, val); }); + } else { + break; + } } if before.elapsed() > Duration::from_millis(200) { @@ -199,7 +229,6 @@ impl Stream for Telemetry { if has_connected { Poll::Ready(Some(TelemetryEvent::Connected)) } else { - self.inner.polling_waker.register(cx.waker()); Poll::Pending } } @@ -210,17 +239,20 @@ impl slog::Drain for TelemetryDrain { type Err = (); fn log(&self, record: &slog::Record, values: &slog::OwnedKVList) -> Result { - if let Some(inner) = self.inner.0.upgrade() { - let before = Instant::now(); - let result = inner.worker.lock().log(record, values); - inner.polling_waker.wake(); - if before.elapsed() > Duration::from_millis(50) { - warn!(target: "telemetry", "Writing a telemetry log took more than 50ms"); - } - result - } else { - Ok(()) + let before = Instant::now(); + + let serialized = slog_async::AsyncRecord::from(record, values); + // Note: interestingly, `try_send` requires a `&mut` because it modifies some internal value, while `clone()` + // is lock-free. + if let Err(err) = self.sender.clone().try_send(serialized) { + warn!(target: "telemetry", "Ignored telemetry message because of error on channel: {:?}", err); + } + + if before.elapsed() > Duration::from_millis(50) { + warn!(target: "telemetry", "Writing a telemetry log took more than 50ms"); } + + Ok(()) } } diff --git a/core/telemetry/src/worker.rs b/core/telemetry/src/worker.rs index e13270937899c69bc610fb949ca67986ef20cb85..24a1de8ec4a3197368f6a3cd3b7c204c6b7a99c9 100644 --- a/core/telemetry/src/worker.rs +++ b/core/telemetry/src/worker.rs @@ -187,6 +187,25 @@ impl TelemetryWorker { /// For some context, we put this object around the `wasm_ext::ExtTransport` in order to make sure /// that each telemetry message maps to one single call to `write` in the WASM FFI. struct StreamSink(T); + +impl futures01::Stream for StreamSink { + type Item = BytesMut; + type Error = io::Error; + + fn poll(&mut self) -> futures01::Poll, Self::Error> { + let mut buf = [0; 128]; + Ok(self.0.poll_read(&mut buf)? + .map(|n| + if n == 0 { + None + } else { + let buf: BytesMut = buf[..n].into(); + Some(buf) + } + )) + } +} + impl futures01::Sink for StreamSink { type SinkItem = BytesMut; type SinkError = io::Error; diff --git a/core/telemetry/src/worker/node.rs b/core/telemetry/src/worker/node.rs index fc09e90c7db54a4cab6d4e7864b20747a893df4d..11b1f2a81e6996da38c9636f563bbf809922b7a2 100644 --- a/core/telemetry/src/worker/node.rs +++ b/core/telemetry/src/worker/node.rs @@ -87,7 +87,11 @@ impl Node { impl Node where TTrans: Clone + Unpin, TTrans::Dial: Unpin, - TTrans::Output: Sink + Unpin, TSinkErr: fmt::Debug { + TTrans::Output: Sink + + Stream> + + Unpin, + TSinkErr: fmt::Debug +{ /// Sends a WebSocket frame to the node. Returns an error if we are not connected to the node. /// /// After calling this method, you should call `poll` in order for it to be properly processed. @@ -112,12 +116,12 @@ where TTrans: Clone + Unpin, TTrans::Dial: Unpin, let mut socket = mem::replace(&mut self.socket, NodeSocket::Poisoned); self.socket = loop { match socket { - NodeSocket::Connected(mut conn) => + NodeSocket::Connected(mut conn) => match NodeSocketConnected::poll(Pin::new(&mut conn), cx, &self.addr) { Poll::Ready(Ok(v)) => match v {} Poll::Pending => break NodeSocket::Connected(conn), Poll::Ready(Err(err)) => { - debug!(target: "telemetry", "Disconnected from {}: {:?}", self.addr, err); + warn!(target: "telemetry", "Disconnected from {}: {:?}", self.addr, err); let timeout = gen_rand_reconnect_delay(); self.socket = NodeSocket::WaitingReconnect(timeout); return Poll::Ready(NodeEvent::Disconnected(err)) @@ -132,7 +136,7 @@ where TTrans: Clone + Unpin, TTrans::Dial: Unpin, }, Poll::Pending => break NodeSocket::Dialing(s), Poll::Ready(Err(err)) => { - debug!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); + warn!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); let timeout = gen_rand_reconnect_delay(); socket = NodeSocket::WaitingReconnect(timeout); } @@ -143,7 +147,7 @@ where TTrans: Clone + Unpin, TTrans::Dial: Unpin, socket = NodeSocket::Dialing(d.compat()); } Err(err) => { - debug!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); + warn!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); let timeout = gen_rand_reconnect_delay(); socket = NodeSocket::WaitingReconnect(timeout); } @@ -175,7 +179,10 @@ fn gen_rand_reconnect_delay() -> Delay { } impl NodeSocketConnected -where TTrans::Output: Sink + Unpin { +where TTrans::Output: Sink + + Stream> + + Unpin +{ /// Processes the queue of messages for the connected socket. /// /// The address is passed for logging purposes only. @@ -200,15 +207,26 @@ where TTrans::Output: Sink + Unpin { item_len, my_addr ); self.need_flush = true; + } else if self.need_flush { match Sink::poll_flush(Pin::new(&mut self.sink), cx) { - Poll::Pending => {} + Poll::Pending => return Poll::Pending, Poll::Ready(Err(err)) => return Poll::Ready(Err(err)), Poll::Ready(Ok(())) => self.need_flush = false, } } else { - break + match Stream::poll_next(Pin::new(&mut self.sink), cx) { + Poll::Ready(Some(Ok(_))) => { + // We poll the telemetry `Stream` because the underlying implementation relies on + // this in order to answer PINGs. + // We don't do anything with incoming messages, however. + }, + Poll::Ready(Some(Err(err))) => { + return Poll::Ready(Err(err)) + }, + Poll::Pending | Poll::Ready(None) => break, + } } } diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index 0d709fab68305b2e4209bf7e8712fc7f2bad19ac..1af77ce2f0193045806a0f17c0ace529b7808399 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -9,10 +9,10 @@ client = { package = "substrate-client", path = "../client" } client-db = { package = "substrate-client-db", path = "../client/db", features = ["test-helpers"] } consensus = { package = "substrate-consensus-common", path = "../consensus/common" } executor = { package = "substrate-executor", path = "../executor" } -futures-preview = "0.3.0-alpha.17" -hash-db = "0.14.0" +futures-preview = "=0.3.0-alpha.17" +hash-db = "0.15.0" keyring = { package = "substrate-keyring", path = "../keyring" } -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } primitives = { package = "substrate-primitives", path = "../primitives" } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } +sr-primitives = { path = "../sr-primitives" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } diff --git a/core/test-client/src/client_ext.rs b/core/test-client/src/client_ext.rs index 5f677108c359d2000fcb3a348ee95b8fac49bf51..b29a7db471e5e9bd4f21f70beb3a701660436930 100644 --- a/core/test-client/src/client_ext.rs +++ b/core/test-client/src/client_ext.rs @@ -18,15 +18,15 @@ use client::{self, Client}; use consensus::{ - ImportBlock, BlockImport, BlockOrigin, Error as ConsensusError, + BlockImportParams, BlockImport, BlockOrigin, Error as ConsensusError, ForkChoiceStrategy, }; use hash_db::Hasher; -use runtime_primitives::Justification; -use runtime_primitives::traits::{Block as BlockT}; -use runtime_primitives::generic::BlockId; +use sr_primitives::Justification; +use sr_primitives::traits::{Block as BlockT}; +use sr_primitives::generic::BlockId; use primitives::Blake2Hasher; -use parity_codec::alloc::collections::hash_map::HashMap; +use codec::alloc::collections::hash_map::HashMap; /// Extension trait for a test client. pub trait ClientExt: Sized { @@ -34,6 +34,10 @@ pub trait ClientExt: Sized { fn import(&self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError>; + /// Import a block and make it our best block if possible. + fn import_as_best(&self, origin: BlockOrigin, block: Block) + -> Result<(), ConsensusError>; + /// Import block with justification, finalizes block. fn import_justified( &self, @@ -64,7 +68,7 @@ impl ClientExt for Client -> Result<(), ConsensusError> { let (header, extrinsics) = block.deconstruct(); - let import = ImportBlock { + let import = BlockImportParams { origin, header, justification: None, @@ -78,6 +82,24 @@ impl ClientExt for Client BlockImport::import_block(&mut (&*self), import, HashMap::new()).map(|_| ()) } + fn import_as_best(&self, origin: BlockOrigin, block: Block) + -> Result<(), ConsensusError> + { + let (header, extrinsics) = block.deconstruct(); + let import = BlockImportParams { + origin, + header, + justification: None, + post_digests: vec![], + body: Some(extrinsics), + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::Custom(true), + }; + + BlockImport::import_block(&mut (&*self), import, HashMap::new()).map(|_| ()) + } + fn import_justified( &self, origin: BlockOrigin, @@ -85,7 +107,7 @@ impl ClientExt for Client justification: Justification, ) -> Result<(), ConsensusError> { let (header, extrinsics) = block.deconstruct(); - let import = ImportBlock { + let import = BlockImportParams { origin, header, justification: Some(justification), diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index 509863e4e56ae544463a50af457e955d98580c38..d0d4a54b0f4ae55b02caac7d399f386873805f7b 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -25,9 +25,13 @@ pub use client_db::{Backend, self}; pub use client_ext::ClientExt; pub use consensus; pub use executor::{NativeExecutor, self}; -pub use keyring::{sr25519::Keyring as AuthorityKeyring, AccountKeyring}; -pub use primitives::Blake2Hasher; -pub use runtime_primitives::{StorageOverlay, ChildrenStorageOverlay}; +pub use keyring::{ + AccountKeyring, + ed25519::Keyring as Ed25519Keyring, + sr25519::Keyring as Sr25519Keyring, +}; +pub use primitives::{Blake2Hasher, traits::BareCryptoStorePtr}; +pub use sr_primitives::{StorageOverlay, ChildrenStorageOverlay}; pub use state_machine::ExecutionStrategy; use std::sync::Arc; @@ -35,7 +39,7 @@ use std::collections::HashMap; use futures::future::Ready; use hash_db::Hasher; use primitives::storage::well_known_keys; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Block as BlockT, NumberFor }; use client::LocalCallExecutor; @@ -69,6 +73,7 @@ pub struct TestClientBuilder { child_storage_extension: HashMap, Vec<(Vec, Vec)>>, backend: Arc, _executor: std::marker::PhantomData, + keystore: Option, } impl Default for TestClientBuilder< @@ -96,11 +101,7 @@ impl TestClientBuilder< } } -impl TestClientBuilder< - Executor, - Backend, - G, -> { +impl TestClientBuilder { /// Create a new instance of the test client builder. pub fn with_backend(backend: Arc) -> Self { TestClientBuilder { @@ -109,9 +110,16 @@ impl TestClientBuilder< child_storage_extension: Default::default(), genesis_init: Default::default(), _executor: Default::default(), + keystore: None, } } + /// Set the keystore that should be used by the externalities. + pub fn set_keystore(mut self, keystore: BareCryptoStorePtr) -> Self { + self.keystore = Some(keystore); + self + } + /// Alter the genesis storage parameters. pub fn genesis_init_mut(&mut self) -> &mut G { &mut self.genesis_init @@ -180,7 +188,7 @@ impl TestClientBuilder< self.backend.clone(), executor, storage, - self.execution_strategies + self.execution_strategies, ).expect("Creates new client"); let longest_chain = client::LongestChain::new(self.backend); @@ -196,7 +204,7 @@ impl TestClientBuilder< > { /// Build the test client with the given native executor. pub fn build_with_native_executor( - self, + mut self, executor: I, ) -> ( client::Client< @@ -213,7 +221,7 @@ impl TestClientBuilder< Block: BlockT::Out>, { let executor = executor.into().unwrap_or_else(|| executor::NativeExecutor::new(None)); - let executor = LocalCallExecutor::new(self.backend.clone(), executor); + let executor = LocalCallExecutor::new(self.backend.clone(), executor, self.keystore.take()); self.build_with_executor(executor) } diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index d14d324006cbbc218874f170d50b247603374c92..13186056ce2dcc31f2c0089013768cb2f6f9a813 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -8,27 +8,34 @@ build = "build.rs" [dependencies] log = { version = "0.4", optional = true } serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } keyring = { package = "substrate-keyring", path = "../keyring", optional = true } substrate-client = { path = "../client", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../application-crypto", default-features = false } inherents = { package = "substrate-inherents", path = "../inherents", default-features = false } -consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../consensus/aura/primitives", default-features = false } -consensus_babe = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives", default-features = false } +aura-primitives = { package = "substrate-consensus-aura-primitives", path = "../consensus/aura/primitives", default-features = false } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } +sr-primitives = { path = "../sr-primitives", default-features = false } +session = { package = "substrate-session", path = "../session", default-features = false } runtime_version = { package = "sr-version", path = "../sr-version", default-features = false } runtime_support = { package = "srml-support", path = "../../srml/support", default-features = false } substrate-trie = { path = "../trie", default-features = false } -trie-db = { version = "0.14.0", default-features = false } +trie-db = { version = "0.15.0", default-features = false } +memory-db = { version = "0.15.0", default-features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../offchain/primitives", default-features = false} executive = { package = "srml-executive", path = "../../srml/executive", default-features = false } cfg-if = "0.1.6" +srml-babe = { path = "../../srml/babe", default-features = false } +srml-timestamp = { path = "../../srml/timestamp", default-features = false } +srml-system = { path = "../../srml/system", default-features = false } [dev-dependencies] substrate-executor = { path = "../executor" } substrate-test-runtime-client = { path = "./client" } +state_machine = { package = "substrate-state-machine", path = "../state-machine" } [build-dependencies] wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.2", path = "../utils/wasm-builder-runner" } @@ -43,19 +50,25 @@ std = [ "serde", "substrate-client/std", "keyring", - "parity-codec/std", + "codec/std", "rstd/std", "runtime_io/std", "runtime_support/std", "primitives/std", "inherents/std", - "runtime_primitives/std", + "sr-primitives/std", "runtime_version/std", - "consensus_aura/std", - "consensus_babe/std", + "aura-primitives/std", + "babe-primitives/std", "primitives/std", "substrate-trie/std", "trie-db/std", + "memory-db/std", "offchain-primitives/std", "executive/std", + "srml-babe/std", + "srml-timestamp/std", + "srml-system/std", + "app-crypto/std", + "session/std", ] diff --git a/core/test-runtime/build.rs b/core/test-runtime/build.rs index f543f68ccd72fd30254e678804e9a897c5a81b5e..e412123b94d88b77d775892bae428181b3c7a857 100644 --- a/core/test-runtime/build.rs +++ b/core/test-runtime/build.rs @@ -14,14 +14,22 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project, WasmBuilderSource}; +use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; fn main() { - build_current_project( + build_current_project_with_rustflags( "wasm_binary.rs", WasmBuilderSource::CratesOrPath { path: "../utils/wasm-builder", version: "1.0.4", }, + // Note that we set the stack-size to 1MB explicitly even though it is set + // to this value by default. This is because some of our tests (`restoration_of_globals`) + // depend on the stack-size. + // + // The --export=__heap_base instructs LLD to export __heap_base as a global variable, which + // is used by the external memory allocator. + "-Clink-arg=-zstack-size=1048576 \ + -Clink-arg=--export=__heap_base", ); } diff --git a/core/test-runtime/client/Cargo.toml b/core/test-runtime/client/Cargo.toml index 4905678ae9c30953f5f304313a3aba5953012f14..6545048759687a8d93f7811de04c3f2e598acb0a 100644 --- a/core/test-runtime/client/Cargo.toml +++ b/core/test-runtime/client/Cargo.toml @@ -8,7 +8,8 @@ edition = "2018" generic-test-client = { package = "substrate-test-client", path = "../../test-client" } primitives = { package = "substrate-primitives", path = "../../primitives" } runtime = { package = "substrate-test-runtime", path = "../../test-runtime", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +sr-primitives = { path = "../../sr-primitives" } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } [features] default = [ diff --git a/core/test-runtime/client/src/block_builder_ext.rs b/core/test-runtime/client/src/block_builder_ext.rs index 9b7d343f02f88ee46f938bdfa55d9c993792f337..c389a946bab869317ad3c44561402e0be582d249 100644 --- a/core/test-runtime/client/src/block_builder_ext.rs +++ b/core/test-runtime/client/src/block_builder_ext.rs @@ -17,7 +17,7 @@ //! Block Builder extensions for tests. use runtime; -use runtime_primitives::traits::ProvideRuntimeApi; +use sr_primitives::traits::ProvideRuntimeApi; use generic_test_client::client; use generic_test_client::client::block_builder::api::BlockBuilder; diff --git a/core/test-runtime/client/src/lib.rs b/core/test-runtime/client/src/lib.rs index 104ffac820c50389b8cd08db7ff00b2e032f9651..f1cbb6fd8c9216049b6ecea63df50b5f8f62d51a 100644 --- a/core/test-runtime/client/src/lib.rs +++ b/core/test-runtime/client/src/lib.rs @@ -26,8 +26,9 @@ pub use block_builder_ext::BlockBuilderExt; pub use generic_test_client::*; pub use runtime; +use primitives::sr25519; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT}; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT}; /// A prelude to import in tests. pub mod prelude { @@ -39,7 +40,7 @@ pub mod prelude { Executor, LightExecutor, LocalExecutor, NativeExecutor, }; // Keyring - pub use super::{AccountKeyring, AuthorityKeyring}; + pub use super::{AccountKeyring, Sr25519Keyring}; } mod local_executor { @@ -95,19 +96,27 @@ pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor #[derive(Default)] pub struct GenesisParameters { support_changes_trie: bool, + heap_pages_override: Option, } impl generic_test_client::GenesisInit for GenesisParameters { fn genesis_storage(&self) -> (StorageOverlay, ChildrenStorageOverlay) { - let mut storage = genesis_config(self.support_changes_trie).genesis_map(); - + use codec::Encode; + let mut storage = genesis_config(self.support_changes_trie, self.heap_pages_override).genesis_map(); + + let child_roots = storage.1.iter().map(|(sk, child_map)| { + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + child_map.clone().into_iter() + ); + (sk.clone(), state_root.encode()) + }); let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - storage.clone().into_iter() + storage.0.clone().into_iter().chain(child_roots) ); let block: runtime::Block = client::genesis::construct_genesis_block(state_root); - storage.extend(additional_storage_with_genesis(&block)); + storage.0.extend(additional_storage_with_genesis(&block)); - (storage, Default::default()) + storage } } @@ -145,6 +154,9 @@ pub trait TestClientBuilderExt: Sized { /// Enable or disable support for changes trie in genesis. fn set_support_changes_trie(self, support_changes_trie: bool) -> Self; + /// Override the default value for Wasm heap pages. + fn set_heap_pages(self, heap_pages: u64) -> Self; + /// Build the test client. fn build(self) -> Client { self.build_with_longest_chain().0 @@ -160,6 +172,11 @@ impl TestClientBuilderExt for TestClientBuilder< > where B: client::backend::Backend, { + fn set_heap_pages(mut self, heap_pages: u64) -> Self { + self.genesis_init_mut().heap_pages_override = Some(heap_pages); + self + } + fn set_support_changes_trie(mut self, support_changes_trie: bool) -> Self { self.genesis_init_mut().support_changes_trie = support_changes_trie; self @@ -170,17 +187,20 @@ impl TestClientBuilderExt for TestClientBuilder< } } -fn genesis_config(support_changes_trie: bool) -> GenesisConfig { - GenesisConfig::new(support_changes_trie, vec![ - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Bob.into(), - AuthorityKeyring::Charlie.into(), - ], vec![ - AccountKeyring::Alice.into(), - AccountKeyring::Bob.into(), - AccountKeyring::Charlie.into(), - ], - 1000 +fn genesis_config(support_changes_trie: bool, heap_pages_override: Option) -> GenesisConfig { + GenesisConfig::new( + support_changes_trie, + vec![ + sr25519::Public::from(Sr25519Keyring::Alice).into(), + sr25519::Public::from(Sr25519Keyring::Bob).into(), + sr25519::Public::from(Sr25519Keyring::Charlie).into(), + ], vec![ + AccountKeyring::Alice.into(), + AccountKeyring::Bob.into(), + AccountKeyring::Charlie.into(), + ], + 1000, + heap_pages_override, ) } @@ -198,9 +218,16 @@ pub fn new_light() -> client::Client(backend: Arc) where diff --git a/core/test-runtime/src/genesismap.rs b/core/test-runtime/src/genesismap.rs index 21d7aae0a1a064a0ea5cf4b135ecf413f645e815..7686ed08bc02e6996296182d087c57ba8c9128fd 100644 --- a/core/test-runtime/src/genesismap.rs +++ b/core/test-runtime/src/genesismap.rs @@ -19,15 +19,16 @@ use std::collections::HashMap; use runtime_io::{blake2_256, twox_128}; use super::{AuthorityId, AccountId, WASM_BINARY}; -use parity_codec::{Encode, KeyedVec, Joiner}; +use codec::{Encode, KeyedVec, Joiner}; use primitives::{ChangesTrieConfiguration, map, storage::well_known_keys}; -use runtime_primitives::traits::Block; +use sr_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; /// Configuration of a general Substrate test genesis block. pub struct GenesisConfig { pub changes_trie_config: Option, pub authorities: Vec, pub balances: Vec<(AccountId, u64)>, + pub heap_pages_override: Option, } impl GenesisConfig { @@ -35,7 +36,8 @@ impl GenesisConfig { support_changes_trie: bool, authorities: Vec, endowed_accounts: Vec, - balance: u64 + balance: u64, + heap_pages_override: Option, ) -> Self { GenesisConfig { changes_trie_config: match support_changes_trie { @@ -44,27 +46,56 @@ impl GenesisConfig { }, authorities: authorities.clone(), balances: endowed_accounts.into_iter().map(|a| (a, balance)).collect(), + heap_pages_override, } } - pub fn genesis_map(&self) -> HashMap, Vec> { + pub fn genesis_map(&self) -> ( + HashMap, Vec>, + HashMap, HashMap, Vec>>, + ) { let wasm_runtime = WASM_BINARY.to_vec(); let mut map: HashMap, Vec> = self.balances.iter() .map(|&(ref account, balance)| (account.to_keyed_vec(b"balance:"), vec![].and(&balance))) .map(|(k, v)| (blake2_256(&k[..])[..].to_vec(), v.to_vec())) .chain(vec![ (well_known_keys::CODE.into(), wasm_runtime), - (well_known_keys::HEAP_PAGES.into(), vec![].and(&(16 as u64))), + ( + well_known_keys::HEAP_PAGES.into(), + vec![].and(&(self.heap_pages_override.unwrap_or(16 as u64))), + ), ].into_iter()) .collect(); if let Some(ref changes_trie_config) = self.changes_trie_config { map.insert(well_known_keys::CHANGES_TRIE_CONFIG.to_vec(), changes_trie_config.encode()); } map.insert(twox_128(&b"sys:auth"[..])[..].to_vec(), self.authorities.encode()); - map + (map, Default::default()) } } +pub fn insert_genesis_block( + storage: &mut ( + HashMap, Vec>, + HashMap, HashMap, Vec>>, + ) +) -> primitives::hash::H256 { + + let child_roots = storage.1.iter().map(|(sk, child_map)| { + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + child_map.clone().into_iter() + ); + (sk.clone(), state_root.encode()) + }); + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + storage.0.clone().into_iter().chain(child_roots) + ); + let block: crate::Block = substrate_client::genesis::construct_genesis_block(state_root); + let genesis_hash = block.header.hash(); + storage.0.extend(additional_storage_with_genesis(&block)); + genesis_hash +} + pub fn additional_storage_with_genesis(genesis_block: &crate::Block) -> HashMap, Vec> { map![ twox_128(&b"latest"[..]).to_vec() => genesis_block.hash().as_fixed_bytes().to_vec() diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index edd192407eb5fe813a5d941b2f52002e14e43081..c3be0538ba02a04ca57b9304f52c6aced8d618be 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -23,39 +23,38 @@ pub mod genesismap; pub mod system; use rstd::{prelude::*, marker::PhantomData}; -use parity_codec::{Encode, Decode, Input}; +use codec::{Encode, Decode, Input, Error}; -use primitives::Blake2Hasher; +use primitives::{Blake2Hasher, OpaqueMetadata}; +use app_crypto::{ed25519, sr25519, RuntimeAppPublic}; +pub use app_crypto; use trie_db::{TrieMut, Trie}; -use substrate_trie::{TrieDB, TrieDBMut, PrefixedMemoryDB}; +use substrate_trie::PrefixedMemoryDB; +use substrate_trie::trie_types::{TrieDB, TrieDBMut}; use substrate_client::{ runtime_api as client_api, block_builder::api as block_builder_api, decl_runtime_apis, impl_runtime_apis, }; -use runtime_primitives::{ - ApplyResult, - create_runtime_str, - transaction_validity::TransactionValidity, - PrimitiveError, +use sr_primitives::{ + ApplyResult, create_runtime_str, Perbill, impl_opaque_keys, PrimitiveError, + transaction_validity::{TransactionValidity, ValidTransaction}, traits::{ BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT, - GetNodeBlockType, GetRuntimeBlockType, Verify + GetNodeBlockType, GetRuntimeBlockType, Verify, IdentityLookup, }, }; use runtime_version::RuntimeVersion; -pub use primitives::hash::H256; -use primitives::{sr25519, OpaqueMetadata}; +pub use primitives::{hash::H256, crypto::key_types}; #[cfg(any(feature = "std", test))] use runtime_version::NativeVersion; +use runtime_support::{impl_outer_origin, parameter_types}; use inherents::{CheckInherentsResult, InherentData}; use cfg_if::cfg_if; -pub use consensus_babe::AuthorityId; // Ensure Babe and Aura use the same crypto to simplify things a bit. -pub type AuraId = AuthorityId; -// Ensure Babe and Aura use the same crypto to simplify things a bit. -pub type BabeId = AuthorityId; +pub use babe_primitives::AuthorityId; +pub type AuraId = aura_primitives::sr25519::AuthorityId; // Inlucde the WASM binary #[cfg(feature = "std")] @@ -129,7 +128,7 @@ impl BlindCheckable for Extrinsic { match self { Extrinsic::AuthoritiesChange(new_auth) => Ok(Extrinsic::AuthoritiesChange(new_auth)), Extrinsic::Transfer(transfer, signature) => { - if runtime_primitives::verify_encoded_lazy(&signature, &transfer, &transfer.from) { + if sr_primitives::verify_encoded_lazy(&signature, &transfer, &transfer.from) { Ok(Extrinsic::Transfer(transfer, signature)) } else { Err(PrimitiveError::BadSignature) @@ -142,6 +141,8 @@ impl BlindCheckable for Extrinsic { } impl ExtrinsicT for Extrinsic { + type Call = Extrinsic; + fn is_signed(&self) -> Option { if let Extrinsic::IncludeData(_) = *self { Some(false) @@ -149,6 +150,10 @@ impl ExtrinsicT for Extrinsic { Some(true) } } + + fn new_unsigned(call: Self::Call) -> Option { + Some(call) + } } impl Extrinsic { @@ -171,13 +176,13 @@ pub type BlockNumber = u64; /// Index of a transaction. pub type Index = u64; /// The item of a block digest. -pub type DigestItem = runtime_primitives::generic::DigestItem; +pub type DigestItem = sr_primitives::generic::DigestItem; /// The digest of a block. -pub type Digest = runtime_primitives::generic::Digest; +pub type Digest = sr_primitives::generic::Digest; /// A test block. -pub type Block = runtime_primitives::generic::Block; +pub type Block = sr_primitives::generic::Block; /// A test block's header. -pub type Header = runtime_primitives::generic::Header; +pub type Header = sr_primitives::generic::Header; /// Run whatever tests we have. pub fn run_tests(mut input: &[u8]) -> Vec { @@ -211,6 +216,8 @@ impl Encode for DecodeFails { } } +impl codec::EncodeLike for DecodeFails {} + impl DecodeFails { /// Create a new instance. pub fn new() -> DecodeFails { @@ -221,9 +228,8 @@ impl DecodeFails { } impl Decode for DecodeFails { - fn decode(_: &mut I) -> Option { - // decoding always fails - None + fn decode(_: &mut I) -> Result { + Err("DecodeFails always fails".into()) } } @@ -254,6 +260,8 @@ cfg_if! { fn use_trie() -> u64; fn benchmark_indirect_call() -> u64; fn benchmark_direct_call() -> u64; + fn returns_mutable_static() -> u64; + fn allocates_huge_stack_array(trap: bool) -> Vec; /// Returns the initialized block number. fn get_block_number() -> u64; /// Takes and returns the initialized block number. @@ -261,6 +269,14 @@ cfg_if! { /// Returns if no block was initialized. #[skip_initialize_block] fn without_initialize_block() -> bool; + /// Test that `ed25519` crypto works in the runtime. + /// + /// Returns the signature generated for the message `ed25519` and the public key. + fn test_ed25519_crypto() -> (ed25519::AppSignature, ed25519::AppPublic); + /// Test that `sr25519` crypto works in the runtime. + /// + /// Returns the signature generated for the message `sr25519`. + fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic); } } } else { @@ -285,6 +301,8 @@ cfg_if! { fn use_trie() -> u64; fn benchmark_indirect_call() -> u64; fn benchmark_direct_call() -> u64; + fn returns_mutable_static() -> u64; + fn allocates_huge_stack_array(trap: bool) -> Vec; /// Returns the initialized block number. fn get_block_number() -> u64; /// Takes and returns the initialized block number. @@ -292,11 +310,20 @@ cfg_if! { /// Returns if no block was initialized. #[skip_initialize_block] fn without_initialize_block() -> bool; + /// Test that `ed25519` crypto works in the runtime. + /// + /// Returns the signature generated for the message `ed25519` and the public key. + fn test_ed25519_crypto() -> (ed25519::AppSignature, ed25519::AppPublic); + /// Test that `sr25519` crypto works in the runtime. + /// + /// Returns the signature generated for the message `sr25519`. + fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic); } } } } +#[derive(Clone, Eq, PartialEq)] pub struct Runtime; impl GetNodeBlockType for Runtime { @@ -307,6 +334,63 @@ impl GetRuntimeBlockType for Runtime { type RuntimeBlock = Block; } +impl_outer_origin!{ + pub enum Origin for Runtime where system = srml_system {} +} + +#[derive(Clone, Encode, Decode, Eq, PartialEq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Event; + +impl From for Event { + fn from(_evt: srml_system::Event) -> Self { + unimplemented!("Not required in tests!") + } +} + +parameter_types! { + pub const BlockHashCount: BlockNumber = 250; + pub const MinimumPeriod: u64 = 5; + pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; + pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); +} + +impl srml_system::Trait for Runtime { + type Origin = Origin; + type Call = Extrinsic; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = Event; + type WeightMultiplierUpdate = (); + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; +} + +impl srml_timestamp::Trait for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; +} + +parameter_types! { + pub const EpochDuration: u64 = 6; + pub const ExpectedBlockTime: u64 = 10_000; +} + +impl srml_babe::Trait for Runtime { + type EpochDuration = EpochDuration; + type ExpectedBlockTime = ExpectedBlockTime; +} + /// Adds one to the given input and returns the final result. #[inline(never)] fn benchmark_add_one(i: u64) -> u64 { @@ -331,22 +415,40 @@ fn code_using_trie() -> u64 { for i in 0..v.len() { let key: &[u8]= &v[i].0; let val: &[u8] = &v[i].1; - t.insert(key, val).expect("static input"); + if !t.insert(key, val).is_ok() { + return 101; + } } t }; - let trie = TrieDB::::new(&mdb, &root).expect("on memory with static content"); + if let Ok(trie) = TrieDB::::new(&mdb, &root) { + if let Ok(iter) = trie.iter() { + let mut iter_pairs = Vec::new(); + for pair in iter { + if let Ok((key, value)) = pair { + iter_pairs.push((key, value.to_vec())); + } + } + iter_pairs.len() as u64 + } else { 102 } + } else { 103 } +} - let iter = trie.iter().expect("static input"); - let mut iter_pairs = Vec::new(); - for pair in iter { - let (key, value) = pair.expect("on memory with static content"); - iter_pairs.push((key, value.to_vec())); +impl_opaque_keys! { + pub struct SessionKeys { + #[id(key_types::ED25519)] + pub ed25519: ed25519::AppPublic, + #[id(key_types::SR25519)] + pub sr25519: sr25519::AppPublic, } - iter_pairs.len() as u64 } +#[cfg(not(feature = "std"))] +/// Mutable static variables should be always observed to have +/// the initialized value at the start of a runtime call. +static mut MUTABLE_STATIC: u64 = 32; + cfg_if! { if #[cfg(feature = "std")] { impl_runtime_apis! { @@ -373,13 +475,13 @@ cfg_if! { impl client_api::TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { if let Extrinsic::IncludeData(data) = utx { - return TransactionValidity::Valid { + return TransactionValidity::Valid(ValidTransaction { priority: data.len() as u64, requires: vec![], provides: vec![data], longevity: 1, propagate: false, - }; + }); } system::validate_transaction(utx) @@ -452,6 +554,14 @@ cfg_if! { (0..1000).fold(0, |p, i| p + benchmark_add_one(i)) } + fn returns_mutable_static() -> u64 { + unimplemented!("is not expected to be invoked from non-wasm builds"); + } + + fn allocates_huge_stack_array(_trap: bool) -> Vec { + unimplemented!("is not expected to be invoked from non-wasm builds"); + } + fn get_block_number() -> u64 { system::get_block_number().expect("Block number is initialized") } @@ -463,23 +573,47 @@ cfg_if! { fn take_block_number() -> Option { system::take_block_number() } + + fn test_ed25519_crypto() -> (ed25519::AppSignature, ed25519::AppPublic) { + test_ed25519_crypto() + } + + fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic) { + test_sr25519_crypto() + } } - impl consensus_aura::AuraApi for Runtime { - fn slot_duration() -> u64 { 1 } - fn authorities() -> Vec { system::authorities() } + impl aura_primitives::AuraApi for Runtime { + fn slot_duration() -> u64 { 1000 } + fn authorities() -> Vec { + system::authorities().into_iter().map(|a| { + let authority: sr25519::Public = a.into(); + AuraId::from(authority) + }).collect() + } } - impl consensus_babe::BabeApi for Runtime { - fn startup_data() -> consensus_babe::BabeConfiguration { - consensus_babe::BabeConfiguration { - slot_duration: 1, - expected_block_time: 1, - threshold: std::u64::MAX, - median_required_blocks: 100, + impl babe_primitives::BabeApi for Runtime { + fn startup_data() -> babe_primitives::BabeConfiguration { + babe_primitives::BabeConfiguration { + median_required_blocks: 0, + slot_duration: 3000, + c: (3, 10), + } + } + + fn epoch() -> babe_primitives::Epoch { + let authorities = system::authorities(); + let authorities: Vec<_> = authorities.into_iter().map(|x|(x, 1)).collect(); + + babe_primitives::Epoch { + start_slot: >::epoch_start_slot(), + authorities, + randomness: >::randomness(), + epoch_index: >::epoch_index(), + duration: EpochDuration::get(), } } - fn authorities() -> Vec { system::authorities() } } impl offchain_primitives::OffchainWorkerApi for Runtime { @@ -488,6 +622,12 @@ cfg_if! { runtime_io::submit_transaction(&ex).unwrap(); } } + + impl session::SessionKeys for Runtime { + fn generate_session_keys(_: Option>) -> Vec { + SessionKeys::generate(None) + } + } } } else { impl_runtime_apis! { @@ -514,13 +654,13 @@ cfg_if! { impl client_api::TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { if let Extrinsic::IncludeData(data) = utx { - return TransactionValidity::Valid { + return TransactionValidity::Valid(ValidTransaction{ priority: data.len() as u64, requires: vec![], provides: vec![data], longevity: 1, propagate: false, - }; + }); } system::validate_transaction(utx) @@ -597,6 +737,41 @@ cfg_if! { (0..10000).fold(0, |p, i| p + benchmark_add_one(i)) } + fn returns_mutable_static() -> u64 { + unsafe { + MUTABLE_STATIC += 1; + MUTABLE_STATIC + } + } + + fn allocates_huge_stack_array(trap: bool) -> Vec { + // Allocate a stack frame that is approx. 75% of the stack (assuming it is 1MB). + // This will just decrease (stacks in wasm32-u-u grow downwards) the stack + // pointer. This won't trap on the current compilers. + let mut data = [0u8; 1024 * 768]; + + // Then make sure we actually write something to it. + // + // If: + // 1. the stack area is placed at the beginning of the linear memory space, and + // 2. the stack pointer points to out-of-bounds area, and + // 3. a write is performed around the current stack pointer. + // + // then a trap should happen. + // + for (i, v) in data.iter_mut().enumerate() { + *v = i as u8; // deliberate truncation + } + + if trap { + // There is a small chance of this to be pulled up in theory. In practice + // the probability of that is rather low. + panic!() + } + + data.to_vec() + } + fn get_block_number() -> u64 { system::get_block_number().expect("Block number is initialized") } @@ -608,23 +783,47 @@ cfg_if! { fn take_block_number() -> Option { system::take_block_number() } + + fn test_ed25519_crypto() -> (ed25519::AppSignature, ed25519::AppPublic) { + test_ed25519_crypto() + } + + fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic) { + test_sr25519_crypto() + } } - impl consensus_aura::AuraApi for Runtime { - fn slot_duration() -> u64 { 1 } - fn authorities() -> Vec { system::authorities() } + impl aura_primitives::AuraApi for Runtime { + fn slot_duration() -> u64 { 1000 } + fn authorities() -> Vec { + system::authorities().into_iter().map(|a| { + let authority: sr25519::Public = a.into(); + AuraId::from(authority) + }).collect() + } } - impl consensus_babe::BabeApi for Runtime { - fn startup_data() -> consensus_babe::BabeConfiguration { - consensus_babe::BabeConfiguration { + impl babe_primitives::BabeApi for Runtime { + fn startup_data() -> babe_primitives::BabeConfiguration { + babe_primitives::BabeConfiguration { median_required_blocks: 0, - slot_duration: 1, - expected_block_time: 1, - threshold: core::u64::MAX, + slot_duration: 1000, + c: (3, 10), + } + } + + fn epoch() -> babe_primitives::Epoch { + let authorities = system::authorities(); + let authorities: Vec<_> = authorities.into_iter().map(|x|(x, 1)).collect(); + + babe_primitives::Epoch { + start_slot: >::epoch_start_slot(), + authorities, + randomness: >::randomness(), + epoch_index: >::epoch_index(), + duration: EpochDuration::get(), } } - fn authorities() -> Vec { system::authorities() } } impl offchain_primitives::OffchainWorkerApi for Runtime { @@ -633,6 +832,103 @@ cfg_if! { runtime_io::submit_transaction(&ex).unwrap() } } + + impl session::SessionKeys for Runtime { + fn generate_session_keys(_: Option>) -> Vec { + SessionKeys::generate(None) + } + } } } } + +fn test_ed25519_crypto() -> (ed25519::AppSignature, ed25519::AppPublic) { + let public0 = ed25519::AppPublic::generate_pair(None); + let public1 = ed25519::AppPublic::generate_pair(None); + let public2 = ed25519::AppPublic::generate_pair(None); + + let all = ed25519::AppPublic::all(); + assert!(all.contains(&public0)); + assert!(all.contains(&public1)); + assert!(all.contains(&public2)); + + let signature = public0.sign(&"ed25519").expect("Generates a valid `ed25519` signature."); + assert!(public0.verify(&"ed25519", &signature)); + (signature, public0) +} + +fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic) { + let public0 = sr25519::AppPublic::generate_pair(None); + let public1 = sr25519::AppPublic::generate_pair(None); + let public2 = sr25519::AppPublic::generate_pair(None); + + let all = sr25519::AppPublic::all(); + assert!(all.contains(&public0)); + assert!(all.contains(&public1)); + assert!(all.contains(&public2)); + + let signature = public0.sign(&"sr25519").expect("Generates a valid `sr25519` signature."); + assert!(public0.verify(&"sr25519", &signature)); + (signature, public0) +} + +#[cfg(test)] +mod tests { + use substrate_test_runtime_client::{ + prelude::*, + DefaultTestClientBuilderExt, TestClientBuilder, + runtime::TestAPI, + }; + use sr_primitives::{ + generic::BlockId, + traits::ProvideRuntimeApi, + }; + use state_machine::ExecutionStrategy; + + #[test] + fn returns_mutable_static() { + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); + let runtime_api = client.runtime_api(); + let block_id = BlockId::Number(client.info().chain.best_number); + + let ret = runtime_api.returns_mutable_static(&block_id).unwrap(); + assert_eq!(ret, 33); + + // We expect that every invocation will need to return the initial + // value plus one. If the value increases more than that then it is + // a sign that the wasm runtime preserves the memory content. + let ret = runtime_api.returns_mutable_static(&block_id).unwrap(); + assert_eq!(ret, 33); + } + + // If we didn't restore the wasm instance properly, on a trap the stack pointer would not be + // returned to its initial value and thus the stack space is going to be leaked. + // + // See https://github.com/paritytech/substrate/issues/2967 for details + #[test] + fn restoration_of_globals() { + // Allocate 32 pages (of 65536 bytes) which gives the runtime 2048KB of heap to operate on + // (plus some additional space unused from the initial pages requested by the wasm runtime + // module). + // + // The fixture performs 2 allocations of 768KB and this theoretically gives 1536KB, however, due + // to our allocator algorithm there are inefficiencies. + const REQUIRED_MEMORY_PAGES: u64 = 32; + + let client = TestClientBuilder::new() + .set_execution_strategy(ExecutionStrategy::AlwaysWasm) + .set_heap_pages(REQUIRED_MEMORY_PAGES) + .build(); + let runtime_api = client.runtime_api(); + let block_id = BlockId::Number(client.info().chain.best_number); + + // On the first invocation we allocate approx. 768KB (75%) of stack and then trap. + let ret = runtime_api.allocates_huge_stack_array(&block_id, true); + assert!(ret.is_err()); + + // On the second invocation we allocate yet another 768KB (75%) of stack + let ret = runtime_api.allocates_huge_stack_array(&block_id, false); + assert!(ret.is_ok()); + } + +} diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index f4433e391c7df8812ede37fd59a0c14e1c4ff2a4..f3c890cf79f54f80b08d5690a09d0d65914f433a 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -18,13 +18,14 @@ //! and depositing logs. use rstd::prelude::*; -use runtime_io::{storage_root, enumerated_trie_root, storage_changes_root, twox_128, blake2_256}; +use runtime_io::{storage_root, ordered_trie_root, storage_changes_root, twox_128, blake2_256}; use runtime_support::storage::{self, StorageValue, StorageMap}; use runtime_support::storage_items; -use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Header as _}; -use runtime_primitives::generic; -use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult, transaction_validity::TransactionValidity}; -use parity_codec::{KeyedVec, Encode}; +use sr_primitives::traits::{Hash as HashT, BlakeTwo256, Header as _}; +use sr_primitives::generic; +use sr_primitives::{ApplyError, ApplyOutcome, ApplyResult}; +use sr_primitives::transaction_validity::{TransactionValidity, ValidTransaction}; +use codec::{KeyedVec, Encode}; use super::{ AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest, AuthorityId }; @@ -95,7 +96,7 @@ fn execute_block_with_state_root_handler( // check transaction trie root represents the transactions. let txs = block.extrinsics.iter().map(Encode::encode).collect::>(); let txs = txs.iter().map(Vec::as_slice).collect::>(); - let txs_root = enumerated_trie_root::(&txs).into(); + let txs_root = ordered_trie_root::(&txs).into(); info_expect_equal_hash(&txs_root, &header.extrinsics_root); if let Mode::Overwrite = mode { header.extrinsics_root = txs_root; @@ -175,13 +176,13 @@ pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { p }; - TransactionValidity::Valid { + TransactionValidity::Valid(ValidTransaction { priority: tx.amount, requires, provides, longevity: 64, propagate: true, - } + }) } /// Execute a transaction outside of the block execution function. @@ -199,14 +200,13 @@ pub fn finalize_block() -> Header { let extrinsic_index: u32 = storage::unhashed::take(well_known_keys::EXTRINSIC_INDEX).unwrap(); let txs: Vec<_> = (0..extrinsic_index).map(ExtrinsicData::take).collect(); let txs = txs.iter().map(Vec::as_slice).collect::>(); - let extrinsics_root = enumerated_trie_root::(&txs).into(); - // let mut digest = Digest::default(); + let extrinsics_root = ordered_trie_root::(&txs).into(); let number = ::take().expect("Number is set by `initialize_block`"); let parent_hash = ::take(); let mut digest = ::take().expect("StorageDigest is set by `initialize_block`"); let o_new_authorities = ::take(); - // This MUST come after all changes to storage are done. Otherwise we will fail the + // This MUST come after all changes to storage are done. Otherwise we will fail the // “Storage root does not match that calculated” assertion. let storage_root = BlakeTwo256::storage_root(); let storage_changes_root = BlakeTwo256::storage_changes_root(parent_hash); @@ -231,7 +231,7 @@ pub fn finalize_block() -> Header { #[inline(always)] fn check_signature(utx: &Extrinsic) -> Result<(), ApplyError> { - use runtime_primitives::traits::BlindCheckable; + use sr_primitives::traits::BlindCheckable; utx.clone().check().map_err(|_| ApplyError::BadSignature)?; Ok(()) } @@ -273,8 +273,7 @@ fn execute_transfer_backend(tx: &Transfer) -> ApplyResult { } fn execute_new_authorities_backend(new_authorities: &[AuthorityId]) -> ApplyResult { - let new_authorities: Vec = new_authorities.iter().cloned().collect(); - ::put(new_authorities); + NewAuthorities::put(new_authorities.to_vec()); Ok(ApplyOutcome::Success) } @@ -312,24 +311,24 @@ mod tests { use super::*; use runtime_io::{with_externalities, TestExternalities}; - use substrate_test_runtime_client::{AuthorityKeyring, AccountKeyring}; + use substrate_test_runtime_client::{AccountKeyring, Sr25519Keyring}; use crate::{Header, Transfer, WASM_BINARY}; use primitives::{Blake2Hasher, map}; use substrate_executor::WasmExecutor; fn new_test_ext() -> TestExternalities { let authorities = vec![ - AuthorityKeyring::Alice.to_raw_public(), - AuthorityKeyring::Bob.to_raw_public(), - AuthorityKeyring::Charlie.to_raw_public() + Sr25519Keyring::Alice.to_raw_public(), + Sr25519Keyring::Bob.to_raw_public(), + Sr25519Keyring::Charlie.to_raw_public() ]; - TestExternalities::new(map![ + TestExternalities::new((map![ twox_128(b"latest").to_vec() => vec![69u8; 32], twox_128(b"sys:auth").to_vec() => authorities.encode(), blake2_256(&AccountKeyring::Alice.to_raw_public().to_keyed_vec(b"balance:")).to_vec() => { vec![111u8, 0, 0, 0, 0, 0, 0, 0] } - ]) + ], map![])) } fn block_import_works(block_executor: F) where F: Fn(Block, &mut TestExternalities) { diff --git a/core/transaction-pool/Cargo.toml b/core/transaction-pool/Cargo.toml index 2e4f32197b11e5804736316426ef861a1b524283..747c39a16566a9881d7319fb2ab42d5ae995d512 100644 --- a/core/transaction-pool/Cargo.toml +++ b/core/transaction-pool/Cargo.toml @@ -8,11 +8,11 @@ edition = "2018" derive_more = "0.14.0" futures = "0.1" log = "0.4" -parity-codec = "4.1.1" -parking_lot = "0.8.0" +codec = { package = "parity-scale-codec", version = "1.0.0" } +parking_lot = "0.9.0" sr-primitives = { path = "../sr-primitives" } client = { package = "substrate-client", path = "../client" } -substrate-primitives = { path = "../primitives" } +primitives = { package = "substrate-primitives", path = "../primitives" } txpool = { package = "substrate-transaction-graph", path = "./graph" } [dev-dependencies] diff --git a/core/transaction-pool/graph/Cargo.toml b/core/transaction-pool/graph/Cargo.toml index 951a595810d7453a152c180f7bca62d2e43a94e3..4dc7ce69cffe943817077c385678580cc0eb0f42 100644 --- a/core/transaction-pool/graph/Cargo.toml +++ b/core/transaction-pool/graph/Cargo.toml @@ -8,13 +8,13 @@ edition = "2018" derive_more = "0.14.0" futures = "0.1" log = "0.4" -parking_lot = "0.8.0" +parking_lot = "0.9.0" serde = { version = "1.0", features = ["derive"] } -substrate-primitives = { path = "../../primitives" } +primitives = { package = "substrate-primitives", path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } [dev-dependencies] assert_matches = "1.3.0" env_logger = "0.6.1" -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } test_runtime = { package = "substrate-test-runtime", path = "../../test-runtime" } diff --git a/core/transaction-pool/graph/src/base_pool.rs b/core/transaction-pool/graph/src/base_pool.rs index b3a2cf0e54702475a514da18705c6b76971dd3cb..cb37aee07f4b8116fe2b0cb7cfcf36e746676474 100644 --- a/core/transaction-pool/graph/src/base_pool.rs +++ b/core/transaction-pool/graph/src/base_pool.rs @@ -27,7 +27,7 @@ use std::{ use log::{trace, debug, warn}; use serde::Serialize; -use substrate_primitives::hexdisplay::HexDisplay; +use primitives::hexdisplay::HexDisplay; use sr_primitives::traits::Member; use sr_primitives::transaction_validity::{ TransactionTag as Tag, diff --git a/core/transaction-pool/graph/src/future.rs b/core/transaction-pool/graph/src/future.rs index 6ca5019e47fadfd98892d64f9a3f885088f0065a..c7b13c912df183c054d7c717ce6cc056a0353e64 100644 --- a/core/transaction-pool/graph/src/future.rs +++ b/core/transaction-pool/graph/src/future.rs @@ -22,7 +22,7 @@ use std::{ time, }; -use substrate_primitives::hexdisplay::HexDisplay; +use primitives::hexdisplay::HexDisplay; use sr_primitives::transaction_validity::{ TransactionTag as Tag, }; diff --git a/core/transaction-pool/graph/src/pool.rs b/core/transaction-pool/graph/src/pool.rs index 4498598aee9cab96b878e4f5984460c806c8e053..6eec0d222f1a3f8fc4621ce9775c13ef814c339d 100644 --- a/core/transaction-pool/graph/src/pool.rs +++ b/core/transaction-pool/graph/src/pool.rs @@ -129,18 +129,19 @@ impl Pool { } match self.api.validate_transaction(at, xt.clone())? { - TransactionValidity::Valid { priority, requires, provides, longevity, propagate } => { + TransactionValidity::Valid(validity) => { Ok(base::Transaction { data: xt, - bytes, + bytes + , hash, - priority, - requires, - provides, - propagate, + priority: validity.priority, + requires: validity.requires, + provides: validity.provides, + propagate: validity.propagate, valid_till: block_number .saturated_into::() - .saturating_add(longevity), + .saturating_add(validity.longevity), }) }, TransactionValidity::Invalid(e) => { @@ -233,7 +234,7 @@ impl Pool { for (extrinsic, existing_in_pool) in all { match *existing_in_pool { - // reuse the tags for extrinsis that were found in the pool + // reuse the tags for extrinsics that were found in the pool Some(ref transaction) => { tags.extend(transaction.provides.iter().cloned()); }, @@ -242,8 +243,8 @@ impl Pool { None => { let validity = self.api.validate_transaction(parent, extrinsic.clone()); match validity { - Ok(TransactionValidity::Valid { mut provides, .. }) => { - tags.append(&mut provides); + Ok(TransactionValidity::Valid(mut validity)) => { + tags.append(&mut validity.provides); }, // silently ignore invalid extrinsics, // cause they might just be inherent @@ -306,7 +307,7 @@ impl Pool { let hashes = status.pruned.iter().map(|tx| tx.hash.clone()).collect::>(); let results = self.submit_at(at, status.pruned.into_iter().map(|tx| tx.data.clone()))?; - // Collect the hashes of transactions that now became invalid (meaning that they are succesfully pruned). + // Collect the hashes of transactions that now became invalid (meaning that they are successfully pruned). let hashes = results.into_iter().enumerate().filter_map(|(idx, r)| match r.map_err(error::IntoPoolError::into_pool_error) { Err(Ok(error::Error::InvalidTransaction(_))) => Some(hashes[idx].clone()), _ => None, @@ -451,8 +452,9 @@ fn fire_events( #[cfg(test)] mod tests { use super::*; + use sr_primitives::transaction_validity::ValidTransaction; use futures::Stream; - use parity_codec::Encode; + use codec::Encode; use test_runtime::{Block, Extrinsic, Transfer, H256, AccountId}; use assert_matches::assert_matches; use crate::watcher; @@ -486,13 +488,13 @@ mod tests { if nonce < block_number { Ok(TransactionValidity::Invalid(0)) } else { - Ok(TransactionValidity::Valid { + Ok(TransactionValidity::Valid(ValidTransaction { priority: 4, requires: if nonce > block_number { vec![vec![nonce as u8 - 1]] } else { vec![] }, provides: vec![vec![nonce as u8]], longevity: 3, propagate: true, - }) + })) } } diff --git a/core/transaction-pool/src/api.rs b/core/transaction-pool/src/api.rs index 84475376fe6377ff6c71afd2499bb941bd453865..c0c4c787a5012d652ff1aac873f483331d304da5 100644 --- a/core/transaction-pool/src/api.rs +++ b/core/transaction-pool/src/api.rs @@ -21,9 +21,9 @@ use std::{ marker::PhantomData, }; use client::{runtime_api::TaggedTransactionQueue, blockchain::HeaderBackend}; -use parity_codec::Encode; +use codec::Encode; use txpool; -use substrate_primitives::{ +use primitives::{ H256, Blake2Hasher, Hasher, diff --git a/core/transaction-pool/src/tests.rs b/core/transaction-pool/src/tests.rs index a1ee4a50df332b9fe9d74fd0f4a1e8f3d637bebf..71ed988e5e7b34901cd46d42ca1f6f3bb086e9fe 100644 --- a/core/transaction-pool/src/tests.rs +++ b/core/transaction-pool/src/tests.rs @@ -17,13 +17,13 @@ use super::*; -use parity_codec::Encode; +use codec::Encode; use txpool::{self, Pool}; use test_client::{runtime::{AccountId, Block, Hash, Index, Extrinsic, Transfer}, AccountKeyring::{self, *}}; use sr_primitives::{ generic::{self, BlockId}, traits::{Hash as HashT, BlakeTwo256}, - transaction_validity::TransactionValidity, + transaction_validity::{TransactionValidity, ValidTransaction}, }; struct TestApi; @@ -48,13 +48,13 @@ impl txpool::ChainApi for TestApi { }; let provides = vec![vec![uxt.transfer().nonce as u8]]; - Ok(TransactionValidity::Valid { + Ok(TransactionValidity::Valid(ValidTransaction { priority: 1, requires, provides, longevity: 64, propagate: true, - }) + })) } fn block_id_to_number(&self, at: &BlockId) -> error::Result>> { diff --git a/core/trie/Cargo.toml b/core/trie/Cargo.toml index ef00e52edadc47c4d8bf74c777f7c6215c23371a..82945d90f33d7d49aec9f4a150cd31bfd4629181 100644 --- a/core/trie/Cargo.toml +++ b/core/trie/Cargo.toml @@ -2,7 +2,7 @@ name = "substrate-trie" version = "2.0.0" authors = ["Parity Technologies "] -description = "Patricia trie stuff using a parity-codec node format" +description = "Patricia trie stuff using a parity-scale-codec node format" repository = "https://github.com/paritytech/parity-common" license = "GPL-3.0" edition = "2018" @@ -12,18 +12,18 @@ name = "bench" harness = false [dependencies] -codec = { package = "parity-codec", version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } -hash-db = { version = "0.14.0", default-features = false } -trie-db = { version = "0.14.0", default-features = false } -trie-root = { version = "0.14.0", default-features = false } -memory-db = { version = "0.14.0", default-features = false } -substrate-primitives = { path = "../primitives", default-features = false } +hash-db = { version = "0.15.0", default-features = false } +trie-db = { version = "0.15.0", default-features = false } +trie-root = { version = "0.15.0", default-features = false } +memory-db = { version = "0.15.0", default-features = false } +primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } [dev-dependencies] -trie-bench = { version = "0.14.0" } -trie-standardmap = { version = "0.14.0" } -keccak-hasher = { version = "0.14.0" } +trie-bench = { version = "0.16.0" } +trie-standardmap = { version = "0.15.0" } +keccak-hasher = { version = "0.15.0" } criterion = "0.2" hex-literal = "0.2.0" @@ -36,5 +36,5 @@ std = [ "memory-db/std", "trie-db/std", "trie-root/std", - "substrate-primitives/std", + "primitives/std", ] diff --git a/core/trie/benches/bench.rs b/core/trie/benches/bench.rs index 179dc6aaf8413c0c85e88f3c95ecda7d3e089d5b..a8a473222285d78ff92775468f4cefa28a146191 100644 --- a/core/trie/benches/bench.rs +++ b/core/trie/benches/bench.rs @@ -20,13 +20,11 @@ criterion_main!(benches); fn benchmark(c: &mut Criterion) { trie_bench::standard_benchmark::< - substrate_primitives::Blake2Hasher, - substrate_trie::NodeCodec, + substrate_trie::Layout, substrate_trie::TrieStream, >(c, "substrate-blake2"); trie_bench::standard_benchmark::< - keccak_hasher::KeccakHasher, - substrate_trie::NodeCodec, + substrate_trie::Layout, substrate_trie::TrieStream, >(c, "substrate-keccak"); } diff --git a/core/trie/src/error.rs b/core/trie/src/error.rs index 1e386146d3dff7294d4c7985be1774a7aecbc086..c18db37f35ba3c1f7921503b61e61109bee52cab 100644 --- a/core/trie/src/error.rs +++ b/core/trie/src/error.rs @@ -12,22 +12,36 @@ use std::fmt; use std::error::Error as StdError; #[derive(Debug, PartialEq, Eq, Clone)] -/// Error concerning the Parity-Codec based decoder. +/// Error for trie node decoding. pub enum Error { /// Bad format. BadFormat, + /// Decoding error. + Decode(codec::Error) +} + +impl From for Error { + fn from(x: codec::Error) -> Self { + Error::Decode(x) + } } #[cfg(feature="std")] impl StdError for Error { fn description(&self) -> &str { - "codec error" + match self { + Error::BadFormat => "Bad format error", + Error::Decode(_) => "Decoding error", + } } } #[cfg(feature="std")] impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - fmt::Debug::fmt(&self, f) + match self { + Error::Decode(e) => write!(f, "Decode error: {}", e.what()), + Error::BadFormat => write!(f, "Bad format"), + } } } diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index fe45c4aaf1985e08fcd2462f1c0b4836bdee8942..e526a27ebefba5f152b4aee379cfb4ec73bf7142 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -33,57 +33,104 @@ pub use trie_stream::TrieStream; /// The Substrate format implementation of `NodeCodec`. pub use node_codec::NodeCodec; /// Various re-exports from the `trie-db` crate. -pub use trie_db::{Trie, TrieMut, DBValue, Recorder, Query}; +pub use trie_db::{Trie, TrieMut, DBValue, Recorder, CError, + Query, TrieLayout, TrieConfiguration, nibble_ops}; /// Various re-exports from the `memory-db` crate. -pub use memory_db::{KeyFunction, prefixed_key}; +pub use memory_db::KeyFunction; +pub use memory_db::prefixed_key; /// Various re-exports from the `hash-db` crate. -pub use hash_db::HashDB as HashDBT; +pub use hash_db::{HashDB as HashDBT, EMPTY_PREFIX}; -/// As in `trie_db`, but less generic, error type for the crate. -pub type TrieError = trie_db::TrieError; -/// As in `hash_db`, but less generic, trait exposed. + +#[derive(Default)] +/// substrate trie layout +pub struct Layout(rstd::marker::PhantomData); + +impl TrieLayout for Layout { + const USE_EXTENSION: bool = false; + type Hash = H; + type Codec = NodeCodec; +} + +impl TrieConfiguration for Layout { + fn trie_root(input: I) -> ::Out where + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, + { + trie_root::trie_root_no_extension::(input) + } + + fn trie_root_unhashed(input: I) -> Vec where + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, + { + trie_root::unhashed_trie_no_extension::(input) + } + + fn encode_index(input: u32) -> Vec { + codec::Encode::encode(&codec::Compact(input)) + } +} + +/// TrieDB error over `TrieConfiguration` trait. +pub type TrieError = trie_db::TrieError, CError>; +/// Reexport from `hash_db`, with genericity set for `Hasher` trait. pub trait AsHashDB: hash_db::AsHashDB {} impl> AsHashDB for T {} -/// As in `hash_db`, but less generic, trait exposed. +/// Reexport from `hash_db`, with genericity set for `Hasher` trait. pub type HashDB<'a, H> = dyn hash_db::HashDB + 'a; -/// As in `hash_db`, but less generic, trait exposed. +/// Reexport from `hash_db`, with genericity set for key only. pub type PlainDB<'a, K> = dyn hash_db::PlainDB + 'a; -/// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. +/// Reexport from `hash_db`, with genericity set for `Hasher` trait. +/// This uses a `KeyFunction` for prefixing keys internally (avoiding +/// key conflict for non random keys). pub type PrefixedMemoryDB = memory_db::MemoryDB, trie_db::DBValue>; -/// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. +/// Reexport from `hash_db`, with genericity set for `Hasher` trait. +/// This uses the `KeyFunction` for prefixing keys internally (avoiding +/// This uses a noops `KeyFunction` (key addressing must be hashed or using +/// an encoding scheme that avoid key conflict). pub type MemoryDB = memory_db::MemoryDB, trie_db::DBValue>; -/// As in `memory_db`, but less generic, trait exposed. +/// Reexport from `hash_db`, with genericity set for `Hasher` trait. pub type GenericMemoryDB = memory_db::MemoryDB; /// Persistent trie database read-access interface for the a given hasher. -pub type TrieDB<'a, H> = trie_db::TrieDB<'a, H, NodeCodec>; +pub type TrieDB<'a, L> = trie_db::TrieDB<'a, L>; /// Persistent trie database write-access interface for the a given hasher. -pub type TrieDBMut<'a, H> = trie_db::TrieDBMut<'a, H, NodeCodec>; +pub type TrieDBMut<'a, L> = trie_db::TrieDBMut<'a, L>; /// Querying interface, as in `trie_db` but less generic. -pub type Lookup<'a, H, Q> = trie_db::Lookup<'a, H, NodeCodec, Q>; - -/// Determine a trie root given its ordered contents, closed form. -pub fn trie_root(input: I) -> H::Out where - I: IntoIterator, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, -{ - trie_root::trie_root::(input) +pub type Lookup<'a, L, Q> = trie_db::Lookup<'a, L, Q>; +/// Hash type for a trie layout. +pub type TrieHash = <::Hash as Hasher>::Out; + +/// This module is for non generic definition of trie type. +/// Only the `Hasher` trait is generic in this case. +pub mod trie_types { + pub type Layout = super::Layout; + /// Persistent trie database read-access interface for the a given hasher. + pub type TrieDB<'a, H> = super::TrieDB<'a, Layout>; + /// Persistent trie database write-access interface for the a given hasher. + pub type TrieDBMut<'a, H> = super::TrieDBMut<'a, Layout>; + /// Querying interface, as in `trie_db` but less generic. + pub type Lookup<'a, H, Q> = trie_db::Lookup<'a, Layout, Q>; + /// As in `trie_db`, but less generic, error type for the crate. + pub type TrieError = trie_db::TrieError; } /// Determine a trie root given a hash DB and delta values. -pub fn delta_trie_root( +pub fn delta_trie_root( db: &mut DB, - mut root: H::Out, + mut root: TrieHash, delta: I -) -> Result>> where +) -> Result, Box>> where I: IntoIterator)>, A: AsRef<[u8]> + Ord, B: AsRef<[u8]>, - DB: hash_db::HashDB, + DB: hash_db::HashDB, { { - let mut trie = TrieDBMut::::from_existing(&mut *db, &mut root)?; + let mut trie = TrieDBMut::::from_existing(&mut *db, &mut root)?; for (key, change) in delta { match change { @@ -97,45 +144,26 @@ pub fn delta_trie_root( } /// Read a value from the trie. -pub fn read_trie_value>( +pub fn read_trie_value>( db: &DB, - root: &H::Out, + root: &TrieHash, key: &[u8] -) -> Result>, Box>> { - Ok(TrieDB::::new(&*db, root)?.get(key).map(|x| x.map(|val| val.to_vec()))?) +) -> Result>, Box>> { + Ok(TrieDB::::new(&*db, root)?.get(key).map(|x| x.map(|val| val.to_vec()))?) } /// Read a value from the trie with given Query. -pub fn read_trie_value_with, DB: hash_db::HashDBRef>( +pub fn read_trie_value_with< + L: TrieConfiguration, + Q: Query, + DB: hash_db::HashDBRef +>( db: &DB, - root: &H::Out, + root: &TrieHash, key: &[u8], query: Q -) -> Result>, Box>> { - Ok(TrieDB::::new(&*db, root)?.get_with(key, query).map(|x| x.map(|val| val.to_vec()))?) -} - -/// Determine a trie root node's data given its ordered contents, closed form. -pub fn unhashed_trie(input: I) -> Vec where - I: IntoIterator, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, -{ - trie_root::unhashed_trie::(input) -} - -/// A trie root formed from the items, with keys attached according to their -/// compact-encoded index (using `parity-codec` crate). -pub fn ordered_trie_root(input: I) -> H::Out -where - I: IntoIterator, - A: AsRef<[u8]>, -{ - trie_root::(input - .into_iter() - .enumerate() - .map(|(i, v)| (codec::Encode::encode(&codec::Compact(i as u32)), v)) - ) +) -> Result>, Box>> { + Ok(TrieDB::::new(&*db, root)?.get_with(key, query).map(|x| x.map(|val| val.to_vec()))?) } /// Determine whether a child trie key is valid. @@ -143,8 +171,8 @@ where /// For now, the only valid child trie key is `:child_storage:default:`. /// /// `child_trie_root` and `child_delta_trie_root` can panic if invalid value is provided to them. -pub fn is_child_trie_key_valid(storage_key: &[u8]) -> bool { - use substrate_primitives::storage::well_known_keys; +pub fn is_child_trie_key_valid(storage_key: &[u8]) -> bool { + use primitives::storage::well_known_keys; let has_right_prefix = storage_key.starts_with(b":child_storage:default:"); if has_right_prefix { // This is an attempt to catch a change of `is_child_storage_key`, which @@ -158,37 +186,42 @@ pub fn is_child_trie_key_valid(storage_key: &[u8]) -> bool { } /// Determine the default child trie root. -pub fn default_child_trie_root(_storage_key: &[u8]) -> Vec { - trie_root::, Vec>(core::iter::empty()).as_ref().iter().cloned().collect() +pub fn default_child_trie_root(_storage_key: &[u8]) -> Vec { + L::trie_root::<_, Vec, Vec>(core::iter::empty()).as_ref().iter().cloned().collect() } -/// Determine a child trie root given its ordered contents, closed form. H is the default hasher, but a generic -/// implementation may ignore this type parameter and use other hashers. -pub fn child_trie_root(_storage_key: &[u8], input: I) -> Vec where - I: IntoIterator, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, +/// Determine a child trie root given its ordered contents, closed form. H is the default hasher, +/// but a generic implementation may ignore this type parameter and use other hashers. +pub fn child_trie_root(_storage_key: &[u8], input: I) -> Vec + where + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, { - trie_root::(input).as_ref().iter().cloned().collect() + L::trie_root(input).as_ref().iter().cloned().collect() } -/// Determine a child trie root given a hash DB and delta values. H is the default hasher, but a generic implementation may ignore this type parameter and use other hashers. -pub fn child_delta_trie_root( +/// Determine a child trie root given a hash DB and delta values. H is the default hasher, +/// but a generic implementation may ignore this type parameter and use other hashers. +pub fn child_delta_trie_root( _storage_key: &[u8], db: &mut DB, root_vec: Vec, delta: I -) -> Result, Box>> where - I: IntoIterator)>, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, - DB: hash_db::HashDB + hash_db::PlainDB, +) -> Result, Box>> + where + I: IntoIterator)>, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, + DB: hash_db::HashDB + + hash_db::PlainDB, trie_db::DBValue>, { - let mut root = H::Out::default(); - root.as_mut().copy_from_slice(&root_vec); // root is fetched from DB, not writable by runtime, so it's always valid. + let mut root = TrieHash::::default(); + // root is fetched from DB, not writable by runtime, so it's always valid. + root.as_mut().copy_from_slice(&root_vec); { - let mut trie = TrieDBMut::::from_existing(&mut *db, &mut root)?; + let mut trie = TrieDBMut::::from_existing(&mut *db, &mut root)?; for (key, change) in delta { match change { @@ -202,18 +235,21 @@ pub fn child_delta_trie_root( } /// Call `f` for all keys in a child trie. -pub fn for_keys_in_child_trie( +pub fn for_keys_in_child_trie( _storage_key: &[u8], db: &DB, root_slice: &[u8], mut f: F -) -> Result<(), Box>> where - DB: hash_db::HashDBRef + hash_db::PlainDBRef, +) -> Result<(), Box>> + where + DB: hash_db::HashDBRef + + hash_db::PlainDBRef, trie_db::DBValue>, { - let mut root = H::Out::default(); - root.as_mut().copy_from_slice(root_slice); // root is fetched from DB, not writable by runtime, so it's always valid. + let mut root = TrieHash::::default(); + // root is fetched from DB, not writable by runtime, so it's always valid. + root.as_mut().copy_from_slice(root_slice); - let trie = TrieDB::::new(&*db, &root)?; + let trie = TrieDB::::new(&*db, &root)?; let iter = trie.iter()?; for x in iter { @@ -225,14 +261,14 @@ pub fn for_keys_in_child_trie( } /// Record all keys for a given root. -pub fn record_all_keys( +pub fn record_all_keys( db: &DB, - root: &H::Out, - recorder: &mut Recorder -) -> Result<(), Box>> where - DB: hash_db::HashDBRef + root: &TrieHash, + recorder: &mut Recorder> +) -> Result<(), Box>> where + DB: hash_db::HashDBRef { - let trie = TrieDB::::new(&*db, root)?; + let trie = TrieDB::::new(&*db, root)?; let iter = trie.iter()?; for x in iter { @@ -248,105 +284,76 @@ pub fn record_all_keys( } /// Read a value from the child trie. -pub fn read_child_trie_value( +pub fn read_child_trie_value( _storage_key: &[u8], db: &DB, root_slice: &[u8], key: &[u8] -) -> Result>, Box>> where - DB: hash_db::HashDBRef + hash_db::PlainDBRef, +) -> Result>, Box>> + where + DB: hash_db::HashDBRef + + hash_db::PlainDBRef, trie_db::DBValue>, { - let mut root = H::Out::default(); - root.as_mut().copy_from_slice(root_slice); // root is fetched from DB, not writable by runtime, so it's always valid. + let mut root = TrieHash::::default(); + // root is fetched from DB, not writable by runtime, so it's always valid. + root.as_mut().copy_from_slice(root_slice); - Ok(TrieDB::::new(&*db, &root)?.get(key).map(|x| x.map(|val| val.to_vec()))?) + Ok(TrieDB::::new(&*db, &root)?.get(key).map(|x| x.map(|val| val.to_vec()))?) } /// Read a value from the child trie with given query. -pub fn read_child_trie_value_with, DB>( +pub fn read_child_trie_value_with, DB>( _storage_key: &[u8], db: &DB, root_slice: &[u8], key: &[u8], query: Q -) -> Result>, Box>> where - DB: hash_db::HashDBRef + hash_db::PlainDBRef, +) -> Result>, Box>> + where + DB: hash_db::HashDBRef + + hash_db::PlainDBRef, trie_db::DBValue>, { - let mut root = H::Out::default(); - root.as_mut().copy_from_slice(root_slice); // root is fetched from DB, not writable by runtime, so it's always valid. + let mut root = TrieHash::::default(); + // root is fetched from DB, not writable by runtime, so it's always valid. + root.as_mut().copy_from_slice(root_slice); - Ok(TrieDB::::new(&*db, &root)?.get_with(key, query).map(|x| x.map(|val| val.to_vec()))?) + Ok(TrieDB::::new(&*db, &root)?.get_with(key, query).map(|x| x.map(|val| val.to_vec()))?) } -// Utilities (not exported): - -const EMPTY_TRIE: u8 = 0; -const LEAF_NODE_OFFSET: u8 = 1; -const LEAF_NODE_BIG: u8 = 127; -const EXTENSION_NODE_OFFSET: u8 = 128; -const EXTENSION_NODE_BIG: u8 = 253; -const BRANCH_NODE_NO_VALUE: u8 = 254; -const BRANCH_NODE_WITH_VALUE: u8 = 255; -const LEAF_NODE_THRESHOLD: u8 = LEAF_NODE_BIG - LEAF_NODE_OFFSET; -const EXTENSION_NODE_THRESHOLD: u8 = EXTENSION_NODE_BIG - EXTENSION_NODE_OFFSET; //125 -const LEAF_NODE_SMALL_MAX: u8 = LEAF_NODE_BIG - 1; -const EXTENSION_NODE_SMALL_MAX: u8 = EXTENSION_NODE_BIG - 1; - -fn take<'a>(input: &mut &'a[u8], count: usize) -> Option<&'a[u8]> { - if input.len() < count { - return None - } - let r = &(*input)[..count]; - *input = &(*input)[count..]; - Some(r) -} - -fn partial_to_key(partial: &[u8], offset: u8, big: u8) -> Vec { - let nibble_count = (partial.len() - 1) * 2 + if partial[0] & 16 == 16 { 1 } else { 0 }; - let (first_byte_small, big_threshold) = (offset, (big - offset) as usize); - let mut output = [first_byte_small + nibble_count.min(big_threshold) as u8].to_vec(); - if nibble_count >= big_threshold { output.push((nibble_count - big_threshold) as u8) } - if nibble_count % 2 == 1 { - output.push(partial[0] & 0x0f); - } - output.extend_from_slice(&partial[1..]); - output -} - -fn branch_node(has_value: bool, has_children: impl Iterator) -> [u8; 3] { - let first = if has_value { - BRANCH_NODE_WITH_VALUE - } else { - BRANCH_NODE_NO_VALUE - }; - let mut bitmap: u16 = 0; - let mut cursor: u16 = 1; - for v in has_children { - if v { bitmap |= cursor } - cursor <<= 1; - } - [first, (bitmap % 256 ) as u8, (bitmap / 256 ) as u8] +/// Constants used into trie simplification codec. +mod trie_constants { + pub const EMPTY_TRIE: u8 = 0; + pub const NIBBLE_SIZE_BOUND: usize = u16::max_value() as usize; + pub const LEAF_PREFIX_MASK: u8 = 0b_01 << 6; + pub const BRANCH_WITHOUT_MASK: u8 = 0b_10 << 6; + pub const BRANCH_WITH_MASK: u8 = 0b_11 << 6; } #[cfg(test)] mod tests { use super::*; use codec::{Encode, Compact}; - use substrate_primitives::Blake2Hasher; + use primitives::Blake2Hasher; use hash_db::{HashDB, Hasher}; - use trie_db::{DBValue, TrieMut, Trie}; + use trie_db::{DBValue, TrieMut, Trie, NodeCodec as NodeCodecT}; use trie_standardmap::{Alphabet, ValueMode, StandardMap}; use hex_literal::hex; - fn check_equivalent(input: &Vec<(&[u8], &[u8])>) { + type Layout = super::Layout; + + fn hashed_null_node() -> TrieHash { + >::hashed_null_node() + } + + fn check_equivalent(input: &Vec<(&[u8], &[u8])>) { { - let closed_form = trie_root::(input.clone()); - let d = unhashed_trie::(input.clone()); + let closed_form = T::trie_root(input.clone()); + let d = T::trie_root_unhashed(input.clone()); println!("Data: {:#x?}, {:#x?}", d, Blake2Hasher::hash(&d[..])); let persistent = { let mut memdb = MemoryDB::default(); let mut root = Default::default(); - let mut t = TrieDBMut::::new(&mut memdb, &mut root); + let mut t = TrieDBMut::::new(&mut memdb, &mut root); for (x, y) in input.iter().rev() { t.insert(x, y).unwrap(); } @@ -356,20 +363,22 @@ mod tests { } } - fn check_iteration(input: &Vec<(&[u8], &[u8])>) { + fn check_iteration(input: &Vec<(&[u8], &[u8])>) { let mut memdb = MemoryDB::default(); let mut root = Default::default(); { - let mut t = TrieDBMut::::new(&mut memdb, &mut root); + let mut t = TrieDBMut::::new(&mut memdb, &mut root); for (x, y) in input.clone() { t.insert(x, y).unwrap(); } } { - let t = TrieDB::::new(&mut memdb, &root).unwrap(); + let t = TrieDB::::new(&mut memdb, &root).unwrap(); assert_eq!( input.iter().map(|(i, j)| (i.to_vec(), j.to_vec())).collect::>(), - t.iter().unwrap().map(|x| x.map(|y| (y.0, y.1.to_vec())).unwrap()).collect::>() + t.iter().unwrap() + .map(|x| x.map(|y| (y.0, y.1.to_vec())).unwrap()) + .collect::>() ); } } @@ -377,11 +386,11 @@ mod tests { #[test] fn default_trie_root() { let mut db = MemoryDB::default(); - let mut root = ::Out::default(); - let mut empty = TrieDBMut::::new(&mut db, &mut root); + let mut root = TrieHash::::default(); + let mut empty = TrieDBMut::::new(&mut db, &mut root); empty.commit(); let root1 = empty.root().as_ref().to_vec(); - let root2: Vec = trie_root::, Vec>( + let root2: Vec = Layout::trie_root::<_, Vec, Vec>( std::iter::empty(), ).as_ref().iter().cloned().collect(); @@ -391,29 +400,35 @@ mod tests { #[test] fn empty_is_equivalent() { let input: Vec<(&[u8], &[u8])> = vec![]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } #[test] fn leaf_is_equivalent() { let input: Vec<(&[u8], &[u8])> = vec![(&[0xaa][..], &[0xbb][..])]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } #[test] fn branch_is_equivalent() { - let input: Vec<(&[u8], &[u8])> = vec![(&[0xaa][..], &[0x10][..]), (&[0xba][..], &[0x11][..])]; - check_equivalent(&input); - check_iteration(&input); + let input: Vec<(&[u8], &[u8])> = vec![ + (&[0xaa][..], &[0x10][..]), + (&[0xba][..], &[0x11][..]), + ]; + check_equivalent::(&input); + check_iteration::(&input); } #[test] fn extension_and_branch_is_equivalent() { - let input: Vec<(&[u8], &[u8])> = vec![(&[0xaa][..], &[0x10][..]), (&[0xab][..], &[0x11][..])]; - check_equivalent(&input); - check_iteration(&input); + let input: Vec<(&[u8], &[u8])> = vec![ + (&[0xaa][..], &[0x10][..]), + (&[0xab][..], &[0x11][..]), + ]; + check_equivalent::(&input); + check_iteration::(&input); } #[test] @@ -428,8 +443,8 @@ mod tests { let mut d = st.make(); d.sort_unstable_by(|&(ref a, _), &(ref b, _)| a.cmp(b)); let dr = d.iter().map(|v| (&v.0[..], &v.1[..])).collect(); - check_equivalent(&dr); - check_iteration(&dr); + check_equivalent::(&dr); + check_iteration::(&dr); } #[test] @@ -439,8 +454,8 @@ mod tests { (&[0xaa, 0xaa][..], &[0xaa][..]), (&[0xaa, 0xbb][..], &[0xab][..]) ]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } #[test] @@ -453,8 +468,8 @@ mod tests { (&[0xbb, 0xbb][..], &[0xbb][..]), (&[0xbb, 0xcc][..], &[0xbc][..]), ]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } #[test] @@ -463,8 +478,8 @@ mod tests { (&[0xaa][..], &b"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"[..]), (&[0xba][..], &[0x11][..]), ]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } #[test] @@ -473,16 +488,16 @@ mod tests { (&[0xaa][..], &b"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"[..]), (&[0xba][..], &b"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"[..]) ]; - check_equivalent(&input); - check_iteration(&input); + check_equivalent::(&input); + check_iteration::(&input); } - fn populate_trie<'db>( - db: &'db mut dyn HashDB, - root: &'db mut ::Out, + fn populate_trie<'db, T: TrieConfiguration>( + db: &'db mut dyn HashDB, + root: &'db mut TrieHash, v: &[(Vec, Vec)] - ) -> TrieDBMut<'db, Blake2Hasher> { - let mut t = TrieDBMut::::new(db, root); + ) -> TrieDBMut<'db, T> { + let mut t = TrieDBMut::::new(db, root); for i in 0..v.len() { let key: &[u8]= &v[i].0; let val: &[u8] = &v[i].1; @@ -491,7 +506,10 @@ mod tests { t } - fn unpopulate_trie<'db>(t: &mut TrieDBMut<'db, Blake2Hasher>, v: &[(Vec, Vec)]) { + fn unpopulate_trie<'db, T: TrieConfiguration>( + t: &mut TrieDBMut<'db, T>, + v: &[(Vec, Vec)], + ) { for i in v { let key: &[u8]= &i.0; t.remove(key).unwrap(); @@ -513,10 +531,10 @@ mod tests { count: 100, }.make_with(seed.as_fixed_bytes_mut()); - let real = trie_root::(x.clone()); + let real = Layout::trie_root(x.clone()); let mut memdb = MemoryDB::default(); let mut root = Default::default(); - let mut memtrie = populate_trie(&mut memdb, &mut root, &x); + let mut memtrie = populate_trie::(&mut memdb, &mut root, &x); memtrie.commit(); if *memtrie.root() != real { @@ -528,17 +546,18 @@ mod tests { } } assert_eq!(*memtrie.root(), real); - unpopulate_trie(&mut memtrie, &x); + unpopulate_trie::(&mut memtrie, &x); memtrie.commit(); - if *memtrie.root() != as trie_db::NodeCodec>::hashed_null_node() { + let hashed_null_node = hashed_null_node::(); + if *memtrie.root() != hashed_null_node { println!("- TRIE MISMATCH"); println!(""); - println!("{:?} vs {:?}", memtrie.root(), as trie_db::NodeCodec>::hashed_null_node()); + println!("{:?} vs {:?}", memtrie.root(), hashed_null_node); for i in &x { println!("{:#x?} -> {:#x?}", i.0, i.1); } } - assert_eq!(*memtrie.root(), as trie_db::NodeCodec>::hashed_null_node()); + assert_eq!(*memtrie.root(), hashed_null_node); } } @@ -549,7 +568,7 @@ mod tests { #[test] fn codec_trie_empty() { let input: Vec<(&[u8], &[u8])> = vec![]; - let trie = unhashed_trie::(input); + let trie = Layout::trie_root_unhashed::<_, _, _>(input); println!("trie: {:#x?}", trie); assert_eq!(trie, vec![0x0]); } @@ -559,11 +578,10 @@ mod tests { let input = vec![ (vec![0xaa], vec![0xbb]) ]; - let trie = unhashed_trie::(input); + let trie = Layout::trie_root_unhashed::<_, _, _>(input); println!("trie: {:#x?}", trie); - assert_eq!(trie, vec![ - 0x03, // leaf (0x01) with (+) key of 2 nibbles (0x02) + 0x42, // leaf 0x40 (2^6) with (+) key of 2 nibbles (0x02) 0xaa, // key data to_compact(1), // length of value in bytes as Compact 0xbb // value data @@ -573,21 +591,20 @@ mod tests { #[test] fn codec_trie_two_tuples_disjoint_keys() { let input = vec![(&[0x48, 0x19], &[0xfe]), (&[0x13, 0x14], &[0xff])]; - let trie = unhashed_trie::(input); + let trie = Layout::trie_root_unhashed::<_, _, _>(input); println!("trie: {:#x?}", trie); - let mut ex = Vec::::new(); - ex.push(0xfe); // branch, no value + ex.push(0x80); // branch, no value (0b_10..) no nibble ex.push(0x12); // slots 1 & 4 are taken from 0-7 ex.push(0x00); // no slots from 8-15 ex.push(to_compact(0x05)); // first slot: LEAF, 5 bytes long. - ex.push(0x04); // leaf with 3 nibbles + ex.push(0x43); // leaf 0x40 with 3 nibbles ex.push(0x03); // first nibble ex.push(0x14); // second & third nibble ex.push(to_compact(0x01)); // 1 byte data ex.push(0xff); // value data ex.push(to_compact(0x05)); // second slot: LEAF, 5 bytes long. - ex.push(0x04); // leaf with 3 nibbles + ex.push(0x43); // leaf with 3 nibbles ex.push(0x08); // first nibble ex.push(0x19); // second & third nibble ex.push(to_compact(0x01)); // 1 byte data @@ -605,9 +622,9 @@ mod tests { let mut mdb = MemoryDB::default(); let mut root = Default::default(); - let _ = populate_trie(&mut mdb, &mut root, &pairs); + let _ = populate_trie::(&mut mdb, &mut root, &pairs); - let trie = TrieDB::::new(&mdb, &root).unwrap(); + let trie = TrieDB::::new(&mdb, &root).unwrap(); let iter = trie.iter().unwrap(); let mut iter_pairs = Vec::new(); diff --git a/core/trie/src/node_codec.rs b/core/trie/src/node_codec.rs index 1b0d2be6524eaf0f88f7db5409c8c16b4e7497c5..03cbdfce528f493a2a2a4e0bcdbe927a21e855ec 100644 --- a/core/trie/src/node_codec.rs +++ b/core/trie/src/node_codec.rs @@ -18,72 +18,95 @@ use rstd::marker::PhantomData; use rstd::vec::Vec; +use rstd::borrow::Borrow; use codec::{Encode, Decode, Compact}; use hash_db::Hasher; -use trie_db::{self, DBValue, NibbleSlice, node::Node, ChildReference}; +use trie_db::{self, NibbleSlice, node::Node, ChildReference, + nibble_ops, Partial, NodeCodec as NodeCodecT}; use crate::error::Error; -use super::{EMPTY_TRIE, LEAF_NODE_OFFSET, LEAF_NODE_BIG, EXTENSION_NODE_OFFSET, - EXTENSION_NODE_BIG, take, partial_to_key, node_header::NodeHeader, branch_node}; +use crate::trie_constants; +use super::{node_header::{NodeHeader, NodeKind}}; + +fn take<'a>(input: &mut &'a[u8], count: usize) -> Option<&'a[u8]> { + if input.len() < count { + return None + } + let r = &(*input)[..count]; + *input = &(*input)[count..]; + Some(r) +} /// Concrete implementation of a `NodeCodec` with Parity Codec encoding, generic over the `Hasher` #[derive(Default, Clone)] -pub struct NodeCodec(PhantomData); +pub struct NodeCodec(PhantomData); -impl trie_db::NodeCodec for NodeCodec { +impl NodeCodecT for NodeCodec { type Error = Error; - fn hashed_null_node() -> H::Out { - H::hash(&[0u8][..]) + fn hashed_null_node() -> ::Out { + H::hash(>::empty_node()) } - fn decode(data: &[u8]) -> ::rstd::result::Result { - use Error::BadFormat; + fn decode(data: &[u8]) -> rstd::result::Result { let input = &mut &*data; - match NodeHeader::decode(input).ok_or(BadFormat)? { + let head = NodeHeader::decode(input)?; + match head { NodeHeader::Null => Ok(Node::Empty), - NodeHeader::Branch(has_value) => { - let bitmap = u16::decode(input).ok_or(BadFormat)?; + NodeHeader::Branch(has_value, nibble_count) => { + let padding = nibble_count % nibble_ops::NIBBLE_PER_BYTE != 0; + // check that the padding is valid (if any) + if padding && nibble_ops::pad_left(input[0]) != 0 { + return Err(Error::BadFormat); + } + let nibble_data = take( + input, + (nibble_count + (nibble_ops::NIBBLE_PER_BYTE - 1)) / nibble_ops::NIBBLE_PER_BYTE, + ).ok_or(Error::BadFormat)?; + let nibble_slice = NibbleSlice::new_offset( + nibble_data, + nibble_ops::number_padding(nibble_count), + ); + let bitmap_slice = take(input, BITMAP_LENGTH).ok_or(Error::BadFormat)?; + let bitmap = Bitmap::decode(&bitmap_slice[..])?; let value = if has_value { - let count = >::decode(input).ok_or(BadFormat)?.0 as usize; - Some(take(input, count).ok_or(BadFormat)?) + let count = >::decode(input)?.0 as usize; + Some(take(input, count).ok_or(Error::BadFormat)?) } else { None }; let mut children = [None; 16]; - let mut pot_cursor = 1; - for i in 0..16 { - if bitmap & pot_cursor != 0 { - let count = >::decode(input).ok_or(BadFormat)?.0 as usize; - children[i] = Some(take(input, count).ok_or(BadFormat)?); + + for i in 0..nibble_ops::NIBBLE_LENGTH { + if bitmap.value_at(i) { + let count = >::decode(input)?.0 as usize; + children[i] = Some(take(input, count).ok_or(Error::BadFormat)?); } - pot_cursor <<= 1; } - Ok(Node::Branch(children, value)) - } - NodeHeader::Extension(nibble_count) => { - if nibble_count % 2 == 1 && input[0] & 0xf0 != 0x00 { - return Err(BadFormat); - } - let nibble_data = take(input, (nibble_count + 1) / 2).ok_or(BadFormat)?; - let nibble_slice = NibbleSlice::new_offset(nibble_data, nibble_count % 2); - let count = >::decode(input).ok_or(BadFormat)?.0 as usize; - Ok(Node::Extension(nibble_slice, take(input, count).ok_or(BadFormat)?)) + Ok(Node::NibbledBranch(nibble_slice, children, value)) } NodeHeader::Leaf(nibble_count) => { - if nibble_count % 2 == 1 && input[0] & 0xf0 != 0x00 { - return Err(BadFormat); + let padding = nibble_count % nibble_ops::NIBBLE_PER_BYTE != 0; + // check that the padding is valid (if any) + if padding && nibble_ops::pad_left(input[0]) != 0 { + return Err(Error::BadFormat); } - let nibble_data = take(input, (nibble_count + 1) / 2).ok_or(BadFormat)?; - let nibble_slice = NibbleSlice::new_offset(nibble_data, nibble_count % 2); - let count = >::decode(input).ok_or(BadFormat)?.0 as usize; - Ok(Node::Leaf(nibble_slice, take(input, count).ok_or(BadFormat)?)) + let nibble_data = take( + input, + (nibble_count + (nibble_ops::NIBBLE_PER_BYTE - 1)) / nibble_ops::NIBBLE_PER_BYTE, + ).ok_or(Error::BadFormat)?; + let nibble_slice = NibbleSlice::new_offset( + nibble_data, + nibble_ops::number_padding(nibble_count), + ); + let count = >::decode(input)?.0 as usize; + Ok(Node::Leaf(nibble_slice, take(input, count).ok_or(Error::BadFormat)?)) } } } - fn try_decode_hash(data: &[u8]) -> Option { + fn try_decode_hash(data: &[u8]) -> Option<::Out> { if data.len() == H::LENGTH { - let mut r = H::Out::default(); + let mut r = ::Out::default(); r.as_mut().copy_from_slice(data); Some(r) } else { @@ -92,53 +115,137 @@ impl trie_db::NodeCodec for NodeCodec { } fn is_empty_node(data: &[u8]) -> bool { - data == &[EMPTY_TRIE][..] + data == >::empty_node() } - fn empty_node() -> Vec { - [EMPTY_TRIE].to_vec() + + fn empty_node() -> &'static [u8] { + &[trie_constants::EMPTY_TRIE] } - // FIXME: refactor this so that `partial` isn't already encoded with HPE. Should just be an `impl Iterator`. - fn leaf_node(partial: &[u8], value: &[u8]) -> Vec { - let mut output = partial_to_key(partial, LEAF_NODE_OFFSET, LEAF_NODE_BIG); + fn leaf_node(partial: Partial, value: &[u8]) -> Vec { + let mut output = partial_encode(partial, NodeKind::Leaf); value.encode_to(&mut output); output } - // FIXME: refactor this so that `partial` isn't already encoded with HPE. Should just be an `impl Iterator`. - fn ext_node(partial: &[u8], child: ChildReference) -> Vec { - let mut output = partial_to_key(partial, EXTENSION_NODE_OFFSET, EXTENSION_NODE_BIG); - match child { - ChildReference::Hash(h) => - h.as_ref().encode_to(&mut output), - ChildReference::Inline(inline_data, len) => - (&AsRef::<[u8]>::as_ref(&inline_data)[..len]).encode_to(&mut output), - }; - output + fn extension_node( + _partial: impl Iterator, + _nbnibble: usize, + _child: ChildReference<::Out>, + ) -> Vec { + unreachable!() + } + + fn branch_node( + _children: impl Iterator::Out>>>>, + _maybe_value: Option<&[u8]>, + ) -> Vec { + unreachable!() } - fn branch_node(children: I, maybe_value: Option) -> Vec - where I: IntoIterator>> + Iterator>> - { - let mut output = [0, 0, 0].to_vec(); - let have_value = if let Some(value) = maybe_value { - (&*value).encode_to(&mut output); - true + fn branch_node_nibbled( + partial: impl Iterator, + number_nibble: usize, + children: impl Iterator::Out>>>>, + maybe_value: Option<&[u8]>, + ) -> Vec { + let mut output = if maybe_value.is_some() { + partial_from_iterator_encode(partial, number_nibble, NodeKind::BranchWithValue) } else { - false + partial_from_iterator_encode(partial, number_nibble, NodeKind::BranchNoValue) + }; + let bitmap_index = output.len(); + let mut bitmap: [u8; BITMAP_LENGTH] = [0; BITMAP_LENGTH]; + (0..BITMAP_LENGTH).for_each(|_|output.push(0)); + if let Some(value) = maybe_value { + value.encode_to(&mut output); }; - let prefix = branch_node(have_value, children.map(|maybe_child| match maybe_child { + Bitmap::encode(children.map(|maybe_child| match maybe_child.borrow() { Some(ChildReference::Hash(h)) => { h.as_ref().encode_to(&mut output); true } - Some(ChildReference::Inline(inline_data, len)) => { - (&AsRef::<[u8]>::as_ref(&inline_data)[..len]).encode_to(&mut output); + &Some(ChildReference::Inline(inline_data, len)) => { + inline_data.as_ref()[..len].encode_to(&mut output); true } None => false, - })); - output[0..3].copy_from_slice(&prefix[..]); + }), bitmap.as_mut()); + output[bitmap_index..bitmap_index + BITMAP_LENGTH] + .copy_from_slice(&bitmap[..BITMAP_LENGTH]); output } + +} + +// utils + +/// Encode and allocate node type header (type and size), and partial value. +/// It uses an iterator over encoded partial bytes as input. +fn partial_from_iterator_encode>( + partial: I, + nibble_count: usize, + node_kind: NodeKind, +) -> Vec { + let nibble_count = rstd::cmp::min(trie_constants::NIBBLE_SIZE_BOUND, nibble_count); + + let mut output = Vec::with_capacity(3 + (nibble_count / nibble_ops::NIBBLE_PER_BYTE)); + match node_kind { + NodeKind::Leaf => NodeHeader::Leaf(nibble_count).encode_to(&mut output), + NodeKind::BranchWithValue => NodeHeader::Branch(true, nibble_count).encode_to(&mut output), + NodeKind::BranchNoValue => NodeHeader::Branch(false, nibble_count).encode_to(&mut output), + }; + output.extend(partial); + output +} + +/// Encode and allocate node type header (type and size), and partial value. +/// Same as `partial_from_iterator_encode` but uses non encoded `Partial` as input. +fn partial_encode(partial: Partial, node_kind: NodeKind) -> Vec { + let number_nibble_encoded = (partial.0).0 as usize; + let nibble_count = partial.1.len() * nibble_ops::NIBBLE_PER_BYTE + number_nibble_encoded; + + let nibble_count = rstd::cmp::min(trie_constants::NIBBLE_SIZE_BOUND, nibble_count); + + let mut output = Vec::with_capacity(3 + partial.1.len()); + match node_kind { + NodeKind::Leaf => NodeHeader::Leaf(nibble_count).encode_to(&mut output), + NodeKind::BranchWithValue => NodeHeader::Branch(true, nibble_count).encode_to(&mut output), + NodeKind::BranchNoValue => NodeHeader::Branch(false, nibble_count).encode_to(&mut output), + }; + if number_nibble_encoded > 0 { + output.push(nibble_ops::pad_right((partial.0).1)); + } + output.extend_from_slice(&partial.1[..]); + output } + +const BITMAP_LENGTH: usize = 2; + +/// Radix 16 trie, bitmap encoding implementation, +/// it contains children mapping information for a branch +/// (children presence only), it encodes into +/// a compact bitmap encoding representation. +pub(crate) struct Bitmap(u16); + +impl Bitmap { + pub fn decode(data: &[u8]) -> Result { + Ok(Bitmap(u16::decode(&mut &data[..])?)) + } + + pub fn value_at(&self, i: usize) -> bool { + self.0 & (1u16 << i) != 0 + } + + pub fn encode>(has_children: I , dest: &mut [u8]) { + let mut bitmap: u16 = 0; + let mut cursor: u16 = 1; + for v in has_children { + if v { bitmap |= cursor } + cursor <<= 1; + } + dest[0] = (bitmap % 256) as u8; + dest[1] = (bitmap / 256) as u8; + } +} + diff --git a/core/trie/src/node_header.rs b/core/trie/src/node_header.rs index 2c01189f8a155118d3c1779524df729ed5059544..50d3d87250de6002c5df232bb44cc7db6c250a96 100644 --- a/core/trie/src/node_header.rs +++ b/core/trie/src/node_header.rs @@ -16,62 +16,107 @@ //! The node header. +use crate::trie_constants; use codec::{Encode, Decode, Input, Output}; -use super::{EMPTY_TRIE, LEAF_NODE_OFFSET, LEAF_NODE_BIG, EXTENSION_NODE_OFFSET, - EXTENSION_NODE_BIG, BRANCH_NODE_NO_VALUE, BRANCH_NODE_WITH_VALUE, LEAF_NODE_THRESHOLD, - EXTENSION_NODE_THRESHOLD, LEAF_NODE_SMALL_MAX, EXTENSION_NODE_SMALL_MAX}; +use rstd::iter::once; -/// A node header. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum NodeHeader { +/// A node header +#[derive(Copy, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub(crate) enum NodeHeader { Null, - Branch(bool), - Extension(usize), + Branch(bool, usize), Leaf(usize), } +/// NodeHeader without content +pub(crate) enum NodeKind { + Leaf, + BranchNoValue, + BranchWithValue, +} + impl Encode for NodeHeader { fn encode_to(&self, output: &mut T) { match self { - NodeHeader::Null => output.push_byte(EMPTY_TRIE), - - NodeHeader::Branch(true) => output.push_byte(BRANCH_NODE_WITH_VALUE), - NodeHeader::Branch(false) => output.push_byte(BRANCH_NODE_NO_VALUE), + NodeHeader::Null => output.push_byte(trie_constants::EMPTY_TRIE), + NodeHeader::Branch(true, nibble_count) => + encode_size_and_prefix(*nibble_count, trie_constants::BRANCH_WITH_MASK, output), + NodeHeader::Branch(false, nibble_count) => + encode_size_and_prefix(*nibble_count, trie_constants::BRANCH_WITHOUT_MASK, output), + NodeHeader::Leaf(nibble_count) => + encode_size_and_prefix(*nibble_count, trie_constants::LEAF_PREFIX_MASK, output), + } + } +} - NodeHeader::Leaf(nibble_count) if *nibble_count < LEAF_NODE_THRESHOLD as usize => - output.push_byte(LEAF_NODE_OFFSET + *nibble_count as u8), - NodeHeader::Leaf(nibble_count) => { - output.push_byte(LEAF_NODE_BIG); - output.push_byte((*nibble_count - LEAF_NODE_THRESHOLD as usize) as u8); - } +impl codec::EncodeLike for NodeHeader {} - NodeHeader::Extension(nibble_count) if *nibble_count < EXTENSION_NODE_THRESHOLD as usize => - output.push_byte(EXTENSION_NODE_OFFSET + *nibble_count as u8), - NodeHeader::Extension(nibble_count) => { - output.push_byte(EXTENSION_NODE_BIG); - output.push_byte((*nibble_count - EXTENSION_NODE_THRESHOLD as usize) as u8); - } +impl Decode for NodeHeader { + fn decode(input: &mut I) -> Result { + let i = input.read_byte()?; + if i == trie_constants::EMPTY_TRIE { + return Ok(NodeHeader::Null); + } + match i & (0b11 << 6) { + trie_constants::LEAF_PREFIX_MASK => Ok(NodeHeader::Leaf(decode_size(i, input)?)), + trie_constants::BRANCH_WITHOUT_MASK => Ok(NodeHeader::Branch(false, decode_size(i, input)?)), + trie_constants::BRANCH_WITH_MASK => Ok(NodeHeader::Branch(true, decode_size(i, input)?)), + // do not allow any special encoding + _ => Err("Unallowed encoding".into()), } } } -impl Decode for NodeHeader { - fn decode(input: &mut I) -> Option { - Some(match input.read_byte()? { - EMPTY_TRIE => NodeHeader::Null, // 0 +/// Returns an iterator over encoded bytes for node header and size. +/// Size encoding allows unlimited, length unefficient, representation, but +/// is bounded to 16 bit maximum value to avoid possible DOS. +pub(crate) fn size_and_prefix_iterator(size: usize, prefix: u8) -> impl Iterator { + let size = rstd::cmp::min(trie_constants::NIBBLE_SIZE_BOUND, size); - i @ LEAF_NODE_OFFSET ..= LEAF_NODE_SMALL_MAX => // 1 ... (127 - 1) - NodeHeader::Leaf((i - LEAF_NODE_OFFSET) as usize), - LEAF_NODE_BIG => // 127 - NodeHeader::Leaf(input.read_byte()? as usize + LEAF_NODE_THRESHOLD as usize), + let l1 = rstd::cmp::min(62, size); + let (first_byte, mut rem) = if size == l1 { + (once(prefix + l1 as u8), 0) + } else { + (once(prefix + 63), size - l1) + }; + let next_bytes = move || { + if rem > 0 { + if rem < 256 { + let result = rem - 1; + rem = 0; + Some(result as u8) + } else { + rem = rem.saturating_sub(255); + Some(255) + } + } else { + None + } + }; + first_byte.chain(rstd::iter::from_fn(next_bytes)) +} - i @ EXTENSION_NODE_OFFSET ..= EXTENSION_NODE_SMALL_MAX =>// 128 ... (253 - 1) - NodeHeader::Extension((i - EXTENSION_NODE_OFFSET) as usize), - EXTENSION_NODE_BIG => // 253 - NodeHeader::Extension(input.read_byte()? as usize + EXTENSION_NODE_THRESHOLD as usize), +/// Encodes size and prefix to a stream output. +fn encode_size_and_prefix(size: usize, prefix: u8, out: &mut impl Output) { + for b in size_and_prefix_iterator(size, prefix) { + out.push_byte(b) + } +} - BRANCH_NODE_NO_VALUE => NodeHeader::Branch(false), // 254 - BRANCH_NODE_WITH_VALUE => NodeHeader::Branch(true), // 255 - }) +/// Decode size only from stream input and header byte. +fn decode_size(first: u8, input: &mut impl Input) -> Result { + let mut result = (first & 255u8 >> 2) as usize; + if result < 63 { + return Ok(result); + } + result -= 1; + while result <= trie_constants::NIBBLE_SIZE_BOUND { + let n = input.read_byte()? as usize; + if n < 255 { + return Ok(result + n + 1); + } + result += 255; } + Ok(trie_constants::NIBBLE_SIZE_BOUND) } diff --git a/core/trie/src/trie_stream.rs b/core/trie/src/trie_stream.rs index 913cff2c5a94e0664e3e24163e9a39f65538ff72..2629cefac8c5ea2019e8263b7bf79a2bc84c55f2 100644 --- a/core/trie/src/trie_stream.rs +++ b/core/trie/src/trie_stream.rs @@ -16,16 +16,19 @@ //! `TrieStream` implementation for Substrate's trie format. -use rstd::iter::once; use hash_db::Hasher; use trie_root; use codec::Encode; use rstd::vec::Vec; +use crate::trie_constants; +use crate::node_header::{NodeKind, size_and_prefix_iterator}; +use crate::node_codec::Bitmap; -use super::{EMPTY_TRIE, LEAF_NODE_OFFSET, LEAF_NODE_BIG, EXTENSION_NODE_OFFSET, - EXTENSION_NODE_BIG, branch_node}; +const BRANCH_NODE_NO_VALUE: u8 = 254; +const BRANCH_NODE_WITH_VALUE: u8 = 255; -/// Codec-flavored TrieStream +#[derive(Default, Clone)] +/// Codec-flavored TrieStream. pub struct TrieStream { buffer: Vec, } @@ -35,62 +38,102 @@ impl TrieStream { pub fn as_raw(&self) -> &[u8] { &self.buffer } } -/// Create a leaf/extension node, encoding a number of nibbles. Note that this -/// cannot handle a number of nibbles that is zero or greater than 127 and if -/// you attempt to do so *IT WILL PANIC*. -fn fuse_nibbles_node<'a>(nibbles: &'a [u8], leaf: bool) -> impl Iterator + 'a { - debug_assert!(nibbles.len() < 255 + 126, "nibbles length too long. what kind of size of key are you trying to include in the trie!?!"); - // We use two ranges of possible values; one for leafs and the other for extensions. - // Each range encodes zero following nibbles up to some maximum. If the maximum is - // reached, then it is considered "big" and a second byte follows it in order to - // encode a further offset to the number of nibbles of up to 255. Beyond that, we - // cannot encode. This shouldn't be a problem though since that allows for keys of - // up to 380 nibbles (190 bytes) and we expect key sizes to be generally 128-bit (16 - // bytes) or, at a push, 384-bit (48 bytes). - - let (first_byte_small, big_threshold) = if leaf { - (LEAF_NODE_OFFSET, (LEAF_NODE_BIG - LEAF_NODE_OFFSET) as usize) - } else { - (EXTENSION_NODE_OFFSET, (EXTENSION_NODE_BIG - EXTENSION_NODE_OFFSET) as usize) +fn branch_node_bit_mask(has_children: impl Iterator) -> (u8, u8) { + let mut bitmap: u16 = 0; + let mut cursor: u16 = 1; + for v in has_children { + if v { bitmap |= cursor } + cursor <<= 1; + } + ((bitmap % 256 ) as u8, (bitmap / 256 ) as u8) +} + + +/// Create a leaf/branch node, encoding a number of nibbles. +fn fuse_nibbles_node<'a>(nibbles: &'a [u8], kind: NodeKind) -> impl Iterator + 'a { + let size = rstd::cmp::min(trie_constants::NIBBLE_SIZE_BOUND, nibbles.len()); + + let iter_start = match kind { + NodeKind::Leaf => size_and_prefix_iterator(size, trie_constants::LEAF_PREFIX_MASK), + NodeKind::BranchNoValue => size_and_prefix_iterator(size, trie_constants::BRANCH_WITHOUT_MASK), + NodeKind::BranchWithValue => size_and_prefix_iterator(size, trie_constants::BRANCH_WITH_MASK), }; - let first_byte = first_byte_small + nibbles.len().min(big_threshold) as u8; - once(first_byte) - .chain(if nibbles.len() >= big_threshold { Some((nibbles.len() - big_threshold) as u8) } else { None }) + iter_start .chain(if nibbles.len() % 2 == 1 { Some(nibbles[0]) } else { None }) .chain(nibbles[nibbles.len() % 2..].chunks(2).map(|ch| ch[0] << 4 | ch[1])) } + impl trie_root::TrieStream for TrieStream { - fn new() -> Self { Self {buffer: Vec::new() } } + + fn new() -> Self { + TrieStream { + buffer: Vec::new() + } + } + fn append_empty_data(&mut self) { - self.buffer.push(EMPTY_TRIE); + self.buffer.push(trie_constants::EMPTY_TRIE); } fn append_leaf(&mut self, key: &[u8], value: &[u8]) { - self.buffer.extend(fuse_nibbles_node(key, true)); + self.buffer.extend(fuse_nibbles_node(key, NodeKind::Leaf)); value.encode_to(&mut self.buffer); } - fn begin_branch(&mut self, maybe_value: Option<&[u8]>, has_children: impl Iterator) { - self.buffer.extend(&branch_node(maybe_value.is_some(), has_children)); - // Push the value if one exists. + + fn begin_branch( + &mut self, + maybe_partial: Option<&[u8]>, + maybe_value: Option<&[u8]>, + has_children: impl Iterator, + ) { + if let Some(partial) = maybe_partial { + if maybe_value.is_some() { + self.buffer.extend(fuse_nibbles_node(partial, NodeKind::BranchWithValue)); + } else { + self.buffer.extend(fuse_nibbles_node(partial, NodeKind::BranchNoValue)); + } + let bm = branch_node_bit_mask(has_children); + self.buffer.extend([bm.0,bm.1].iter()); + } else { + debug_assert!(false, "trie stream codec only for no extension trie"); + self.buffer.extend(&branch_node(maybe_value.is_some(), has_children)); + } if let Some(value) = maybe_value { value.encode_to(&mut self.buffer); } } - fn append_extension(&mut self, key: &[u8]) { - self.buffer.extend(fuse_nibbles_node(key, false)); + + fn append_extension(&mut self, _key: &[u8]) { + debug_assert!(false, "trie stream codec only for no extension trie"); } + fn append_substream(&mut self, other: Self) { let data = other.out(); match data.len() { - 0..=31 => { - data.encode_to(&mut self.buffer) - }, - _ => { - H::hash(&data).as_ref().encode_to(&mut self.buffer) - } + 0..=31 => data.encode_to(&mut self.buffer), + _ => H::hash(&data).as_ref().encode_to(&mut self.buffer), } } fn out(self) -> Vec { self.buffer } } + +fn branch_node(has_value: bool, has_children: impl Iterator) -> [u8; 3] { + let mut result = [0, 0, 0]; + branch_node_buffered(has_value, has_children, &mut result[..]); + result +} + +fn branch_node_buffered(has_value: bool, has_children: I, output: &mut[u8]) + where + I: Iterator, +{ + let first = if has_value { + BRANCH_NODE_WITH_VALUE + } else { + BRANCH_NODE_NO_VALUE + }; + output[0] = first; + Bitmap::encode(has_children, &mut output[1..]); +} diff --git a/core/utils/fork-tree/Cargo.toml b/core/utils/fork-tree/Cargo.toml index c41914e07acb408565655a425709c41671a9f68b..fa37161dc2495b1a7dd72210f6390285903105ba 100644 --- a/core/utils/fork-tree/Cargo.toml +++ b/core/utils/fork-tree/Cargo.toml @@ -5,4 +5,4 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", features = ["derive"] } diff --git a/core/utils/fork-tree/src/lib.rs b/core/utils/fork-tree/src/lib.rs index 7a2e2f422a7fa7d67540c31d09bcc4688a45283c..5a7480e0651aa0ca1c803e0105c5bdf4db2883a3 100644 --- a/core/utils/fork-tree/src/lib.rs +++ b/core/utils/fork-tree/src/lib.rs @@ -20,7 +20,7 @@ #![warn(missing_docs)] use std::fmt; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; /// Error occured when iterating with the tree. #[derive(Clone, Debug, PartialEq)] @@ -81,6 +81,62 @@ pub struct ForkTree { best_finalized_number: Option, } +impl ForkTree where + H: PartialEq + Clone, + N: Ord + Clone, + V: Clone, +{ + /// Prune all nodes that are not descendents of `hash` according to + /// `is_descendent_of`. The given function `is_descendent_of` should return + /// `true` if the second hash (target) is a descendent of the first hash + /// (base). After pruning the tree it should have one or zero roots. The + /// number and order of calls to `is_descendent_of` is unspecified and + /// subject to change. + pub fn prune( + &mut self, + hash: &H, + number: N, + is_descendent_of: &F + ) -> Result<(), Error> + where E: std::error::Error, + F: Fn(&H, &H) -> Result + { + let mut new_root = None; + for node in self.node_iter() { + // if the node has a lower number than the one being finalized then + // we only keep if it has no children and the finalized block is a + // descendent of this node + if node.number < number { + if !node.children.is_empty() || !is_descendent_of(&node.hash, hash)? { + continue; + } + } + + // if the node has the same number as the finalized block then it + // must have the same hash + if node.number == number && node.hash != *hash { + continue; + } + + // if the node has a higher number then we keep it if it is a + // descendent of the finalized block + if node.number > number && !is_descendent_of(hash, &node.hash)? { + continue; + } + + new_root = Some(node); + break; + } + + if let Some(root) = new_root { + self.roots = vec![root.clone()]; + } + + Ok(()) + } + +} + impl ForkTree where H: PartialEq, N: Ord, @@ -152,6 +208,34 @@ impl ForkTree where self.node_iter().map(|node| (&node.hash, &node.number, &node.data)) } + /// Find a node in the tree that is the lowest ancestor of the given + /// block hash and which passes the given predicate. The given function + /// `is_descendent_of` should return `true` if the second hash (target) + /// is a descendent of the first hash (base). + pub fn find_node_where( + &self, + hash: &H, + number: &N, + is_descendent_of: &F, + predicate: &P, + ) -> Result>, Error> + where E: std::error::Error, + F: Fn(&H, &H) -> Result, + P: Fn(&V) -> bool, + { + // search for node starting from all roots + for root in self.roots.iter() { + let node = root.find_node_where(hash, number, is_descendent_of, predicate)?; + + // found the node, early exit + if let Some(node) = node { + return Ok(node); + } + } + + Ok(None) + } + /// Finalize a root in the tree and return it, return `None` in case no root /// with the given hash exists. All other roots are pruned, and the children /// of the finalized node become the new roots. @@ -167,7 +251,7 @@ impl ForkTree where } /// Finalize a node in the tree. This method will make sure that the node - /// being finalized is either an existing root (an return its data), or a + /// being finalized is either an existing root (and return its data), or a /// node from a competing branch (not in the tree), tree pruning is done /// accordingly. The given function `is_descendent_of` should return `true` /// if the second hash (target) is a descendent of the first hash (base). @@ -400,6 +484,57 @@ mod node_implementation { Ok(Some((hash, number, data))) } } + + /// Find a node in the tree that is the lowest ancestor of the given + /// block hash and which passes the given predicate. The given function + /// `is_descendent_of` should return `true` if the second hash (target) + /// is a descendent of the first hash (base). + // FIXME: it would be useful if this returned a mutable reference but + // rustc can't deal with lifetimes properly. an option would be to try + // an iterative definition instead. + pub fn find_node_where( + &self, + hash: &H, + number: &N, + is_descendent_of: &F, + predicate: &P, + ) -> Result>>, Error> + where E: std::error::Error, + F: Fn(&H, &H) -> Result, + P: Fn(&V) -> bool, + { + // stop searching this branch + if *number < self.number { + return Ok(None); + } + + // continue depth-first search through all children + for node in self.children.iter() { + let node = node.find_node_where(hash, number, is_descendent_of, predicate)?; + + // found node, early exit + if node.is_some() { + return Ok(node); + } + } + + // node not found in any of the descendents, if the node we're + // searching for is a descendent of this node then we will stop the + // search here, since there aren't any more children and we found + // the correct node so we don't want to backtrack. + if is_descendent_of(&self.hash, hash)? { + // if the predicate passes we return the node + if predicate(&self.data) { + Ok(Some(Some(self))) + + // otherwise we stop the search returning `None` + } else { + Ok(Some(None)) + } + } else { + Ok(None) + } + } } } @@ -870,4 +1005,74 @@ mod test { ); } } + + #[test] + fn find_node_works() { + let (tree, is_descendent_of) = test_fork_tree(); + + let node = tree.find_node_where( + &"D", + &4, + &is_descendent_of, + &|_| true, + ).unwrap().unwrap(); + + assert_eq!(node.hash, "C"); + assert_eq!(node.number, 3); + } + + #[test] + fn prune_works() { + let (mut tree, is_descendent_of) = test_fork_tree(); + + tree.prune( + &"C", + 3, + &is_descendent_of, + ).unwrap(); + + assert_eq!( + tree.roots.iter().map(|node| node.hash).collect::>(), + vec!["C"], + ); + + assert_eq!( + tree.iter().map(|(hash, _, _)| *hash).collect::>(), + vec!["C", "D", "E"], + ); + } + + #[test] + fn find_node_doesnt_backtrack_after_finding_highest_descending_node() { + let mut tree = ForkTree::new(); + + // + // A - B + // \ + // — C + // + let is_descendent_of = |base: &&str, block: &&str| -> Result { + match (*base, *block) { + ("A", b) => Ok(b == "B" || b == "C" || b == "D"), + ("B", b) | ("C", b) => Ok(b == "D"), + ("0", _) => Ok(true), + _ => Ok(false), + } + }; + + tree.import("A", 1, 1, &is_descendent_of).unwrap(); + tree.import("B", 2, 4, &is_descendent_of).unwrap(); + tree.import("C", 2, 4, &is_descendent_of).unwrap(); + + // when searching the tree we reach both node `B` and `C`, but the + // predicate doesn't pass. still, we should not backtrack to node `A`. + let node = tree.find_node_where( + &"D", + &3, + &is_descendent_of, + &|data| *data < 3, + ).unwrap(); + + assert_eq!(node, None); + } } diff --git a/core/utils/wasm-builder/src/lib.rs b/core/utils/wasm-builder/src/lib.rs index 779fa8db095a2a4f381df4cadfe80fc0f8e8e490..5bb0342c665dec533f79c0603b903ef4b4dcbd63 100644 --- a/core/utils/wasm-builder/src/lib.rs +++ b/core/utils/wasm-builder/src/lib.rs @@ -151,18 +151,66 @@ fn create_out_file(file_name: &str, content: String) { } /// Get a cargo command that compiles with nightly -fn get_nightly_cargo() -> Command { - if Command::new("rustup") - .args(&["run", "nightly", "cargo"]) - .stdout(Stdio::null()) - .stderr(Stdio::null()) - .status() - .map(|s| s.success()).unwrap_or(false) - { - let mut cmd = Command::new("rustup"); - cmd.args(&["run", "nightly", "cargo"]); - cmd +fn get_nightly_cargo() -> CargoCommand { + let default_cargo = CargoCommand::new("cargo"); + let mut rustup_run_nightly = CargoCommand::new("rustup"); + rustup_run_nightly.args(&["run", "nightly", "cargo"]); + + if default_cargo.is_nightly() { + default_cargo + } else if rustup_run_nightly.works() { + rustup_run_nightly } else { - Command::new("cargo") + default_cargo + } +} + +/// Builder for cargo commands +#[derive(Debug)] +struct CargoCommand { + program: String, + args: Vec, +} + +impl CargoCommand { + fn new(program: &str) -> Self { + CargoCommand { program: program.into(), args: Vec::new() } + } + + fn arg(&mut self, arg: &str) -> &mut Self { + self.args.push(arg.into()); + self + } + + fn args(&mut self, args: &[&str]) -> &mut Self { + for arg in args { + self.arg(arg); + } + self + } + + fn command(&self) -> Command { + let mut cmd = Command::new(&self.program); + cmd.args(&self.args); + cmd + } + + fn works(&self) -> bool { + self.command() + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status() + .map(|s| s.success()).unwrap_or(false) + } + + /// Check if the supplied cargo command is a nightly version + fn is_nightly(&self) -> bool { + self.command() + .arg("--version") + .output() + .map_err(|_| ()) + .and_then(|o| String::from_utf8(o.stdout).map_err(|_| ())) + .unwrap_or_default() + .contains("-nightly") } } diff --git a/core/utils/wasm-builder/src/prerequisites.rs b/core/utils/wasm-builder/src/prerequisites.rs index 5835d322b1f15dd1878eb05734c4f0331ec179d0..52ff40887cfd829074458134f37794453ee481a1 100644 --- a/core/utils/wasm-builder/src/prerequisites.rs +++ b/core/utils/wasm-builder/src/prerequisites.rs @@ -44,21 +44,8 @@ pub fn check() -> Option<&'static str> { } fn check_nightly_installed() -> bool { - let version = Command::new("cargo") - .arg("--version") - .output() - .map_err(|_| ()) - .and_then(|o| String::from_utf8(o.stdout).map_err(|_| ())) - .unwrap_or_default(); - - let version2 = Command::new("rustup") - .args(&["run", "nightly", "cargo", "--version"]) - .output() - .map_err(|_| ()) - .and_then(|o| String::from_utf8(o.stdout).map_err(|_| ())) - .unwrap_or_default(); - - version.contains("-nightly") || version2.contains("-nightly") + let command = crate::get_nightly_cargo(); + command.is_nightly() } fn check_wasm_toolchain_installed() -> bool { @@ -87,10 +74,11 @@ fn check_wasm_toolchain_installed() -> bool { let manifest_path = manifest_path.display().to_string(); crate::get_nightly_cargo() + .command() .args(&["build", "--target=wasm32-unknown-unknown", "--manifest-path", &manifest_path]) .stdout(Stdio::null()) .stderr(Stdio::null()) .status() .map(|s| s.success()) .unwrap_or(false) -} \ No newline at end of file +} diff --git a/core/utils/wasm-builder/src/wasm_project.rs b/core/utils/wasm-builder/src/wasm_project.rs index 0d348a5cf4ed898311d46fbbf338344282f9a36a..4bc908114cf4612c655692e2fc90d46b26b48d8a 100644 --- a/core/utils/wasm-builder/src/wasm_project.rs +++ b/core/utils/wasm-builder/src/wasm_project.rs @@ -259,7 +259,7 @@ fn is_release_build() -> bool { /// Build the project to create the WASM binary. fn build_project(project: &Path) { let manifest_path = project.join("Cargo.toml"); - let mut build_cmd = crate::get_nightly_cargo(); + let mut build_cmd = crate::get_nightly_cargo().command(); let rustflags = format!( "-C link-arg=--export-table {}", diff --git a/node-template/Cargo.toml b/node-template/Cargo.toml index 4c85ef38174cad7a05336c8a5d37de1f053dda87..4112452b2722f7741a8f3e71d941a7d171fb3596 100644 --- a/node-template/Cargo.toml +++ b/node-template/Cargo.toml @@ -16,9 +16,9 @@ ctrlc = { version = "3.0", features = ["termination"] } log = "0.4" tokio = "0.1" exit-future = "0.1" -parking_lot = "0.8.0" -parity-codec = "4.1.1" -trie-root = "0.14.0" +parking_lot = "0.9.0" +codec = { package = "parity-scale-codec", version = "1.0.0" } +trie-root = "0.15.0" sr-io = { path = "../core/sr-io" } substrate-cli = { path = "../core/cli" } primitives = { package = "substrate-primitives", path = "../core/primitives" } @@ -28,6 +28,8 @@ inherents = { package = "substrate-inherents", path = "../core/inherents" } transaction-pool = { package = "substrate-transaction-pool", path = "../core/transaction-pool" } network = { package = "substrate-network", path = "../core/network" } consensus = { package = "substrate-consensus-aura", path = "../core/consensus/aura" } +aura-primitives = { package = "substrate-consensus-aura-primitives", path = "../core/consensus/aura/primitives" } +grandpa-primitives = { package = "substrate-finality-grandpa-primitives", path = "../core/finality-grandpa/primitives" } substrate-client = { path = "../core/client" } basic-authorship = { package = "substrate-basic-authorship", path = "../core/basic-authorship" } node-template-runtime = { path = "runtime" } diff --git a/node-template/runtime/Cargo.toml b/node-template/runtime/Cargo.toml index 375a0ad64eb0df7f9d99d5b8a621b818493a2aad..2f41513048dc056f10c2ff13f8f273c44766ba54 100644 --- a/node-template/runtime/Cargo.toml +++ b/node-template/runtime/Cargo.toml @@ -5,14 +5,16 @@ authors = ["Anonymous"] edition = "2018" [dependencies] + serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default_features = false } runtime-io = { package = "sr-io", path = "../../core/sr-io", default_features = false } version = { package = "sr-version", path = "../../core/sr-version", default_features = false } support = { package = "srml-support", path = "../../srml/support", default_features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default_features = false } +substrate-session = { path = "../../core/session", default-features = false } balances = { package = "srml-balances", path = "../../srml/balances", default_features = false } aura = { package = "srml-aura", path = "../../srml/aura", default_features = false } executive = { package = "srml-executive", path = "../../srml/executive", default_features = false } @@ -20,7 +22,7 @@ indices = { package = "srml-indices", path = "../../srml/indices", default_featu system = { package = "srml-system", path = "../../srml/system", default_features = false } timestamp = { package = "srml-timestamp", path = "../../srml/timestamp", default_features = false } sudo = { package = "srml-sudo", path = "../../srml/sudo", default_features = false } -runtime-primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default_features = false } +sr-primitives = { path = "../../core/sr-primitives", default_features = false } client = { package = "substrate-client", path = "../../core/client", default_features = false } consensus-aura = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives", default_features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../../core/offchain/primitives", default-features = false } @@ -31,7 +33,7 @@ wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1. [features] default = ["std"] std = [ - "parity-codec/std", + "codec/std", "client/std", "rstd/std", "runtime-io/std", @@ -41,7 +43,7 @@ std = [ "aura/std", "indices/std", "primitives/std", - "runtime-primitives/std", + "sr-primitives/std", "system/std", "timestamp/std", "sudo/std", @@ -50,5 +52,6 @@ std = [ "safe-mix/std", "consensus-aura/std", "offchain-primitives/std", + "substrate-session/std", ] no_std = [] diff --git a/node-template/runtime/build.rs b/node-template/runtime/build.rs index ccf58b138f0799ca2cfacc70988c173b096012f1..7000c602e852514254baef95a37676238cd59626 100644 --- a/node-template/runtime/build.rs +++ b/node-template/runtime/build.rs @@ -14,8 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project, WasmBuilderSource}; +use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; fn main() { - build_current_project("wasm_binary.rs", WasmBuilderSource::Crates("1.0.4")); + build_current_project_with_rustflags( + "wasm_binary.rs", + WasmBuilderSource::Crates("1.0.4"), + // This instructs LLD to export __heap_base as a global variable, which is used by the + // external memory allocator. + "-Clink-arg=--export=__heap_base", + ); } diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index ada638c5eab56746a714297ed1100b2c9d2d8214..75608583ed031ba23901698697f96efe60d35010 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -8,17 +8,14 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); -#[cfg(feature = "std")] -use serde::{Serialize, Deserialize}; -use parity_codec::{Encode, Decode}; use rstd::prelude::*; -#[cfg(feature = "std")] -use primitives::bytes; -use primitives::{ed25519, sr25519, OpaqueMetadata}; -use runtime_primitives::{ +use primitives::{sr25519, OpaqueMetadata, crypto::key_types}; +use sr_primitives::{ ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str, - traits::{self, NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify} + impl_opaque_keys, }; +use sr_primitives::traits::{NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify, ConvertInto}; +use sr_primitives::weights::Weight; use client::{ block_builder::api::{CheckInherentsResult, InherentData, self as block_builder_api}, runtime_api, impl_runtime_apis @@ -29,17 +26,17 @@ use version::NativeVersion; // A few exports that help ease life for downstream crates. #[cfg(any(feature = "std", test))] -pub use runtime_primitives::BuildStorage; +pub use sr_primitives::BuildStorage; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; -pub use runtime_primitives::{Permill, Perbill}; +pub use sr_primitives::{Permill, Perbill}; pub use support::{StorageValue, construct_runtime, parameter_types}; /// Alias to the signature scheme used for Aura authority signatures. -pub type AuraSignature = ed25519::Signature; +pub type AuraSignature = consensus_aura::sr25519::AuthoritySignature; /// The Ed25519 pub key of an session that belongs to an Aura authority of the chain. -pub type AuraId = ed25519::Public; +pub type AuraId = consensus_aura::sr25519::AuthorityId; /// Alias to pubkey that identifies an account on the chain. pub type AccountId = ::Signer; @@ -51,10 +48,13 @@ pub type AccountSignature = sr25519::Signature; pub type Hash = primitives::H256; /// Index of a block number in the chain. -pub type BlockNumber = u64; +pub type BlockNumber = u32; /// Index of an account's extrinsic in the chain. -pub type Nonce = u64; +pub type Nonce = u32; + +/// Balance type for the node. +pub type Balance = u128; /// Used for the module template in `./template.rs` mod template; @@ -66,29 +66,21 @@ mod template; pub mod opaque { use super::*; - /// Opaque, encoded, unchecked extrinsic. - #[derive(PartialEq, Eq, Clone, Default, Encode, Decode)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub struct UncheckedExtrinsic(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - #[cfg(feature = "std")] - impl std::fmt::Debug for UncheckedExtrinsic { - fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(fmt, "{}", primitives::hexdisplay::HexDisplay::from(&self.0)) - } - } - impl traits::Extrinsic for UncheckedExtrinsic { - fn is_signed(&self) -> Option { - None - } - } + pub use sr_primitives::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; - /// Opaque session key type. - pub type SessionKey = AuraId; + + impl_opaque_keys! { + pub struct SessionKeys { + #[id(key_types::AURA)] + pub aura: AuraId, + } + } } /// This runtime version. @@ -112,11 +104,16 @@ pub fn native_version() -> NativeVersion { parameter_types! { pub const BlockHashCount: BlockNumber = 250; + pub const MaximumBlockWeight: Weight = 1_000_000; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); + pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; } impl system::Trait for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; + /// The aggregated dispatch type that is available for extrinsics. + type Call = Call; /// The lookup mechanism to get account ID from whatever is passed in dispatchers. type Lookup = Indices; /// The index type for storing how many extrinsics an account has signed. @@ -131,10 +128,18 @@ impl system::Trait for Runtime { type Header = generic::Header; /// The ubiquitous event type. type Event = Event; + /// Update weight (to fee) multiplier per-block. + type WeightMultiplierUpdate = (); /// The ubiquitous origin type. type Origin = Origin; /// Maximum number of block number to block hash mappings to keep (oldest pruned first). type BlockHashCount = BlockHashCount; + /// Maximum weight of each block. With a default weight system of 1byte == 1weight, 4mb is ok. + type MaximumBlockWeight = MaximumBlockWeight; + /// Maximum size of all encoded transactions (in bytes) that are allowed in one block. + type MaximumBlockLength = MaximumBlockLength; + /// Portion of the block weight that is available to all normal transactions. + type AvailableBlockRatio = AvailableBlockRatio; } impl aura::Trait for Runtime { @@ -155,10 +160,11 @@ impl indices::Trait for Runtime { } parameter_types! { - pub const MinimumPeriod: u64 = 5; + pub const MinimumPeriod: u64 = 5000; } + impl timestamp::Trait for Runtime { - /// A timestamp: seconds since the unix epoch. + /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; type MinimumPeriod = MinimumPeriod; @@ -168,13 +174,13 @@ parameter_types! { pub const ExistentialDeposit: u128 = 500; pub const TransferFee: u128 = 0; pub const CreationFee: u128 = 0; - pub const TransactionBaseFee: u128 = 1; - pub const TransactionByteFee: u128 = 0; + pub const TransactionBaseFee: u128 = 0; + pub const TransactionByteFee: u128 = 1; } impl balances::Trait for Runtime { /// The type for recording an account's balance. - type Balance = u128; + type Balance = Balance; /// What to do if an account's free balance gets zeroed. type OnFreeBalanceZero = (); /// What to do if a new account is created. @@ -189,6 +195,7 @@ impl balances::Trait for Runtime { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = ConvertInto; } impl sudo::Trait for Runtime { @@ -229,12 +236,14 @@ pub type Header = generic::Header; pub type Block = generic::Block; /// BlockId type as expected by this runtime. pub type BlockId = generic::BlockId; +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = (system::CheckNonce, system::CheckWeight, balances::TakeFees); /// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; +pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive; +pub type Executive = executive::Executive; // Implement our runtime API endpoints. This is just a bunch of proxying. impl_runtime_apis! { @@ -300,4 +309,11 @@ impl_runtime_apis! { Executive::offchain_worker(n) } } + + impl substrate_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + let seed = seed.as_ref().map(|s| rstd::str::from_utf8(&s).expect("Seed is an utf8 string")); + opaque::SessionKeys::generate(seed) + } + } } diff --git a/node-template/runtime/src/template.rs b/node-template/runtime/src/template.rs index 4049c09a9930dccbd957827864ea6b6154708569..c49024b598522a178ddc85bc7b46dc3d81e25e59 100644 --- a/node-template/runtime/src/template.rs +++ b/node-template/runtime/src/template.rs @@ -72,7 +72,9 @@ mod tests { use runtime_io::with_externalities; use primitives::{H256, Blake2Hasher}; use support::{impl_outer_origin, assert_ok, parameter_types}; - use runtime_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use sr_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use sr_primitives::weights::Weight; + use sr_primitives::Perbill; impl_outer_origin! { pub enum Origin for Test {} @@ -85,9 +87,13 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } impl system::Trait for Test { type Origin = Origin; + type Call = (); type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -95,9 +101,13 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type Error = Error; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl Trait for Test { type Event = (); @@ -107,7 +117,7 @@ mod tests { // This function basically just builds a genesis storage key/value store according to // our desired mockup. fn new_test_ext() -> runtime_io::TestExternalities { - system::GenesisConfig::default().build_storage::().unwrap().0.into() + system::GenesisConfig::default().build_storage::().unwrap().into() } #[test] diff --git a/node-template/src/chain_spec.rs b/node-template/src/chain_spec.rs index 3970522b37ab5c2c2a4227e7c52c06a9a4645974..65caab70dbe5ff5c6ad1c25771dfee42d030a250 100644 --- a/node-template/src/chain_spec.rs +++ b/node-template/src/chain_spec.rs @@ -1,8 +1,9 @@ -use primitives::{ed25519, sr25519, Pair}; +use primitives::{sr25519, Pair}; use node_template_runtime::{ AccountId, GenesisConfig, AuraConfig, BalancesConfig, SudoConfig, IndicesConfig, SystemConfig, WASM_BINARY, AuraId }; +use aura_primitives::sr25519::AuthorityPair as AuraPair; use substrate_service; // Note this is the URL for the telemetry server @@ -23,7 +24,7 @@ pub enum Alternative { } fn authority_key(s: &str) -> AuraId { - ed25519::Pair::from_string(&format!("//{}", s), None) + AuraPair::from_string(&format!("//{}", s), None) .expect("static values are valid; qed") .public() } diff --git a/node-template/src/cli.rs b/node-template/src/cli.rs index b799a5d9aee4233988302bb22fcd706eda724f79..4d672491c18e658b69fa9114261f2ad4a1b38ec1 100644 --- a/node-template/src/cli.rs +++ b/node-template/src/cli.rs @@ -3,7 +3,7 @@ use futures::{future, Future, sync::oneshot}; use std::cell::RefCell; use tokio::runtime::Runtime; pub use substrate_cli::{VersionInfo, IntoExit, error}; -use substrate_cli::{informant, parse_and_execute, NoCustom}; +use substrate_cli::{informant, parse_and_prepare, ParseAndPrepare, NoCustom}; use substrate_service::{ServiceFactory, Roles as ServiceRoles}; use crate::chain_spec; use std::ops::Deref; @@ -15,9 +15,8 @@ pub fn run(args: I, exit: E, version: VersionInfo) -> error::Result<()> T: Into + Clone, E: IntoExit, { - parse_and_execute::( - load_spec, &version, "substrate-node", args, exit, - |exit, _cli_args, _custom_args, config| { + match parse_and_prepare::(&version, "substrate-node", args) { + ParseAndPrepare::Run(cmd) => cmd.run(load_spec, exit, |exit, _cli_args, _custom_args, config| { info!("{}", version.name); info!(" version {}", config.full_version()); info!(" by {}, 2017, 2018", version.author); @@ -37,8 +36,16 @@ pub fn run(args: I, exit: E, version: VersionInfo) -> error::Result<()> exit ), }.map_err(|e| format!("{:?}", e)) - } - ).map_err(Into::into).map(|_| ()) + }), + ParseAndPrepare::BuildSpec(cmd) => cmd.run(load_spec), + ParseAndPrepare::ExportBlocks(cmd) => cmd.run::(load_spec, exit), + ParseAndPrepare::ImportBlocks(cmd) => cmd.run::(load_spec, exit), + ParseAndPrepare::PurgeChain(cmd) => cmd.run(load_spec), + ParseAndPrepare::RevertChain(cmd) => cmd.run::(load_spec), + ParseAndPrepare::CustomCommand(_) => Ok(()) + }?; + + Ok(()) } fn load_spec(id: &str) -> Result, String> { @@ -52,11 +59,11 @@ fn run_until_exit( mut runtime: Runtime, service: T, e: E, -) -> error::Result<()> - where - T: Deref> + Future + Send + 'static, - C: substrate_service::Components, - E: IntoExit, +) -> error::Result<()> where + T: Deref>, + T: Future + Send + 'static, + C: substrate_service::Components, + E: IntoExit, { let (exit_send, exit) = exit_future::signal(); @@ -67,10 +74,19 @@ fn run_until_exit( // but we need to keep holding a reference to the global telemetry guard let _telemetry = service.telemetry(); - let _ = runtime.block_on(service.select(e.into_exit())); + let service_res = { + let exit = e.into_exit().map_err(|_| error::Error::Other("Exit future failed.".into())); + let service = service.map_err(|err| error::Error::Service(err)); + let select = service.select(exit).map(|_| ()).map_err(|(err, _)| err); + runtime.block_on(select) + }; + exit_send.fire(); - Ok(()) + // TODO [andre]: timeout this future #1318 + let _ = runtime.shutdown_on_idle().wait(); + + service_res } // handles ctrl-c diff --git a/node-template/src/main.rs b/node-template/src/main.rs index 5418453a022cac246e767dbda5c031b9b201836c..18e9638833fd22230ae292df41d9268acf6054b4 100644 --- a/node-template/src/main.rs +++ b/node-template/src/main.rs @@ -21,7 +21,7 @@ fn main() { }; if let Err(e) = cli::run(::std::env::args(), cli::Exit, version) { - eprintln!("Error starting the node: {}\n\n{:?}", e, e); + eprintln!("Fatal error: {}\n\n{:?}", e, e); std::process::exit(1) } } diff --git a/node-template/src/service.rs b/node-template/src/service.rs index 050fb2646be7f5bfebcbd282b4bf3583cea9d306..7f2c80c48b2b821f42086c2befbc83d1ed531208 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -3,7 +3,6 @@ #![warn(unused_extern_crates)] use std::sync::Arc; -use log::info; use transaction_pool::{self, txpool::{Pool as TransactionPool}}; use node_template_runtime::{self, GenesisConfig, opaque::Block, RuntimeApi, WASM_BINARY}; use substrate_service::{ @@ -15,11 +14,11 @@ use basic_authorship::ProposerFactory; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration}; use futures::prelude::*; use substrate_client::{self as client, LongestChain}; -use primitives::{ed25519::Pair, Pair as PairT}; use inherents::InherentDataProviders; use network::{config::DummyFinalityProofRequestBuilder, construct_simple_protocol}; use substrate_executor::native_executor_instance; use substrate_service::construct_service_factory; +use aura_primitives::sr25519::AuthorityPair as AuraAuthorityPair; pub use substrate_executor::NativeExecutor; // Our native executor instance. @@ -66,25 +65,24 @@ construct_service_factory! { }, AuthoritySetup = { |service: Self::FullService| { - if let Some(key) = service.authority_key::() { - info!("Using authority key {}", key.public()); - let proposer = Arc::new(ProposerFactory { + if service.config().roles.is_authority() { + let proposer = ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - }); + }; let client = service.client(); let select_chain = service.select_chain() .ok_or_else(|| ServiceError::SelectChainRequired)?; - let aura = start_aura( + let aura = start_aura::<_, _, _, _, _, AuraAuthorityPair, _, _, _>( SlotDuration::get_or_compute(&*client)?, - Arc::new(key), client.clone(), select_chain, client, proposer, service.network(), - service.config.custom.inherent_data_providers.clone(), - service.config.force_authoring, + service.config().custom.inherent_data_providers.clone(), + service.config().force_authoring, + Some(service.keystore()), )?; service.spawn_task(Box::new(aura.select(service.on_exit()).then(|_| Ok(())))); } @@ -97,14 +95,20 @@ construct_service_factory! { FullImportQueue = AuraImportQueue< Self::Block, > - { |config: &mut FactoryFullConfiguration , client: Arc>, _select_chain: Self::SelectChain| { - import_queue::<_, _, Pair>( + { | + config: &mut FactoryFullConfiguration, + client: Arc>, + _select_chain: Self::SelectChain, + transaction_pool: Option>>, + | { + import_queue::<_, _, aura_primitives::sr25519::AuthorityPair, _>( SlotDuration::get_or_compute(&*client)?, Box::new(client.clone()), None, None, client, config.custom.inherent_data_providers.clone(), + transaction_pool, ).map_err(Into::into) } }, @@ -113,13 +117,14 @@ construct_service_factory! { > { |config: &mut FactoryFullConfiguration, client: Arc>| { let fprb = Box::new(DummyFinalityProofRequestBuilder::default()) as Box<_>; - import_queue::<_, _, Pair>( + import_queue::<_, _, AuraAuthorityPair, TransactionPool>( SlotDuration::get_or_compute(&*client)?, Box::new(client.clone()), None, None, client, config.custom.inherent_data_providers.clone(), + None, ).map(|q| (q, fprb)).map_err(Into::into) } }, diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index ad49cbe36cd900f6a9e0d0cea6d04fe38f518415..c266427439d781e1e96965ab9809bf527aaf9f25 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -12,7 +12,7 @@ tokio = "0.1.7" futures = "0.1" exit-future = "0.1" cli = { package = "substrate-cli", path = "../../core/cli" } -parity-codec = { version = "4.1.1" } +codec = { package = "parity-scale-codec", version = "1.0.0" } sr-io = { path = "../../core/sr-io" } client = { package = "substrate-client", path = "../../core/client" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } @@ -24,13 +24,12 @@ substrate-basic-authorship = { path = "../../core/basic-authorship" } substrate-service = { path = "../../core/service" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } network = { package = "substrate-network", path = "../../core/network" } -aura = { package = "substrate-consensus-aura", path = "../../core/consensus/aura" } -aura_primitives = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives" } +babe = { package = "substrate-consensus-babe", path = "../../core/consensus/babe" } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives" } grandpa = { package = "substrate-finality-grandpa", path = "../../core/finality-grandpa" } grandpa_primitives = { package = "substrate-finality-grandpa-primitives", path = "../../core/finality-grandpa/primitives" } sr-primitives = { path = "../../core/sr-primitives" } node-executor = { path = "../executor" } -substrate-keystore = { path = "../../core/keystore" } substrate-telemetry = { package = "substrate-telemetry", path = "../../core/telemetry" } structopt = "0.2" transaction-factory = { path = "../../test-utils/transaction-factory" } @@ -40,10 +39,18 @@ timestamp = { package = "srml-timestamp", path = "../../srml/timestamp", default rand = "0.6" finality_tracker = { package = "srml-finality-tracker", path = "../../srml/finality-tracker", default-features = false } contracts = { package = "srml-contracts", path = "../../srml/contracts" } +system = { package = "srml-system", path = "../../srml/system" } +balances = { package = "srml-balances", path = "../../srml/balances" } +support = { package = "srml-support", path = "../../srml/support", default-features = false } +im_online = { package = "srml-im-online", path = "../../srml/im-online", default-features = false } [dev-dependencies] +keystore = { package = "substrate-keystore", path = "../../core/keystore" } +babe = { package = "substrate-consensus-babe", path = "../../core/consensus/babe", features = ["test-helpers"] } consensus-common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } service-test = { package = "substrate-service-test", path = "../../core/service/test" } +futures03 = { package = "futures-preview", version = "=0.3.0-alpha.17" } +tempfile = "3.1" [build-dependencies] cli = { package = "substrate-cli", path = "../../core/cli" } diff --git a/node/cli/res/flaming-fir.json b/node/cli/res/flaming-fir.json index 3ff5495c9bd79faa75f40067d7945a6f5ae1b00d..851aaa21b4a9a332147279495349e32a5fc95862 100644 --- a/node/cli/res/flaming-fir.json +++ b/node/cli/res/flaming-fir.json @@ -21,109 +21,86 @@ "protocolId": "fir", "consensusEngine": null, "genesis": { - "raw": { - "0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300", - "0x6e4ab2ac5a7cf9b1829eacc84a75bde0804be01fc31c9419ea72407f50a33384": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", - "0x366a192e1ce90bf109f11cf4d4bdab1ce310d835c09411b1be3ad53814e33196": "0x0c000001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", - "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0x0000c16ff28623000000000000000000", - "0xd437fe93b0bd0a5d67d30d85d010edc2": "0x40420f00", - "0x656abc4530eb4c1692051ca24c867220aa8d62e4a9686b432f760de7455e8f95": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce4405633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440", - "0x7c79972b34b7e51bdd5f168ba3accd35fbec396be75dfad19dd1121327f1a1ad": "0x0c000168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde7800", - "0xfe7030fd433199728c516e4392091aa5": "0x0080c6a47e8d03000000000000000000", - "0x686f6c72b7b80bad8dba022335cb7c9e4556ac7ea200008da8046e3178eb89c1": "0x0f0000c16ff286230f0000c16ff2862300", + "raw": [{ + "0xbc3717660105a864bd63dcd430de64128d58bd0917fa8dd75aee827cf086e19c": "0x0000c16ff28623000000000000000000", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973a6e391e5d17627fa5aaa7a76b39ebee4b139bff595608fe41aea21aa7ea48053": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", + "0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0c0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b65797372fff749dbf31067eff27b442ec22922d2b7817d7c6fbc6895d90847fd91504c": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0xc98362e2ca21b342cc749022ed9b560e4d29ec9862a960c2538c314f1d279635": "0x149ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e3180973474718099c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b657973e54094c2d5af8ae10b91e1288f4f59f2946d7738f2c509b7effd909e5e9ba0ad": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a", + "0xc63b8a0db7e72fd87c88d8dcf4777b883f86728613c57148c4e5cdceb05b7a1a": "0x0c0001f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", + "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b6579737f325c981c2b001f5fe8c51cc7b89e50ebb1f60feb7ab3fa3bc79d6ab71d45cb": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993326e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106", + "0x2b334d6ac6698775ed17edf8cd3cbd9dae56cead0d69cb54f6af6aaecba544d8": "0x0f0000c16ff286230f0000c16ff2862300", + "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b65797361be8e37f76f246c8d427bc3a669795df24fff7035dc10ba08f864f7d286c05e": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", + "0x154ebcb2c318b2e1c23e43e65aea27cd1348c4c5157502d7669a31c7635019cc": "0x9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526", + "0x26ac4a74e1ba94e0e7dbfc3b2aea083cf3c0f0d80eb999c7cebb340ee8934da9": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde780f0000c16ff286230f0000c16ff2862300", + "0x2d5205eddfc20f1a616c0391abb78a3920e823abe7ed33cfd7945dd1a1bf8651": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0e", "0x121725e2f949944d00a8c011c0db54ae07b84a6ca772adf3c65417345d91522d": "0x0000c16ff28623000000000000000000", - "0xeecb67c20ca6cc8ba4d4434687f61309": "0x109becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe969933201000000000000007932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f01000000000000005633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce44001000000000000003919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef0100000000000000", + "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", + "0x46cef122497fefa60faf6c66d3ef05caf9870446796ae11f0a4f734fee993d8b": "0x00", + "0xfff675c76ad8a5dfbd7db9a4e80f7c0ece595ad1878d2b6fca6086b2483a055b": "0x0000c16ff28623000000000000000000", + "0x75f6361fd25fec35714be80f2d9870af8c92e73cb6d299ba4774f5b0ad842275": "0x00", + "0x633daafcb669e97549c1b9d65660881016f969040bc16171709159437c31294a": "0x0f0000c16ff286230f0000c16ff2862300", + "0x7c79972b34b7e51bdd5f168ba3accd35fbec396be75dfad19dd1121327f1a1ad": "0x0c000168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde7800", + "0x4e62513de81454ce76df887573f7f98b101eb4585b1485a222b7db599f4e93e2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0e", + "0xd437fe93b0bd0a5d67d30d85d010edc2": "0x40420f00", + "0xb2029f8665aac509629f2d28cea790a3": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26633919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d655633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde787932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d129becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993326e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106", + "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d6568655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde789c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973887a8c8429d90d6cf7a8ba6b60877979bff529eab6930cb2fdea5edf5a79c7d5": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0x579ab55d37b1220812be3c3df29d4858": "0x00000000", "0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000", - "0x4ac2684a5a20e7a5adf17ed7aa792a3f6334a0505f02b2a44c3934d36cc4ee0a": "0xc8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973559fe6ed570e93d5c6b0b335ecf466e5fbbbe8261673da66a68c9fcc835db06b": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", + "0x366a192e1ce90bf109f11cf4d4bdab1ce310d835c09411b1be3ad53814e33196": "0x0c000001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", "0x125dc846383907f5846f72ce53ca0e4b": "0x00ca9a3b000000000000000000000000", - "0x763c9e671e9c7ff51644a965ea0f2707": "0x0000000000000000", - "0x75f6361fd25fec35714be80f2d9870af8c92e73cb6d299ba4774f5b0ad842275": "0x00", - "0x0c41b62474c49057a4476d0b96853c6d44e9c86c5fa130b0da3831c5eef546a0": "0x00", - "0xdee5bbb035d9ebc2c9338b5aedf744d7": "0x4038000000000000", - "0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000", - "0x15b569617561081f097bbc5c5a059d2f7ccf6d23be534cffa33fb544946a6a92": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", - "0xf541ffd8c90d7124a5298d6c1e2c0d40": "0x0300000000000000", - "0x3a636f6465": "0x0061736d01000000019f022760027f7f0060017f0060037f7f7f017f60027f7f017f60037f7f7f0060047f7f7f7f0060057f7f7f7f7f0060057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f0060047f7f7f7f017f60017e0060017f017f60000060017e017f60037f7e7e0060057f7e7f7f7e0060027f7e0060047f7f7e7e0060067f7f7e7e7e7f0060037f7f7e0060027e7e017e60087f7f7f7f7f7f7f7f0060047f7f7f7f017e60087f7f7e7e7f7f7f7f0060097f7f7f7e7e7f7f7f7f0060057f7f7f7e7e0060057f7f7e7e7f0060037f7e7f0060037e7f7f017f60037f7e7f017f60017f017e60047f7e7e7e0060027f7f017e60087f7f7f7f7f7e7e7f0060057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f000286061d03656e760c6578745f74776f785f313238000403656e76146578745f6765745f73746f726167655f696e746f000703656e760e6578745f626c616b65325f323536000403656e76116578745f636c6561725f73746f72616765000003656e760f6578745f7365745f73746f72616765000503656e76166578745f73616e64626f785f6d656d6f72795f6e6577000303656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000103656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000103656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e76156578745f7365745f6368696c645f73746f72616765000a03656e76176578745f636c6561725f6368696c645f73746f72616765000503656e76166578745f6b696c6c5f6368696c645f73746f72616765000003656e76166578745f73616e64626f785f6d656d6f72795f676574000b03656e760e6578745f7072696e745f75746638000003656e76166578745f73616e64626f785f6d656d6f72795f736574000b03656e76126578745f737232353531395f766572696679000b03656e76126578745f656432353531395f766572696679000b03656e76166578745f6368696c645f73746f726167655f726f6f74000203656e76196578745f6765745f616c6c6f63617465645f73746f72616765000203656e76106578745f73746f726167655f726f6f74000103656e76186578745f73746f726167655f6368616e6765735f726f6f74000203656e760d6578745f7072696e745f686578000003656e76106578745f636c6561725f707265666978000003656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000503656e760d6578745f7072696e745f6e756d000c03656e760a6578745f6d616c6c6f63000d03656e76086578745f667265650001038104ff030e0e0f0000000101000d020004001004110f0000000600000112000000010101000000000000000000000000000000000000010000000000000e0400000b1300000000030014150000000000010100000000010000000000000004000013011604130001040004000101000006000300000500000e04000101030803020404040404010003000000040000000000000d000400000003020301051705050505050505050505050505050505050505050505051800040e04010406040003040013000110010419040e060e1a0404030400000100010100000000000000000001000110010013131b131c03000c000000010000000000001300000012000404060000000000000000000000000000000003030406041d00000001010100000000000000000000000004050001030503031e0c0415011f04000101002001040003030001010e010000010e010101001e02000c01210101010101010101010101010404000e01010101010101002222010004050c00222200040000002222220022222222220422222222040101010000000300010101000101010000000d01010123010003000503030400000003000d04000404060506040404040405030303040504020303030204030404000004040303030301030300040001000d01020d0e0302030301200b0503030d0303050102010303010203030202020224242525260407017001ab01ab0105030100120619037f01418080c0000b7f0041adb1c5000b7f0041adb1c5000b07a30414066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010a5f5f646174615f656e6403020c436f72655f76657273696f6e00880312436f72655f657865637574655f626c6f636b00890315436f72655f696e697469616c697a655f626c6f636b009003114d657461646174615f6d657461646174610091031c426c6f636b4275696c6465725f6170706c795f65787472696e7369630097031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00980320426c6f636b4275696c6465725f696e686572656e745f65787472696e736963730099031c426c6f636b4275696c6465725f636865636b5f696e686572656e7473009b0318426c6f636b4275696c6465725f72616e646f6d5f73656564009c032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e009d03214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572009e03214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765009f03204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500a1031e4772616e6470614170695f6772616e6470615f617574686f72697469657300a20315417572614170695f736c6f745f6475726174696f6e00a30313417572614170695f617574686f72697469657300a40309cb02010041010baa0160bf03db02dc029601cb02a101b801b901ba01bb01bc01bd01be01bf01c001c101c201c301c401c501c601c701c801c901ca01cb01cc01cd01ce01cf01ca02c802ac03c203c303ac02b2019801e103d803d903da03e403df038804fc03840485048004b802f20140b1033e3d7473727170f90180018201788101fa01f801f701f601f501f401f301bf02be02bd02bc02bb02ba02b902e302e202e902df02e102de02f1028003e702e802e602b303b403b203f202fd01ff01fb01f302ba03bb03b903f4026a6f69f5023b3c3af602f001f101ee01f702af03b003ae03f8029501810382038303f902a703a803a603fa02b602b702b502fb02840385038603f0028703a903d601d701da01d901d501db01bd03e501e901eb01ea01e801ec018f04f003e003f103eb03ee03ed03ec03fd03fe03ff0381048c048b048d048e049004910492040acdca39ff030500101e000b0a0041f481c500104f000be11204077f037e037f117e230041c0026b2201240041082102200141b8016a41086a22034200370300200142003703b80141fc88c0004115200141b8016a100020014198016a41086a2003290300370300200120012903b8013703980141002104024002400240024002400240024020014198016a411041a886c500410041001001417f460d002001421037022c200120014198016a360228200141b8016a200141286a102020012802b8012202450d0220012802bc0121054198012103200141c0016a28020022044198016c2206450d010c030b41002105419801210341004198016c22060d020b200141003602302001200236022c200120023602282001200141b8026a36023420040d020c030b41d4aac10041331021000b200220066a2106200141b8016a20022802701022200220036a21030240024020012802c8012207450d00200141186a20012903b801200141b8016a41086a290300200141d0016a3502004200109804200141186a41086a29030021082001290318210920012802cc01450d01200710230c010b42002109420021080b200141013602302001200636022c200120033602282001200141b8026a36023402402002450d002002ad422086210a024020032006460d0020044198016c41e87e6a2106200141c8016a210b200141d0016a210c200141cc016a210d4201210e0340200141b8016a200341f0006a280200102202400240200b2802002207450d00200141086a20012903b801200141b8016a41086a290300200c3502004200109804200141086a41086a290300210f20012903082110200d280200450d01200710230c010b420021104200210f0b024020092010562008200f562008200f511b0d002003ad422086200e84210a20102109200f21080b20034198016a2103200e42017c210e200641e87e6a22060d000b0b200a4280808080105a0d030b2004450d010b20044198016c21062002210303402003102420034198016a2103200641e87e6a22060d000b0b02402005450d00200210230b200141c0026a240041a489c0000f0b024002400240024002402004200aa722034d0d0020022004417f6a22074198016c6a220641e0006a2903002110200641e8006a2903002109200641f0006a290300210a200641f8006a2903002111200641c0006a2903002112200641c8006a2903002113200641d0006a2903002114200641d8006a2903002115200641206a2903002116200641286a2903002117200641306a2903002118200641386a29030021192006290300211a2006290308211b2006290310211c200220034198016c6a220341186a220b290300211d20064190016a290300210f20064188016a290300210820064180016a290300210e200b200641186a2903003703002003290310211e2003201c3703102003290308211c2003201b3703082003290300211b2003201a370300200341386a2206290200211a20062019370200200341306a2206290200211920062018370200200341286a2206290200211820062017370200200341206a2206290200211720062016370200200341d8006a2206290200211620062015370200200341d0006a2206290200211520062014370200200341c8006a2206290200211420062013370200200341c0006a2206290200211320062012370200200341f8006a2011370200200341f0006a2206280200210b2006200a370200200341e8006a2206290200210a20062009370200200341e0006a220629020021092006201037020020034180016a200e37020020034188016a2008370200200141b8016a41086a2206200837030020034190016a200f370200200141b8016a41106a200f3703002001200e3703b801200141286a41e8006a200a370300200141286a41e0006a2009370300200141286a41d8006a2016370300200141286a41d0006a2015370300200141286a41c8006a2014370300200141286a41c0006a2013370300200141286a41386a201a370300200141286a41306a2019370300200141286a41286a2018370300200141286a41206a2017370300200141286a41186a201d3703002001201e3703382001201c3703302001201b370328200120073602b002200120053602ac02200120023602a80220064200370300200142003703b80141fc88c0004115200141b8016a100020014198016a41086a2006290300370300200120012903b80137039801200141103602bc01200120014198016a3602b801200141a8026a200141b8016a102502402007450d0020044198016c41e87e6a21062002210303402003102420034198016a2103200641e87e6a22060d000b0b02402005450d00200210230b411310262203450d01410021072003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272203450d022003200b360013200141b8016a41186a22064200370300200141b8016a41106a22024200370300200141b8016a41086a220c4200370300200142003703b80120034117200141b8016a100220014198016a41186a200629030037030020014198016a41106a200229030037030020014198016a41086a200c290300370300200120012903b8013703980102400240024020014198016a412041a886c500410041001001417f460d00200120014198016a3602a802200141203602ac02200142003703c001200142003703b8012001410020014198016a4120200141b8016a41104100100122062006417f461b2206411020064110491b3602b0022006410f4d0d02200141c0016a290300210f20012903b8012108200141b8016a200141a8026a102820012802b8012207450d0220012902bc01210e20014198016a41201003200e422088a72102200ea7210c200310232007450d010c060b2003102341000d050b200141286a10240c050b41d4aac10041331021000b419489c000200320041029000b41134101102a000b41264101102a000b024020024105742206450d0020072103034020032008200f102b200341206a2103200641606a22060d000b0b200141e0016a200f370300200141d8016a2008370300200141d0016a2002360200200141cc016a200c360200200141c8016a2007360200200141c4016a200b360200200141c0016a41013a0000200141053a00b80141a886c5004100200141b8016a102c200141b8016a200141286a41f0001094041a20014198016a20004280e20e7c200141b8016a41004280e90f102d2001280298014101470d00200128029c012103200141c0026a240020030f0b200141c0026a240041000bb40803027f017e107f230041b0046b22022400200241086a2001104a02400240024002400240024002400240024002402002280208450d00200228020c2203ad4298017e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241b0046a24000f0b4108210620030d030b4100210f4100210d0c030b101d000b20054108102a000b200241b0026a4104722107200141086a210820024190046a41186a210920024190046a41106a210a4100210b4100210c410021052003210d0340200141046a220e280200210f20082802002110200241003602a003200841002001280200200f200241a0036a410420101001220f200f417f461b220f4104200f410449220f1b20082802006a36020002400240200f0d0020022802a0032111200241a0036a2001102f20022802a003410e460d00200241b0026a200241a0036a41f0001094041a20094200370300200a420037030020024190046a41086a221042003703002002420037039004200841002001280200200e28020020024190046a412020082802001001220f200f417f461b220f4120200f4120491b20082802006a3602000240200f411f4d0d00200241a0016a41186a2009290300370300200241a0016a41106a200a290300370300200241a0016a41086a201029030037030020022002290390043703a00120022802b0022110200241c4016a200741ec001094041a201121120c020b200241b0026a10240b410e21100b200241a0036a200241c4016a41ec001094041a200241b0026a41186a220e200241a0016a41186a290300370300200241b0026a41106a2211200241a0016a41106a290300370300200241b0026a41086a2213200241a0016a41086a290300370300200220022903a0013703b0022010410e460d02200541016a210f200241346a200241a0036a41ec001094041a200241106a41186a2214200e290300370300200241106a41106a220e2011290300370300200241106a41086a22112013290300370300200220022903b00237031002402005200d470d00200b200f200f200b491b220dad4298017e2204422088a70d042004a722134100480d0402402005450d002006200c2013102722060d010c060b201310262206450d050b2006200c6a22052010360200200541046a200241346a41ec001094041a200541f0006a20123602002005418c016a201429030037020020054184016a200e290300370200200541fc006a2011290300370200200541f4006a2002290310370200200b41026a210b200c4198016a210c200f2105200f2003490d000b0b2000200d36020420002006360200200041086a200f360200200241b0046a24000f0b2000410036020002402005450d002006210503402005102420054198016a2105200c41e87e6a220c0d000b0b0240200d450d00200610230b200241b0046a24000f0b101e000b20134108102a000b5e01017f230041306b220224002002200136020c20022000360208200241246a41013602002002410136022c20024201370214200241ccb0c5003602102002200241086a3602282002200241286a360220200241106a41d4b0c5001061000bad0302047f037e230041d0006b2202240002400240411310262203450d002003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041a886c500410041001001417f460d00200220023602202002412036022420024200370338200242003703302002410020024120200241306a41104100100122012001417f461b2201411020014110491b3602282001410f4d0d02200241386a290300210620022903302107200241306a200241206a102820022802302201450d0220022902342108200020063703082000200737030020002008370214200020013602100c010b200041003602100b20031023200241d0006a24000f0b41d4aac10041331021000b41134101102a000b41264101102a000b0700200010f8030bee0601027f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002201410c4b0d0020010e0d01151515020304050615071508010b20002802044101470d14200041086a22002802001024200028020010230f0b200041086a280200220141044b0d0c024020010e051400140e0f140b200041106a280200450d132000410c6a28020010230f0b200041086a280200450d12200028020410230f0b200041086a2d00002201410c4b0d1020014106470d11200041106a280200450d112000410c6a28020010230f0b200041086a2d0000417f6a220141074b0d10024020010e080011111107110809000b2000410c6a22002802001024200028020010230f0b200041086a28020022014102460d0320014101470d0f200041106a280200450d0f2000410c6a28020010230f0b20002d000422014102460d0320014101470d0e200041086a22002802001024200028020010230f0b200041086a280200450d0d200028020410230f0b200041086a2d0000220141054b0d08024020010e060d0d000a0b0d0d0b200041106a280200450d0c2000410c6a28020010230f0b200041106a280200450d0b2000410c6a28020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010230b2001410c6a2101200241746a22020d000b0b200041106a280200450d062000410c6a28020010230f0b200041106a280200450d052000410c6a28020010230f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200241686a22020d000b0b200041106a280200450d042000410c6a28020010230f0b200041d0006a280200450d03200041cc006a28020010230f0b200041346a280200450d02200041306a28020010230f0b200041306a280200450d012000412c6a28020010230f0b200041106a280200450d002000410c6a28020010230f0b0bc80401077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d0020004198016c2104200241086a22052802002100200228020421060340200341f0006a28020021070240024002400240200620006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102722060d020c070b200228020021060c020b200010262206450d050b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200320021039024002400240024020022802042206200528020022076b41204f0d00200741206a22002007490d0620064101742207200020002007491b22004100480d062006450d01200228020020062000102722080d020c080b200228020021080c020b200010262208450d060b200220003602042002200836020020052802002107200021060b2005200741206a2200360200200820076a220741086a200341fc006a290000370000200741106a20034184016a290000370000200741186a2003418c016a2900003700002007200341f4006a29000037000020034198016a2103200441e87e6a22040d000b200128020020012802042008200010042006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100420030d030c040b101e000b20004101102a000b20004101102a000b200810230b200241106a24000b0700200010f7030b0b0020002001200210f9030bdc0403027f017e0d7f230041d0006b22022400200241086a2001104a02400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210d0c030b101d000b20054101102a000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d03402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001001220f200f417f461b220f4120200f4120491b20052802006a360200200f411f4d0d02200c41016a2105200241106a41186a220f2007290300370300200241106a41106a22102008290300370300200241106a41086a2211200e290300370300200220022903303703100240200c200d470d00200a20052005200a491b220dad4205862204422088a70d042004a7220e4100480d040240200c450d002006200b200e102722060d010c060b200e10262206450d050b2006200b6a220c2002290310370000200c41186a200f290300370000200c41106a2010290300370000200c41086a2011290300370000200a41026a210a200b41206a210b2005210c20052003490d000b0b2000200d36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200d450d00200610230b200241d0006a24000f0b101e000b200e4101102a000b6c01017f230041306b2203240020032002360204200320013602002003412c6a41023602002003411c6a4102360200200341023602242003420237020c2003419886c500360208200320033602282003200341046a3602202003200341206a360218200341086a20001061000b0e0041b080c500412210f60300000bdb0604027f017e037f047e230041c0006b22032400024002400240411810262204450d00200441106a410029008db741370000200441086a4100290085b741370000200441002900fdb64137000020044118413810272204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a29000037000042002105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044138200341206a1002200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a2903002109200329032021052004102341142106411410262204450d010c050b4200210920041023411421064114102622040d040b20064101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b200441106a41002800f9b641360000200441086a41002900f1b641370000200441002900e9b641370000024020042006413410272204450d00200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a2900003700004200210a200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044134200341206a1002200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a290300210b2003290320210a0c010b4200210b0b200410232000200a200120052005200156200920025620092002511b22041b22017c220c200b2002200920041b22027c200c200a54ad7c10df012000200520017d200920027d2005200154ad7d10fe01200341c0006a24000f0b41d4aac10041331021000b41344101102a000bd52803087f047e047f230041a0036b22032400410021044101210502400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240418595c300411041a886c500410041001001417f460d002003410036029801418595c300411020034198016a41044100100141016a41044d0d0320032802980121064100210720010d010c020b410121072001450d010b200141057422044100480d13200410262205450d032001410574220841606a410576210941002104034020034198016a41186a200020046a220a41186a290000220b37030020034198016a41106a200a41106a290000220c37030020034198016a41086a200a41086a290000220d3703002003200a290000220e37039801200520046a220a41106a200c370000200a41086a200d370000200a41186a200b370000200a200e3700002008200441206a2204470d000b200941016a21040b20034184016a20063602002003200736028001200341106a200241f0001094041a20034190016a20043602002003418c016a20013602002003200536028801200341b0026a41086a22044200370300200342003703b00241c19dc3004111200341b0026a1000200341e8026a41086a2004290300370300200320032903b0023703e8024100210f0240200341e8026a411041a886c500410041001001417f460d002003410036029801200341e8026a411020034198016a41044100100141016a41044d0d02200328029801210f0b0240200f41016a220a200f4f0d00200341106a10d802200341a0036a24000f0b200341b0026a41086a22044200370300200342003703b00241c19dc3004111200341b0026a1000200341e8026a41086a22052004290300370300200320032903b0023703e8022003200a36029801200341e8026a411020034198016a4104100420034198016a200341106a4188011094041a20044200370300200342003703b00241b49dc300410d200341b0026a100020052004290300370300200320032903b0023703e802200341003602b002200341e8026a4110200341b0026a1014210a0240024002400240024002400240024020032802b0022204417f460d00200a450d00200320043602a802200320043602a4022003200a3602a0022004450d01200320043602b4022003200a3602b002200341086a200341b0026a104502402003280208450d004101210a200328020c220541016a220820054f0d030b410021040c140b200341003602a802200342013703a0020b200341003602b802200342013703b002200341013602e802200341e8026a200341b0026a10410240024002402003280288024101470d0020032802b402200341b8026a2802002204470d01200441016a220a2004490d1b20044101742205200a200a2005491b22054100480d1b2004450d0420032802b002200420051027220a450d050c120b20032802b402200341b8026a2802002204470d01200441016a220a2004490d1a20044101742205200a200a2005491b22054100480d1a2004450d0520032802b002200420051027220a450d060c0f0b20032802b002210a0c110b20032802b002210a0c0e0b0240200541c000490d004102210a200541808001490d00410441052005418080808004491b210a0b410121050240200841c000490d0041022105200841808001490d00410441052008418080808004491b21050b2005200a470d042003200341a0026a3602b0022008200341b0026a200a10d90220034198016a200341a0026a10da02200341a8026a280200210520032802a402210820032802a00222040d130c180b20051026220a0d0d0b20054101102a000b20051026220a0d090b20054101102a000b20042005200a6b6a2204417f4c0d0f024002402004450d002004102622020d0120044101102a000b410121020b200320043602880320032004360284032003200236028003200320034180036a3602b0022008200341b0026a200510d90220042005490d0320032802880322082004490d04200341a8026a2802002208200a490d05200328028003210220032802a00221062003200420056b22043602900320032008200a6b22083602940320042008470d06200220056a2006200a6a20041094041a20034198016a20034180036a10da0220034188036a28020021052003280284032108200328028003210420032802a402450d0d20032802a002102320040d0e0c130b41d4aac10041331021000b41d4aac10041331021000b20044101102a000b200520041048000b20042008108c01000b200a20081048000b200320034190036a36029803200320034194036a36029c03200341b0026a41146a4100360200200341e8026a41146a4103360200200341f4026a4104360200200341d0026a41146a4103360200200341a886c5003602c002200342013702b402200341a881c5003602b002200341043602ec02200342033702d402200341d480c5003602d0022003200341b0026a3602f80220032003419c036a3602f002200320034198036a3602e8022003200341e8026a3602e002200341d0026a41e481c5001061000b200320053602b4022003200a3602b002200341b8026a28020021040b200341b8026a2205200441016a360200200a20046a41003a00002003418c026a28020021080240024002400240024020032802b402220a200528020022046b41044f0d00200441046a22052004490d0e200a4101742204200520052004491b22044100480d0e200a450d0120032802b002200a20041027220a450d020c030b20032802b002210a0c030b20041026220a0d010b20044101102a000b200320043602b4022003200a3602b002200341b8026a28020021040b200341b8026a200441046a360200200a20046a20083600000c020b200320053602b4022003200a3602b002200341b8026a28020021040b200341b8026a200441016a360200200a20046a41013a00000b20034198016a200341b0026a10dd0220032802900221042003200328029802220a3602e802200341e8026a200341b0026a10410240200a450d00200a4105742106200341b0026a41086a2207280200210520032802b402210803400240024002400240200820056b41204f0d00200541206a220a2005490d0c20084101742205200a200a2005491b22054100480d0c2008450d0120032802b00220082005102722020d020c0b0b20032802b00221022005210a0c020b200510262202450d090b200320053602b402200320023602b0022007280200210a200521080b2007200a41206a22053602002002200a6a220a41086a200441086a290000370000200a41106a200441106a290000370000200a41186a200441186a290000370000200a2004290000370000200441206a2104200641606a22060d000b0b200341b8026a280200210520032802b402210820032802b002210420032802a402450d010b20032802a00210230b2004450d050b4200210c200341b0026a41086a220a4200370300200342003703b00241b49dc300410d200341b0026a1000200341e8026a41086a2202200a290300370300200320032903b0023703e802200341e8026a411020042005100402402008450d00200410230b20034198016a10d802200a4200370300200342003703b00241af98c300410d200341b0026a10002002200a290300370300200320032903b0023703e8020240200341e8026a411041a886c500410041001001417f460d002003420037039801200341e8026a411020034198016a41084100100141016a41084d0d02200329039801210c0b02402001450d0020014105742110200341d0026a41086a2111024003402011200f3602002003200c3703d0020240024002400240024002400240024002400240024002400240024002400240411210262204450d00200441106a41002f00e29d433b0000200441086a41002900da9d43370000200441002900d29d4337000020034198016a41186a2208420037030020034198016a41106a2202420037030020034198016a41086a220a420037030020034200370398012004411220034198016a1002200341b0026a41186a22062008290300370300200341b0026a41106a22072002290300370300200341b0026a41086a2201200a29030037030020032003290398013703b002412010262205450d01200520032903b002370000200541186a2006290300370000200541106a2007290300370000200541086a2001290300370000200410232008420037030020024200370300200a420037030020034200370398012000412020034198016a100220062008290300370300200720022903003703002001200a29030037030020032003290398013703b0022005412041c00010272204450d02200420032903b002370020200441386a2006290300370000200441306a2007290300370000200441286a20012903003700002003410036029801200441c00020034198016a101421050240024002400240024002400240024002400240024002400240024002400240024002402003280298012208417f460d00200341a0026a41086a22022008360200200320083602a402200320053602a0022008450d012003200836029c012003200536029801200320034198016a10452003280200450d02410021052003280204220a41016a2207200a490d0641012105410121060240200a41c000490d0041022106200a41808001490d0041044105200a418080808004491b21060b0240200741c000490d0041022105200741808001490d00410441052007418080808004491b21050b20052006470d082003200341a0026a36029801200720034198016a200610d90220032903d002210b20032802a40222052002280200220a6b41084f0d09200a41086a2208200a490d282005410174220a20082008200a491b220a4100480d282005450d0c20032802a0022005200a102722050d0d0c1c0b200341a0026a41086a4100360200200342013703a0020b200a41003602002003420137039801200341013602b002200341b0026a20034198016a104120032903d002210b0240200328029c012208200a28020022026b41084f0d00200241086a22052002490d2720084101742206200520052006491b22064100480d272008450d0220032802980120082006102722050d030c140b20032802980121050c030b4100210520032802a4020d040c1d0b200610262205450d110b2003200636029c012003200536029801200621080b200a200241086a2206360200200520026a200b370000201128020021070240024002400240200820066b41034b0d00200641046a22012006490d2620084101742209200120012009491b22094100480d262008450d01200520082009102722050d020c140b200821090c020b200910262205450d120b2003200936029c0120032005360298010b200a2002410c6a2212360200200520066a20073600000b20032802a402450d190b20032802a00210230c180b2008200520066b6a2208417f4c0d1c2008450d012008102622010d020c0e0b20032802a00221050c040b410121010b20034180036a41086a220a200836020020032008360284032003200136028003200320034180036a36029801200720034198016a200510d90220082005490d0c200a28020022072008490d0d200228020022022006490d0e200328028003210720032802a00221012003200820056b2208360290032003200220066b22023602940320082002470d0f200720056a200120066a20081094041a20032903d002210b02402003280284032208200a28020022056b41084f0d00200541086a22022005490d1d20084101742205200220022005491b22054100480d1d2008450d0420032802800320082005102722080d050c130b20032802800321080c050b200a10262205450d0f0b2003200a3602a402200320053602a0022002280200210a0b2002200a41086a3602002005200a6a200b37000020112802002108024002400240024020032802a40222052002280200220a6b41044f0d00200a41046a2206200a490d1d2005410174220a20062006200a491b220a4100480d1d2005450d0120032802a0022005200a102722050d020c120b20032802a00221050c020b200a10262205450d100b2003200a3602a402200320053602a0022002280200210a0b2002200a41046a3602002005200a6a20083600002002280200211220032802a402210920032802a00222050d120c140b200510262208450d0e0b20032005360284032003200836028003200a28020021050b200a200541086a360200200820056a200b3700002011280200210202400240024002402003280284032208200a28020022056b41044f0d00200541046a22062005490d1a20084101742205200620062005491b22054100480d1a2008450d0120032802800320082005102722080d020c110b20032802800321080c020b200510262208450d0f0b20032005360284032003200836028003200a28020021050b200a200541046a360200200820056a2002360000200a28020021122003280284032109200328028003210520032802a402450d0e20032802a002102320050d0f0c110b41124101102a000b41204101102a000b41c0004101102a000b20064101102a000b20094101102a000b20084101102a000b200520081048000b20082007108c01000b200620021048000b200320034190036a36029803200320034194036a36029c0320034198016a41146a4100360200200341e8026a41146a4103360200200341f4026a4104360200200341b0026a41146a4103360200200341a886c5003602a8012003420137029c01200341a881c50036029801200341043602ec02200342033702b402200341d480c5003602b002200320034198016a3602f80220032003419c036a3602f002200320034198036a3602e8022003200341e8026a3602c002200341b0026a41e481c5001061000b200a4101102a000b200a4101102a000b20054101102a000b20054101102a000b2005450d020b200441c00020052012100402402009450d00200510230b200041206a210020041023201041606a22100d000c020b0b200410230b200341a0036a24000f0b101d000b41d4aac10041331021000b20054101102a000b101e000b20034198016a10d802200341a0036a24000b8d0c03037f017e037f230041b0026b2205240020054188016a41086a22064200370300200542003703880141a387c000411920054188016a1000200541086a20062903003703002005200529038801370300410021060240024002400240024002400240024002400240024002400240024002402005411041a886c500410041001001417f460d0020054100360288012005411020054188016a41044100100141016a41044d0d0120052802880121060b024002402006417f6a220720064d0d002005410e3602080c010b2005200710382005280208410e460d0020054188016a20054188011094041a200529038801210820054188016a41086a102420082001580d00200041b588c00036020420004101360200200041086a41c70036020020021024200541b0026a24000f0b20054188016a41086a22074200370300200542003703880141a387c000411920054188016a1000200541086a200729030037030020052005290388013703002005200641016a360288012005411020054188016a4104100420052001370388012007200241f0001094042109200520033a0088022005200437038002411a10262207450d01200741186a41002f00dc86403b0000200741106a41002900d48640370000200741086a41002900cc8640370000200741002900c486403700002007411a413410272202450d022002200636001a200541186a220a4200370300200541106a220b4200370300200541086a22074200370300200542003703002002411e2005100220054190026a41186a200a29030037030020054190026a41106a200b29030037030020054190026a41086a200729030037030020052005290300370390022005410036020820054201370300200529038801210141081026220a450d032005410836020420072007280200220b41086a3602002005200a360200200a200b6a20013700002009200510390240024002400240024002400240024002400240024020054188026a2d000022074101460d0020074102470d012005280204200541086a2802002207470d03200741016a220a2007490d162007410174220b200a200a200b491b220b4100480d162007450d0720052802002007200b1027220a450d080c130b2005280204200541086a2802002207470d01200741016a220a2007490d152007410174220b200a200a200b491b220b4100480d152007450d0420052802002007200b1027220a450d050c100b2005280204200541086a2802002207470d02200741016a220a2007490d142007410174220b200a200a200b491b220b4100480d142007450d0720052802002007200b1027220a450d080c0d0b2005280200210a0c0f0b2005280200210a0c100b2005280200210a0c0b0b200b1026220a0d0b0b200b4101102a000b200b1026220a0d0b0b200b4101102a000b200b1026220a0d050b200b4101102a000b41d4aac10041331021000b411a4101102a000b41344101102a000b41084101102a000b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41003a00000c040b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41013a00000c020b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41023a00000b20054180026a29030021010240024002402005280204220a200541086a28020022076b41084f0d00200741086a220b2007490d03200a4101742207200b200b2007491b22074100480d03200a450d012005280200200a20071027220a450d020c040b2005280200210a0c040b20071026220a0d020b20074101102a000b101e000b200520073602042005200a360200200541086a28020021070b200541086a220b200741086a360200200a20076a20013700002005280204210720054190026a41202005280200220a200b280200100402402007450d00200a10230b200210232009102420054194016a200636020020054191016a20033a000020054188016a41086a41033a0000200541053a00880141a886c500410020054188016a102c2000410036020020002006360204200541b0026a24000bf10401047f230041c0046b22012400200141d0036a41086a22024200370300200142003703d003418388c0004116200141d0036a1000200141d8016a41086a2002290300370300200120012903d0033703d8010240024002400240200141d8016a411041a886c500410041001001417f460d00200142103702ec012001200141d8016a3602e801200141d0036a200141e8016a102f20012802d003410e460d03200141e0026a200141d0036a41f0001094041a200141003a00f40120012802e80120012802ec01200141f4016a4101200141f0016a22022802001001210320022002280200200341016a41014b22036a3602002003450d0220012d00f401220341034f0d0220012802e0022102200141f4016a200141e0026a41047241ec001094041a2002410e460d03200141d0036a200141f4016a41ec001094041a200141d8016a411010030c010b410e21020b200141ec006a200141d0036a41ec001094041a02402002410e470d00200141c0046a2400419988c0000f0b2001200141ec006a41ec00109404220141013a00e002200141d0036a41086a22044200370300200142003703d00341f186c000411f200141d0036a1000200141d8016a41086a2004290300370300200120012903d0033703d801200141d8016a4110200141e0026a41011004200441023a0000200141053a00d0034100210441a886c5004100200141d0036a102c200120023602d003200141d0036a410472200141ec001094041a200141e0026a20004280e20e7c200141d0036a20034280e90f102d024020012802e0024101470d0020012802e40221040b200141c0046a240020040f0b200141e0026a10240b41d4aac10041331021000b965605047f057e0a7f027e047f230041b0086b22022400200241003a00d00620012802002001280204200241d0066a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00d0062203410d4b0d0e024020030e0e00090607030a0c080e050d02040b000b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d6120022d00bc05220341044b0d61024020030e050029252624000b20022001104a2002280200450d6120022802042203417f4c0d622003450d4d200310ac012205450d6c200141086a2204200341002001280200200141046a280200200520032004280200100122012001417f461b2201200120034b1b220120042802006a36020020012003470d4e0c760b2000410e360200200241b0086a24000f0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d2020022d00bc05220341044b0d20024020030e05001f1d1e1c000b200241b0036a2001104c20022903b003a7450d20200241c0036a290300210620022903b8032107200241d0066a200110c20220022d00d00622034102460d20200241ec066a2902002108200241e4066a290200210920022f00d106210120022d00d306210420022902d406210a2002200241dc066a2902003703e8052002200a3703e005200220093703f00520012004411074722101410121040c1f0b41002103200241003a00bc052001280200200141046a280200200241bc056a4101200410012104200141086a220b200b280200200441016a41014b22046a220b3602002004450d5120022d00bc050d51200241e8066a220c4200370300200241e0066a4200370300200241d0066a41086a220d4200370300200242003703d006200141086a220341002001280200200141046a220e280200200241d0066a4120200b100122042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d50200241e0056a41086a200d290300370300200220022903d0063703e005200c290300210620022903e0062107200220022f00e1053b01bc0520022d00e005210420022800e305210b20022800e705211020022800eb05211120022d00ef052105200220022f01bc053b01f804200c4200370300200d4200370300200242003703e006200242003703d006200341002001280200200e280200200241d0066a4120200f1001220c200c417f461b220c4120200c4120491b20032802006a360200200c411f4d0d50200241e0056a41086a200241d0066a41086a290300370300200220022903d0063703e005200241e8066a2903002108200241e0066a2903002109200220022f00e10522033b01bc05200241eb056a280000210c200241ef056a2d0000210d20022d00e005210e20022800e305210f20022800e7052112200220033b019805200220033b01de05200220022f01f8043b01b00420024180016a2001104a200228028001450d502002280284012213417f4c0d5f2013450d4e201310ac012203450d6b200141086a2214201341002001280200200141046a280200200320132014280200100122012001417f461b2201200120134b1b220120142802006a36020020012013470d4f0c710b200241c0076a200110c00220022d00c0072101200241d0066a200241c0076a41017241e7001094041a20014107470d0b2000410e360200200241b0086a24000f0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6e20022d00d006450d0c0c6e0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22012001280200200341016a41014b6a3602002000410e360200200241b0086a24000f0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d0f20022d00bc0522034101460d0d20030d0f200241c0076a200110c20220022d00c00722034102460d0f20022d00c307211020022f00c1072111200241cc076a2902002106200241dc076a2902002107200241d8076a2802002104200241d4076a280200210b20022902c4072108200241386a2001104c2002280238450d0f20112010411074722101200241386a41106a2903002109410121102002290340210a0c0e0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d3320022d00bc05220341094b0d33024020030e0a00272425222a2b262d23000b200241d0066a200110a60220022802d0062203450d3320022902d406210620024188026a2001104a2006a72104200228028802450d32200228028c022110200141046a2802002111200141086a220b2802002105200241003602d006200b410020012802002011200241d0066a41042005100122012001417f461b2201410420014104491b200b2802006a360200200141034d0d3220064220882106200441087621012003410876210c20022802d006210d4101210e0c270b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6920022d00d006450d090c690b200241003a00bc054104210b2001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a22103602002003450d5220022d00bc05220d410c4b0d520240200d0e0d00383a51343c3d3b3e363f3335000b200241d0066a200110c20220022d00d00622044102460d5220022d00d306211020022f00d106210c200241dc066a2902002106200241ec066a2902002107200241e8066a2802002111200241e4066a280200210320022902d406210820024188016a2001104c200229038801a7450d5220024188016a41106a290300210a2002290390012109200241003a00bc052001280200200141046a280200200241bc056a4101200141086a22012802001001210b20012001280200200b41016a41014b220b6a360200200b450d5220022d00bc05220541034f0d52200c201041107472210c4101210b0c500b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d0d20022d00d00622034101460d0c20030d0d200241c0076a2001102f20022802c0072103200241d0066a200241c0076a41047241ec001094041a2003410e460d0d200241e0056a200241d0066a41ec001094041a41f00010262201450d5d20012003360200200141046a200241e0056a41ec001094041a20024198056a41186a200241bc056a41186a29020037030020024198056a41106a200241bc056a41106a29020037030020024198056a41086a200241bc056a41086a290200370300200220022902bc053703980520014108762104410121030c1c0b200241d0066a20011049200220022f01d2063b01e0052002200241f2066a2f01003b01bc0520022d00d00622014111470d042000410e360200200241b0086a24000f0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6420022d00d006450d060c640b200241003a00bc05410421032001280200200141046a280200200241bc056a4101200410012104200141086a220b200b280200200441016a41014b22046a220b3602002004450d0d20022d00bc0522044102460d0c20044101460d0b20040d0d200241c0076a2001102f4104210320022802c0072101200241d0066a200241c0076a41047241ec001094041a2001410e460d0d200241e0056a200241d0066a41ec001094041a41f00010262204450d5c20042001360200200441046a200241e0056a41ec001094041a200220022f0198053b01de05200220022f01bc053b01ae04410121030c0e0b2000410e360200200241b0086a24000f0b200241e0056a200241d0066a41e7001094041a200041086a20013a00002000410c360200200041096a200241e0056a41e7001094041a200241b0086a24000f0b200241d0066a41196a2900002106200241d0066a41116a2900002107200241d0066a41216a2d00002103200241d0066a41106a2d00002104200241d0066a410c6a280200210b200241d0066a41086a280200211020022802d406211120022d00d1062105200220022f01e0053b01b004200220022f01bc053b019805200241f4066a280200210c200041216a2006370000200041196a2007370000200020053a0009200041086a20013a000020004106360200200020033a0029200041186a20043a0000200041146a200b360200200041106a20103602002000410c6a20113602002000412c6a200c360200200020022f01b0043b000a200020022f0198053b012a200041306a20022903c007370300200041386a200241c0076a41086a290300370300200041c0006a200241c0076a41106a290300370300200041c8006a200241c0076a41186a290300370300200041d0006a200241e0076a290300370300200041d8006a200241e8076a290300370300200041e0006a200241c0076a41306a290300370300200041e8006a200241c0076a41386a290300370300200241b0086a24000f0b20024198036a2001104b200229039803a7450d6120022903a003210620004109360200200041086a2006370300200041106a200241c0076a41e0001094041a200241b0086a24000f0b200241286a2001104b2002290328a7450d5f2002290330210620004101360200200041086a2006370300200041106a200241c0076a41e0001094041a200241b0086a24000f0b200241a8036a2001104a20022802a803450d5d20022802ac032203417f4c0d4e2003450d24200310ac012204450d55200141086a220b200341002001280200200141046a28020020042003200b280200100122012001417f461b2201200120034b1b2201200b2802006a36020020012003470d250c5c0b200241c0076a200110c20220022d00c00722034102460d0120022d00c307211020022f00c1072111200241cc076a2902002106200241dc076a2902002107200241d8076a2802002104200241d4076a280200210b20022902c4072108200241e8006a2001104c2002290368a7450d01200241e8006a41106a29030021092002290370210a200241d0006a2001104c2002290350a7450d0120112010411074722101200241e0006a290300211520022903582116410221100b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2015370200200041c0006a2016370200200041386a2009370200200041306a200a370200200041186a2006370000200041106a2008370000200041286a2007370000200041246a2004360000200041206a200b3600002000410c6a20033a0000200041086a2010360200200041d0006a20022903d006370300200041d8006a200241d0066a41086a290300370300200041e0006a200241d0066a41106a290300370300200041e8006a200241d0066a41186a290300370300200241b0086a24000f0b2000410e360200200241b0086a24000f0b200241c0076a200110c202200241d0066a41086a220b200241cc076a290200370300200241d0066a41106a2210200241d4076a290200370300200241d0066a41186a2211200241dc076a290200370300200220022902c4073703d0064102210320022d00c00722014102470d0e0b2000410e360200200241b0086a24000f0b20024188036a2001104a200228028803450d01200228028c032104200241c0076a2001102f4104210320022802c0072101200241d0066a200241c0076a41047241ec001094041a2001410e460d01200241e0056a200241d0066a41ec001094041a41f0001026220b450d51200b2001360200200b41046a200241e0056a41ec001094041a200220022f0198053b01de05200220022f01ce053b01ae04410221030c020b200241e8066a22114200370300200241e0066a4200370300200241d0066a41086a4200370300200242003703d00641042103200141086a221041002001280200200141046a280200200241d0066a4120200b100122042004417f461b2204412020044120491b20102802006a3602002004411f4d0d00200220022f00d1063b01bc052011290300210720022903e006210620022d00d006210520022800d306210420022800d706210b20022800db06211020022d00df062111200220022f01bc053b01980520024190036a2001104a200228029003450d00200228029403210c200241003a00c007410421032001280200200141046a280200200241c0076a4101200141086a22012802001001210d20012001280200200d41016a41014b220d6a360200200d450d0020022d00c0072101200220022f01980522033b01f804200220033b01de05410321030c010b0b200220022f01de053b01e005200220022f01ae043b01bc05024020034104470d002000410e360200200241b0086a24000f0b200220022f01e0053b01ac04200220022f01bc053b01aa042000411d6a2007370000200041156a2006370000200020053a0005200020033a000420004108360200200020013a0025200041146a20113a0000200041106a20103602002000410c6a200b360200200041086a2004360200200041286a200c360200200020022f01ac043b0006200020022f01aa043b01262000412c6a200241b0046a41c4001094041a200241b0086a24000f0b200241a0046a2001104a20022802a004450d0420022802a4042203410876210141052104420021080c030b20024190046a2001104a200228029004450d032002280294042103200241f8036a2001104c20022903f803a7450d0320024188046a29030021062002290380042107200241e8036a2001104b20022903e803a7450d0320022903f0032108200241e0036a2001104a20022802e003450d0320022802e4032101200241f0056a2006370300200220073703e805200220013602e00520034108762101410321040c020b20024198046a2001104a200228029804450d02200228029c042203410876210141042104420021080c010b200241c8036a2001104c20022903c803a7450d01200241d8036a2903002106200220022903d0033703e005200220063703e805410221040b200241d0066a41106a200241e0056a41106a2903002209370300200241d0066a41086a200241e0056a41086a290300220a370300200241b0046a41086a220b200a370300200241b0046a41106a22102009370300200220022903e00522093703b004200220093703d006200041386a2006370200200041306a20073702002000410c6a2001410874200341ff017172360200200041086a20043602002000410b360200200041286a2008370200200041106a20022903b004370200200041186a200b290300370200200041206a2010290300370200200041c0006a20022903c007370300200041c8006a200241c0076a41086a290300370300200041d0006a200241c0076a41106a290300370300200041d8006a200241c0076a41186a290300370300200041e0006a200241c0076a41206a290300370300200041e8006a200241c0076a41286a290300370300200241b0086a24000f0b200241d0066a41106a200241e0056a41106a290300370300200241d0066a41086a200241e0056a41086a290300370300200220022903e0053703d0062000410e360200200241b0086a24000f0b200241d0066a200110a80220022802d0062205450d3d20022902d4062106410521010c530b200241086a2001104a2002280208450d3c200228020c2203417f4c0d3d2003450d26200310ac012205450d48200141086a2204200341002001280200200141046a280200200520032004280200100122012001417f461b2201200120034b1b220120042802006a36020020012003470d270c4a0b200241206a2001104a2002280220450d3b20022802242214ad42187e2206422088a70d3c2006a72203417f4c0d3c2003450d292003102622050d2a20034104102a000b20022f00c10720022d00c30741107472210420024198056a41186a201129030037030020024198056a41106a201029030037030020024198056a41086a200b290300370300200220022903d006370398050b200241f8046a41186a220b20024198056a41186a290300370300200241f8046a41106a221020024198056a41106a290300370300200241f8046a41086a221120024198056a41086a29030037030020022002290398053703f804200041086a2004410874200141ff017172360200200020033602042000410d3602002000410c6a20022903f804370200200041146a20112903003702002000411c6a2010290300370200200041246a200b2903003702002000412c6a200241b0046a41c4001094041a200241b0086a24000f0b200242003703d006200141086a220341002001280200200141046a280200200241d0066a41082004100122012001417f461b2201410820014108491b20032802006a360200200141074d0d3820022903d0062106410221010c4e0b200241b8026a2001104a20022802b802450d1120022802bc022203410876210c4105210e0c090b200241f8026a2001104b20022903f802a7450d10200229038003220742208821062007a722044108762101410a210e0c0a0b200241a8026a2001104a20022802a802450d0f20022802ac022103200241d0066a200110c20220022d00d00622044102460d0f20022d00d306211020022f00d1062111200241dc066a2902002109200241ec066a2902002107200241e8066a280200210c200241e4066a280200210b20022902d4062106200241a0026a2001104a20022802a002450d0f20022802a402210520024198026a2001104a200228029802450d0f20112010411074722101200228029c02210d2002200c3602e0052003410876210c2006422088a72110200220073702e4052007422088a7210f2009422088a7211120022903e0052107200dad21082009a7210d420021094103210e0c0b0b200241b0026a2001104a20022802b002450d0e20022802b4022203410876210c4104210e0c060b200241d0066a200110c20220022d00d00622034102460d0d20022902d406220742208821064108210e2007a72204410876210120022f00d10620022d00d30641107472210c200241dc066a2902002208422088a7210d200241e4066a2802002111200241e8066a280200210b200241ec066a29020021072008a721100c020b200241d0066a200110a60220022802d0062203450d0c20022902d406210620024190026a2001104a2006a72104200228029002450d0b2002280294022110200141046a2802002111200141086a220b2802002105200241003602d006200b410020012802002011200241d0066a41042005100122012001417f461b2201410420014104491b200b2802006a360200200141034d0d0b20064220882106200441087621012003410876210c20022802d006210d4102210e0b0b0c060b200241d0066a200110c20220022d00d00622034102460d0920022d00d306210420022f00d1062110200241dc066a290200210a200241ec066a2902002107200241e8066a280200210b200241e4066a280200211120022902d4062116200241c8026a2001104c20022903c802a7450d09200241c8026a41106a290300210920022903d0022108200241c0026a2001104a20022802c002450d092010200441107472210c20022802c402210f201642208821062016a722044108762101200a422088a7210d200aa721104106210e0c050b200241e0026a2001104a20022802e002450d0820022802e4022203410876210c4107210e0b42002106410021010c020b200241e8026a2001104b20022903e802a7450d0620022903f002220742208821062007a7220441087621014109210e0b0b0b20004107360200200041c0006a2009370200200041386a2008370200200041346a2005360200200041306a200f360200200041286a2007370200200041246a200b360200200041206a20113602002000411c6a200d360200200041186a2010360200200041086a200e360200200041c8006a20022903c0073703002000410c6a200c410874200341ff017172360200200041d0006a200241c0076a41086a290300370300200041d8006a200241c0076a41106a290300370300200041e0006a200241c0076a41186a290300370300200041e8006a200241c0076a41206a290300370300200041106a20064220862001ad42ffffff07834208862004ad42ff01838484370200200241b0086a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d370b2003450d37200410230c370b2004450d00200310230b2000410e360200200241b0086a24000f0b20024180026a2001104a200228028002450d1f2002280284022104200220022f0198053b01b0042004410876210c410c210b0c030b200241e8016a2001104a20022802e801450d1e20022802ec012103200241d0016a2001104c20022903d001a7450d1e200241e0016a290300210620022903d8012108200220022f01d0063b01b0044105210b4100210c0c040b200241d0066a2001102820022802d0062204450d1d20022902d4062108200220022f0198053b01b0042004410876210c410d210b0c180b200241f8016a2001104a20022802f801450d1c20022802fc012104200220022f01d0063b01b0042004410876210c410a210b0b420021060c090b200241a0016a2001104c20022903a001a7450d1a200241b0016a290300210620022903a8012108200220022f01d0063b01b00420022802e005210320022802e405211120022903e80521074102210b4100210c0b0c160b200241b8016a2001104c20022903b801a7450d18200241c8016a290300210620022903c0012108200220022f01e0053b01b004200241e8066a290300210a20022903e006210920022802d006210320022802d406211120022903d80621074103210b4100210c0c150b200241003a00bc052001280200200141046a280200200241bc056a4101201010012103200141086a22012001280200200341016a41014b22016a3602002001450d1720022d00bc05220541034f0d17200220022f01d0063b01b0044108210b420021064100210c0c150b200241f0016a2001104a20022802f001450d1620022802f4012213ad42247e2206422088a70d1c2006a72203417f4c0d1c2003450d0f2003102622040d1020034104102a000b4107210b0c020b200241d0066a200110c20220022d00d00622044102460d14200241dc066a290200210620022902d4062108200241e4066a2802002103200241e8066a2802002111200241ec066a290200210720022f00d106210120022d00d306210b200220022f01e0053b01b0042001200b41107472210c4109210b0c110b410b210b0b0b0c0d0b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d230b20030d130c140b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d280b20030d110c120b410421050b024002402014450d0042002106200141086a2111200141046a21124100210d4100210341002110201421130340200241186a2001104a2002280218450d11200228021c220b417f4c0d1402400240200b450d00200b10ac01220e450d1b2011200b410020012802002012280200200e200b2011280200100122042004417f461b22042004200b4b1b220420112802006a3602002004200b460d010c120b4101210e2001280200201228020041014100201128020010011a4100200b470d110b200241106a2001104a2002280210450d1020022802142204417f4c0d14024002402004450d00200410ac01220f450d1a20112004410020012802002012280200200f200420112802001001220c200c417f461b220c200c20044b1b220c20112802006a360200200c2004460d010c110b4101210f2001280200201228020041014100201128020010011a41002004470d100b201041016a210c024020102013470d00200d200c200c200d491b2213ad42187e2207422088a70d162007a722174100480d1602402010450d00200520032017102722050d010c180b201710262205450d170b200520036a2210200e360200201041146a2004360200201041106a20043602002010410c6a200f360200201041046a200bad220742208620078437020020064280808080107c2106200d41026a210d200341186a2103200c2110200c2014490d000c020b0b41002113420021060b2005450d1020062013ad842106410421010c260b410121032001280200200141046a28020041014100200141086a28020010011a41002013460d220b2013450d00200310230b410021030b0c200b410421040b024002402013450d0042002106200241d0066a410c6a2114200241d0066a411c6a2117200241d0066a41186a2118200241d0066a41146a2119410021114100211041002103201321120340200241d0066a200110c20220022d00d00622054102460d07200341016a210b20022d00d306210c20022f00d106210d20142902002107201729020021082018280200210e2019280200210f20022902d4062109024020032012470d002011200b200b2011491b2212ad42247e220a422088a70d10200aa7221a4100480d1002402003450d0020042010201a102722040d010c130b201a10262204450d120b200420106a220320053a0000200341036a200d200c4110747222054110763a0000200341016a20053b00002003410c6a2007370000200341046a20093700002003411c6a2008370000200341186a200e360000200341146a200f36000020064280808080107c2106201141026a2111201041246a2110200b2103200b2013490d000c020b0b41002112420021060b2004450d0520062012ad842108200220022f01e0053b01b0042004410876210c4106210b0b0b0b0b200220022f01b00422013b01d006200220013b01f804200041386a200a370000200041306a2009370000200041186a2006370000200041106a2008370000200020053a0009200041086a200b3a000020004105360200200041286a2007370000200041246a2011360000200041206a20033600002000410c6a200c410874200441ff017172360000200020022f01f8043b000a200041c0006a20022903c007370300200041c8006a200241c0076a41086a290300370300200041d0006a200241c0076a41106a290300370300200041d8006a200241c0076a41186a290300370300200041e0006a200241c0076a41206a290300370300200041e8006a200241c0076a41286a290300370300200241b0086a24000f0b2012450d00200410230b200220022f01b0043b01d0062000410e360200200241b0086a24000f0b2004450d00200f10230b200b450d00200e10230b02402010450d002005210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200341686a22030d000b0b2013450d010b200510230b2000410e360200200241b0086a24000f0b101d000b101e000b20174104102a000b201a4104102a000b20044101102a000b200b4101102a000b41f0004108102a000b20034101102a000b41f0004108102a000b41f0004108102a000b20034101102a000b20034101102a000b20134101102a000b2003ad22064220862006842106410321010c070b200020043602042000410a360200200041086a2003ad2206422086200684370200200041106a200241c0076a41e0001094041a200241b0086a24000f0b2000410e360200200241b0086a24000f0b2000410e360200200241b0086a24000f0b2000410e360200200241b0086a24000f0b200220022f01b0043b01ae04200220022f01de053b01ac042013ad220a422086200a84210a0b200220022f01ae043b01d006200220022f01ac043b01e00502402003450d00200220022f01d0063b01aa04200220022f01e0053b01a804200041286a2006370000200041206a2007370000200041c8006a2008370000200041c0006a2009370000200041106a20043a0000200041086a200a3702002000200336020420004104360200200041306a200e3a0000200020053a001f2000201136001b200041176a2010360000200041136a200b3600002000200d3a003f2000200c36003b200041376a2012360000200041336a200f360000200020022f01aa043b0011200020022f01a8043b0031200041e8006a200241d8076a290300370300200041e0006a200241c0076a41106a290300370300200041d8006a200241c0076a41086a290300370300200041d0006a20022903c007370300200241b0086a24000f0b2000410e360200200241b0086a24000f0b2003ad22064220862006842106410121010b20004100360200200041106a20063702002000410c6a2005360200200041086a2001360200200041186a200241c0076a41d8001094041a200241b0086a24000bd20201047f230041d0006b22022400024002400240411310262203450d002003410f6a41002800e28740360000200341086a41002900db8740370000200341002900d3874037000020034113412610272203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a102820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031023200241d0006a24000f0b41134101102a000b41264101102a000b41d4aac10041331021000ba70301047f230041c0006b22022400024002400240411010262203450d00200341086a410029009886403700002003410029009086403700002001280200210420034110412010272203450d01200320043600102003412041c00010272203450d02200320012900043700142003412c6a2001411c6a290000370000200341246a200141146a2900003700002003411c6a2001410c6a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034134200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290320370300410021010240024002402002412041a886c500410041001001417f460d00200241003a002020024120200241206a41014100100141016a41014d0d0220022d0020220441ff0071220141064f0d02200441077621040c010b410021040b20031023200020013a0001200020043a0000200241c0006a24000f0b41d4aac10041331021000b41104101102a000b41204101102a000b41c0004101102a000bb81604047f047e107f087e230041b0046b22052400024002400240024002400240024002400240024002402004450d0020054190046a41186a2206420037030020054190046a41106a2207420037030020054190046a41086a22084200370300200542003703900441e687c000411d20054190046a1002200541e8026a41186a2006290300370300200541e8026a41106a2007290300370300200541e8026a41086a200829030037030020052005290390043703e802410021070240200541e8026a412041a886c500410041001001417f460d00200541d0036a41186a4200370300200541d0036a41106a4200370300200541d0036a41086a4200370300200542003703d003200541e8026a4120200541d0036a4120410010012206417f460d0a2006411f4d0d0a200541a0026a41186a200541d0036a41186a290300370300200541a0026a41106a200541d0036a41106a290300370300200541a0026a41086a200541d0036a41086a290300370300200520052903d0033703a002410121070b412810262206450d0a200620073a0004200641a886c500360200200620052903a002370005200620052f00e8023b00252006410d6a200541a8026a290300370000200641156a200541b0026a2903003700002006411d6a200541b8026a290300370000200641276a200541ea026a2d00003a0000200541a0026a20061033420021094200210a4200210b4200210c20052d00e0024106460d022004417f6a210d200541e8026a41206a2108200541e8026a41c0006a220e2002460d01200541e8026a41186a210f200541e8026a41106a2110200541c8036a2111200341ff017121124200210b4200210c420021094200210a0340200f200c3703002010200b370300200520093703e8022005200a3703f0022008200541a0026a41c10010940421040240200e200241201096040d00200541f0036a41186a2213200441186a2214290200370300200541f0036a41106a2215200441106a2216290200370300200541f0036a41086a2217200441086a2218290200370300200520042902003703f003411010262207450d06200741086a4100290098864037000020074100290090864037000020074110412010272207450d09200720013600102007412041c00010272207450d0a200720052903f0033700142007412c6a2013290300370000200741246a20152903003700002007411c6a201729030037000020054190046a41186a2219420037030020054190046a41106a221a420037030020054190046a41086a221b420037030020054200370390042007413420054190046a1002200541d0036a41186a2019290300370300200541d0036a41106a201a290300370300200541d0036a41086a201b29030037030020052005290390043703d003200541d0036a412041a886c500410041001001211c20071023201c417f470d0020112d00002107201320142900003703002015201629000037030020172018290000370300200520042900003703f00302404100417f4101200720124b1b20072012461b41016a41014b0d00200321070b20054190026a200541f0036a103420054190026a41086a290300211d200529039002211e02400240200741ff0171450d00200541d0016a201d42002007ad42ff0183221f4200109804200541e0016a201e4200201f420010980420192013290300370300201a2015290300370300201b2017290300370300200520052903f00337039004200541f0016a200120054190046a2007200d1032200541c0016a42004200201e4200109804427f200541e0016a41086a290300221f20052903d00120052903c0017c7c222020052903d80120052903c801844200522020201f547222041b2120427f20052903e00120041b211f200541f0016a41186a2903002121200541f0016a41086a2903002122200529038002212320052903f00121240c010b20054190016a201e201d420a420010970420192013290300370300201a2015290300370300201b2017290300370300200520052903f00337039004200541a0016a200120054190046a4100200d1032200541a0016a41186a2903002121200541a0016a41086a290300212220052903b001212320052903a0012124200529039001221f211e20054190016a41086a2903002220211d0b201d200c7c201e200b7c220c201e54ad7c20217c200c20237c220b200c54ad7c210c2020200a7c201f20097c220a201f54ad7c20227c200a20247c2209200a54ad7c210a0b200541a0026a20061033200541a0026a41c0006a2d00004106470d000c030b0b4200210b4200210c420021094200210a0c020b200541c8036a211a200341ff017121194200210b4200210c420021094200210a0340200541e8026a41186a200c370300200541e8026a41106a200b370300200520093703e8022005200a3703f0022008200541a0026a41c100109404210f200541f0036a41186a2207200541a0026a41186a290300370300200541f0036a41106a2202200541a0026a41106a290300370300200541f0036a41086a220e200541a0026a41086a290300370300200520052903a0023703f003411010262204450d03200441086a4100290098864037000020044100290090864037000020044110412010272204450d04200420013600102004412041c00010272204450d05200420052903f0033700142004412c6a2007290300370000200441246a20022903003700002004411c6a200e29030037000020054190046a41186a2210420037030020054190046a41106a2213420037030020054190046a41086a2215420037030020054200370390042004413420054190046a1002200541d0036a41186a2010290300370300200541d0036a41106a2013290300370300200541d0036a41086a201529030037030020052005290390043703d003200541d0036a412041a886c50041004100100121172004102302402017417f470d00201a2d000021042007200f41186a2900003703002002200f41106a290000370300200e200f41086a2900003703002005200f2900003703f00302404100417f4101200420194b1b20042019461b41016a41014b0d00200321040b20054180016a200541f0036a103420054180016a41086a290300211d200529038001211e02400240200441ff0171450d00200541c0006a201d42002004ad42ff0183221f4200109804200541d0006a201e4200201f420010980420102007290300370300201320022903003703002015200e290300370300200520052903f00337039004200541e0006a200120054190046a2004200d1032200541306a42004200201e4200109804427f200541d0006a41086a290300221f200529034020052903307c7c222020052903482005290338844200522020201f547222041b2120427f200529035020041b211f200541e0006a41186a2903002121200541e0006a41086a290300212220052903702123200529036021240c010b2005201e201d420a420010970420102007290300370300201320022903003703002015200e290300370300200520052903f00337039004200541106a200120054190046a4100200d1032200541106a41186a2903002121200541106a41086a290300212220052903202123200529031021242005290300221f211e200541086a2903002220211d0b201d200c7c201e200b7c220c201e54ad7c20217c200c20237c220b200c54ad7c210c2020200a7c201f20097c220a201f54ad7c20227c200a20247c2209200a54ad7c210a0b200541a0026a20061033200541a0026a41c0006a2d00004106470d000b0b200610230b2000200b37031020002009370300200041186a200c3703002000200a370308200541b0046a24000f0b41104101102a000b41204101102a000b41c0004101102a000b41204101102a000b41c0004101102a000b41d4aac10041331021000b41284104102a000b8d0903037f047e067f230022022103200241e0026b416071220224002001411c6a22042902002105200420022903f801370200200141146a22042902002106200420022903f0013702002001410c6a22042902002107200420022903e801370200200241003a00e00120012902042108200120022903e00137020420022005370378200220063703702002200737036820022008370360200141246a2d00002109200241e0016a41176a22042002290078370000200241e0016a41106a220a2002290071370300200241e0016a41086a220b2002290069370300200220022900613703e001024002400240024002402008a741ff01714101470d00200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b290300370300200220022903e001370318411510262204450d012004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272204450d0220042002290318370015200420093a00342004412c6a2002412f6a290000370000200441256a200241186a41106a2903003700002004411d6a200241186a41086a290300370000200241e0016a41186a220a4200370300200241e0016a41106a220b4200370300200241e0016a41086a220c4200370300200242003703e00120044135200241e0016a1002200241386a41186a200a290300370300200241386a41106a200b290300370300200241386a41086a200c290300370300200220022903e001370338200241386a412041a886c500410041001001417f460d03200242203702d4012002200241386a3602d001200241e0016a200241d0016a105920022d0081024102460d04200241a8016a41206a220a200241e0016a41206a2d00003a0000200241a8016a41186a220b200241e0016a41186a290300370300200241a8016a41106a220c200241e0016a41106a290300370300200241a8016a41086a220d200241e0016a41086a290300370300200220022903e0013703a801200241e0006a20024182026a41c1001094041a200241386a41206a220e200a2d00003a0000200241386a41186a220a200b290300370300200241386a41106a220b200c290300370300200241386a41086a220c200d290300370300200220022903a801370338200241e0016a200241e0006a41c1001094041a200141246a200241e0016a41c0006a2d00003a00002001411c6a200241e0016a41386a290000370000200141146a200241e0016a41306a2900003700002001410c6a200241e0016a41286a290000370000200120022900800237000420002002290318370000200041086a200241186a41086a290300370000200041106a200241186a41106a290300370000200041176a200241186a41176a290000370000200020093a001f200041c0006a200e2d00003a0000200041386a200a290300370000200041306a200b290300370000200041286a200c2903003700002000200229033837002020041023200324000f0b200041063a0040200324000f0b41154101102a000b41354101102a000b41faccc40041d7001021000b41d4aac10041331021000ba40604027f017e037f037e230041c0006b22022400024002400240411410262203450d00200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22054200370300200241206a41106a22064200370300200241206a41086a220742003703002002420037032020034134200241206a1002200241186a2005290300370300200241106a2006290300370300200241086a2007290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012205417f460d022005410f4d0d02200241286a29030021082002290320210420031023411810262203450d010c050b42002108200310234118102622030d040b41184101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b200341106a410029008db741370000200341086a4100290085b741370000200341002900fdb641370000024020034118413810272203450d0020032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a29000037000042002109200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034138200241206a1002200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a290300210a200229032021090c010b4200210a0b200310232000200920047c22043703002000200a20087c2004200954ad7c370308200241c0006a24000f0b41d4aac10041331021000b41384101102a000b8507010d7f230041e0006b220124000240024002400240411a10262202450d00200241186a41002f00dc86403b0000200241106a41002900d48640370000200241086a41002900cc8640370000200241002900c486403700002002411a413410272202450d012002200036001a200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002411e200141c0006a1002200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100320021023411310262202450d022002410f6a41002800e28740360000200241086a41002900db8740370000200241002900d3874037000020024113412610272202450d0320022000360013200141c0006a41186a22044200370300200141c0006a41106a22054200370300200141c0006a41086a220342003703002001420037034020024117200141c0006a1002200141206a41186a22062004290300370300200141206a41106a22072005290300370300200141206a41086a200329030037030020012001290340370320200141206a4120100320021023200141c0006a200010302001280244210820012802402109024002400240024020012802482202450d002002410574210a200921030340200141186a220b200341186a290000370300200141106a220c200341106a290000370300200141086a220d200341086a29000037030020012003290000370300411010262202450d02200241086a4100290098864037000020024100290090864037000020024110412010272202450d03200220003600102002412041c00010272202450d04200341206a2103200220012903003700142002412c6a200b290300370000200241246a200c2903003700002002411c6a200d2903003700002004420037030020054200370300200141c0006a41086a220b42003703002001420037034020024134200141c0006a10022006200429030037030020072005290300370300200141206a41086a200b29030037030020012001290340370320200141206a4120100320021023200a41606a220a0d000b0b02402008450d00200910230b200141e0006a24000f0b41104101102a000b41204101102a000b41c0004101102a000b411a4101102a000b41344101102a000b41134101102a000b41264101102a000bd20201057f230041d0006b22022400024002400240411710262203450d002003410f6a41002900cb8740370000200341086a41002900c48740370000200341002900bc874037000020034117412e10272203450d0120032001370017200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a22064200370300200242003703302003411f200241306a1002200241186a2004290300370300200241106a2005290300370300200241086a200629030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a103720022802302204450d0420002002290234370204200020043602000c010b20004100360208200042083702000b20031023200241d0006a24000f0b41174101102a000b412e4101102a000b41d4aac10041331021000beb0603027f017e0b7f230041c0046b22022400200241086a2001104a02400240024002400240024002400240024002400240024002402002280208450d00200228020c2203ad42f8007e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241c0046a24000f0b4108210620030d030b4100210d4100210b0c030b101d000b20054108102a000b200241d8026a4104722107200141086a210541002108410021094100210a2003210b0340200241003a00c8032001280200200141046a220c280200200241c8036a410120052802001001210d20052005280200200d41016a41014b220d6a360200200d450d040240024020022d00c803220d4101460d00200d0d06200241c8036a20024180016a41ec001094041a410e210c0c010b200241c8036a2001102f20022802c803410e460d04200241d8026a200241c8036a41f0001094041a200c280200210d2005280200210c200241003602bc04200541002001280200200d200241bc046a4104200c1001220d200d417f461b220d4104200d4104491b20052802006a360200200d41034d0d0320022802bc04210e20022802d802210c200241ec016a200741ec001094041a200241c8036a200241ec016a41ec001094041a200c410e460d0520024180016a200241c8036a41ec001094041a200241c8036a20024180016a41ec001094041a200c410f460d060b200a41016a210d200241146a200241c8036a41ec001094041a0240200a200b470d002008200d200d2008491b220bad42f8007e2204422088a70d072004a7220f4100480d070240200a450d0020062009200f102722060d010c090b200f10262206450d080b200620096a220a200c360200200a41046a200241146a41ec001094041a200a41f0006a200e360200200841026a2108200941f8006a2109200d210a200d2003490d000b0b2000200b36020420002006360200200041086a200d360200200241c0046a24000f0b200241d8026a10240b200241c8036a200241ec016a41ec001094041a0b200241c8036a20024180016a41ec001094041a0b200041003602000240200a450d0020062105034002402005280200410e460d00200510240b200541f8006a2105200941887f6a22090d000b0b0240200b450d00200610230b200241c0046a24000f0b101e000b200f4108102a000beb0604047f017e027f017e23004180046b220224000240024002400240411a10262203450d00200341186a41002f00dc86403b0000200341106a41002900d48640370000200341086a41002900cc8640370000200341002900c486403700002003411a413410272203450d012003200136001a200241a0026a41186a22014200370300200241a0026a41106a22044200370300200241a0026a41086a22054200370300200242003703a0022003411e200241a0026a1002200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a2005290300370300200220022903a002370308024002400240200241086a412041a886c500410041001001417f460d002002200241086a3602282002412036022c200242003703a00220024100200241086a4120200241a0026a41084100100122012001417f461b2201410820014108491b360230200141074d0d0620022903a0022106200241a0026a200241286a102f20022802a002210120024194036a200241a0026a41047241ec001094041a2001410e460d06200241b4016a20024194036a41ec001094041a20022001360240200241c0006a410472200241b4016a41ec001094042104200241003a00a0022002280228200228022c200241a0026a4101200241306a22012802001001210520012001280200200541016a41014b22056a22073602002005450d0220022d00a002220541034f0d02200242003703a002200241286a41086a220841002002280228200228022c200241a0026a41082007100122012001417f461b2201410820014108491b20082802006a360200200141074d0d0520022903a002210920022802402101200241a0026a200441ec001094041a20022002413c6a2800003600970320022002280039360294032001410e460d06200241c0006a200241a0026a41ec001094041a20022002280097033600b70120022002280294033602b40120002001360208200020063703002000410c6a200241c0006a41ec001094041a20004180016a20053a0000200041f8006a2009370200200020022802b4013600810120004184016a20022800b7013600000c010b2000410e3602080b2003102320024180046a24000f0b200241c0006a102441d4aac10041331021000b411a4101102a000b41344101102a000b200241c0006a10240b41d4aac10041331021000bc6c00102097f027e230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000280200417f6a2203410c4b0d00024002400240024002400240024002400240024020030e0d0008050602090b070d040c0103000b200141046a280200200141086a2802002203470d14200341016a22042003490d6220034101742205200420042005491b22054100480d622003450d2920012802002003200510272204450d2a0c600b200141046a280200200141086a2802002203470d0c200341016a22042003490d5a20034101742205200420042005491b22054100480d5a2003450d1a20012802002003200510272204450d1b0c4e0b200141046a2206280200200141086a22042802002203470d0c200341016a22052003490d6020034101742207200520052007491b22074100480d602003450d1b20012802002003200710272205450d1c0c4b0b200141046a280200200141086a2802002203470d0c200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d1c20012802002003200510272204450d1d0c480b200141046a280200200141086a2802002203470d0c200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d1d20012802002003200510272204450d1e0c450b200141046a280200200141086a2802002203470d0c200341016a22042003490d5d20034101742205200420042005491b22054100480d5d2003450d1e20012802002003200510272204450d1f0c420b200141046a280200200141086a2802002203470d0c200341016a22042003490d5c20034101742205200420042005491b22054100480d5c2003450d1f20012802002003200510272204450d200c3f0b200141046a280200200141086a2802002203470d0c200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d2020012802002003200510272204450d210c3c0b200141046a280200200141086a2802002200470d0d200041016a22032000490d5a20004101742204200320032004491b22044100480d5a2000450d2320012802002000200410272203450d240c390b200141046a2206280200200141086a22042802002203470d0d200341016a22052003490d5920034101742207200520052007491b22074100480d592003450d2420012802002003200710272205450d250c360b200141046a280200200141086a2802002203470d0d200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d2520012802002003200510272204450d260c330b200141046a280200200141086a2802002203470d0d200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d2620012802002003200510272204450d270c300b200141046a280200200141086a2802002203470d0d200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d2720012802002003200510272204450d280c2d0b200141046a280200200141086a2802002203470d0d200341016a22042003490d4e20034101742205200420042005491b22054100480d4e2003450d2820012802002003200510272204450d290c2a0b200128020021040c420b200128020021050c3f0b200128020021040c3c0b200128020021040c390b200128020021040c360b200128020021040c330b200128020021040c300b200128020021040c4c0b200128020021030c2c0b200128020021050c290b200128020021040c260b200128020021040c230b200128020021040c200b200128020021040c1d0b2005102622040d330b20054101102a000b2007102622050d2f0b20074101102a000b2005102622040d2b0b20054101102a000b2005102622040d270b20054101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d360b20054101102a000b2004102622030d150b20044101102a000b2007102622050d110b20074101102a000b2005102622040d0d0b20054101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a0000200041086a280200417f6a220341044b0d1602400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d3d20034101742205200420042005491b22054100480d3d2003450d0f20012802002003200510272204450d100c1b0b200141046a280200200141086a2802002203470d03200341016a22042003490d3c20034101742205200420042005491b22054100480d3c2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d3b20034101742205200420042005491b22054100480d3b2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d3a20034101742205200420042005491b22054100480d3a2003450d0a20012802002003200510272204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d3920034101742205200420042005491b22054100480d392003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110412002200041186a36020c2002410c6a20011066200041286a2001109802200041106a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a36020c2002410c6a200110662000410c6a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200041086a280200417f6a220341094b0d1402400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b200141046a280200200141086a2802002203470d0e200341016a22042003490d6020034101742205200420042005491b22054100480d602003450d1d20012802002003200510272204450d1e0c390b200141046a280200200141086a2802002203470d08200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d1220012802002003200510272204450d130c360b200141046a280200200141086a2802002203470d08200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d1320012802002003200510272204450d140c330b200141046a280200200141086a2802002203470d08200341016a22042003490d5620034101742205200420042005491b22054100480d562003450d1420012802002003200510272204450d150c300b200141046a280200200141086a2802002203470d08200341016a22042003490d5520034101742205200420042005491b22054100480d552003450d1520012802002003200510272204450d160c2d0b200141046a280200200141086a2802002203470d08200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d1620012802002003200510272204450d170c2a0b200141046a280200200141086a2802002203470d09200341016a22042003490d5320034101742205200420042005491b22054100480d532003450d1920012802002003200510272204450d1a0c270b200141046a280200200141086a2802002203470d09200341016a22042003490d5220034101742205200420042005491b22054100480d522003450d1a20012802002003200510272204450d1b0c240b200141046a280200200141086a2802002203470d09200341016a22042003490d5120034101742205200420042005491b22054100480d512003450d1b20012802002003200510272204450d1c0c210b200141046a280200200141086a2802002203470d09200341016a22042003490d5020034101742205200420042005491b22054100480d502003450d1c20012802002003200510272204450d1d0c1e0b200128020021040c2e0b200128020021040c2b0b200128020021040c280b200128020021040c250b200128020021040c220b200128020021040c2b0b200128020021040c1e0b200128020021040c1b0b200128020021040c180b200128020021040c150b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d170b20054101102a000b2005102622040d130b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d0d0b20054101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a200110ec022002200041386a36020c2002410c6a20011066200041306a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001104102400240024002402007450d00200141046a210903400240024002400240200928020020052802002203470d00200341016a22062003490d332003410174220a20062006200a491b220a4100480d332003450d0120012802002003200a102722060d020c060b200128020021060c020b200a10262206450d040b200120063602002009200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a200110412000411c6a2802002104024002400240200141046a2802002203200528020022006b41044f0d00200041046a22052000490d3020034101742200200520052000491b22004100480d302003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b200a4101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a2004360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011041200041106a200110ec02200041346a20011041200041386a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001104102400240024002402007450d00200141046a210903400240024002400240200928020020052802002203470d00200341016a22062003490d272003410174220a20062006200a491b220a4100480d272003450d0120012802002003200a102722060d020c060b200128020021060c020b200a10262206450d040b200120063602002009200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a200110412000411c6a2802002104024002400240200141046a2802002203200528020022006b41044f0d00200041046a22052000490d2420034101742200200520052000491b22004100480d242003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b200a4101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a2004360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a280200417f6a220341044b0d1202400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d4020034101742205200420042005491b22054100480d402003450d0f20012802002003200510272204450d100c1b0b200141046a280200200141086a2802002203470d03200341016a22042003490d3f20034101742205200420042005491b22054100480d3f2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d3e20034101742205200420042005491b22054100480d3e2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d3d20034101742205200420042005491b22044100480d3d2003450d0a20012802002003200410272205450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d3c20034101742205200420042005491b22054100480d3c2003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021050c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2004102622050d070b20044101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041106a290300210b02400240024002400240200141046a2802002203200528020022006b41084f0d00200041086a22042000490d3020034101742200200420042000491b22004100480d302003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200320006a200b370000200241106a24000f0b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41033a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d182003200041186c6a2108200141046a2106024002400340200328020021092002200341086a280200220036020c2002410c6a20011041024002400240024020062802002207200428020022056b20004f0d00200520006a220a2005490d3020074101742205200a200a2005491b22054100480d302007450d01200128020020072005102722070d020c050b200128020021070c020b200510262207450d030b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200920001094041a2003410c6a28020021092002200341146a280200220036020c2002410c6a20011041024002400240024020062802002207200428020022056b20004f0d00200520006a220a2005490d3020074101742205200a200a2005491b22054100480d302007450d01200128020020072005102722070d020c060b200128020021070c020b200510262207450d040b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200920001094041a200341186a22032008470d000c1b0b0b20054101102a000b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2c20044101742203200520052003491b22034100480d2c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00002000410c6a28020021042002200041146a280200220036020c2002410c6a200110412000450d1420042000410c6c6a2108200141046a210902400340200428020021072002200441086a280200220036020c2002410c6a20011041024002400240024020092802002206200528020022036b20004f0d00200320006a220a2003490d2b20064101742203200a200a2003491b22034100480d2b2006450d01200128020020062003102722060d020c050b200128020021060c020b200310262206450d030b2001200636020020092003360200200528020021030b2005200320006a360200200620036a200720001094041a2004410c6a22042008470d000c160b0b20034101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2820044101742203200520052003491b22034100480d282004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41063a0000200041086a22032d0000417f6a2205410f4b0d1002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e10000a0608030b0d090f050e02040c0107000b200628020020042802002203470d18200341016a22042003490d800120034101742205200420042005491b22054100480d80012003450d3120012802002003200510272204450d320c5d0b200628020020042802002200470d0e200041016a22052000490d7f20004101742207200520052007491b22074100480d7f2000450d1e20012802002000200710272205450d1f0c5a0b200628020020042802002200470d0e200041016a22052000490d7e20004101742207200520052007491b22074100480d7e2000450d1f20012802002000200710272205450d200c570b200628020020042802002203470d0e200341016a22052003490d7d20034101742207200520052007491b22074100480d7d2003450d2020012802002003200710272205450d210c540b200628020020042802002200470d0e200041016a22032000490d7c20004101742205200320032005491b22054100480d7c2000450d2120012802002000200510272203450d220c510b200628020020042802002203470d0e200341016a22042003490d7b20034101742205200420042005491b22054100480d7b2003450d2220012802002003200510272204450d230c4e0b200628020020042802002205470d0e200541016a22062005490d7a20054101742207200620062007491b22074100480d7a2005450d2320012802002005200710272206450d240c4b0b200628020020042802002200470d0e200041016a22032000490d7920004101742205200320032005491b22054100480d792000450d2420012802002000200510272203450d250c480b200628020020042802002205470d0e200541016a22062005490d7820054101742207200620062007491b22074100480d782005450d2520012802002005200710272206450d260c450b200628020020042802002203470d0e200341016a22042003490d7720034101742205200420042005491b22054100480d772003450d2620012802002003200510272204450d270c420b200628020020042802002203470d0f200341016a22042003490d7620034101742205200420042005491b22054100480d762003450d2920012802002003200510272204450d2a0c3f0b200628020020042802002203470d0f200341016a22052003490d7520034101742207200520052007491b22074100480d752003450d2a20012802002003200710272205450d2b0c3c0b200628020020042802002200470d0f200041016a22052000490d7420004101742207200520052007491b22074100480d742000450d2b20012802002000200710272205450d2c0c390b200628020020042802002203470d0f200341016a22042003490d7320034101742205200420042005491b22054100480d732003450d2c20012802002003200510272204450d2d0c360b200628020020042802002203470d0f200341016a22042003490d7220034101742205200420042005491b22054100480d722003450d2d20012802002003200510272204450d2e0c330b200628020020042802002200470d0f200041016a22052000490d7120004101742207200520052007491b22074100480d712000450d2e20012802002000200710272205450d2f0c300b200128020021050c4c0b200128020021050c490b200128020021050c460b200128020021030c430b200128020021040c400b200128020021060c3d0b200128020021030c3a0b200128020021060c370b200128020021040c340b200128020021040c450b200128020021040c300b200128020021050c2d0b200128020021050c2a0b200128020021040c270b200128020021040c240b200128020021050c210b2007102622050d3b0b20074101102a000b2007102622050d370b20074101102a000b2007102622050d330b20074101102a000b2005102622030d2f0b20054101102a000b2005102622040d2b0b20054101102a000b2007102622060d270b20074101102a000b2005102622030d230b20054101102a000b2007102622060d1f0b20074101102a000b2005102622040d1b0b20054101102a000b2005102622040d2b0b20054101102a000b2005102622040d150b20054101102a000b2007102622050d110b20074101102a000b2007102622050d0d0b20074101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2007102622050d010b20074101102a000b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a41083a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d4420054101742200200620062000491b22004100480d442005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041186a20011098022000410c6a20011041200041106a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a28020020011039200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410d3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d3e20054101742200200620062000491b22004100480d3e2005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41053a00002000410c6a28020021050240024002400240024020062802002203200428020022006b41044f0d00200041046a22062000490d3c20034101742200200620062000491b22004100480d3c2003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a2005360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a28020020011039200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41033a00002000410c6a2001104120032d00012105200341026a2d0000210602400240024002400240200141046a28020020072802002200470d00200041016a22032000490d3620004101742207200320032007491b22074100480d362000450d0120012802002000200710272203450d020c030b200128020021030c030b2007102622030d010b20074101102a000b20012003360200200141046a2007360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410f3a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41023a00002000410c6a2001104120032d00012105200341026a2d0000210602400240024002400240200141046a28020020072802002200470d00200041016a22032000490d3220004101742207200320032007491b22074100480d322000450d0120012802002000200710272203450d020c030b200128020021030c030b2007102622030d010b20074101102a000b20012003360200200141046a2007360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a20011041200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410c3a0000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200520036a41043a00002000410c6a28020020011039024002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200628020020042802002203470d03200341016a22052003490d3920034101742207200520052007491b22074100480d392003450d0720012802002003200710272205450d080c0f0b200628020020042802002203470d01200341016a22052003490d3820034101742207200520052007491b22074100480d382003450d0420012802002003200710272205450d050c0c0b200628020020042802002203470d02200341016a22052003490d3720034101742207200520052007491b22074100480d372003450d0720012802002003200710272205450d080c090b200128020021050c0b0b200128020021050c0c0b200128020021050c070b2007102622050d070b20074101102a000b2007102622050d070b20074101102a000b2007102622050d010b20074101102a000b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41003a00000c040b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41013a00000c020b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41023a00000b200041106a290300210b0240024002400240024020062802002205200428020022036b41084f0d00200341086a22072003490d2c20054101742203200720072003491b22034100480d2c2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341086a360200200520036a200b370000200041186a290300210b0240024002400240024020062802002203200428020022006b41084f0d00200041086a22052000490d2c20034101742200200520052000491b22004100480d2c2003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a200b3700000c160b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410b3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d2a20054101742200200620062000491b22004100480d2a2005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410e3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22042000490d2820054101742200200420042000491b22004100480d282005450d0120012802002005200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a29000037000020002003290001370000200341216a2d00002001103f200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a280200200110392002200041106a36020c2002410c6a20011066200241106a24000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a00000240024002400240024002400240024002400240024002400240024002400240200041046a22042d000022034103460d00024020034102460d0020034101470d1d200141046a280200200141086a2802002203470d04200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0920012802002003200510272204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d2620034101742205200420042005491b22054100480d262003450d0420012802002003200510272204450d050c0c0b200141046a28020020052802002203470d01200341016a22052003490d2520034101742206200520052006491b22064100480d252003450d0520012802002003200610272205450d060c090b200128020021040c0b0b200128020021050c080b200128020021040c0b0b2005102622040d070b20054101102a000b2006102622050d030b20064101102a000b2005102622040d050b20054101102a000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41023a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d1f20054101742203200620062003491b22034100480d1f2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a29000037000020032004290001370000200041286a2001104102400240024002400240200141046a28020020062802002200470d00200041016a22032000490d1f20004101742205200320032005491b22054100480d1f2000450d0120012802002000200510272203450d020c030b200128020021030c030b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a200441216a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110412000410c6a28020020011039200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a28020020011039200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041106a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041306a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a280200210620022000410c6a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240024002400240024002400240200041086a28020022034102460d0020034101470d13200141046a280200200141086a2802002203470d01200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0320012802002003200510272204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110ec022002200041306a36020c2002410c6a200110662002200041c0006a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110ec022002200041306a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1520034101742205200420042005491b22054100480d152003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041046a280200210620022000410c6a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a000002400240024002400240024002400240024002400240200028020422034102460d0020034101470d0f200141046a280200200141086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0320012802002003200510272204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d1820034101742205200420042005491b22054100480d182003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a28020020011039200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41053a0000200041086a2d0000417f6a2203410c4b0d0202400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0d0008050602090a070c040b0103000b200628020020042802002203470d13200341016a22052003490d6020034101742207200520052007491b22074100480d602003450d2720012802002003200710272205450d280c4b0b200628020020042802002203470d0b200341016a22042003490d5f20034101742205200420042005491b22054100480d5f2003450d1820012802002003200510272204450d190c480b200628020020042802002203470d0b200341016a22042003490d5e20034101742205200420042005491b22054100480d5e2003450d1920012802002003200510272204450d1a0c450b200628020020042802002203470d0b200341016a22052003490d5d20034101742207200520052007491b22074100480d5d2003450d1a20012802002003200710272205450d1b0c420b200628020020042802002203470d0b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c2003450d1b20012802002003200510272204450d1c0c3f0b200628020020042802002203470d0b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b2003450d1c20012802002003200510272204450d1d0c3c0b200628020020042802002200470d0b200041016a22032000490d5a20004101742205200320032005491b22054100480d5a2000450d1d20012802002000200510272203450d1e0c390b200628020020042802002203470d0b200341016a22052003490d5920034101742207200520052007491b22074100480d592003450d1e20012802002003200710272205450d1f0c360b200628020020042802002203470d0c200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d2120012802002003200510272204450d220c330b200628020020042802002203470d0c200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d2220012802002003200510272204450d230c300b200628020020042802002200470d0c200041016a22032000490d5620004101742205200320032005491b22054100480d562000450d2320012802002000200510272203450d240c2d0b200628020020042802002200470d0c200041016a22032000490d5520004101742205200320032005491b22054100480d552000450d2420012802002000200510272203450d250c2a0b200628020020042802002203470d0c200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d2520012802002003200510272204450d260c270b200128020021040c3d0b200128020021040c3a0b200128020021050c370b200128020021040c340b200128020021040c310b200128020021030c2e0b200128020021050c2b0b200128020021050c380b200128020021040c270b200128020021040c240b200128020021030c210b200128020021030c1e0b200128020021040c1b0b2005102622040d2f0b20054101102a000b2005102622040d2b0b20054101102a000b2007102622050d270b20074101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622030d1b0b20054101102a000b2007102622050d170b20074101102a000b2007102622050d230b20074101102a000b2005102622040d110b20054101102a000b2005102622040d0d0b20054101102a000b2005102622030d090b20054101102a000b2005102622030d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110ec02200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410a3a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41063a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d14200041246c210003402003200110ec02200341246a21032000415c6a22000d000c150b0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41073a000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200628020020042802002200470d03200041016a22032000490d3220004101742205200320032005491b22054100480d322000450d0720012802002000200510272203450d080c0f0b200628020020042802002200470d01200041016a22032000490d3120004101742205200320032005491b22054100480d312000450d0420012802002000200510272203450d050c0c0b200628020020042802002200470d02200041016a22032000490d3020004101742205200320032005491b22054100480d302000450d0720012802002000200510272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102622030d070b20054101102a000b2005102622030d070b20054101102a000b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41033a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a20011041200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a220a200341016a360200200520036a410c3a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d0820004105742107200141046a210802400340024002400240024020062802002205200428020022006b41204f0d00200041206a22092000490d1f20054101742200200920092000491b22004100480d1f2005450d01200128020020052000102722050d020c050b200128020021050c020b200010262205450d030b2001200536020020082000360200200a28020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000c0a0b0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a200110412002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a20011041200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200520036a41003a00002000410c6a200110ec022002200041306a36020c2002410c6a2001106602400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200628020020042802002200470d03200041016a22032000490d2420004101742205200320032005491b22054100480d242000450d0720012802002000200510272203450d080c0f0b200628020020042802002200470d01200041016a22032000490d2320004101742205200320032005491b22054100480d232000450d0420012802002000200510272203450d050c0c0b200628020020042802002200470d02200041016a22032000490d2220004101742205200320032005491b22054100480d222000450d0720012802002000200510272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102622030d070b20054101102a000b2005102622030d070b20054101102a000b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a0000200041086a22032d0000417f6a220441054b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000402030105000b200141046a280200200141086a2802002203470d08200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d1120012802002003200510272204450d120c260b200141046a280200200141086a2802002200470d04200041016a22042000490d2220004101742205200420042005491b22054100480d222000450d0a20012802002000200510272204450d0b0c200b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0b20012802002003200510272204450d0c0c1d0b200141046a280200200141086a2802002204470d04200441016a22052004490d2020044101742206200520052006491b22064100480d202004450d0c20012802002004200610272205450d0d0c1a0b200141046a280200200141086a2802002203470d05200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0f20012802002003200510272204450d100c170b200141046a280200200141086a2802002204470d05200441016a22052004490d1e20044101742206200520052006491b22064100480d1e2004450d1020012802002004200610272205450d110c120b200128020021040c1c0b200128020021040c190b200128020021050c160b200128020021040c1e0b200128020021040c120b200128020021050c0d0b2005102622040d150b20054101102a000b2005102622040d110b20054101102a000b2006102622050d0d0b20064101102a000b2005102622040d140b20054101102a000b2005102622040d070b20054101102a000b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41053a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341216a220341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200041e0006a290300210b200041d8006a290300210c02400240024002400240200141046a2802002204200628020022036b41104f0d00200341106a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b200141086a2204200341106a360200200520036a2203200b3700082003200c370000200041cc006a28020021032002200041d4006a280200220036020c2002410c6a200110412000450d0020004105742106200141046a21070340024002400240024020072802002205200428020022006b41204f0d00200041206a22092000490d0f20054101742200200920092000491b22004100480d0f2005450d01200128020020052000102722050d020c060b200128020021050c020b200010262205450d040b2001200536020020072000360200200428020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000b0b200241106a24000f0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a20011098022000410c6a28020021062002200041146a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022006b20034f0d00200020036a22052000490d0b20044101742200200520052000491b22004100480d0b2004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200620031094041a200241106a24000f0b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41033a00002002200041386a36020c2002410c6a20011066200041c8006a200110980202400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0920054101742204200620062004491b22044100480d092005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a290000370000200420032900013700002000412c6a28020021052002200041346a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200628020022006b20034f0d00200020036a22062000490d0920044101742200200620062000491b22004100480d092004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200520031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a200110ec022002200041c0006a36020c2002410c6a20011066200041d0006a2001109802200041306a28020021062002200041386a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022006b20034f0d00200020036a22052000490d0720044101742200200520052000491b22004100480d072004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200620031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41043a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0520044101742200200520052000491b22004100480d052004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a2205200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000002400240024002400240024002400240024002400240200341216a2d00004101470d00200141046a28020020052802002200470d01200041016a22042000490d0b20004101742205200420042005491b22054100480d0b2000450d0320012802002000200510272204450d040c090b200141046a28020020052802002200470d01200041016a22032000490d0a20004101742204200320032004491b22044100480d0a2000450d0420012802002000200410272203450d050c060b200128020021040c080b200128020021030c050b2005102622040d050b20054101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41013a0000024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0320044101742200200520052000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220141186a200341226a220041186a290000370000200141106a200041106a290000370000200141086a200041086a29000037000020012000290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041106a200110b202200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000024002400240200141046a28020020052802002203470d00200341016a22042003490d0320034101742205200420042005491b22054100480d032003450d0120012802002003200510272204450d020c040b200128020021040c040b2005102622040d020b20054101102a000b101e000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109802200241106a24000b130020004110360204200041888ac0003602000b130020004109360204200041e2a2c0003602000b13002000410f360204200041eca2c0003602000b9e0101047f23004190016b220224002002410e360208200241003602880120024201370380010240410110262203450d002002200336028001200320024180016a41086a220428020022056a41003a0000200241013602840120002002290380013702002004200541016a2203360200200041086a200336020002402002280208410e460d00200241086a10240b20024190016a24000f0b41014101102a000bcb0101057f230041306b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030020024100360228200242013703200240412010262206450d0020062002290300370000200641086a2005290300370000200641106a2004290300370000200641186a2003290300370000200242a08080808004370224200220063602204100200241206a103f200041086a200241206a41086a28020036020020002002290320370200200241306a24000f0b41204101102a000ba50801027f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041ff0171417f6a220041044b0d000240024002400240024020000e050004020301000b200141046a280200200141086a2802002200470d08200041016a22022000490d1720004101742203200220022003491b22034100480d172000450d1120012802002000200310272202450d120c220b200141046a280200200141086a2802002200470d04200041016a22022000490d1620004101742203200220022003491b22034100480d162000450d0a20012802002000200310272202450d0b0c1f0b200141046a280200200141086a2802002200470d04200041016a22022000490d1520004101742203200220022003491b22034100480d152000450d0b20012802002000200310272202450d0c0c1c0b200141046a280200200141086a2802002200470d04200041016a22022000490d1420004101742203200220022003491b22034100480d142000450d0c20012802002000200310272202450d0d0c190b200141046a280200200141086a2802002200470d05200041016a22022000490d1320004101742203200220022003491b22034100480d132000450d0f20012802002000200310272202450d100c160b200141046a280200200141086a2802002200470d05200041016a22022000490d1220004101742203200220022003491b22034100480d122000450d1020012802002000200310272202450d110c130b200128020021020c1b0b200128020021020c180b200128020021020c150b200128020021020c1a0b200128020021020c110b200128020021020c0e0b2003102622020d140b20034101102a000b2003102622020d100b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d100b20034101102a000b2003102622020d060b20034101102a000b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41023a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41043a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41033a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41053a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41013a00000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a20021041200041086a200228020836020020002002290300370200200241106a24000b9d0701037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002202413f4b0d00200141046a280200200141086a2802002200470d01200041016a22032000490d1120004101742204200320032004491b22044100480d112000450d0520012802002000200410272203450d060c170b2002418080014f0d01200141046a2802002203200141086a28020022006b41024f0d02200041026a22042000490d1020034101742200200420042000491b22004100480d102003450d0820012802002003200010272203450d090c140b200128020021030c160b20024180808080044f0d01200141046a2802002203200141086a28020022006b41044f0d04200041046a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d08200128020020032000102722030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102722030d0a0c0e0b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2000102622030d0b0b20004101102a000b200010262203450d060b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b200410262203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200028020021030240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0420024101742200200420042000491b22004100480d042002450d01200128020020022000102722020d020c070b200128020021020c020b200010262202450d050b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b101e000b20004101102a000b20044101102a000b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000b8b0401047f230041e0006b2202240002400240410f10262203450d00200341076a41002900a78640370000200341002900a086403700002003410f412f10272203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412f200241c0006a1002200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041a886c500410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031023200241e0006a24000f0b41d4aac10041331021000b410f4101102a000b412f4101102a000bed2604077f017e017f017e230041f0036b22022400200241003a00940220024194026a200128020022032001280204220441004722051094041a024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d0094022204410f4b0d10024020040e10000b0709040c0e0a0f061003050d0208000b20024180036a20011044200228028003210420024194026a20024180036a41047241ec001094041a2004410e470d15200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b22033602002001200520046a22043602002006411f4d0d0f200241a8016a41186a220520024194026a41186a290000370300200241a8016a41106a220620024194026a41106a290000370300200241a8016a41086a220720024194026a41086a29000037030020022002290094023703a80120024180036a41186a2208200529030037030020024180036a41106a2205200629030037030020024180036a41086a22062007290300370300200220022903a8013703800320024188016a41186a200829030037030020024188016a41106a200529030037030020024188016a41086a2006290300370300200220022903800337038801200241003a00940220024194026a2004200341004722051094041a20032005490d29200141046a200320056b3602002001200420056a3602002003450d1d20022d009402220141064f0d1d200241e8006a41186a220420024188016a41186a290300370300200241e8006a41106a220520024188016a41106a290300370300200241e8006a41086a220320024188016a41086a29030037030020022002290388013703682000410f3a0000200041216a20013a000020002002290368370001200041096a2003290300370000200041116a2005290300370000200041196a2004290300370000200041226a2002280160360100200041266a200241e4006a2f01003b0100200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a3602002006411f4d0d0f200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024180036a41186a2203200129030037030020024180036a41106a2201200429030037030020024180036a41086a22042005290300370300200220022903a8013703800320024188016a41186a2205200329030037030020024188016a41106a2203200129030037030020024188016a41086a220120042903003703002002200229038003370388012000410c3a00002000200229038801370001200041096a2001290300370000200041116a2003290300370000200041196a2005290300370000200041216a2002280068360000200041246a200241eb006a280000360000200241f0036a24000f0b20024180036a20011044200228028003210420024194026a20024180036a41047241ec001094041a2004410e470d0f200041113a0000200241f0036a24000f0b2000410d3a0000200241f0036a24000f0b200241386a200110452002280238450d14200228023c2101200020022f0094023b00012000410a3a0000200041046a2001360200200041086a200229038003370300200041036a20024196026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241286a200110452002280228450d14200228022c2107200141046a22032802002104200241003a00940220024194026a20012802002206200441004722051094041a20042005490d222003200420056b3602002001200620056a36020002402004450d0020022d009402220141ff007122044106490d1c0b200041113a0000200241f0036a24000f0b200041103a0000200241f0036a24000f0b200241306a200110452002280230450d1320022802342107200141046a22032802002104200241003a00940220024194026a20012802002206200441004722051094041a20042005490d212003200420056b3602002001200620056a36020002402004450d0020022d009402220141ff007122044106490d1b0b200041113a0000200241f0036a24000f0b20024180036a20011044200228028003210120024194026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b200241206a200110452002280220450d1220022802242101200020022f0094023b0001200041023a0000200041046a2001360200200041086a200229038003370300200041036a20024194026a41026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241003602940220024194026a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d0a2002280294022101200041063a0000200041046a2001360200200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a3602002006411f4d0d0a200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024180036a41186a2203200129030037030020024180036a41106a2201200429030037030020024180036a41086a22042005290300370300200220022903a8013703800320024188016a41186a2205200329030037030020024188016a41106a2203200129030037030020024188016a41086a220120042903003703002002200229038003370388012000410e3a00002000200229038801370001200041096a2001290300370000200041116a2003290300370000200041196a2005290300370000200041216a2002280068360000200041246a200241eb006a280000360000200241f0036a24000f0b20024180036a20011044200228028003210120024194026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b4100210320024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a36020002402006411f4d0d00200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024188016a41186a200129030037030020024188016a41106a200429030037030020024188016a41086a2005290300370300200220022903a80137038801410121030b20024180036a41186a220120024188016a41186a29030037030020024180036a41106a220420024188016a41106a29030037030020024180036a41086a220520024188016a41086a2903003703002002200229038801370380032003450d0a200241e8006a41186a22032001290300370300200241e8006a41106a22012004290300370300200241e8006a41086a220420052903003703002002200229038003370368200041093a000020002002290368370001200041096a2004290300370000200041116a2001290300370000200041196a2003290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b200241d0006a200110462002290350a7450d0e20022903582109200241c8006a200110452002280248450d11200228024c2104200241c0006a200110452002280240450d1520022802442101200020022f0094023b00012000410b3a0000200041106a2009370300200041086a2001360200200041046a2004360200200041186a200229038003370300200041036a20024196026a2d00003a0000200041206a20024180036a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262205450d1820052004360200200541046a200241a8016a41ec001094041a200141046a22072802002104200241003a00940220024194026a20012802002208200441004722031094041a20042003490d192007200420036b22063602002001200820036a22033602002004450d0c20022d009402220841034f0d0c200242003703800320024180036a20032006410820064108491b22041094041a200141046a220a200620046b22073602002001200320046a2204360200200641074d0d122002290380032109200242003703800320024180036a20042007410820074108491b22031094041a200a200720036b3602002001200420036a360200200741074d0d13200041106a200229038003370300200041086a2009370300200041046a2005360200200020083a0001200041053a0000200041186a200229038801370300200041206a20024188016a41086a290300370300200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262204450d1920042001360200200441046a200241a8016a41ec001094041a200041083a0000200041046a2004360200200020022f00683b0001200041036a200241ea006a2d00003a0000200041086a200229038801370300200041106a20024188016a41086a290300370300200041186a20024188016a41106a290300370300200041206a20024188016a41186a290300370300200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262205450d1920052004360200200541046a200241a8016a41ec001094041a200241086a200110472002290308a7450d0e200241086a41106a29030021092002290310210b200020022f00683b0001200041013a0000200041086a200b370300200041046a2005360200200041186a200229038801370300200041106a2009370300200041036a200241ea006a2d00003a0000200041206a20024188016a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262204450d1720042001360200200441046a200241a8016a41ec001094041a200041073a0000200041046a2004360200200020022f00683b0001200041036a200241ea006a2d00003a0000200041086a200229038801370300200041106a20024188016a41086a290300370300200041186a20024188016a41106a290300370300200041206a20024188016a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c100b200041113a0000200241f0036a24000f0b200041033a0000200041046a2007360200200041026a20043a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041043a0000200041046a2007360200200041026a20043a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041113a00002005102420051023200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c0a0b200041113a00000c090b200520041048000b200520041048000b200520041048000b200520031048000b41f0004108102a000b200320041048000b41f0004108102a000b41f0004108102a000b41f0004108102a000b2005102420051023200241f0036a24000bc35c05067f057e047f027e087f230041d0086b22022400200241003a00f006200241f0066a200128020022032001280204220441004722051094041a0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d00f0062204410d4b0d0e024020040e0e00090607030a0c080e050d02040b000b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6a200141046a200620046b22033602002001200520046a22043602002006450d6620022d00ff05220541044b0d66024020050e050025232422000b200241086a200110452002280208450d66200228020c2204417f4c0d682004450d4f200410ac012206450d870120062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d88012003200720056b3602002001200128020020056a36020020052004470d500c9a010b2000410e360200200241d0086a24000f0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d69200141046a200620046b3602002001200520046a3602002006450d1e20022d00ff05220441044b0d1e024020040e05001d1b1c1a000b200241d0036a2001104720022903d003a7450d1e200241e0036a290300210820022903d8032109200241f0066a200110950220022d00f00622044102460d1e2002418c076a290200210a20024184076a290200210b20022f00f106210120022d00f306210520022902f406210c2002200241fc066a290200370388062002200c370380062002200b3703900620012005411074722101410121050c1d0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d69200141046a200620046b22033602002001200520046a22043602002006450d5520022d00ff050d55200241f0066a2003412020034120491b22056a41004100412020056b2005411f4b1b1093041a200241f0066a200420051094041a200141046a2207200320056b22063602002001200420056a22053602002003411f4d0d5520024188076a22032903002109200229038007210a20022903f0062108200220022903f806370388062002200837038006200241f0066a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a200241f0066a200520041094041a2007200620046b3602002001200520046a3602002006411f4d0d552003290300210820024180076a290300210b200241f0066a41086a290300210c20022802f406210320022802f0062107200241d0046a41086a20024180066a41086a29030037030020022002290380063703d00420024198016a20011045200228029801450d55200228029c012204417f4c0d652004450d53200410ac012206450d880120062001280200200141046a220d2802002205200420052004491b22051094041a200d280200220e2005490d8901200d200e20056b3602002001200128020020056a36020020052004470d540c95010b200241e0076a200110c30220022d00e0072101200241f0066a200241e0076a41017241e7001094041a20014107470d0b2000410e360200200241d0086a24000f0b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d920120022d00f006450d0c0c92010b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002000410e360200200241d0086a24000f0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d0f20022d00ff0522044101460d0d20040d0f200241e0076a200110950220022d00e00722044102460d0f20022d00e307210320022f00e1072107200241ec076a2902002108200241fc076a2902002109200241f8076a2802002105200241f4076a280200210620022902e407210a200241d0006a200110472002280250450d0f20072003411074722101200241d0006a41106a290300210b410121032002290358210c0c0e0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d3120022d00ff05220441094b0d31024020040e0a00252223202829242b21000b200241f0066a200110a50220022802f0062204450d3120022902f4062108200241a8026a200110452008a7210520022802a802450d3020022802ac022103200241003602f006200241f0066a2001280200220d200141046a220e2802002206410420064104491b22071094041a200e200620076b3602002001200d20076a360200200641034d0d30200842208821082005410876210e2004410876210f20022802f0062110410121010c250b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d8d0120022d00f006450d090c8d010b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6841042103200141046a200620046b220f3602002001200520046a22103602002006450d850120022d00ff05220d410c4b0d85010240200d0e0d0036388901323a3b393c343d3133000b200241f0066a200110950220022d00f00622044102460d850120022d00f306210f20022f00f1062110200241fc066a290200210a2002418c076a290200210920024188076a280200210720024184076a280200210520022902f4062108200241a0016a2001104720022903a001a7450d8501200241a0016a41106a290300210c20022903a801210b200141046a220d2802002106200241003a00ff05200241ff056a2001280200220e200641004722031094041a20062003490d8301200d200620036b3602002001200e20036a3602002006450d850120022d00ff05220641034f0d85012010200f41107472210e410121030c88010b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d0d20022d00f00622044101460d0c20040d0d200241e0076a2001104420022802e0072104200241f0066a200241e0076a41047241ec001094041a2004410e460d0d20024180066a200241f0066a41ec001094041a41f00010262201450d7520012004360200200141046a20024180066a41ec001094041a200241b8056a41186a200241d8056a41186a290200370300200241b8056a41106a200241d8056a41106a290200370300200241b8056a41086a200241d8056a41086a290200370300200220022902d8053703b80520014108762105410121040c1b0b200241f0066a20011043200220022f01f2063b018006200220024192076a2f01003b01d80520022d00f00622014111470d042000410e360200200241d0086a24000f0b200241003a00f006200241f0066a2005200641004722041094041a20062004490d67200141046a200620046b3602002001200520046a3602002006450d880120022d00f006450d060c88010b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6741042103200141046a200620046b22073602002001200520046a22053602002006450d4620022d00ff0522044102460d0c20044101460d0b20040d46200241e0076a200110444104210320022802e0072101200241f0066a200241e0076a41047241ec001094041a2001410e460d4620024180066a200241f0066a41ec001094041a41f00010262204450d7520042001360200200441046a20024180066a41ec001094041a200220022f01b8053b019805200220022f01d8053b01ce04410121030c470b2000410e360200200241d0086a24000f0b20024180066a200241f0066a41e7001094041a200041086a20013a00002000410c360200200041096a20024180066a41e7001094041a200241d0086a24000f0b200241f0066a41196a2900002108200241f0066a41116a2900002109200241f0066a41216a2d00002104200241f0066a41106a2d00002105200241f0066a410c6a2802002106200241f0066a41086a280200210320022802f406210720022d00f106210d200220022f0180063b01d004200220022f01d8053b01b80520024194076a280200210e200041216a2008370000200041196a20093700002000200d3a0009200041086a20013a000020004106360200200020043a0029200041186a20053a0000200041146a2006360200200041106a20033602002000410c6a20073602002000412c6a200e360200200020022f01d0043b000a200020022f01b8053b012a200041306a20022903e007370300200041386a200241e0076a41086a290300370300200041c0006a200241e0076a41106a290300370300200041c8006a200241e0076a41186a290300370300200041d0006a20024180086a290300370300200041d8006a20024188086a290300370300200041e0006a200241e0076a41306a290300370300200041e8006a200241e0076a41386a290300370300200241d0086a24000f0b200241b8036a2001104620022903b803a7450d850120022903c003210820004109360200200041086a2008370300200041106a200241e0076a41e0001094041a200241d0086a24000f0b200241c0006a200110462002290340a7450d83012002290348210820004101360200200041086a2008370300200041106a200241e0076a41e0001094041a200241d0086a24000f0b200241c8036a2001104520022802c803450d810120022802cc032204417f4c0d542004450d22200410ac012206450d6d20062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d6e2003200720056b3602002001200128020020056a36020020052004470d230c80010b200241e0076a200110950220022d00e00722044102460d0120022d00e307210320022f00e1072107200241ec076a2902002108200241fc076a2902002109200241f8076a2802002105200241f4076a280200210620022902e407210a20024180016a20011047200229038001a7450d0120024180016a41106a290300210b200229038801210c200241e8006a200110472002290368a7450d0120072003411074722101200241f8006a290300211120022903702112410221030b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2011370200200041c0006a2012370200200041386a200b370200200041306a200c370200200041186a2008370000200041106a200a370000200041286a2009370000200041246a2005360000200041206a20063600002000410c6a20043a0000200041086a2003360200200041d0006a20022903f006370300200041d8006a200241f0066a41086a290300370300200041e0006a200241f0066a41106a290300370300200041e8006a200241f0066a41186a290300370300200241d0086a24000f0b2000410e360200200241d0086a24000f0b200241e0076a2001109502200241f0066a41086a2206200241ec076a290200370300200241f0066a41106a2203200241f4076a290200370300200241f0066a41186a2207200241fc076a290200370300200220022902e4073703f0064102210420022d00e00722014102470d0d0b2000410e360200200241d0086a24000f0b200241a8036a2001104520022802a803450d3a20022802ac032104200241e0076a200110444104210320022802e0072105200241f0066a200241e0076a41047241ec001094041a2005410e460d3a20024180066a200241f0066a41ec001094041a41f00010262201450d6a20012005360200200141046a20024180066a41ec001094041a200220022f01b8053b019805200220022f01ea053b01ce04410221030c3b0b200241f0066a2007412020074120491b22046a41004100412020046b2004411f4b1b1093041a200241f0066a200520041094041a41042103200141046a200720046b3602002001200520046a3602002007411f4d0d3920024188076a2902002109200229028007210820022902f806210a20022802f406210720022802f0062105200241b0036a2001104520022802b003450d3920022802b4032106200141046a220d2802002104200241003a00e007200241e0076a2001280200220e200441004722031094041a20042003490d6a200d200420036b3602002001200e20036a3602002004450d3820022d00e007210e20022005360280062002200736028406200220022f0081063b0198052002200a37038806200a423888a7210d200a421888a7210720022800870621012002280083062104410321030c3a0b200241c0046a2001104520022802c004450d0420022802c40422044108762101410521054200210a0c030b200241b0046a2001104520022802b004450d0320022802b404210420024198046a20011047200229039804a7450d03200241a8046a290300210820022903a004210920024188046a20011046200229038804a7450d03200229039004210a20024180046a20011045200228028004450d03200228028404210120024190066a20083703002002200937038806200220013602800620044108762101410321050c020b200241b8046a2001104520022802b804450d0220022802bc0422044108762101410421054200210a0c010b200241e8036a2001104720022903e803a7450d01200241f8036a2903002108200220022903f003370380062002200837038806410221050b200241f0066a41106a20024180066a41106a290300220b370300200241f0066a41086a20024180066a41086a290300220c370300200241d0046a41086a2206200c370300200241d0046a41106a2203200b3703002002200229038006220b3703d0042002200b3703f006200041386a2008370200200041306a20093702002000410c6a2001410874200441ff017172360200200041086a20053602002000410b360200200041286a200a370200200041106a20022903d004370200200041186a2006290300370200200041206a2003290300370200200041c0006a20022903e007370300200041c8006a200241e0076a41086a290300370300200041d0006a200241e0076a41106a290300370300200041d8006a200241e0076a41186a290300370300200041e0006a200241e0076a41206a290300370300200041e8006a200241e0076a41286a290300370300200241d0086a24000f0b200241f0066a41106a20024180066a41106a290300370300200241f0066a41086a20024180066a41086a29030037030020022002290380063703f0062000410e360200200241d0086a24000f0b200241386a200110452002280238450d44200228023c2213ad420c7e2208422088a70d462008a72204417f4c0d462004450d272004102622060d2820044104102a000b200241106a200110452002280210450d4320022802142204417f4c0d452004450d28200410ac012206450d6620062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d672003200720056b3602002001200128020020056a36020020052004470d290c700b200241286a200110452002280228450d42200228022c2214ad42187e2208422088a70d442008a72204417f4c0d442004450d2d2004102622060d2e20044104102a000b200242003703f006200241f0066a20042003410820034108491b22051094041a200141046a200320056b3602002001200420056a360200200341074d0d4120022903f0062108410221010c760b20022f00e10720022d00e307411074722105200241b8056a41186a2007290300370300200241b8056a41106a2003290300370300200241b8056a41086a2006290300370300200220022903f0063703b8050b20024198056a41186a2206200241b8056a41186a29030037030020024198056a41106a2203200241b8056a41106a29030037030020024198056a41086a2207200241b8056a41086a290300370300200220022903b80537039805200041086a2005410874200141ff017172360200200020043602042000410d3602002000410c6a200229039805370200200041146a20072903003702002000411c6a2003290300370200200041246a20062903003702002000412c6a200241d0046a41c4001094041a200241d0086a24000f0b200241d8026a2001104520022802d802450d1120022802dc022204410876210f410521010c090b20024198036a20011046200229039803a7450d1020022903a003220942208821082009a72205410876210e410a21010c0a0b200241c8026a2001104520022802c802450d0f20022802cc022104200241f0066a200110950220022d00f00622054102460d0f20022d00f306210320022f00f1062107200241fc066a290200210b2002418c076a290200210920024188076a280200210f20024184076a280200210620022902f4062108200241c0026a2001104520022802c002450d0f20022802c402210d200241b8026a2001104520022802b802450d0f2007200341107472210e20022802bc0221012002200f360280062004410876210f2008422088a7210320022009370284062009422088a72113200b422088a7210720022903800621092001ad210a200ba721104200210b410321010c0b0b200241d0026a2001104520022802d002450d0e20022802d4022204410876210f410421010c060b200241f0066a200110950220022d00f00622044102460d0d20022902f40622094220882108410821012009a72205410876210e20022f00f10620022d00f30641107472210f200241fc066a290200220a422088a7211020024184076a280200210720024188076a28020021062002418c076a2902002109200aa721030c020b200241f0066a200110a50220022802f0062204450d0c20022902f4062108200241b0026a200110452008a7210520022802b002450d0b20022802b4022103200241003602f006200241f0066a2001280200220d200141046a220e2802002206410420064104491b22071094041a200e200620076b3602002001200d20076a360200200641034d0d0b200842208821082005410876210e2004410876210f20022802f0062110410221010b0b0c060b200241f0066a200110950220022d00f00622044102460d0920022d00f306210520022f00f1062103200241fc066a290200210c2002418c076a290200210920024188076a280200210620024184076a280200210720022902f4062112200241e8026a2001104720022903e802a7450d09200241e8026a41106a290300210b20022903f002210a200241e0026a2001104520022802e002450d092003200541107472210f20022802e4022113201242208821082012a72205410876210e200c422088a72110200ca72103410621010c050b20024180036a20011045200228028003450d082002280284032204410876210f410721010b420021084100210e0c020b20024188036a20011046200229038803a7450d06200229039003220942208821082009a72205410876210e410921010b0b0b20004107360200200041c0006a200b370200200041386a200a370200200041346a200d360200200041306a2013360200200041286a2009370200200041246a2006360200200041206a20073602002000411c6a2010360200200041186a2003360200200041086a2001360200200041c8006a20022903e0073703002000410c6a200f410874200441ff017172360200200041d0006a200241e0076a41086a290300370300200041d8006a200241e0076a41106a290300370300200041e0006a200241e0076a41186a290300370300200041e8006a200241e0076a41206a290300370300200041106a2008422086200ead42ffffff07834208862005ad42ff01838484370200200241d0086a24000f0b4101210641002004460d5d0b2004450d5d200610230c5d0b2005450d00200410230b2000410e360200200241d0086a24000f0b20024198026a20011045200228029802450d54200228029c022104200220022f01b8053b01d0042004410876210e410c21030c030b20024180026a20011045200228028002450d532002280284022105200241e8016a2001104720022903e801a7450d53200241f8016a290300210a20022903f0012108200220022f01f0063b01d004410521034100210e0c040b200241a0026a2001104520022802a002450d5220022802a4022215ad2208421b88a70d2b2008420586a72205417f4c0d2b2005450d1e2005102622040d1f20054101102a000b20024190026a20011045200228029002450d512002280294022104200220022f01f0063b01d0042004410876210e410a21030b4200210a0c090b200241b8016a2001104720022903b801a7450d4f200241c8016a290300210a20022903c0012108200220022f01f0063b01d004200228028006210520022802840621072002290388062109410221034100210e0b0c500b200241d0016a2001104720022903d001a7450d4d200241e0016a290300210a20022903d8012108200220022f01f0063b01d004410321034100210e0c4e0b200241003a00ff05200241ff056a2010200f41004722041094041a200f2004490d43200141046a200f20046b3602002001201020046a360200200f450d4c20022d00ff05220641034f0d4c200220022f01f0063b01d004410821034200210a4100210e0c4f0b20024188026a20011045200228028802450d4b200228028c022214ad42247e2208422088a70d242008a72205417f4c0d242005450d192005102622040d1a20054104102a000b410721030c020b200241f0066a200110950220022d00f00622044102460d49200241fc066a290200210a20022902f406210820024184076a280200210520024188076a28020021072002418c076a290200210920022f00f106210120022d00f3062106200220022f0180063b01d0042001200641107472210e410921030c4b0b410b21030b0b0c470b410421060b2013450d02420021084100210d4100210541002107201321100340200241306a200110452002280230450d1020022802342204417f4c0d1e024002402004450d00200410ac01220e450d2e200e2001280200200141046a220f2802002203200420032004491b22031094041a200f28020022162003490d2f200f201620036b3602002001200128020020036a36020020032004460d010c110b4101210e41002004470d100b200741016a2103024020072010470d00200d20032003200d491b2210ad420c7e2209422088a70d202009a7220f4100480d2002402007450d0020062005200f102722060d010c300b200f10262206450d2f0b200620056a2207200e360200200741046a2004ad220942208620098437020020084280808080107c2108200d41026a210d2005410c6a21052003210720032013490d000c040b0b4101210641002004460d470b20040d180c190b41002110420021080b2006450d1720082010ad842108410521010c4c0b4101210641002004460d4a0b20040d140c150b410421060b024002402014450d00420021084100210e4100210441002107201421130340200241206a200110452002280220450d1420022802242203417f4c0d18024002402003450d00200310ac01220f450d30200f2001280200200141046a220d2802002205200320052003491b22051094041a200d28020022102005490d31200d201020056b3602002001200128020020056a36020020052003460d010c150b4101210f41002003470d140b200241186a200110452002280218450d13200228021c2205417f4c0d18024002402005450d00200510ac012210450d2e20102001280200200141046a2216280200220d2005200d2005491b220d1094041a20162802002217200d490d2f20162017200d6b36020020012001280200200d6a360200200d2005460d010c140b4101211041002005470d130b200741016a210d024020072013470d00200e200d200d200e491b2213ad42187e2209422088a70d1a2009a722164100480d1a02402007450d00200620042016102722060d010c2b0b201610262206450d2a0b200620046a2207200f360200200741146a2005360200200741106a20053602002007410c6a2010360200200741046a2003ad220942208620098437020020084280808080107c2108200e41026a210e200441186a2104200d2107200d2014490d000c020b0b41002113420021080b2006450d1320082013ad842108410421010c480b410421030b0b200220022f0198053b018006200220022f01ce043b01d805024020034104470d002000410e360200200241d0086a24000f0b200220022f0180063b01cc04200220022f01d8053b01ca042000411d6a2009370000200041156a2008370000200020053a0005200020033a0004200041083602002000200e3a0025200041146a200d3a0000200041106a20073602002000410c6a2001360200200041086a2004360200200041286a2006360200200020022f01cc043b0006200020022f01ca043b01262000412c6a200241d0046a41c4001094041a200241d0086a24000f0b4101210641002004460d410b2004450d00200610230b200241f0066a41086a200241d8056a41086a290300370300200220022903d8053703f0060c400b2004450d00200e10230b02402007450d002006210103400240200141046a280200450d00200128020010230b2001410c6a2101200541746a22050d000b0b20100d0a0c0b0b410121040b024002402015450d00200241f0066a41186a210f200241f0066a41106a2110200241f0066a41086a2113200141046a210e420021084100210d4100210741002103201521170340200f42003703002010420037030020134200370300200242003703f006200241f0066a20012802002216200e2802002205412020054120491b22061094041a200e200520066b3602002001201620066a3602002005411f4d0d06200341016a2106200f29030021092010290300210a2013290300210b20022802f406211620022802f0062114024020032017470d00200d20062006200d491b2217ad420586220c422088a70d10200ca722054100480d1002402003450d00200420072005102722040d010c220b200510262204450d210b200420076a22052014360000200541186a2009370000200541106a200a370000200541086a200b370000200541046a201636000020084280808080107c2108200d41026a210d200741206a21072006210320062015490d000c020b0b41002117420021080b2004450d3220082017ad842108200220022f01b8053b01d0042004410876210e410d21030c020b410421040b024002402014450d0042002108200241f0066a410c6a2117200241f0066a411c6a2115200241f0066a41186a2118200241f0066a41146a2119410021074100210341002105201421160340200241f0066a200110950220022d00f006220d4102460d05200541016a210620022d00f306210e20022f00f106210f201729020021092015290200210a201828020021102019280200211320022902f406210b024020052016470d002007200620062007491b2216ad42247e220c422088a70d0e200ca7221a4100480d0e02402005450d0020042003201a102722040d010c210b201a10262204450d200b200420036a2205200d3a0000200541036a200f200e41107472220d4110763a0000200541016a200d3b00002005410c6a2009370000200541046a200b3700002005411c6a200a370000200541186a2010360000200541146a201336000020084280808080107c2108200741026a2107200341246a21032006210520062014490d000c020b0b41002116420021080b2004450d3020082016ad842108200220022f0180063b01d0042004410876210e410621030b0c300b2017450d2e0c2d0b20160d2c0c2d0b2005450d00201010230b2003450d00200f10230b02402007450d002006210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200441686a22040d000b0b2013450d010b200610230b2000410e360200200241d0086a24000f0b200520041048000b101d000b101e000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b20044101102a000b200320161048000b200f4104102a000b20164104102a000b20054101102a000b201a4104102a000b20054101102a000b200d20171048000b20034101102a000b200520101048000b41f0004108102a000b20044101102a000b200520071048000b41f0004108102a000b41f0004108102a000b200320041048000b2004200f1048000b20044101102a000b200520071048000b20044101102a000b200520071048000b20044101102a000b2005200e1048000b200320061048000b200410230b200220022f01d0043b01f0062000410e360200200241d0086a24000f0b0b0b200220022f01d00422013b01f006200220013b019805200041386a200c370000200041306a200b370000200041186a200a370000200041106a2008370000200020063a0009200041086a20033a000020004105360200200041286a2009370000200041246a2007360000200041206a20053600002000410c6a200e410874200441ff017172360000200020022f0198053b000a200041c0006a20022903e007370300200041c8006a200241e0076a41086a290300370300200041d0006a200241e0076a41106a290300370300200041d8006a200241e0076a41186a290300370300200041e0006a200241e0076a41206a290300370300200041e8006a200241e0076a41286a290300370300200241d0086a24000f0b2004ad22084220862008842108410321010c070b200020063602042000410a360200200041086a2004ad2208422086200884370200200041106a200241e0076a41e0001094041a200241d0086a24000f0b2000410e360200200241d0086a24000f0b2000410e360200200241d0086a24000f0b2000410e360200200241d0086a24000f0b200241d8056a41086a2201200241d0046a41086a290300370300200220022903d0043703d805200241f0066a41086a22052001290300370300200220022903d8053703f0062006450d00200241b8056a41086a22012005290300370300200220022903f0063703b805200041c8006a2008370200200041c0006a200b370200200041286a2009370200200041206a200a370200200041086a2004ad22084220862008843702002000200636020420004104360200200041386a200c370200200041346a2003360200200041306a2007360200200041106a20022903b805370200200041186a2001290300370200200041d0006a20022903e007370300200041d8006a200241e0076a41086a290300370300200041e0006a200241e0076a41106a290300370300200041e8006a200241e0076a41186a290300370300200241d0086a24000f0b2000410e360200200241d0086a24000f0b2004ad22084220862008842108410121010b20004100360200200041106a20083702002000410c6a2006360200200041086a2001360200200041186a200241e0076a41d8001094041a200241d0086a24000bdd0301077f230041106b22022400200241003a0003200241036a200128020022032001280204220441004722051094041a02400240024020042005490d00200141046a200420056b22063602002001200320056a22033602000240024002402004450d000240024020022d0003220741037122044102460d00024020044101460d0020040d0220074102762105410121040c080b200241003a000f2002410f6a2003200641004722041094041a20062004490d06200141046a200620046b3602002001200320046a3602002006450d0420022d000f4108742007724102762105410121040c070b41002105200241003a000a200241003b0108200241086a200320064103200641034922081b22041094041a200141046a200620046b3602002001200320046a3602004100210420080d0620022f010820022d000a411074724108742007724102762105410121040c060b200741034b0d004100210420024100360204200241046a20032006410420064104491b22051094041a200141046a200620056b3602002001200320056a360200200641034d0d0120022802042105410121040c050b410021040b0c030b41002105410021040c020b200520041048000b200420061048000b2000200536020420002004360200200241106a24000bcb0503057f037e047f230041106b22022400200241003a0000200220012802002203200128020422044100472205109404210202400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d0020022d00002204ad210702400240024002400240200441037122034102460d00024020034101460d0020030d022004410276ad2108420121090c080b200241003a00002002200520064100472204109404210320062004490d0a200141046a200620046b3602002001200520046a3602002006450d0220033100004208862007844202882108420121090c070b200241003a000e200241003b010c2002410c6a200520064103200641034922031b22041094041a200141046a200620046b3602002001200520046a360200420021084200210920030d06200233010c200231000e421086844208862007844202882108420121090c060b200441027622044104460d0120040d0220024100360200200220052006410420064104491b22041094042103200141046a200620046b3602002001200520046a360200200641034d0d0020033502002108420121090c050b42002108420021090c040b4200210920024200370300200220052006410820064108491b22041094042103200141046a200620046b3602002001200520046a360200200641074d0d0220032903002108420121090c030b200441046a220a41084b0d0042002108200141046a210b410021030340200241003a00002002200520064100472204109404210c20062004490d05200b200620046b220d3602002001200520046a22053602002006450d01200c3100002003410374413871ad86200884210842012109200d2106200341016a22042103200441ff0171200a490d000c030b0b420021090b0b2000200837030820002009370300200241106a24000f0b200520041048000b200420061048000b200420061048000be90605057f017e017f027e037f230041306b22022400200241003a0018200241186a200128020022032001280204220441004722051094041a02400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d0002400240024002400240024020022d0018220341037122044102460d00024020044101460d0020040d022003410276ad21070c0d0b200241003a0018200241186a2005200641004722041094041a20062004490d0a200141046a200620046b3602002001200520046a3602002006450d0220022d001841087420037241fcff0371410276ad21070c0c0b200241003a002e200241003b012c2002412c6a200520064103200641034922081b22041094041a200141046a200620046b3602002001200520046a36020020080d0120022f012c20022d002e41107472410874200372410276ad21070c0b0b20034102762204410c460d0220044104460d0120040d0320024100360218200241186a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d00200235021821070c0a0b420021070c080b4200210720024200370318200241186a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d07200229031821070c080b4200210a2002420037032020024200370318200241186a20052006411020064110491b22041094041a200141046a200620046b3602002001200520046a3602002006410f4d0d02200241206a2903002109200229031821074201210a0c080b200441046a220b41104b0d00200141046a210c200241106a210d4200210742002109410021030340200241003a0018200241186a2005200641004722041094041a20062004490d04200c200620046b22083602002001200520046a22053602002006450d01200241086a20023100184200200341037441f80071109904200d2903002009842109200229030820078421074201210a20082106200341016a22042103200441ff0171200b490d000c080b0b4200210a0b0c050b200520041048000b200420061048000b200420061048000b420021094200210a0c010b420021094201210a0b200020073703082000200a370300200041106a2009370300200241306a24000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c2002419489c5003602082002200241046a360228200220023602202002200241206a360218200241086a41a489c5001061000b832702087f027e230041f0036b22022400200241003a0090022001280200200128020420024190026a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d0090022203410f4b0d10024020030e10000b0709040c0e0a0f061003050d0208000b20024180036a2001102f200228028003210320024190026a20024180036a41047241ec001094041a2003410e470d15200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a220828020020024190026a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d0f200241a0016a41186a22042005290300370300200241a0016a41106a22052006290300370300200241a0016a41086a2206200729030037030020022002290390023703a00120024180036a41186a2207200429030037030020024180036a41106a2204200529030037030020024180036a41086a22052006290300370300200220022903a0013703800320024180016a41186a200729030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903800337038001200241003a0090022001280200200828020020024190026a410120091001210120032003280200200141016a41014b22016a3602002001450d1820022d009002220141064f0d18200241e0006a41186a220320024180016a41186a290300370300200241e0006a41106a220420024180016a41106a290300370300200241e0006a41086a220520024180016a41086a29030037030020022002290380013703602000410f3a0000200041216a20013a000020002002290360370001200041096a2005290300370000200041116a2004290300370000200041196a2003290300370000200041226a2002280158360100200041266a200241dc006a2f01003b0100200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0f200241a0016a41186a22012005290300370300200241a0016a41106a22032006290300370300200241a0016a41086a2204200729030037030020022002290390023703a00120024180036a41186a2205200129030037030020024180036a41106a2201200329030037030020024180036a41086a22032004290300370300200220022903a0013703800320024180016a41186a2204200529030037030020024180016a41106a2205200129030037030020024180016a41086a220120032903003703002002200229038003370380012000410c3a00002000200229038001370001200041096a2001290300370000200041116a2005290300370000200041196a2004290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b20024180036a2001102f200228028003210320024190026a20024180036a41047241ec001094041a2003410e470d0f200041113a0000200241f0036a24000f0b2000410d3a0000200241f0036a24000f0b200241306a2001104a2002280230450d1520022802342101200020022f0090023b00012000410a3a0000200041046a2001360200200041086a200229038003370300200041036a20024192026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241206a2001104a2002280220450d1620022802242104200241003a0090022001280200200141046a28020020024190026a4101200141086a22012802001001210320012001280200200341016a41014b22036a36020002402003450d0020022d009002220141ff007122034106490d1d0b200041113a0000200241f0036a24000f0b200041103a0000200241f0036a24000f0b200241286a2001104a2002280228450d15200228022c2104200241003a0090022001280200200141046a28020020024190026a4101200141086a22012802001001210320012001280200200341016a41014b22036a36020002402003450d0020022d009002220141ff007122034106490d1c0b200041113a0000200241f0036a24000f0b20024180036a2001102f200228028003210120024190026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b200241186a2001104a2002280218450d14200228021c2101200020022f0090023b0001200041023a0000200041046a2001360200200041086a200229038003370300200041036a20024190026a41026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200141046a28020021032002410036029002200141086a220541002001280200200320024190026a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d0a2002280290022101200041063a0000200041046a2001360200200020022f00a0013b0001200041036a200241a2016a2d00003a0000200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0a200241a0016a41186a22012005290300370300200241a0016a41106a22032006290300370300200241a0016a41086a2204200729030037030020022002290390023703a00120024180036a41186a2205200129030037030020024180036a41106a2201200329030037030020024180036a41086a22032004290300370300200220022903a0013703800320024180016a41186a2204200529030037030020024180016a41106a2205200129030037030020024180016a41086a220120032903003703002002200229038003370380012000410e3a00002000200229038001370001200041096a2001290300370000200041116a2005290300370000200041196a2004290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b20024180036a2001102f200228028003210120024190026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b20024190026a41186a2206420037030020024190026a41106a2207420037030020024190026a41086a22084200370300200242003703900241002103200141086a220541002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20052802006a36020002402001411f4d0d00200241a0016a41186a22012006290300370300200241a0016a41106a22032007290300370300200241a0016a41086a2204200829030037030020022002290390023703a00120024180016a41186a200129030037030020024180016a41106a200329030037030020024180016a41086a2004290300370300200220022903a00137038001410121030b20024180036a41186a220120024180016a41186a29030037030020024180036a41106a220420024180016a41106a29030037030020024180036a41086a220520024180016a41086a2903003703002002200229038001370380032003450d0a200241e0006a41186a22032001290300370300200241e0006a41106a22012004290300370300200241e0006a41086a220420052903003703002002200229038003370360200041093a000020002002290360370001200041096a2004290300370000200041116a2001290300370000200041196a2003290300370000200041216a2002280058360000200041246a200241db006a280000360000200241f0036a24000f0b200241c8006a2001104b2002290348a7450d102002290350210a200241c0006a2001104a2002280240450d1120022802442103200241386a2001104a2002280238450d15200228023c2101200020022f0090023b00012000410b3a0000200041106a200a370300200041086a2001360200200041046a2003360200200041186a200229038003370300200041036a20024192026a2d00003a0000200041206a20024180036a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262204450d1420042003360200200441046a200241a0016a41ec001094041a200241003a0090022001280200200141046a28020020024190026a4101200141086a22032802001001210520032003280200200541016a41014b22056a22063602002005450d0820022d009002220741034f0d082002420037038003200141086a220341002001280200200141046a220828020020024180036a41082006100122052005417f461b2205410820054108491b20032802006a2206360200200541074d0d12200229038003210a2002420037038003200341002001280200200828020020024180036a41082006100122012001417f461b2201410820014108491b20032802006a360200200141074d0d13200041106a200229038003370300200041086a200a370300200041046a2004360200200020073a0001200041053a0000200041186a200229038001370300200041206a20024180016a41086a290300370300200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262203450d1420032001360200200341046a200241a0016a41ec001094041a200041083a0000200041046a2003360200200020022f00603b0001200041036a200241e2006a2d00003a0000200041086a200229038001370300200041106a20024180016a41086a290300370300200041186a20024180016a41106a290300370300200041206a20024180016a41186a290300370300200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262204450d1420042003360200200441046a200241a0016a41ec001094041a20022001104c2002290300a7450d0c200241106a290300210a2002290308210b200020022f00603b0001200041013a0000200041086a200b370300200041046a2004360200200041186a200229038001370300200041106a200a370300200041036a200241e2006a2d00003a0000200041206a20024180016a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262203450d1220032001360200200341046a200241a0016a41ec001094041a200041073a0000200041046a2003360200200020022f00603b0001200041036a200241e2006a2d00003a0000200041086a200229038001370300200041106a20024180016a41086a290300370300200041186a20024180016a41106a290300370300200041206a20024180016a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c0f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00002004102420041023200241f0036a24000f0b200041033a0000200041046a2004360200200041026a20033a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041043a0000200041046a2004360200200041026a20033a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c050b200041113a00000c040b41f0004108102a000b41f0004108102a000b41f0004108102a000b41f0004108102a000b2004102420041023200241f0036a24000bd00301057f230041106b2202240041002103200241003a000f200128020020012802042002410f6a410120012802081001210420012001280208200441016a41014b22046a2205360208024002402004450d00024002400240024020022d000f220641037122044102460d0020044101460d0120040d0320064102762104410121030c050b4100210420024100360208200220063a000841012103200141086a220641002001280200200141046a280200200241086a41017241032005100122012001417f461b2201410320014103491b20062802006a360200200141024d0d01200228020841027621040c040b41002104200241003b010c200220063a000c2001280200200141046a2802002002410c6a4101724101200510012103200141086a22012001280200200341016a41014b22016a3602002001450d0020022f010c4102762104410121030c030b410021030c020b200641034b0d01200141046a28020021044100210320024100360204200141086a2206410020012802002004200241046a41042005100122012001417f461b2201410420014104491b20062802006a360200200141034d0d0020022802042104410121030c010b0b2000200436020420002003360200200241106a24000bc50503047f027e037f230041106b22022400200241003a000820012802002001280204200241086a410120012802081001210320012001280208200341016a41014b22046a22033602080240024002402004450d0002400240024002400240024020022d0008220541037122044102460d0020044101460d0120040d022005410276ad2106420121070c080b20024100360208200220053a0008200141086a220441002001280200200141046a280200200241086a41017241032003100122012001417f461b2201410320014103491b20042802006a360200200141024d0d022002280208410276ad2106420121070c070b200241003b0108200220053a00082001280200200141046a280200200241086a4101724101200310012103200141086a22012001280200200341016a41014b22016a3602002001450d0120022f0108410276ad2106420121070c060b200541027622044104460d0120040d02200141046a280200210420024100360208200141086a2205410020012802002004200241086a41042003100122012001417f461b2201410420014104491b20052802006a360200200141034d0d0020023502082106420121070c050b42002106420021070c040b4200210720024200370308200141086a220441002001280200200141046a280200200241086a41082003100122012001417f461b2201410820014108491b20042802006a360200200141074d0d0220022903082106420121070c030b200441046a220841084b0d0042002106200141046a2109200141086a2105410021040340200241003a000820012802002009280200200241086a410120031001210320052005280200200341016a41014b220a6a2203360200200a450d0120023100082004410374413871ad86200684210642012107200441016a220441ff01712008490d000c030b0b420021070b0b2000200637030820002007370300200241106a24000be40603047f037e037f230041206b22022400200241003a001020012802002001280204200241106a410120012802081001210320012001280208200341016a41014b22036a220436020802400240024002402003450d000240024002400240024002400240024020022d0010220541037122034102460d0020034101460d0120030d022005410276ad21060c060b20024100360210200220053a0010200141086a220341002001280200200141046a280200200241106a41017241032004100122012001417f461b2201410320014103491b20032802006a360200200141024d0d022002280210410276ad21060c050b200241003b0110200220053a00102001280200200141046a280200200241106a4101724101200410012103200141086a22012001280200200341016a41014b22016a3602002001450d0120022f0110410276ad21060c040b20054102762203410c460d0120034104460d0220030d04200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d00200235021021060c030b420021060c060b420021082002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100122012001417f461b2201411020014110491b20032802006a3602002001410f4d0d04200241106a41086a290300210720022903102106420121080c060b4200210620024200370310200141086a220341002001280200200141046a280200200241106a41082004100122012001417f461b2201410820014108491b20032802006a360200200141074d0d04200229031021060b42002107420121080c040b200341046a220941104b0d00200141046a210a200141086a21054200210642002107410021030340200241003a00102001280200200a280200200241106a410120041001210420052005280200200441016a41014b220b6a2204360200200b450d01200220023100104200200341037441f80071109904200241086a29030020078421072002290300200684210642012108200341016a220341ff01712009490d000c040b0b420021080b0c010b42002107420021080b2000200637030820002008370300200041106a2007370300200241206a24000bfb0601017f0240024002400240024020012d0000417f6a2202410f4b0d00024002400240024002400240024002400240024002400240024002400240024020020e10000a0608030b0d090e050f02040c0107000b41f00010262202450d102002200141046a280200104e200041046a2002360200200041013a0000200041106a200141106a290300370300200041086a200141086a2903003703000f0b2000410f3a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00000f0b2000410c3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b41f00010262202450d0e2002200141046a280200104e200041046a2002360200200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200020012d00013a00010f0b2000410d3a00000f0b2000410a3a0000200041046a200141046a2802003602000f0b200041033a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b200041103a00000f0b200041043a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b41f00010262202450d092002200141046a280200104e200041083a0000200041046a20023602000f0b200041023a0000200041046a200141046a2802003602000f0b200041063a0000200041046a200141046a2802003602000f0b2000410e3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b41f00010262202450d062002200141046a280200104e200041073a0000200041046a20023602000f0b200041093a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b2000410b3a0000200041106a200141106a290300370300200041046a200141046a2902003702000f0b4184bfc000104f000b41f0004108102a000b41f0004108102a000b41f0004108102a000b41f0004108102a000bca1904027f027e077f027e230041c0016b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d272003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a2003450d0620012802042106200310262201450d1e2001200620031094041a0c070b2001410c6a2802002203417f4c0d192003450d0720012802042106200310262201450d1e2001200620031094041a0c080b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a28020021060c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121010b200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121010b200020013602042000410a3602002000410c6a2003360200200041086a2003360200200241c0016a24000f0b200241106a41086a200141186a290200370300200241106a41106a200141206a2802003602002002200141106a290200370310200141246a350200200141286a310000422086842104200141096a2f00002001410b6a2d00004110747221072001410c6a2802002106410021030b200241d0006a41106a200241106a41106a280200360200200241d0006a41086a200241106a41086a2903003703002002200229031037035020032007410874722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290350370200200041246a2004370200200041186a200241d0006a41086a290300370200200041206a200241d0006a41106a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041022101410021030c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b20034101102a000b20034101102a000b41f0004108102a000b6802017f037e230041306b22012400200029020821022000290210210320002902002104200141146a410036020020012004370318200141a886c500360210200142013702042001200141186a36020020012003370328200120023703202001200141206a1061000be21904027f027e077f027e230041c0016b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d252003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a200128020421012003450d062003102622060d0720034101102a000b2001410c6a2802002203417f4c0d19200128020421012003450d072003102622060d0820034101102a000b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a2802002106410021070c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121060b2006200120031094042101200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121060b20062001200310940421012000410c6a2003360200200041086a2003360200200020013602042000410a360200200241c0016a24000f0b200241d0006a41086a200141186a290200370300200241d0006a41106a200141206a290200370300200241d0006a41186a200141286a2d00003a00002002200141106a290200370350200141096a2f00002001410b6a2d00004110747241087421072001410c6a2802002106410021030b200241106a41186a200241d0006a41186a280200360200200241106a41106a200241d0006a41106a290300370300200241106a41086a200241d0006a41086a2903003703002002200229035037031020032007722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290310370200200041186a200241106a41086a290300370200200041206a200241106a41106a290300370200200041286a200241106a41186a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041002103410221010c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b41f0004108102a000bbe0703037f017e077f024002400240024002400240024002400240024002402001280200417f6a220241044b0d000240024002400240024002400240024002400240024020020e050004020301000b2001410c6a2802002202417f4c0d13200128020421034101210102402002450d00200210262201450d0c0b20012003200210940421012000410c6a2002360200200041086a200236020020002001360204200041013602000f0b2001410c6a2802002204ad420c7e2205422088a70d122005a72202417f4c0d12200128020421032002450d03200210262206450d0b410c21072004450d040c100b2001410c6a2802002202417f4c0d11200128020421012002450d042002102622030d0520024101102a000b2001410c6a2802002206ad42187e2205422088a70d102005a72203417f4c0d10200128020421022003450d0520031026220c450d0a2006450d060c0b0b20004102360200200041086a200141086a2903003703000f0b41042106410c210720040d0c0b410021090c0c0b410121030b20032001200210940421012000410c6a2002360200200041086a200236020020002001360204200041033602000f0b4104210c20060d050b4100210b0c050b41b89ac300104f000b20024101102a000b20024104102a000b20034104102a000b2002200641186c6a21044100210b200c21010340200241086a2802002203417f4c0d050240024002402003450d0020022802002107200310262209450d012009200720031094041a200241146a2802002207417f4c0d080c020b41012109200241146a2802002207417f4a0d010c070b20034101102a000b024002402007450d002002410c6a280200210820071026220a450d04200a200820071094041a0c010b4101210a0b20012009360200200141146a2007360200200141106a20073602002001410c6a200a360200200141086a2003360200200141046a2003360200200141186a2101200b41016a210b200241186a22022004470d000b0b2000200c360204200041043602002000410c6a200b360200200041086a20063602000f0b20074101102a000b2003200420076c6a210841002109200621020340200341086a2802002201417f4c0d022003280200210a024002402001450d0020011026220b0d010c050b4101210b0b200b200a2001109404210a200241086a2001360200200241046a20013602002002200a360200200220076a2102200941016a2109200320076a22032008470d000b0b2000200636020420004105360200200020076a2009360200200041086a20043602000f0b101d000b20014101102a000bae0a01047f230041206b220224000240024002402001280200417f6a220341094b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b2001410c6a2802002203417f4c0d12200128020421044101210502402003450d00200310262205450d140b20052004200310940421052000410c6a2003360200200041086a20033602002000200536020420004101360200200041106a200141106a290200370300200241206a24000f0b2000410536020020002001280204360204200241206a24000f0b2000410a360200200041086a200141086a290300370300200241206a24000f0b2001280204210541012103200141086a22042d00004101470d062001410c6a28020021040c070b2000410436020020002001280204360204200241206a24000f0b4101210320012d00044101470d06200141086a28020021010c070b2001410c6a2802002203417f4c0d0c200128020421052003450d092003102622040d0a20034101102a000b4101210320012d00044101470d06200141086a28020021050c070b2000410736020020002001280204360204200241206a24000f0b20004109360200200041086a200141086a290300370300200241206a24000f0b2002411e6a200441036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220042f00013b011c2002200141106a2902003703002001410c6a2802002104410021030b20002005360204200020022f011c3b0009200041086a20033a00002000410c6a2004360200200041106a20022903003702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a2802003602002000412c6a2001412c6a29020037020020004103360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030b200020022f011c3b0005200020033a000420004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002105410021030b200020033a0004200020022f011c3b0005200041086a20053602002000410c6a2002290300370200200041386a200141386a290300370300200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141286a280200210120004106360200200041286a2001360200200241206a24000f0b410121040b20042005200310940421052000410c6a2003360200200041086a20033602002000200536020420004102360200200041106a200141106a290200370300200241206a24000f0b41d8b8c200104f000b101d000b20034101102a000b900201027f024002400240024020012d000022024103460d00024020024102460d0020024101470d0241f00010262202450d032002200141046a28020010b703200041013a0000200041046a20023602000f0b200141046a280200210341f00010262202450d032002200141086a28020010b703200041086a2002360200200041046a2003360200200041023a00000f0b200041033a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041246a200141246a280200360200200041216a200141216a2d00004100473a00000f0b41f496c400104f000b41f0004108102a000b41f0004108102a000b840f02057f037e230041c0006b220224000240024002400240024020012d0000417f6a220341054b0d000240024002400240024002400240024002400240024002400240024020030e06000402030105000b200041e0006a200141e0006a280200360200200041d8006a200141d8006a290300370300200041d0006a200141d0006a290300370300200041c8006a200141c8006a290300370300200041c0006a200141c0006a290300370300200041386a200141386a290300370300200041306a200141306a290300370300200041286a200141286a290300370300200041206a200141206a290300370300200041186a200141186a290300370300200041106a200141106a290300370300200041086a200141086a290300370300200041e4006a200141e4006a2d00004100473a0000200041013a0000200241c0006a24000f0b200241186a2204200141196a290000370300200241106a2205200141116a290000370300200241086a2206200141096a29000037030020022001290001370300410021030240200141216a2d00004101470d00200241206a41186a2001413a6a290000370300200241206a41106a200141326a290000370300200241206a41086a2001412a6a2900003703002002200141226a290000370320410121030b20002002290300370001200041216a20033a0000200041226a2002290320370000200041196a2004290300370000200041116a2005290300370000200041096a20062903003700002000412a6a200241206a41086a290300370000200041326a200241206a41106a2903003700002000413a6a200241206a41186a290300370000200041053a0000200241c0006a24000f0b41012104200141046a2d00004101470d03200141086a28020021050c040b200141386a2903002107200141306a2903002108200141c0006a2903002109200241386a200141196a290000370300200241306a200141116a290000370300200241286a200141096a290000370300200220012900013703202001412c6a2802002203417f4c0d0b2003450d04200141246a2802002104200310262201450d0c2001200420031094041a0c050b2001410c6a2802002203417f4c0d0a200141106a29030021072003450d05200141046a2802002104200310262201450d0c2001200420031094041a0c060b200241186a200141196a290000370300200241106a200141116a290000370300200241086a200141096a29000037030020022001290001370300200241206a41186a200141396a290000370300200241206a41106a200141316a290000370300200241206a41086a200141296a2900003703002002200141216a290000370320200141cc006a2802002203ad2207421b88a70d092007420586a72204417f4c0d09200141d8006a2903002107200141d0006a2903002108200141c4006a28020021012004450d062004102622050d0720044101102a000b200241026a200141076a2d00003a0000200241206a41086a200141146a290000370300200241306a2001411c6a290000370300200241386a200141246a2d00003a00002002200141056a2f00003b010020022001410c6a290000370320200141086a2800002105410021040b200141306a2802002203417f4c0d07200141c0006a2903002107200141386a2903002108200141c8006a2903002109024002402003450d00200141286a2802002106200310262201450d0c2001200620031094041a0c010b410121010b200041c0006a2007370300200041386a2008370300200041056a20022f01003b0000200041046a20043a0000200041086a20053602002000410c6a2002290320370200200041c8006a2009370300200041306a20033602002000412c6a2003360200200041286a2001360200200041076a200241026a2d00003a0000200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a280200360200200041033a0000200241c0006a24000f0b410121010b20002002290320370001200041043a0000200041386a2007370300200041306a2008370300200041c0006a20093703002000412c6a2003360200200041286a2003360200200041246a2001360200200041096a200241286a290300370000200041116a200241306a290300370000200041196a200241386a290300370000200241c0006a24000f0b410121010b200041023a00002000410c6a2003360200200041086a2003360200200041046a2001360200200041106a2007370300200241c0006a24000f0b410121050b2005200120034105741094042101200041d8006a2007370300200041d0006a2008370300200041196a200241186a290300370000200041116a200241106a290300370000200041096a200241086a29030037000020002002290300370001200041216a2002290320370000200041296a200241206a41086a290300370000200041316a200241206a41106a290300370000200041396a200241206a41186a290300370000200041cc006a2003360200200041c8006a2003360200200041c4006a2001360200200041063a0000200241c0006a24000f0b41a48fc300104f000b101d000b20034101102a000b20034101102a000b20034101102a000b940d03047f017e057f230041206b220224000240024002400240024002400240024020012d0000417f6a2203410c4b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0d0008050602090a070c040b0103000b41012103200141046a2d00004101470d0c200141086a28020021040c0d0b2000410c3a0000200041046a200141046a280200360200200241206a24000f0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a280200360200200241206a24000f0b2001410c6a2802002205ad2206421b88a70d122006420586a72203417f4c0d12200141046a28020021072003450d0d200310262208450d132005450d0e0c170b2000410a3a0000200041046a200141046a280200360200200241206a24000f0b200041033a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b200041043a0000200241206a24000f0b200041083a0000200020012d00013a0001200241206a24000f0b200041023a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b2001410c6a280200220aad42247e2206422088a70d0c2006a72204417f4c0d0c200141046a28020021032004450d0920041026220b450d0e200a450d0a0c0f0b200041073a0000200241206a24000f0b2000410b3a0000200241206a24000f0b41012103200141046a2d00004101470d02200141086a28020021010c030b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030b200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041286a200141286a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141016a2d00002101200041013a0000200020013a0001200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030b200041093a0000200041056a20022f011c3b0000200041046a20033a0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b4101210820050d090b41002105410021010c090b4104210b200a0d050b410021040c050b41e89dc100104f000b101d000b20034101102a000b20044104102a000b200a41246c2105410021042002411e6a2109200b210103400240024020032d00004101470d00200341046a2802002107410121080c010b2009200341036a2d00003a0000200341046a2800002107200341016a2f00002108200241186a200341206a2d00003a0000200241106a200341186a290000370300200241086a200341106a290000370300200220083b011c2002200341086a290000370300410021080b200341246a2103200120083a0000200141046a2007360200200141036a20092d00003a0000200141016a20022f011c3b0000200141206a200241186a280200360200200141186a200241106a290300370200200141106a200241086a290300370200200141086a2002290300370200200141246a2101200441016a21042005415c6a22050d000b0b200041063a00002000410c6a2004360200200041086a200a360200200041046a200b360200200241206a24000f0b20054105742104416020076b21092008210120072103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200720054105746a20096a41057641016a21010b2000410d3a00002000410c6a2001360200200041086a2005360200200041046a2008360200200241206a24000b0a00419896c400104f000bd9b40107027f027e017f017e0f7f017e077f230041b0066b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410f4b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e10000a0608030b0d0910050e02040c0107000b200141106a2903002105200141086a2903002106200141046a28020021072002411a6a2901002108200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d1e200320083702f403200320093a00f3032003200a3a00f2032003200b3b01f003410121020c1f0b200141216a2d0000210b200341186a41186a200141196a290000370300200341186a41106a200141116a290000370300200341186a41086a200141096a290000370300200320012900013703182002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d0f200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c100b200341d8006a41186a200141196a290000370300200341d8006a41106a200141116a290000370300200341d8006a41086a200141096a29000037030020032001290001370358200241166a2f01002104200241186a2d00002116200241196a2d000021072002411a6a290100210820022d0000450d11200320083702f403200320073a00f303200320163a00f203200320043b01f0030c230b2002410c6a280200210a200241086a280200210b200241046a2802002115200141106a2903002105200141086a2903002108200141046a2802002117200241036a2d0000211620022d0000210420012d0001210920022f00012107200341f0036a41086a2002411c6a2802003602002003200241146a2902003703f0032004450d1141012102201541ff01710d12200b200a4f0d130c120b2002411a6a2901002108200241196a2d00002116200241186a2d00002107200241166a2f0100211720022d0000450d14200320083702f403200320163a00f303200320073a00f203200320173b01f0030c210b20022d000120022d0000720d09200141046a28020010350c98010b2002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100211720022d0000450d13200320083702f403200320043a00f303200320163a00f203200320173b01f0030c1f0b2002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f0100211320022d0000450d13200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c140b2002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100210720022d0000450d15200320083702f403200320043a00f303200320163a00f203200320073b01f0030c1d0b200141046a280200210741ef94c4002104410e211620022d0000450d9101200241046a2d00000d9101200241086a28020041036c2002410c6a280200410174490d910120034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d37419fc1c0002104411521160c91010b200141046a280200210b2002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d17200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c180b41ef94c4002104410e21164101210720022d0000450d8d01200241046a2d00000d8d0141012107200241086a28020041036c2002410c6a280200410174490d8d01200341e8026a200141046a2802002216103820032802f002410e470d3441cac2c0002104410d21160c8d010b200341e8056a41186a200141196a290000370300200341e8056a41106a200141116a290000370300200341e8056a41086a200141096a290000370300200320012900013703e8052002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100210720022d0000450d18200320083702f403200320043a00f303200320163a00f203200320073b01f0030c190b200141046a280200210741ef94c4002104410e211620022d0000450d8c01200241086a2802004101742002410c6a280200490d8c01200241046a28020041ff01710d8c0120034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d25419fc1c0002104411521160c8c010b20022d000120022d000072450d180b41b394c3002104412821160c92010b200341e0056a200141196a290000370300200341c8056a41106a200141116a290000370300200341c8056a41086a200141096a290000370300200320012900013703c805024020022d0000450d00200241236a2d00002116200241216a2f000021072002411f6a2d000021172002411d6a2f000021152002410f6a2d000021092002410d6a2f0000210a2002410b6a2d0000210b200241096a2f0000210c200241076a2d0000210d200241056a2f0000210e200241246a3502002106200241206a3100002118200241116a2900002108200241106a2d0000210f2002410c6a2d00002110200241086a2d00002111200241046a2d000021042003200241196a2800003602f803200320083703f0032004450d00200320032902f40322054238883c00ff05200320054230883c00fe05200320054220883d01fc05200320054218883c00fb05200320054210883c00fa05200320053d01f8052003200f3a00f3052003200a2009411074724108742010723600ef052003200c200b411074724108742011723600eb05200320083d01f405200320084218883c00f7052003200e200d4110747222023b01e805200320024110763a00ea0520032008a74110763a00f605200320184218862015201741107472ad42ffffff0783842007201641107472ad42ffffff0783422086842006423886843703800620034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d212003421037028c062003200341a8056a36028806200341e8026a20034188066a102f20032802e802410e460d4c200341d8006a200341e8026a41f0001094041a200341003a00af06200328028806200328028c06200341af066a410120034190066a22022802001001210420022002280200200441016a41014b22046a3602002004450d4b20032d00af0641034f0d4b20032802582102200341e0016a200341d8006a41047241ec001094041a2002410e460d4c200341f0036a200341e0016a41ec001094041a200320023602e802200341e8026a410472200341f0036a41ec001094041a2003410036026020034201370358200341e8026a200341d8006a1039200328025c2104200328026021072003280258210220034188066a41186a221742003703004110211620034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002200720034188066a1002200341d8006a41186a2017290300370300200341d8006a41106a2015290300370300200341d8006a41086a2009290300370300200320032903880637035802402004450d00200210230b200341c8056a200341d8006a41201096042102200341e8026a10244181c2c000210420020d8801200341e8026a200341c8056a105820032802f002220b450d364100210220032902f4022208422088a72204450d37024020044101460d004100210203402004410176221620026a22072002200b20074105746a200341e8056a41201096044101481b2102200420166b220441014b0d000b0b200b20024105746a200341e8056a41201096042204450d442004411f7620026a21020c370b41ef94c4002104410e21160c87010b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b41db94c300210441002107412a2117410021160b200741ffff0371410874201741ff017172201641187472211620020d84012003200837038005200320153a00ff04200320093a00fe042003200a3b01fc042003200c3a00fb042003200d3a00fa042003200e3b01f8042003200f3a00f704200320103a00f604200320113b01f404200320123a00f304200320163600ef04200320043600eb04200320133a00ea04200320143b01e80420034188056a41186a20032903800537030020034188056a41106a20032903f80437030020034188056a41086a200341e8046a41086a290300370300200320032903e80437038805200341e0016a41186a200341186a41186a290300370300200341e0016a41106a200341186a41106a290300370300200341e0016a41086a200341186a41086a2903003703002003200b3a008002200320032903183703e001411510262202450d432002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d4420022003290388053700152002412d6a20034188056a41186a290300370000200241256a20034188056a41106a2903003700002002411d6a20034188056a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d172003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322044102460d4a200341386a41186a200341a2036a290100370300200341386a41106a2003419a036a290100370300200341386a41086a20034192036a290100370300200341d8006a41086a200341b3036a290000370300200341d8006a41106a200341bb036a290000370300200341d8006a41186a200341c3036a2900003703002003200329018a033703382003200341ab036a290000370358200341aa036a2d000021070c82010b200241026a2f01002115200241046a2d00002109200241056a2d0000210a200241066a2f0100210b200241086a2d0000210c200241096a2d0000210d2002410a6a2f0100210e2002410c6a2d0000210f2002410d6a2d000021102002410e6a2f01002111200241106a2d00002112200241116a2d00002113200241126a2f01002114200241146a2d00002119200241156a2d0000211a20022d00012102200320083703f003200241ff01714101470d11410f10262202450d4f200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d502002200329035837000f200241276a200341d8006a41186a221c2903003700002002411f6a200341d8006a41106a221d290300370000200241176a200341d8006a41086a221e29030037000020034188066a41186a2217420037030020034188066a41106a221b420037030020034188066a41086a221f420037030020034200370388062002412f20034188066a1002200341f0036a41186a2017290300370300200341f0036a41106a201b290300370300200341f0036a41086a201f29030037030020032003290388063703f003200341f0036a412041a886c5004100410010012117200210232017417f460d284191c2c0002104410f21160c83010b410021020b200220072016411074727241ff0171450d00201710244128211641b394c30021040c010b4200210620034188066a41086a22024200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200229030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d3f20032903e80221060b200341e8026a201741f0001094041a200341d8006a2006200842c0ca01200842c0ca01561b7c200341e8026a20092005102d4101210720032802584101470d10200328025c2204450d10200341d8006a41086a28020021160b201710234100211541012107410121170c84010b200241156a2d00002115200241146a2d00002109200241126a2f0100210a200241116a2d0000210b200241106a2d0000210c2002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d00002111200241086a2d00002112200241066a2f01002113200241056a2d00002114200241046a2d00002119200241026a2f0100211a20022d00012102200320083703f003200241ff01714101470d0c410f10262202450d4c41002104200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d4d20022008370027200220163a0026200220073a0025200220173b0023200220153a0022200220093a00212002200a3b001f2002200b3a001e2002200c3a001d2002200d3b001b2002200e3a001a20022010410874201172200f4118747236001620022013410874201472201241187472360012200220193a00112002201a3b000f20034188066a41186a2216420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002412f20034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a41201003200210230c85010b200241156a2d00002115200241146a2d00002109200241126a2f0100210a200241116a2d0000210b200241106a2d0000210c2002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d00002111200241086a2d00002112200241066a2f01002113200241056a2d00002114200241046a2d00002119200241026a2f0100211a200141026a2d0000211b200141046a280200211f20022d0001210220012d0001211c200320083703f00341012107200241ff01714101470d0b2003200837038003200320043a00ff02200320163a00fe02200320173b01fc02200320153a00fb02200320093a00fa022003200a3b01f8022003200b3a00f7022003200c3a00f6022003200d3b01f4022003200e3a00f302200320193a00ea022003201a3b01e80220032010410874200f411874722011723600ef02200320134108742014722012411874723600eb02200341e8026a201f201c41ff0171410047201b105a2104412221160c7e0b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002114200241066a2f01002119200241056a2d0000211a20022d00012104200320083703f00341012102200441ff01714101470d002019410874201a722014411874722104410021020c010b41db94c300210441002107412a2117410021160b200741ffff0371410874201741ff017172201641187472211620020d7a2003200837038005200320153a00ff04200320093a00fe042003200a3b01fc042003200b3a00fb042003200c3a00fa042003200d3b01f8042003200e3a00f7042003200f3a00f604200320103b01f404200320113a00f304200320163600ef04200320043600eb04200320123a00ea04200320133b01e804411510262202450d3b2002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d3c200220032903e8043700152002412d6a200341e8046a41186a290300370000200241256a200341e8046a41106a2903003700002002411d6a200341e8046a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341f0036a412041a886c5004100410010012104200210232004417f460d0f411510262202450d412002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d42200220032903e8043700152002412d6a200341e8046a41186a290300370000200241256a200341e8046a41106a2903003700002002411d6a200341e8046a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d162003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322164102460d45200341d8006a41086a20034192036a290100370300200341d8006a41106a2003419a036a290100370300200341d8006a41186a200341a2036a290100370300200341e0016a41086a200341b3036a290000370300200341e0016a41106a200341bb036a290000370300200341e0016a41186a200341c3036a2900003703002003200329018a033703582003200341ab036a2900003703e001200341aa036a2d0000211720032d0088032115200341f0036a412010030c170b200141026a2d0000211a200141046a280200211b20012d0001211f200241156a2d00002117200241146a2d00002115200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002114200241026a2f0100211920022d00012102200320083703f003200241ff01714101470d0720032008370370200320043a006f200320163a006e200320073b016c200320173a006b200320153a006a200320093b01682003200a3a00672003200b3a00662003200c3b01642003200d3a0063200320143a005a200320193b01582003200f410874200e4118747220107236005f2003201241087420137220114118747236005b200341e8026a200341d8006a104220032d00e8024101470d17200341f4026a2d00002102200341f5026a2900002108200341fd026a280000210420032f00e902211620032d00eb02210720032902ec022105200320034181036a29000037038003200320043602fc02200320083702f402200320023a00f302200320053700eb02200320073a00ea02200320163b01e802200341e8026a201b201f41ff0171410047201a105a2104412221160c790b2002410c6a2d000021162002410a6a2f01002117200241096a2d00002115200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b412a21154100211641db94c3002104410021170b201741ffff0371410874201641187472201541ff017172211620020d0820032008370370200320093a006f2003200a3a006e2003200b3b016c2003200c3a006b2003200d3a006a2003200e3b01682003200f3a0067200320103a0066200320113b0164200320123a00632003201636005f2003200436005b200320133a005a200320143b0158200642ffffe883b1de165620054200522005501b0d0741f0bfc0002104410d21160c080b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b412a21174100211641db94c3002104410021070b200741ffff0371410874201641187472201741ff017172211620020d7320032008370370200320153a006f200320093a006e2003200a3b016c2003200c3a006b2003200d3a006a2003200e3b01682003200f3a0067200320103a0066200320113b0164200320123a00632003201636005f2003200436005b200320133a005a200320143b0158200341e8026a200b102220032802f8022217450d0720034184036a2802002116200341e8026a41186a280200210420032802fc022102200341106a200341d8006a20032902ec02220842208620033502e802842205200341f4026a3502004220862008422088842208105b2003280210450d0d41d4c0c0002104411a21162002450d73201710230c730b200241156a2d00002117200241146a2d00002115200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002114200241026a2f0100211920022d00012102200320083703f003200241ff01714101470d00200320083703f801200320043a00f701200320163a00f601200320073b01f401200320173a00f301200320153a00f201200320093b01f0012003200a3a00ef012003200b3a00ee012003200c3b01ec012003200d3a00eb01200320143a00e201200320193b01e0012003200f410874201072200e411874723600e701200320124108742013722011411874723600e301200341e8026a200341e8056a104220032d00e8024101470d12200341f4026a2d00002102200341f5026a2900002108200341fd026a280000210420032f00e902211620032d00eb02210720032902ec022105200320034181036a2900003703702003200436026c20032008370264200320023a00632003200537005b200320073a005a200320163b015841a0c2c0002104200341d8006a200341e0016a41201096040d13200341e8026a41186a200341e8056a41186a290300370300200341e8026a41106a200341e8056a41106a290300370300200341e8026a41086a200341e8056a41086a290300370300200320032903e8053703e802410f10262202450d5c41002104200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d5d200220032903e80237000f200241276a200341e8026a41186a2903003700002002411f6a200341e8026a41106a290300370000200241176a200341e8026a41086a29030037000020034188066a41186a2216420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002412f20034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a41201003200210230c790b41db94c3002104412a21160c710b200141086a2802002107200141046a2802002102200341d8006a200141106a29030022081036200328025821162003280260220420024d0d062016200241f8006c6a2217280200410e460d072016200241f8006c6a41f0006a2802002007470d07201710242017410e360200200341e8026a41086a200341d8006a41086a280200360200200320032903583703e802411710262202450d572002410f6a41002900cb8740370000200241086a41002900c48740370000200241002900bc874037000020024117412e10272202450d582002200837001720034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002411f20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341203602e4012003200341f0036a3602e001200341e8026a200341e0016a105c2002102320032802e8022116024020032802f0022202450d00200241f8006c210420162102034002402002280200410e460d00200210240b200241f8006a2102200441887f6a22040d000b0b20032802ec02450d76201610230c760b2017102341002115410121170c210b200341086a200341d8006a20062005105b2003280208450d0d41fdbfc0002104411a21160b2007102420071023410021094101210741012117410121150c760b200442003703002007420037030020034188066a41086a22174200370300200342003703880641e687c000411d20034188066a1002200341e8026a41186a2004290300370300200341e8026a41106a2007290300370300200341e8026a41086a201729030037030020032003290388063703e802200341e8026a412041a886c500410041001001417f460d1020034188046a420037030020034180046a4200370300200341f0036a41086a4200370300200342003703f003200341e8026a4120200341f0036a4120410010012204417f460d362004411f4d0d36200341a8056a41186a2204200341f0036a41186a290300370300200341a8056a41106a2207200341f0036a41106a290300370300200341a8056a41086a2217200341f0036a41086a290300370300200320032903f0033703a805200341c8056a41186a2004290300370300200341c8056a41106a2007290300370300200341c8056a41086a2017290300370300200320032903a8053703c805411510262204450d3d2004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272207450d3e200720032903c8053700152007412d6a200341c8056a41186a290300370000200741256a200341c8056a41106a2903003700002007411d6a200341c8056a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2217420037030020034188066a41086a2215420037030020034200370388062007413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2017290300370300200341f0036a41086a201529030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d3f200342203702ec052003200341f0036a3602e805200341e8026a200341e8056a105920032d00890322094102460d4020034188066a41186a2204200341e8026a41186a29030037030020034188066a41106a2215200341e8026a41106a29030037030020034188066a41086a2217200341e8026a41086a290300370300200320032903e8023703880620032d008803210a200341d8006a2003418a036a220c41c1001094041a200341e8056a41186a220b2004290300370300200341e8056a41106a220d2015290300370300200341e8056a41086a220e201729030037030020032003290388063703e805200320093a00e802200341e8026a410172200341d8006a41c1001094041a200341d8006a41186a2209200b290300370300200341d8006a41106a220b200d290300370300200341d8006a41086a220d200e290300370300200320032903e80537035820032d008903210e20044200370300201542003703002017420037030020034200370388062007413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2015290300370300200341f0036a41086a201729030037030020032003290388063703f00320034201370388062003410036029006412010262204450d41200342a0808080800437028c06200320043602880620042003290358370000200441086a200d290300370000200441106a200b290300370000200441186a2009290300370000200a20034188066a103f200341013a00af06200328028c0620172802002217470d13201741016a22042017490d6520174101742215200420042015491b22154100480d652017450d212003280288062017201510272204450d220c630b41b0c0c0002104412421160c6b0b41abc2c0002104410d21160c6a0b2004450d010b200441f8006c210420162102034002402002280200410e460d00200210240b200241f8006a2102200441887f6a22040d000b0b0240200328025c450d00201610230b41b8c2c0002104411221160c670b4114211641edc1c00021040c660b200341386a41186a200341d8006a41186a290300370300200341386a41106a2207200341d8006a41106a290300370300200341386a41086a2215200341d8006a41086a2903003703002003200329035837033820022004470d0b200241016a22092002490d5e2002410174220a20092009200a491b2209ad4205862206422088a70d5e2006a7220a4100480d5e2002450d1820172002410574200a102722170d190c4b0b200341003602f002200342013703e8022007200341e8026a103920032802ec02211620032802f002211720032802e802210420034188066a41186a2215420037030020034188066a41106a220942003703002002420037030020034200370388062004201720034188066a1002200341d8006a41186a22172015290300370300200341d8006a41106a2009290300370300200341d8006a41086a2002290300370300200320032903880637035802402016450d00200410230b200341e8026a41186a2017290300370300200341e8026a41106a200341d8006a41106a290300370300200341e8026a41086a200341d8006a41086a290300370300200320032903583703e802200341e0016a200341e8026a105820032802e8012202450d0620032903e00121054200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200429030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d2a20032903e80221080b0240200341ec016a280200450d00200210230b200820055a0d064185c1c0002104411a21160c660b410221160b200341a8056a41186a200341d8006a41186a290300370300200341a8056a41106a200341d8006a41106a290300370300200341a8056a41086a2207200341d8006a41086a29030037030020034188056a41086a2204200341e0016a41086a29030037030020034188056a41106a200341e0016a41106a29030037030020034188056a41186a200341e0016a41186a290300370300200320032903583703a805200320032903e00137038805200210234100210220164102460d55200341e8056a41186a200341a8056a41186a290300370300200341e8056a41106a200341a8056a41106a290300370300200341e8056a41086a2007290300370300200341c8056a41086a2004290300370300200341c8056a41106a20034188056a41106a290300370300200341c8056a41186a20034188056a41186a290300370300200320032903a8053703e80520032003290388053703c805410021020240201741ff01714101470d00411510262202450d3a2002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d3b200220032903c8053700152002412d6a200341e0056a290300370000200241256a200341d8056a2903003700002002411d6a200341c8056a41086a2903003700000b20164101470d05411510262204450d3b2004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272204450d3c200420032903e8053700152004412d6a200341e8056a41186a290300370000200441256a200341e8056a41106a2903003700002004411d6a200341e8056a41086a29030037000020034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062004413520034188066a1002200341f0036a41186a2009290300370300200341f0036a41106a200a290300370300200341f0036a41086a200b29030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d3d2003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322094102460d3e200341d8006a41206a200341e8026a41206a2d00003a0000200341d8006a41186a220a200341e8026a41186a290300370300200341d8006a41106a220b200341e8026a41106a290300370300200341d8006a41086a220c200341e8026a41086a220d290300370300200320032903e802370358200341e0016a200341e8026a41226a41c1001094041a200341d8006a41226a20032900e00137010020034182016a200341e0016a41086a2900003701002003418a016a200341e0016a41106a29000037010020034192016a200341e0016a41186a290000370100200320093a00792003419a016a20173a00002003419b016a20032903c805370000200341a3016a200341c8056a41086a290300370000200341ab016a200341c8056a41106a290300370000200341b3016a200341c8056a41186a29030037000020034188066a41186a2217420037030020034188066a41106a2209420037030020034188066a41086a220e420037030020034200370388062004413520034188066a1002200341f0036a41186a2017290300370300200341f0036a41106a2009290300370300200341f0036a41086a200e29030037030020032003290388063703f003200341003602f002200342013703e802412010262217450d3f20172003290358370000201741086a200c290300370000201741106a200b290300370000201741186a200a290300370000200342a080808080043702ec02200320173602e80220032d0078200341e8026a103f200341f9006a200341e8026a105d20032802ec022117200341f0036a412020032802e8022209200d280200100402402017450d00200910230b20041023410121172002450d0d0c520b4194bac2002104410b21160c610b20034188066a41086a2202420037030020034200370388064197c0c000411920034188066a1000200341a8056a41086a200229030037030020032003290388063703a805410021160240200341a8056a411041a886c500410041001001417f460d00200341003602e802200341a8056a4110200341e8026a41044100100141016a41044d0d2a20032802e80221160b20034188066a41086a2204420037030020034200370388064197c0c000411920034188066a1000200341a8056a41086a2217200429030037030020032003290388063703a8052003201641016a3602e802200341a8056a4110200341e8026a41041004412010262202450d3620022003290358370000200341fc026a428180808010370200200241186a200341d8006a41186a290300370000200241106a200341d8006a41106a290300370000200241086a200341d8006a41086a290300370000200320063703e802200320023602f802200320053703f0022016200341e8026a105e20044200370300200342003703880641fc88c000411520034188066a10002017200429030037030020032003290388063703a80541002102200341a8056a411041a886c500410041001001417f460d0c200342103702e4012003200341a8056a3602e001200341e8026a200341e0016a102020032802e8022217450d43200341f0026a280200210220032802ec0221150c0d0b4194bac20021040b410b21160c5e0b200341e8026a200741f0001095041a41002117200341003a00d80320034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a105f200341e8026a102420071023410121070c0e0b20034188066a41186a2204420037030020034188066a41106a2209420037030020034188066a41086a220a4200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2009290300370300200341f0036a41086a200a29030037030020032003290388063703f003201741ff01714101470d06412010262204450d45200420032903c805370000200441186a200341c8056a41186a290300370000200441106a200341c8056a41106a290300370000200441086a200341c8056a41086a290300370000200341f0036a412020044120100420041023410021044100211720020d4c0c070b20034188066a41186a2204420037030020034188066a41106a2207420037030020174200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003412010262204450d3a2004200329038805370000200441186a20034188056a41186a290300370000200441106a20034188056a41106a290300370000200441086a20034188056a41086a290300370000200341f0036a412020044120100420041023410021070c580b200341e8026a41186a201c290300370300200341e8026a41106a201d290300370300200341e8026a41086a201e290300370300200320032903583703e802410f10262202450d3a200241076a41002900a78640370000200241002900a086403700002002410f412f10272217450d3b201720032903e80237000f201741276a200341e8026a41186a2903003700002017411f6a200341e8026a41106a290300370000201741176a200341e8026a41086a29030037000020034188066a41186a2202420037030020034188066a41106a221b420037030020034188066a41086a221f420037030020034200370388062017412f20034188066a1002200341f0036a41186a2002290300370300200341f0036a41106a201b290300370300200341f0036a41086a201f29030037030020032003290388063703f003412010262202450d3c20022008370018200220073a0017200220163a0016200220043b00142002201a3a0013200220193a0012200220143b0010200220133a000f200220123a000e200220113b000c200220103a000b2002200e410874200d72200f411874723600072002200b410874200a72200c41187472360003200220093a0002200220153b0000200341f0036a41202002412010042002102320171023410021040c5a0b200221090c0d0b4101211520032802880621040c500b20032802e8022102200341e0016a200341e8026a4104724184011094041a20032002360258200341d8006a410472200341e0016a4184011094041a200341003602f002200342013703e802200341d8006a41086a2217200341e8026a103920032802ec02210420032802f002211520032802e802210220034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062002201520034188066a1002200341e0016a41186a22152009290300370300200341e0016a41106a2209200a290300370300200341e0016a41086a220a200b29030037030020032003290388063703e00102402004450d00200210230b200341e8026a41186a2015290300370300200341e8026a41106a2009290300370300200341e8026a41086a200a290300370300200320032903e0013703e802411710262202450d3b2002410f6a41002900fdc040370000200241086a41002900f6c040370000200241002900eec04037000020024117413710272202450d3c200220032903e8023700172002412f6a200341e8026a41186a220a290300370000200241276a200341e8026a41106a220b2903003700002002411f6a200341e8026a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002413720034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2015290300370300200341f0036a41086a200929030037030020032003290388063703f003200341f0036a412041a886c5004100410010012104200210232004417f460d0e2017102441d7c2c0002104412521160c580b200341003602f002200342013703e8022007200341e8026a103920032802ec02211620032802f002211720032802e802210420034188066a41186a2215420037030020034188066a41106a220942003703002002420037030020034200370388062004201720034188066a1002200341d8006a41186a22172015290300370300200341d8006a41106a2009290300370300200341d8006a41086a2002290300370300200320032903880637035802402016450d00200410230b200341e8026a41186a2017290300370300200341e8026a41106a200341d8006a41106a290300370300200341e8026a41086a200341d8006a41086a290300370300200320032903583703e802200341e0016a200341e8026a105820032802e8012202450d0620032903e00121054200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200429030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d2720032903e80221080b0240200341ec016a280200450d00200210230b200820055a0d064185c1c0002104411a21160c590b200341f0036a41201003410021044100211720020d450b41002116201720044572450d450c460b41082117410021150b200341e8026a2007104e200341386a41186a2209200341d8006a41186a290300370300200341386a41106a220a200341d8006a41106a290300370300200341386a41086a220b200341d8006a41086a2903003703002003200329035837033820152002470d41200241016a22042002490d4b20024101742215200420042015491b2215ad4298017e2208422088a70d4b2008a722044100480d4b2002450d0a201720024198016c200410272217450d0b0c410b410021024101210b420021080b200341e8026a41186a200341e8056a41186a290300370300200341e8026a41106a200341e8056a41106a290300370300200341e8026a41086a200341e8056a41086a290300370300200320032903e8053703e80220022008422088a722044b0d2e20042008a7470d3e200441016a22162004490d4920044101742207201620162007491bad22084205862205422088a70d492005a722164100480d492004450d0a200b200441057420161027220b450d0b0c3e0b200341e8026a200741f0001095041a200341023a00d80320034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a105f200341e8026a10242007102341002107410121170b410121150b41012109410021040c560b200a10262217450d320b201720044105746a22022003290338370000200241186a200341386a41186a290300370000200241106a2007290300370000200241086a201529030037000041012107200341e8026a41186a200441016a360200200341fc026a2009360200200320083703f002200320053703e8022003201636028403200320173602f802200b200341e8026a105e410021040c530b2015102622040d410b20154101102a000b200a200341e0016a41186a290300370300200b200341e0016a41106a290300370300200341e8026a41086a200341e0016a41086a290300370300200320032903e0013703e802200341013a00e805411710262202450d34410021042002410f6a41002900fdc040370000200241086a41002900f6c040370000200241002900eec04037000020024117413710272202450d35200220032903e8023700172002412f6a200341e8026a41186a290300370000200241276a200341e8026a41106a2903003700002002411f6a200341e8026a41086a29030037000020034188066a41186a2207420037030020034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002413720034188066a1002200341f0036a41186a2007290300370300200341f0036a41106a2015290300370300200341f0036a41086a200929030037030020032003290388063703f00341012107200341f0036a4120200341e8056a410110042002102320161035201710240c500b2004102622170d360b20044108102a000b20161026220b0d330b20164101102a000b41b4c1c0002104412621162008a7450d43200b10230c430b200341fc026a41013602002003410136025c2003418898c400360258200342013702ec02200341d497c4003602e8022003200341d8006a3602f802200341e8026a41e0bfc0001061000b41d4aac10041331021000b41154101102a000b41354101102a000b41154101102a000b41354101102a000b200341d8006a10240b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41154101102a000b41354101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b410f4101102a000b412f4101102a000b410f4101102a000b412f4101102a000b41d4aac10041331021000b41154101102a000b41354101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b41204101102a000b41154101102a000b41354101102a000b41154101102a000b41354101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b4180e4c400104f000b41204101102a000b410f4101102a000b412f4101102a000b41204101102a000b41d4aac10041331021000b41174101102a000b41374101102a000b200a4101102a000b41174101102a000b412e4101102a000b41204101102a000b410f4101102a000b412f4101102a000b41174101102a000b41374101102a000b200b20024105746a221641206a2016200420026b4105741095041a201641186a200341e8026a41186a290300370000201641106a200341e8026a41106a290300370000201641086a200341e8026a41086a290300370000201620032903e80237000020034188066a41086a22024200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200229030037030020032003290388063703a8050240024002400240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d0220032903e8024280e90f7c21054101211641132107411310262202450d010c030b4280e90f210541012116411321074113102622020d020b20072016102a000b41d4aac10041331021000b2002410f6a41002800e9c140360000200241086a41002900e2c140370000200241002900dac140370000024002402002200741331027220c450d00200c20032903c805370013200c412b6a200341c8056a41186a290300370000200c41236a200341c8056a41106a290300370000200c411b6a200341c8056a41086a29030037000020034188066a41186a2202420037030020034188066a41106a2207420037030020034188066a41086a221742003703002003420037038806200c413320034188066a1002200341f0036a41186a2002290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341003602f002200342013703e802410810262202450d01200220053700002003428880808080013702ec02200320023602e8022003200420166a2202360258200341d8006a200341e8026a10410240024002402002450d00200441057441206a21154100200341e8026a41086a28020022046b210720032802e802210920032802ec022117200b210203400240201720076a411f4b0d00200441206a22162004490d112017410174220a20162016200a491b22164100480d11024002402017450d00200920172016102722090d010c060b201610262209450d050b201621170b200920046a22162002290000370000201641186a200241186a290000370000201641106a200241106a290000370000201641086a200241086a290000370000200741606a2107200441206a2104200241206a2102201541606a22150d000b200341f0026a2004360200200320173602ec02200320093602e8020c010b200341f0026a280200210420032802ec02211720032802e80221090b2008a72102200341f0036a412020092004100402402017450d00200910230b200c102302402002450d00200b10230b200341e8026a41086a410a3a0000200341f1026a20032903e80537000020034191036a20032903c805370000200341f9026a200341e8056a41086a29030037000020034181036a200341e8056a41106a29030037000020034189036a200341e8056a41186a29030037000020034199036a200341c8056a41086a290300370000200341a1036a200341c8056a41106a290300370000200341a9036a200341c8056a41186a290300370000200341053a00e802200341b8036a20053703004100210441a886c5004100200341e8026a102c20034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411010030c1b0b20164101102a000b41334101102a000b41084101102a000b201720024198016c220c6a200341e8026a41f000109404220420163602702004418c016a200929030037020020044184016a200a290300370200200441fc006a200b290300370200200420032903383702742003200241016a22023602f002200320153602ec02200320173602e80220034188066a41086a22044200370300200342003703880641fc88c000411520034188066a1000200341a8056a41086a200429030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a102502402002450d00200c4198016a21042017210203402002102420024198016a2102200441e87e6a22040d000b0b02402015450d00201710230b20034180036a2005370300200341f8026a2006370300200341f4026a201636020041002109200341f0026a41003a0000200341053a00e80241a886c5004100200341e8026a102c2007102420071023410121074101211741012115410021040c190b20034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062002413520034188066a1002200341f0036a41186a2009290300370300200341f0036a41106a200a290300370300200341f0036a41086a200b29030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d032003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d0089034102460d04200341d8006a41206a200341e8026a41206a2d00003a0000200341d8006a41186a2209200341e8026a41186a290300370300200341d8006a41106a220a200341e8026a41106a290300370300200341d8006a41086a220b200341e8026a41086a220c290300370300200320032903e802370358200341e0016a200341e8026a41226a41c1001094041a200341d8006a41226a200341e0016a41c10010940420032903e80537010020034182016a200341e8056a41086a2903003701002003418a016a200341e8056a41106a29030037010020034192016a200341e8056a41186a290300370100200320163a007920034188066a41186a2216420037030020034188066a41106a220d420037030020034188066a41086a220e420037030020034200370388062002413520034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a200d290300370300200341f0036a41086a200e29030037030020032003290388063703f003200341003602f002200342013703e802412010262216450d0520162003290358370000201641086a200b290300370000201641106a200a290300370000201641186a2009290300370000200342a080808080043702ec02200320163602e80220032d0078200341e8026a103f200341f9006a200341e8026a105d20032802ec022116200341f0036a412020032802e8022209200c280200100402402016450d00200910230b20021023410121162017200445720d010b200410230b02402002452016720d00200210230b201521020b4200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a10002007200429030037030020032003290388063703a80502400240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d0120032903e80221080b200342e4cab5fbb6ccdcb0e300370338200341386a200341e8046a427f427f200241187441187541027441a8f9c4006a3502004280e90f7e20087c41021062200341e8026a41086a41093a0000200341e8026a41096a20032903e804370000200341f9026a200341e8046a41086a29030037000020034181036a200341e8046a41106a29030037000020034189036a200341e8046a41186a290300370000200341053a00e8024100210441a886c5004100200341e8026a102c0c140b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b2003201536028c06200320043602880620032d00af0621150b20034188066a41086a2209201741016a360200200420176a20153a000002400240024002400240200328028c06220a200928020022156b411f4b0d00201541206a22172015490d05200a410174220b20172017200b491b22174100480d05200a450d012004200a201710272204450d020c030b200a21170c030b2017102622040d010b20174101102a000b2003201736028c0620032004360288060b2009201541206a220b360200200420156a220941086a20034188056a41086a290300370000200941106a20034188056a41106a290300370000200941186a20034188056a41186a290300370000200920032903880537000002400240024002400240024002400240024002400240200c4100200e4101461b2209450d004101210c200341013a00af062017200b470d01201741016a220a2017490d0b2017410174220c200a200a200c491b220a4100480d0b2017450d0320042017200a10272204450d040c090b41002109200341003a00af062017200b470d01201741016a22092017490d0a2017410174220a20092009200a491b220c4100480d0a2017450d0420042017200c10272204450d050c060b2017210a0c080b2017210c0c050b200a102622040d050b200a4101102a000b200c102622040d010b200c4101102a000b2003200c36028c06200320043602880620032d00af0621090b20034190066a201541216a22153602002004200b6a20093a00000c050b2003200a36028c06200320043602880620032d00af06210c0b20034188066a41086a220d201541216a3602002004200b6a200c3a0000024002400240200a200d28020022176b411f4b0d00201741206a22152017490d03200a410174220b20152015200b491b220c4100480d03200a450d012004200a200c10272204450d020c040b200a210c0c040b200c102622040d020b200c4101102a000b101e000b2003200c36028c0620032004360288060b200d201741206a2215360200200420176a221741086a200941086a290000370000201741106a200941106a290000370000201741186a200941186a290000370000201720092900003700000b200341f0036a41202004201510040240200c450d00200410230b2007102320034188066a41186a2204420037030020034188066a41106a2207420037030020034188066a41086a22174200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003412010262204450d022004200329038805370000200441186a20034188056a41186a290300370000200441106a20034188056a41106a290300370000200441086a20034188056a41086a290300370000200341f0036a412020044120100420041023200341d8006a41186a200341c8056a41186a290300370300200341d8006a41106a200341c8056a41106a290300370300200341d8006a41086a200341c8056a41086a290300370300200320032903c805370358410121070b410021040b2003418d036a20073a00002003418e036a2003290358370100200341f5026a200341386a41086a290300370000200341fd026a200341386a41106a29030037000020034185036a200341386a41186a29030037000020034196036a200341d8006a41086a2903003701002003419e036a200341d8006a41106a290300370100200341a6036a200341d8006a41186a290300370100200320043a00ec02200320032903383700ed022003200341e0016a3602e80220034188066a41186a2204420037030020034188066a41106a2217420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2017290300370300200341f0036a41086a200729030037030020032003290388063703f003200341003602900620034201370388060240412010262204450d00200420032903e001370000200441186a200341e0016a41186a290300370000200441106a200341e0016a41106a290300370000200441086a200341e0016a41086a290300370000200342a0808080800437028c062003200436028806200341e0016a41206a2d000020034188066a103f200341e8026a41047220034188066a105d200328028c062104200341f0036a412020032802880622172007280200100402402004450d00201710230b20021023200342e4cab5fbb6ccdcb0e3003703e004200341e0046a200341e8046a427f1063200341e8026a41086a41083a0000200341f1026a20032903e804370000200341f9026a200341e8046a41086a29030037000020034181036a200341e8046a41106a29030037000020034189036a200341e8046a41186a29030037000020034191036a200329031837000020034199036a200341186a41086a290300370000200341a1036a200341186a41106a290300370000200341a9036a200341186a41186a290300370000200341053a00e8024100210441a886c5004100200341e8026a102c0c020b41204101102a000b41204101102a000b410121070b410121170c020b200710242007102341002117410121070c010b200710242007102341012117410021070b410121150b410121090c030b410021040b410121070b4101211741012115410121090b0240024002400240024002400240024020012d0000417f6a2202410e4b0d0020020e0f030000000400010200000008000808030b200241074b0d07024020020e080008080806080507000b200141046a22022802001024200228020010230c070b2017450d06200141046a22022802001024200228020010230c060b2007450d05200141046a22022802001024200228020010230c050b2009450d04200141046a22022802001024200228020010230c040b2015450d03200141046a22022802001024200228020010230c030b200141046a22022802001024200228020010230c020b200141046a22022802001024200228020010230c010b200141046a22022802001024200228020010230b2000201636020420002004360200200341b0066a24000bc40302047f017e230041d0006b2202240002400240411310262203450d002003410f6a41002800e9c140360000200341086a41002900e2c140370000200341002900dac14037000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034133200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041a886c500410041001001417f460d002002200236022020024120360224200242003703302002410020024120200241306a41084100100122012001417f461b2201410820014108491b360228200141074d0d0220022903302106200241306a200241206a102820022802302201450d022000200229023437020c20002001360208200020063703000c010b200041003602080b20031023200241d0006a24000f0b41d4aac10041331021000b41134101102a000b41334101102a000b960d01097f23004180026b22022400200241e0016a41186a22034200370300200241e0016a41106a22044200370300200241e0016a41086a22054200370300200242003703e0012001410020012802002001280204200241e0016a41202001280208100122062006417f461b22064120200641204922061b20012802086a22073602080240024020060d00200241c0016a41186a2003290300370300200241c0016a41106a2004290300370300200241c0016a41086a2005290300370300200220022903e0013703c001200241003a00e0012001280200200141046a280200200241e0016a4101200710012106200141086a22032003280200200641016a41014b22066a22033602002006450d0020022d00e001220641064f0d00200241186a200241c0016a41186a290300370300200241106a200241c0016a41106a290300370300200241086a200241c0016a41086a290300370300200220022903c00137030041002105200241003a00e0012001280200200141046a280200200241e0016a4101200310012103200141086a22042004280200200341016a41014b22036a22043602002003450d01024020022d00e0012203450d0020034101470d02200241e0016a41186a22074200370300200241e0016a41106a22084200370300200241e0016a41086a22094200370300200242003703e001200141086a220541002001280200200141046a280200200241e0016a41202004100122032003417f461b2203412020034120491b20052802006a22043602002003411f4d0d02200241c0016a41186a22032007290300370300200241c0016a41106a22052008290300370300200241c0016a41086a22072009290300370300200220022903e0013703c001200241a0016a41186a22082003290300370300200241a0016a41106a22032005290300370300200241a0016a41086a22052007290300370300200220022903c0013703a00120024180016a41186a200829030037030020024180016a41106a200329030037030020024180016a41086a2005290300370300200220022903a00137038001410121050b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a290300370300200220022903800137036041002107200241003a00e0012001280200200141046a280200200241e0016a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d01024020022d00e0012203450d0020034101470d02200241e0016a41186a22074200370300200241e0016a41106a22084200370300200241e0016a41086a22094200370300200242003703e001200141086a220341002001280200200141046a280200200241e0016a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d02200241c0016a41186a22012007290300370300200241c0016a41106a22032008290300370300200241c0016a41086a22042009290300370300200220022903e0013703c001200241a0016a41186a22072001290300370300200241a0016a41106a22012003290300370300200241a0016a41086a22032004290300370300200220022903c0013703a00120024180016a41186a200729030037030020024180016a41106a200129030037030020024180016a41086a2003290300370300200220022903a00137038001410121070b200241206a41186a220120024180016a41186a290300370300200241206a41106a220320024180016a41106a290300370300200241206a41086a220420024180016a41086a2903003703002002200229038001370320200241c0006a41186a2208200241e0006a41186a290300370300200241c0006a41106a2209200241e0006a41106a290300370300200241c0006a41086a220a200241e0006a41086a29030037030020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200020053a0021200020063a0020200041c2006a20073a0000200020022903403700222000412a6a200a290300370000200041326a20092903003700002000413a6a2008290300370000200041c3006a2002290320370000200041cb006a2004290300370000200041d3006a2003290300370000200041db006a200129030037000020024180026a24000f0b200041023a002120024180026a24000f0b200041023a002120024180026a24000bc70f030a7f017e057f230041f0006b220424000240024002400240024002400240024002400240024002400240024002400240411a10262205450d00200541186a41002f00dc86403b0000200541106a41002900d48640370000200541086a41002900cc8640370000200541002900c486403700002005411a413410272205450d012005200136001a200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a22084200370300200442003703482005411e200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041a886c50041004100100121062005102302400240024002402006417f460d00200441086a41186a200041186a290000370300200441086a41106a200041106a290000370300200441086a41086a200041086a29000037030020042000290000370308411010262205450d06200541086a4100290098864037000020054100290090864037000020054110412010272205450d07200520013600102005412041c00010272205450d08200520042903083700142005412c6a200441086a41186a2209290300370000200541246a200441086a41106a220a2903003700002005411c6a200441086a41086a220b290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041a886c500410041001001210c20051023200c417f470d0b200441086a200110302006200041186a2900003703002007200041106a2900003703002008200041086a2900003703002004200029000037034820042802102206200428020c220d470d01200641016a22052006490d0c20064101742207200520052007491b220dad420586220e422088a70d0c200ea722074100480d0c2006450d022004280208200641057420071027220f450d030c090b200441f0006a240041fcc2c0000f0b200641016a21052004280208210f0c080b20071026220f0d060b20074101102a000b411a4101102a000b41344101102a000b41104101102a000b41204101102a000b41c0004101102a000b2004200d36020c2004200f3602080b200441086a41086a2005360200200f20064105746a22062004290348370000200641186a200441c8006a41186a290300370000200641106a200441c8006a41106a290300370000200641086a200441c8006a41086a290300370000411310262206450d072006410f6a41002800e28740360000200641086a41002900db8740370000200641002900d3874037000020064113412610272210450d0820102001360013200441c8006a41186a22074200370300200441c8006a41106a22084200370300200441c8006a41086a220642003703002004420037034820104117200441c8006a1002200441286a41186a2007290300370300200441286a41106a2008290300370300200441286a41086a20062903003703002004200429034837032820044100360250200442013703482004200536026c200441ec006a200441c8006a1041024002402005450d00200541057421114100200628020022066b210820042802482112200428024c210c200f210503400240200c20086a411f4b0d00200641206a22072006490d05200c4101742213200720072013491b22074100480d0502400240200c450d002012200c2007102722120d010c080b200710262212450d070b2007210c0b201220066a22072005290000370000200741186a200541186a290000370000200741106a200541106a290000370000200741086a200541086a290000370000200841606a2108200641206a2106200541206a2105201141606a22110d000b200441d0006a20063602002004200c36024c200420123602480c010b20062802002106200428024c210c200428024821120b200441286a41202012200610040240200c450d00201210230b20101023200d450d00200f10230b2009200041186a290000370300200a200041106a290000370300200b200041086a29000037030020042000290000370308411010262205450d02200541086a4100290098864037000020054100290090864037000020054110412010272205450d03200520013600102005412041c00010272205450d04200520042903083700142005412c6a200441086a41186a290300370000200541246a200441086a41106a2903003700002005411c6a200441086a41086a290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328410110262206450d05200641807f410020021b2003723a0000200441286a41202006410110042006102320051023200441f0006a240041000f0b101e000b20074101102a000b41104101102a000b41204101102a000b41c0004101102a000b41014101102a000b41134101102a000b41264101102a000ba80704027f017e037f037e230041d0006b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310024002400240200441106a412041a886c500410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d022007410f4d0d02200441386a290300210a200429033021060c010b4200210a0b2005102302400240200620025a200a20035a200a2003511b0d0041a9b8c2002105411521010c010b200441086a20014104200620027d220b200a20037d2006200254ad7d2206108302024020042802082205450d00200428020c21010c010b411810262205450d05200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0620052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a2900003700004200210a200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054138200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a20092903003703002004200429033037031002400240200441106a412041a886c500410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d062007410f4d0d06200441386a290300210c2004290330210a0c010b4200210c0b200510232001200a20027c2202200c20037c2002200a54ad7c10fe012001200b200610df01410021050b2000200136020420002005360200200441d0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b9c0501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a20021041024002400240024002402000450d00200041f8006c2104200241086a2105034020052802002100200228020421060240024002400240024002400240024002402003280200410e470d0020062000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d03200228020020002007102722060d040c0c0b20062000470d01200041016a22062000490d0a20004101742207200620062007491b22074100480d0a2000450d05200228020020002007102722060d060c0c0b200228020021060c030b200228020021060c050b200710262206450d080b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41003a0000200341f8006a2103200441887f6a22040d030c040b200710262206450d060b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41013a0000200320021039200341f0006a2802002107024002400240024020022802042206200528020022006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102722060d020c090b200228020021060c020b200010262206450d070b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200341f8006a2103200441887f6a22040d000b0b200228020421002001280200200128020420022802002203200241086a280200100402402000450d00200310230b200241106a24000f0b101e000b20074101102a000b20074101102a000b20004101102a000bf90801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024002400240024002400240024020002d00004101470d0020022003470d01200341016a22022003490d0c20034101742204200220022004491b22044100480d0c2003450d0320012802002003200410272202450d040c090b20022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0420012802002003200410272202450d050c060b200128020021020c080b200128020021020c050b2004102622020d050b20044101102a000b2004102622020d010b20044101102a000b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c020b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0620024101742203200420042003491b22034100480d062002450d0120012802002002200310272202450d020c030b200128020021020c030b2003102622020d010b20034101102a000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a28020021030240024002400240024002400240024002400240024020002d00214101470d0020022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0320012802002003200410272202450d040c090b20022003470d01200341016a22002003490d0a20034101742202200020002002491b22024100480d0a2003450d0420012802002003200210272200450d050c060b200128020021020c080b200128020021000c050b2004102622020d050b20044101102a000b2002102622000d010b20024101102a000b20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a0000024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0320024101742203200420042003491b22034100480d032002450d0120012802002002200310272202450d020c040b200128020021020c040b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000bbe0503047f027e057f230041d0006b22022400024002400240411310262203450d002003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272204450d0120042000360013200241286a41186a22034200370300200241286a41106a22004200370300200241286a41086a220542003703002002420037032820044117200241286a1002200241086a41186a2003290300370300200241086a41106a2000290300370300200241086a41086a2005290300370300200220022903283703082002410036023020024201370328200141086a290300210620012903002107411010262203450d02200320073700002003200637000820024290808080800237022c20022003360228200128021021082002200141186a280200220336024c200241cc006a200241286a104102400240024002402003450d0020034105742109200241286a41086a28020021002002280228210a200228022c210b2008210303400240024002400240200b20006b41204f0d00200041206a22052000490d07200b410174220c20052005200c491b220c4100480d07200b450d01200a200b200c1027220a0d020c080b200041206a21050c020b200c1026220a450d060b200c210b0b200a20006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200941606a22090d000b200241306a20053602002002200b36022c2002200a3602280c010b200241306a2802002105200228022c210b2002280228210a0b200241086a4120200a200510040240200b450d00200a10230b200410230240200141146a280200450d00200810230b200241d0006a24000f0b101e000b200c4101102a000b41134101102a000b41264101102a000b41104101102a000bdf0401037f230041106b220224002002410036020820024201370300200020021039024002400240024002400240024002400240024002400240024002400240024002400240024020002d007022004101460d0020004102470d012002280204200241086a2802002200470d03200041016a22032000490d0b20004101742204200320032004491b22044100480d0b2000450d0720022802002000200410272203450d080c100b2002280204200241086a2802002200470d01200041016a22032000490d0a20004101742204200320032004491b22044100480d0a2000450d0420022802002000200410272203450d050c0d0b2002280204200241086a2802002200470d02200041016a22032000490d0920004101742204200320032004491b22044100480d092000450d0720022802002000200410272203450d080c0a0b200228020021030c0c0b200228020021030c0d0b200228020021030c080b2004102622030d080b20044101102a000b2004102622030d080b20044101102a000b2004102622030d020b20044101102a000b101e000b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41003a00000c040b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41013a00000c020b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41023a00000b200228020421002001280200200128020420022802002201200241086a280200100402402000450d00200110230b200241106a24000b110020012000280200200028020410b3010b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241a886c500360204200241a886c500360200200210f503000b831005017f017e077f027e057f230041a0016b2206240042002107200641086a41086a220842003703002006420037030841af98c300410d200641086a1000200641f8006a41086a2008290300370300200620062903083703780240024002400240024002400240024002400240200641f8006a411041a886c500410041001001417f460d0020064200370308200641f8006a4110200641086a41084100100141016a41084d0d01200629030821070b200641086a41106a2003370300200641086a41286a20053a0000200641086a41186a2004370300200641286a22092000290000370300200620023703104201210420064201370308200641f8006a20011080022006280278210a200628027c210b200628028001220c450d02200641f8006a41186a220d2000460d01200c41286c210e42012104200a21050340200541086a2903002102200541106a2903002103200541186a290300210f20052903002110200641f8006a41206a200541206a290300370300200641f8006a41186a200f370300200641f8006a41106a22112003370300200641f8006a41086a2002370300200620103703780240024002400240200d2900002000290000510d0020112903002007580d01200641e8006a41086a200d41086a2903003703002006200d2903003703682011290300210220062903800121032006290378210f42014201520d030c020b200641e8006a41086a200941086a29030037030020062903082110420021042006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310210f20104201510d010c020b42004201520d010b200541286a21050c060b200541286a2105200e41586a220e0d000c030b0b41d4aac10041331021000b200c41286c210e200a41286a2105200641206a2903002102200629031821032006290310210f200629030821040340200641e8006a41086a200941086a290300370300200642003703082006200929030037036820044201510d02200541286a210542002104200e41586a220e0d000b0b4100210c0240200b450d00200a10230b410821124100211320044201510d020c050b420021040b200641d8006a41086a220e200641e8006a41086a29030037030020062006290368370358200641c8006a41086a2211200e29030037030020062006290358370348200641386a41086a220e201129030037030020062006290348370338024002400240412810262212450d00201220062903383703182012200f37030020122003370308201241206a200e290300370300201241106a20023703002005200a200c41286c6a220d460d01200641f8006a41186a210e4101210c41012113034002400240200e2000460d000340200641f8006a41206a200541206a290300370300200e200541186a290300370300200641f8006a41106a2211200541106a290300370300200641f8006a41086a200541086a290300370300200620052903003703780240024002400240200e2900002000290000510d0020112903002007580d01200641e8006a41086a200e41086a2903003703002006200e2903003703682011290300210220062903800121032006290378210f42014201520d030c020b200641e8006a41086a200941086a29030037030020062903082110420021042006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310210f20104201510d010c020b42004201520d010b200541286a21050c030b200d200541286a2205470d000c060b0b200641086a41186a2903002102200629031821032006290310210f2006290308210402400340200641e8006a41086a200941086a290300370300200642003703082006200929030037036820044201510d0142002104200d200541286a2205470d000c060b0b200541286a2105420021040b200641d8006a41086a2211200641e8006a41086a29030037030020062006290368370358200641c8006a41086a2214201129030037030020062006290358370348200641f8006a41086a2215201429030037030020062006290348370378024002402013200c470d00200c41016a2211200c490d07200c4101742213201120112013491b2213ad42287e2210422088a70d072010a722114100480d070240200c450d002012200c41286c2011102722120d010c020b201110262212450d010b2012200c41286c6a221120033703082011200f37030020112006290378370318201141106a2002370300201141206a2015290300370300200c41016a210c2005200d470d010c040b0b20114108102a000b41284108102a000b4101210c410121130b0240200b450d00200a10230b20044201520d030b200641f8006a41206a2209200841206a290300370300200641f8006a41186a2200200841186a290300370300200641f8006a41106a220e200841106a290300370300200641f8006a41086a2211200841086a29030037030020062008290300370378200c2013470d01200c41016a2205200c490d00200c410174220d20052005200d491b2213ad42287e2204422088a70d002004a722054100480d0002400240200c450d002012200c41286c200510272212450d010c030b2005102622120d020b20054108102a000b101e000b2012200c41286c6a22052006290378370300200541206a2009290300370300200541186a2000290300370300200541106a200e290300370300200541086a2011290300370300200c41016a210c0b2006200c360280012006201336027c200620123602782001200641f8006a108702200641a0016a24000bf31107017f017e087f047e017f037e057f23004180016b2203240042002104200341086a41086a220542003703002003420037030841af98c300410d200341086a1000200341d8006a41086a2005290300370300200320032903083703580240024002400240024002400240200341d8006a411041a886c500410041001001417f460d0020034200370308200341d8006a4110200341086a41084100100141016a41084d0d01200329030821040b200341086a41106a427f370300200341086a41286a41023a0000200341086a41186a2002370300200341286a20002900003703002003427f3703104201210220034201370308200341d8006a200110800220032802582106200328025c2107024002400240024002400240024020032802602208450d000240200341d8006a41186a22092000460d00200341f9006a210a200841286c210b420121022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a2211200e370300200341d8006a41086a200d370300200320103703580240024020092900002000290000510d002011290300220d2004580d010c050b2003290308210d4200210220034200370308200d4201510d060b200c41286a210c200b41586a220b0d000c020b0b200841286c210b200341086a41186a29030021122003290318211320032903102114200329030821022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a200e370300200341d8006a41086a200d370300200342003703082003201037035820024201510d03200c41286a210c42002102200b41586a220b0d000b0b4100210802402007450d00200610230b4108210a4100211520024201510d050c0b0b2003200a2800003602502003200a41036a280000360053200c41286a210c200341e0006a290300210e200341f8006a2d0000210b200341f0006a290300210f200329035821100c030b200c41286a210c0c010b200341086a41186a29030021122003290318211320032903102114200c41286a210c0b200341e0006a2903002202201320142003290358220d54201320025420132002511b220b1b210e200d2014200b1b2110200341e8006a2903002202201220122002541b210d200341f8006a2d0000410272210b200341f0006a290300210f420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336003b2003200328024036023841281026220a450d04200a2010370300200a200b3a0020200a200f370318200a200d370310200a2003280238360021200a200e370308200a41246a200328003b36000002400240200c2006200841286c6a2211460d00200341d8006a41186a210b200341f9006a221641036a21174101210841012115034002400240024002400240200b2000460d000340200341d8006a41206a2218200c41206a290300370300200b200c41186a290300370300200341d8006a41106a2209200c41106a290300370300200341d8006a41086a2219200c41086a2903003703002003200c29030037035802400240200b2900002000290000510d002009290300220d2004580d010c040b2003290308210d4200210220034200370308200d4201510d040b2011200c41286a220c470d000c080b0b200341086a41186a290300210e2003290318210d2003290310210f200329030821020340200341d8006a41206a200c41206a290300370300200b200c41186a290300370300200341d8006a41106a200c41106a290300370300200341d8006a41086a200c41086a2903003703002003200c2903003703582003420037030820024201510d03420021022011200c41286a220c470d000c070b0b2003201628000036025020032017280000360053200c41286a210c2019290300211020182d00002118200b290300210e2003290358210f0c020b200341086a41186a290300210e2003290318210d2003290310210f0b200c41286a210c200341d8006a41086a2903002202200d200f2003290358221354200d200254200d2002511b22091b21102013200f20091b210f200341d8006a41106a2903002202200e200e2002541b210d200341d8006a41206a2d00004102722118200b290300210e420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336005b20032003280240360258024020152008470d00200841016a22092008490d0620084101742219200920092019491b2215ad42287e2213422088a70d062013a722094100480d0602402008450d00200a200841286c20091027220a0d010c080b20091026220a450d070b200a200841286c6a220920183a0020200920103703082009200f3703002009200e3703182009200d370310200941246a200328005b36000020092003280258360021200841016a2108200c2011470d000c020b0b41012108410121150b02402007450d00200610230b20024201520d060b200341d8006a41206a2200200541206a290300370300200341d8006a41186a220b200541186a290300370300200341d8006a41106a2211200541106a290300370300200341d8006a41086a2209200541086a2903003703002003200529030037035820082015470d04200841016a220c2008490d0120084101742205200c200c2005491b2215ad42287e2202422088a70d012002a7220c4100480d01024002402008450d00200a200841286c200c1027220a450d010c060b200c1026220a0d050b200c4108102a000b41d4aac10041331021000b101e000b20094108102a000b41284108102a000b200a200841286c6a220c2003290358370300200c41206a2000290300370300200c41186a200b290300370300200c41106a2011290300370300200c41086a2009290300370300200841016a21080b200320083602602003201536025c2003200a3602582001200341d8006a10870220034180016a24000bf20a03027f027e077f23004190026b22022400200241206a2001104a024002402002280220450d0020022802242103200241086a2001104c2002290308a7450d00200241186a29030021042002290310210541002106200241003a00f00120012802002001280204200241f0016a410120012802081001210720012001280208200741016a41014b22076a22083602082007450d01024020022d00f0012207450d0020074101470d02200241f0016a41186a22094200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220641002001280200200141046a280200200241f0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d02200241d0016a41186a22072009290300370300200241d0016a41106a2206200a290300370300200241d0016a41086a2209200b290300370300200220022903f0013703d001200241b0016a41186a220a2007290300370300200241b0016a41106a22072006290300370300200241b0016a41086a22062009290300370300200220022903d0013703b00120024190016a41186a200a29030037030020024190016a41106a200729030037030020024190016a41086a2006290300370300200220022903b00137039001410121060b200241f0006a41186a20024190016a41186a290300370300200241f0006a41106a20024190016a41106a290300370300200241f0006a41086a20024190016a41086a290300370300200220022903900137037041002109200241003a00f0012001280200200141046a280200200241f0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d01024020022d00f0012207450d0020074101470d02200241f0016a41186a22094200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220741002001280200200141046a280200200241f0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d02200241d0016a41186a22012009290300370300200241d0016a41106a2207200a290300370300200241d0016a41086a2208200b290300370300200220022903f0013703d001200241b0016a41186a22092001290300370300200241b0016a41106a22012007290300370300200241b0016a41086a22072008290300370300200220022903d0013703b00120024190016a41186a200929030037030020024190016a41106a200129030037030020024190016a41086a2007290300370300200220022903b00137039001410121090b200241306a41186a220120024190016a41186a290300370300200241306a41106a220720024190016a41106a290300370300200241306a41086a220820024190016a41086a2903003703002002200229039001370330200241d0006a41186a220a200241f0006a41186a290300370300200241d0006a41106a220b200241f0006a41106a290300370300200241d0006a41086a220c200241f0006a41086a290300370300200220022903703703502000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290350370019200041216a200c290300370000200041296a200b290300370000200041316a200a2903003700002000413a6a2002290330370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a2002412e6a2f01003b0100200041da006a200228012a36010020024190026a24000f0b200041023a001820024190026a24000f0b200041023a001820024190026a24000bf90801067f230041106b220224002002410036020820024201370300200041106a200210412002200036020c2002410c6a2002106620022802042103200228020821040240024002400240024002400240024002400240024002400240024002400240024020002d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22034100480d0c2004450d0320022802002004200310272205450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22034100480d0b2004450d0420022802002004200310272205450d050c060b200228020021050c080b200228020021050c050b2003102622050d050b20034101102a000b2003102622050d010b20034101102a000b20022003360204200220053602000b200241086a200441016a2206360200200520046a41003a00000c020b20022003360204200220053602000b200241086a2206200441016a360200200520046a41013a00000240024002400240024020022802042203200628020022046b41204f0d00200441206a22062004490d0620034101742207200620062007491b22074100480d062003450d0120052003200710272205450d020c030b200441206a21060c030b2007102622050d010b20074101102a000b2002200736020420022005360200200721030b200241086a2006360200200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a2900003700002004200041196a2900003700000b024002400240024002400240024002400240200041396a2d00004101470d0020032006470d08200341016a22042003490d0920034101742207200420042007491b22044100480d092003450d0120052003200410272205450d020c070b20032006470d05200341016a22002003490d0820034101742204200020002004491b22004100480d082003450d0220052003200010272205450d030c040b2004102622050d050b20044101102a000b2000102622050d010b20004101102a000b20022000360204200220053602000b200241086a2200200641016a360200200520066a41003a0000200228020421042001280200200128020420022802002203200028020010042004450d060c050b20022004360204200220053602000b200241086a2203200641016a360200200520066a41013a000002400240024020022802042205200328020022046b41204f0d00200441206a22032004490d0320054101742206200320032006491b22064100480d032005450d0120022802002005200610272203450d020c040b200228020021030c040b2006102622030d020b20064101102a000b101e000b2002200636020420022003360200200621050b200241086a200441206a2206360200200320046a220441086a200041c2006a290000370000200441106a200041ca006a290000370000200441186a200041d2006a29000037000020042000413a6a290000370000200128020020012802042003200610042005450d010b200310230b200241106a24000b960a03017f027e057f230041e0006b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d00200141046a280200200141086a2802002200470d01200041016a22052000490d1120004101742206200520052006491b22064100480d112000450d0520012802002000200610272205450d060c190b20034280800154410020051b450d01200141046a2802002205200141086a28020022006b41024f0d02200041026a22062000490d1020054101742200200620062000491b22004100480d102005450d0820012802002005200010272205450d090c160b200128020021050c180b200342808080800454410020051b450d01200141046a2802002205200141086a28020022006b41044f0d04200041046a22062000490d0e20054101742200200620062000491b22004100480d0e2005450d08200128020020052000102722050d090c120b200128020021050c140b411020047920037942c0007c20044200521ba74103766b22074104490d0e200141046a280200200141086a2802002206470d03200641016a22052006490d0c20064101742208200520052008491b22054100480d0c2006450d09200128020020062005102722080d0a0c110b2006102622050d130b20064101102a000b200128020021050c050b200128020021080c070b2000102622050d0d0b20004101102a000b200010262205450d090b20012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a7410274410272360000200241e0006a24000f0b200510262208450d070b20012008360200200141046a2005360200200141086a28020021060b200141086a2205200641016a360200200820066a200741027441736a3a0000200029030021032002200041086a290300220437030820022003370300200141046a210803400240024002400240200828020020052802002200470d00200041016a22062000490d0520004101742209200620062009491b22094100480d052000450d01200128020020002009102722060d020c060b200128020021060c020b200910262206450d040b2001200636020020082009360200200528020021000b2005200041016a360200200620006a2003a73a000020034208882004423886842103200442088821042007417f6a22070d000b2002200337030020022004370308200320048450450d03200241e0006a24000f0b101e000b20094101102a000b41b8a8c400104f000b20022002360240200241d0a8c400360244200241c8006a41146a4100360200200241286a41146a4103360200200241346a4105360200200241106a41146a4103360200200241a886c5003602582002420137024c200241f898c4003602482002410536022c20024203370214200241d480c5003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a41e0a8c4001061000b20004101102a000b20054101102a000b20012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b0000200241e0006a24000f0b20012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a0000200241e0006a24000bae0201027f230041106b2202240020024100360208200242013703000240412010262203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a200210662002200041106a36020c2002410c6a20021066200028022021032002200041286a280200220036020c2002410c6a2002104102402000450d002003200041186c6a210003402002200336020c2002410c6a20021066200341106a200210412000200341186a2203470d000b0b200228020421032001280200200128020420022802002200200241086a280200100402402003450d00200010230b200241106a24000f0b41204101102a000b860100024002400240024002400240200041ff017122004101460d0020004102470d01410110262200450d03200041023a00000c020b410110262200450d03200041013a00000c010b410110262200450d03200041003a00000b20012802002001280204200041011004200010230f0b41014101102a000b41014101102a000b41014101102a000b13002000410d360204200041d0c7c0003602000b130020004107360204200041faf4c0003602000b890501077f230041b0016b22022400024002400240410e10262203450d00200341066a41002900c6c740370000200341002900c0c7403700002003410e412e10272203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241e0006a41186a22014200370300200241e0006a41106a22044200370300200241e0006a41086a22054200370300200242003703602003412e200241e0006a1002200241306a41186a2001290300370300200241306a41106a2004290300370300200241306a41086a20052903003703002002200229036037033002400240200241306a412041a886c500410041001001417f460d00200242203702542002200241306a360250200241e0006a200241d0006a106c2002280280012201450d0420002002290360370300200041186a200241e0006a41186a290300370300200041106a200241e0006a41106a290300370300200041086a200241e0006a41086a290300370300200241086a2204200241e0006a412c6a290200370300200241106a2205200241e0006a41346a290200370300200241186a2206200241e0006a413c6a290200370300200241206a2207200241e0006a41c4006a290200370300200241286a2208200241e0006a41cc006a280200360200200220022902840137030020002001360220200020022903003702242000412c6a2004290300370200200041346a20052903003702002000413c6a2006290300370200200041c4006a2007290300370200200041cc006a20082802003602000c010b200041003602200b20031023200241b0016a24000f0b410e4101102a000b412e4101102a000b41d4aac10041331021000bb60709057f047e017f017e037f027e017f017e017f230041c0016b22022400200241a0016a41186a22034200370300200241a0016a41106a22044200370300200241a0016a41086a22054200370300200242003703a0012001410020012802002001280204200241a0016a41202001280208100122062006417f461b2206412020064120491b20012802086a3602080240024002400240024002400240024002400240024002402006411f4d0d0020024180016a41186a200329030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903a00137038001200241c8006a2001104c2002290348a7450d01200241c8006a41106a290300210720022903502108200241306a2001104c2002290330a7450d02200241c0006a29030021092002290338210a200241286a2001104a2002280228450d09200228022c220bad42187e220c422088a70d05200ca72206417f4c0d052006450d0320061026220d450d06200b450d040c070b20004100360220200241c0016a24000f0b20004100360220200241c0016a24000f0b20004100360220200241c0016a24000f0b4108210d200b0d030b4100210f4200210c0c030b101d000b20064108102a000b4200210c200241106a41106a210e410021054100210441002103200b210f02400340200241106a2001104c2002290310a7450d01200e290300211020022903182111200241086a2001104a2002280208450d01200341016a2106200228020c211202402003200f470d002005200620062005491b220fad42187e2213422088a70d052013a722144100480d0502402003450d00200d200420141027220d0d010c070b20141026220d450d060b200d20046a2203201037030820032011370300200341106a2012360200200c4280808080107c210c200541026a2105200441186a2104200621032006200b490d000c020b0b200f450d01200d10230c010b200d450d00200241e0006a41186a220120024180016a41186a290300370300200241e0006a41106a220620024180016a41106a290300370300200241e0006a41086a220320024180016a41086a2903003703002002200229038001370360200041186a20093703002000200a37031020002007370308200020083703002000200c200fad843702242000200d3602202000412c6a2002290360370200200041346a20032903003702002000413c6a2006290300370200200041c4006a2001290300370200200241c0016a24000f0b20004100360220200241c0016a24000f0b101e000b20144108102a000bc10906047f047e017f017e097f037e230041e0016b220224000240024002400240024002400240024002400240410f10262203450d00200341076a4100290097f64037000020034100290090f6403700002003410f412f10272204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a290000370000200241f0006a41186a22014200370300200241f0006a41106a22034200370300200241f0006a41086a22054200370300200242003703702004412f200241f0006a1002200241d0006a41186a2001290300370300200241d0006a41106a2003290300370300200241d0006a41086a2005290300370300200220022903703703500240024002400240200241d0006a412041a886c500410041001001417f460d0020024220370294012002200241d0006a36029001200241386a20024190016a104c2002290338a7450d0b200241386a41106a290300210620022903402107200241206a20024190016a104c2002290320a7450d0b200241306a290300210820022903282109200241186a20024190016a104a2002280218450d0b200228021c220aad42307e220b422088a70d03200ba72201417f4c0d032001450d0120011026220c450d06200a450d020c070b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000c080b4108210c200a0d050b410021104200210b200c450d080c050b101d000b410f4101102a000b412f4101102a000b20014108102a000b200241f0006a41186a210d200241f0006a41106a210e4200210b4100210f4100210541002101200a21100340200d4200370300200e4200370300200241f0006a41086a221142003703002002420037037020024190016a41086a2203200328020022034100200228029001200228029401200241f0006a41202003100122032003417f461b2203412020034120491b6a3602002003411f4d0d03200241c0016a41186a2212200d290300370300200241c0016a41106a2213200e290300370300200241c0016a41086a22142011290300370300200220022903703703c001200220024190016a104c2002290300a7450d03200141016a2103200241106a290300211520022903082116200241a0016a41186a22112012290300370300200241a0016a41106a22122013290300370300200241a0016a41086a22132014290300370300200220022903c0013703a001024020012010470d00200f20032003200f491b2210ad42307e2217422088a70d062017a722144100480d0602402001450d00200c200520141027220c0d010c080b20141026220c450d070b200c20056a2201201537030820012016370300200141286a2011290300370300200141206a2012290300370300200141186a2013290300370300200141106a20022903a001370300200b4280808080107c210b200f41026a210f200541306a2105200321012003200a490d000b200c450d030b200020093703102000200637030820002007370300200041246a200b2010ad843702002000200c360220200041186a20083703000b20041023200241e0016a24000f0b2010450d00200c10230b41d4aac10041331021000b101e000b20144108102a000b8b0401047f230041e0006b2202240002400240410e10262203450d00200341066a4100290094c7403700002003410029008ec7403700002003410e412e10272203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412e200241c0006a1002200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041a886c500410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031023200241e0006a24000f0b41d4aac10041331021000b410e4101102a000b412e4101102a000b130020004114360204200041e8f6c0003602000bf00301087f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a10662002200336023c2002413c6a200241306a10662002280220210320022004280200220436023c2002413c6a200241306a10410240024002402004450d00200441306c2105200241306a41086a21060340024002400240024020022802342207200628020022046b41204f0d00200441206a22082004490d0620074101742209200820082009491b22094100480d062007450d01200228023020072009102722070d020c070b200441206a2108200228023021070c020b200910262207450d050b20022009360234200220073602300b20062008360200200720046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a2900003700002004200341106a2900003700002002200336023c2002413c6a200241306a1066200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a2802003602000240200241246a280200450d00200241206a28020010230b200241c0006a24000f0b101e000b20094101102a000b7001017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a10412002200241086a36022c2002412c6a200241206a1066200041086a200228022836020020002002290320370200200241306a24000b3401017f0240410410262202450d0020004284808080c00037020420002002360200200241c0843d3600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c000370204200020023602002002413c3600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241043600000f0b41044101102a000be8dd013f017f017e037f057e107f017e037f027e037f017e037f077e207f027e027f017e027f017e087f017e067f027e247f027e057f037e017f017e287f027e037f057e117f017e017f017e0b7f027e047f017e027f027e047f017e027f017e177f017e297f027e367f017e037f027e157f027e0c7f027e077f017e087f017e037f230041b00f6b220224004200210320024190086a41086a22044200370300200242003703900841db98c100411c20024190086a1000200241a8066a41086a2205200429030037030020022002290390083703a8060240024002400240024002400240024002400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012206417f460d022006410f4d0d0220024198086a290300210720022903900821080c010b42002108420021070b20044200370300200242003703900841f798c100411820024190086a10002005200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d032004410f4d0d0320024198086a290300210920022903900821030c010b420021090b20024190086a41086a22044200370300200242003703900841f798c100411820024190086a1000200241a8066a41086a2205200429030037030020022002290390083703a8062002200320087c2208370390082002200920077c2008200354ad7c37039808200241a8066a411020024190086a41101004200442003703002002420037039008418f99c100411320024190086a10002005200429030037030020022002290390083703a806410221040240200241a8066a411041a886c500410041001001417f460d00200241003a009008200241a8066a411020024190086a41014100100141016a41014d0d0320022d0090082104200241a8066a411010030b0240200141016a410670450d00200441ff01714102472004710d0020004100360200200241b00f6a24000f0b4200210320024190086a41086a22044200370300200242003703900841f798c100411820024190086a1000200241a8066a41086a200429030037030020022002290390083703a8060240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d042004410f4d0d0420024198086a290300210a200229039008210b200241a8066a4110100342012103200b200a84500d060c070b420042008450450d060c040b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b410121040c020b410121040c010b024002402003a7450d0020024190086a41086a22044200370300200242003703900841a299c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a8064100210c02400240024002400240200241a8066a411041a886c500410041001001417f460d00200242103702a4052002200241a8066a3602a00520024190086a200241a0056a1028200228029008220d450d02200228029408210e20024198086a280200220c41057422040d010c040b4101210d4100210e41004105742204450d020b200d20046a210f4108211020024190086a41086a2111200241a8066a41086a21124120211341122114411021154100211641322117412a2118411821194122211a411a211b4200211c41a886c500211d417f211e4101211f427f212042012121200241b8086a212241302123200241b4086a212442202125200d2126410021270c040b41d4aac10041331021000b410021040c030b410021040c020b410121040c010b410321040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e040001020f0f0b200241a0036a200b200a200cad22084200109804200241a8086a200a37030020024190086a41106a200b37030020024190086a41086a220441003a0000200241043a00900841a886c500410020024190086a102c20044200370300200242003703900841d099c100411120024190086a1000200241a8066a41086a200429030037030020022002290390083703a806200241a8066a411041a886c5004100410010012104200241a0036a41086a290300210320022903a0032107024002402004417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d0c2004410f4d0d0c20024198086a2903002109200229039008212f0c010b4200212f420021090b20024190036a202f20092008420010980402402007200384500d00200229039003220920024190036a41086a290300222d84500d004200210820024190086a41086a22044200370300200242003703900841ecb5c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d0e2004410f4d0d0e20024198086a290300212f20022903900821080c010b4200212f0b200820097d222e200856202f202d7d2008200954ad7d2208202f562008202f511b0d0020024180036a202e20082009202d10970442002108200241d0026a20024180036a41086a2903002209420020074200109804200241e0026a20034200200229038003222f4200109804200241f0026a202f420020074200109804200942005220034200527120022903d8024200527220022903e80242005272200241f0026a41086a290300220320022903d00220022903e0027c7c2207200354720d0020022903f002210920024190086a41086a22044200370300200242003703900841aaedc300410c20024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d102004410f4d0d1020024198086a290300210320022903900821080c010b420021030b20024190086a41086a22044200370300200242003703900841aaedc300410c20024190086a1000200241a8066a41086a200429030037030020022002290390083703a8062002427f200320077c200820097c22092008542204ad7c22072004200720035420072003511b22041b370398082002427f200920041b37039008200241a8066a411020024190086a411010040b200e450d0f200d1023410121040c4c0b20024190086a41086a22044200370300200242003703900841e199c100411220024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0320022802900841016a21010c010b410121010b20024190086a41086a22044200370300200242003703900841e199c100411220024190086a1000200241a8066a41086a2230200429030037030020022002290390083703a8062002200136029008200241a8066a411020024190086a4104100420044200370300200242003703900841f399c100411620024190086a10002030200429030037030020022002290390083703a806410021310240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0320022802900821310b20024190086a41086a22044200370300200242003703900841899ac100411d20024190086a1000200241a8066a41086a200429030037030020022002290390083703a806024002400240200241a8066a411041a886c500410041001001417f460d00200241003602900841012132200241a8066a411020024190086a41044100100141016a41044d0d06200228029008220441024f0d010c020b410421040b200421320b200241d0046a41186a22044200370300200241d0046a41106a22014200370300200241d0046a41086a22304200370300200242003703d00441a69ac100411a200241d0046a1002200241a8066a41186a2004290300370300200241a8066a41106a2001290300370300200241a8066a41086a2030290300370300200220022903d0043703a806410021010240200241a8066a412041a886c500410041001001417f460d00200241a0056a41186a4200370300200241a0056a41106a4200370300200241a0056a41086a4200370300200242003703a005200241a8066a4120200241a0056a4120410010012204417f460d052004411f4d0d0520024190086a41186a2204200241a0056a41186a220129030037030020024190086a41106a2230200241a0056a41106a223329030037030020024190086a41086a2205200241a0056a41086a2234290300370300200220022903a0053703900820012004290300370300203320302903003703002034200529030037030020022002290390083703a005410121010b412810262204450d07200420013a0004200441a886c500360200200420022903a005370005200420022f00e8053b00252004410d6a200241a0056a41086a2205290300370000200441156a200241a0056a41106a22342903003700002004411d6a200241a0056a41186a2235290300370000200441276a200241ea056a2d00003a0000200241d0046a41186a22014200370300200241d0046a41106a22304200370300200241d0046a41086a22334200370300200242003703d00441c09ac100411a200241d0046a1002200241a8066a41186a2001290300370300200241a8066a41106a2030290300370300200241a8066a41086a2033290300370300200220022903d0043703a806410021010240200241a8066a412041a886c500410041001001417f460d00203542003703002034420037030020054200370300200242003703a005200241a8066a4120200241a0056a4120410010012201417f460d062001411f4d0d0620024190086a41186a2201200241a0056a41186a223029030037030020024190086a41106a2233200241a0056a41106a220529030037030020024190086a41086a2234200241a0056a41086a2235290300370300200220022903a0053703900820302001290300370300200520332903003703002035203429030037030020022002290390083703a005410121010b412810262233450d08203320013a0004203341a886c500360200203320022903a005370005203320022f00e8053b00252033410d6a200241a0056a41086a290300370000203341156a200241a0056a41106a2903003700002033411d6a200241a0056a41186a290300370000203341276a200241e8056a41026a2d00003a0000200242003702e407200241f098c4003602e0072002410036028008200242083703f80720024190076a411c6a200241e0076a36020020024190076a41186a20024188086a360200200241003602a007200241dc9ac1003602940720022004360290072002200241f8076a3602a407200220024188086a36029c07200220024188086a3602980720024190086a20024190076a1076024002400240024020022d00d00822014102470d00200241023a00e8060c010b200241e8056a41386a223020024190086a41386a290300370300200241e8056a41306a220520024190086a41306a290300370300200241e8056a41286a223420024190086a41286a290300370300200241e8056a41206a223520024190086a41206a290300370300200241e8056a41186a220620024190086a41186a290300370300200241e8056a41106a223620024190086a41106a290300370300200241e8056a41086a222720024190086a41086a290300370300200241f0066a41086a2237200241d9086a2228290000370300200241ff066a2238200241e0086a29000037000020022002290390083703e805200220022900d1083703f00620024190076a41106a4101360200200241cc086a2030290300370200200241c4086a2005290300370200200241bc086a2034290300370200200241b4086a203529030037020020024190086a411c6a200629030037020020024190086a41146a20362903003702002002419c086a2027290300370200200220022903e80537029408200241a0056a20024190086a41c4001094041a200241003602900820024190086a410472200241a0056a41c4001094041a20024190086a41c8006a20013a0000202820022903f006370000200241e1086a2037290300370000200241e8086a2038290000370000200241a8066a20024190076a41146a20024190086a107720022d00e8064102470d010b2004102341082136410021374108213441082130410021350c010b20024190086a2004107841c80010262236450d0c2036200241a8066a41c8001094041a200241b0076a41186a20024190076a41186a290300370300200241b0076a41106a223920024190076a41106a290300370300200241b0076a41086a20024190076a41086a29030037030020022002290390073703b00720024190086a200241b0076a1076024002400240024020022d00d00822274102470d0041012135410121370c010b20024190086a41046a2104200241d9086a210520024190086a410472213a200241c4076a213b200241d1086a21342039280200213c200241a8066a41c0006a213d4102213541c800213041002101410121370340200241e8056a41386a220620024190086a41386a290300370300200241e8056a41306a222820024190086a41306a290300370300200241e8056a41286a223820024190086a41286a290300370300200241e8056a41206a223e20024190086a41206a290300370300200241e8056a41186a223f20024190086a41186a290300370300200241e8056a41106a224020024190086a41106a290300370300200241e8056a41086a224120024190086a41086a290300370300200241f0066a41086a2242203441086a290000370300200241f0066a410f6a22432034410f6a29000037000020022002290390083703e805200220342900003703f0062039203c20016a224441016a360200200441386a2006290300370200200441306a2028290300370200200441286a2038290300370200200441206a203e290300370200200441186a203f290300370200200441106a2040290300370200200441086a2041290300370200200420022903e805370200200241a0056a20024190086a41c4001094041a2002204436029008203a200241a0056a41c4001094041a20024190086a41c8006a20273a0000200520022903f006370000200541086a20422903003700002005410f6a2043290000370000200241a8066a203b20024190086a1077203d2d00004102460d0220024190086a200241a8066a41c8001094041a0240200141016a22062037470d00200241a0056a20022802b00720022802b407280210110000200641016a22272006490d362035202720272035491b2237ad42c8007e2203422088a70d362003a722274100480d3602402001417f460d00203620302027102722360d010c0d0b202710262236450d0c0b203620306a20024190086a41c8001094041a203541026a2135203041c8006a213020024190086a200241b0076a10762006210120024190086a41c0006a2d000022274102470d000b200641016a21350b20362134200241e8066a41023a00000c010b200141016a2135203621340b20022802b007220120022802b407220428020011010002402004280204450d00200110230b203421300b200241a8066a2033107920022802c806223e450d2441012145200241a0056a410172214641282147200241a8066a41286a214841242149200241a8066a41246a214a4118214b4110214c4108214d4120214e20024190086a41206a214f42c800215042202151417f21524105215342d00021544100215541d00021564200215741342158413c215941c400215a4102215b419403215c4160215d41e802215e41c800215f427f2160412c2161410121270c110b024020a101450d0020a1012092016a21a10120a201207e6a210420a20120756a227121a20120042d00000d0f20712092016a21a201207120a001470d1a0c190b209901219f010c240b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20274108102a000b41284104102a000b41284104102a000b41d4aac10041331021000b41d4aac10041331021000b41c8004108102a000b41d4aac10041331021000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020270e09000102030405060708080b20262206450d1b201410262204450d0f200420156a20162f00bec7403b0000200420106a20162900b6c740370000200420162900aec74037000020042014201710272204450d1020042006290000370012200420186a200620196a2900003700002004201a6a200620156a2900003700002004201b6a200620106a290000370000200241d0046a20196a2201201c370300200241d0046a20156a2205201c370300200241d0046a20106a2228201c3703002002201c3703d00420042017200241d0046a1002200241a0056a20196a2001290300370300200241a0056a20156a2005290300370300200241a0056a20106a2028290300370300200220022903d0043703a00502400240200241a0056a2013201d201620161001201e460d0020022025370294082002200241a0056a36029008200241b8046a20024190086a104a20022802b804450d10200241a0046a20024190086a104c20022903a004a7450d10200241a0046a20156a290300210320022903a80421070c010b42002107420021030b200410230240024002400240200b2007200b2007200b542003200a542003200a511b22041b22297d222a200a2003200a20041b222b7d200b202954ad7d222c84500d0020024190086a2006106d42002109201129030022034200200229039008220720215620034200522003501b22041b212d2007202120041b212e20024190086a20136a280200212820222802002204450d01202e202d84500d192028200420236c6a210142002109420021082028210402400340200241f8036a2004290300200420106a290300202a202c109804200241e8036a20022903f803200241f8036a20106a290300202e202d10970420024188046a200420156a220420022903e803200241e8036a20106a290300107a20022903880421032002290390042107200241a8066a20156a20024188046a20156a290300222f37030020122007370300200220033703a80602402003a7201f470d0020202008202f7c200920077c22072009542205ad7c22032005200320085420032008511b22051b21082020200720051b2109200420136a22042001470d010c020b024020032021520d00200220123602a005200241a0056a107b0b200420136a22042001470d000b0b202e202d84201c520d020c160b420021094200210842002103420021070c020b42002108202e202d84201c510d140b200241d8036a20024190086a20156a29030020024190086a20196a290300202a202c109804200241c8036a20022903d803200241d8036a20106a290300202e202d109704200241c8036a20106a290300210720022903c80321032024280200450d00202810230b200620136a2126200241b0036a2006200320297c222f2007202b7c202f200354ad7c107a20022903b003210320022903b803210720024190086a20156a200241b0036a20156a290300222f370300201120073703002002200337039008024002402003a7201f470d0020202008202f7c200920077c22072009542204ad7c22032004200320085420032008511b22041b21082020200720041b21090c010b20032021520d00200220113602a806200241a8066a107b0b20022008370398082002200937039008200220024190086a3602a806200241a8066a107b2026200f470d16410021040c590b20482802002162204a2802002163200241b0076a204b6a2264200241a8066a204b6a290300370300200241b0076a204c6a2265200241a8066a204c6a290300370300200241b0076a204d6a2266200241a8066a204d6a290300370300200220022903a8063703b007200241a0056a200241b0076a106e02400240024020022d00a0052045470d00200241e8056a204b6a2046204b6a290000370300200241e8056a204c6a2046204c6a290000370300200241e8056a204d6a2046204d6a290000370300200220462900003703e80520024190086a200241e8056a106b204f2802002204450d0120024190086a204d6a2903002167200229039008216820024190086a20496a280200450d02200410230c020b204f20553602000b42002168420021670b2062ad20507e2203205188a70d3e2003a7220420524c0d3e0240024002402004450d00200410262269450d0d20622053742204450d020c010b4108216920622053742204450d010b203e20046a216a4100216b203e216c4100216d0c290b4100216b0c300b02402035450d0020762104034002402030207e6a2d0000450d00203020756a213020042092016a22040d010c020b2030208a016a290300220320980120032098015620302087016a2903002203209501522003501b22011b2207200320950120011b220384209501510d0a200241c0026a209601209601200720031097042030200241c0026a207a6a290300370308203020022903c002370300203020756a213020042092016a22040d000b0b20022802f807229b01207b280200229c01207c6c6a219d01209c01450d24209b01219e014101216d0c280b200220a70120ab016a2d00003a00aa06200220a7012f002c3b01a806200220a70120ac016a29000037039008200220a70120ad016a2900003700950820a7012802282204450d2d20a70128022022ce01200420ae016c6a21cf0120a70120af016a28000021d00120a70120b0016a28000021d10120a70120b1016a28000021d20120a70120b2016a28000021d30120a70120b3016a21d401410021d501410821d601410021d7014103216d0c280b200241d0046a20e2016a224020fb0120e2016a290200370300200241d0046a20e3016a224120fb0120e3016a290200370300200241d0046a20e4016a224220fb0120e4016a290200370300200220fb012902003703d004200241a8066a20fb01106e02400240024020022d00a80620df01470d00200241a0056a20e2016a20e00120e2016a290000370300200241a0056a20e3016a20e00120e3016a290000370300200241a0056a20e4016a20e00120e4016a290000370300200220e0012900003703a00520024190086a200241a0056a106b20e7012802002204450d0120024190086a20e4016a290300212b20022903900821fc0120e801280200450d02200410230c020b20e70120e1013602000b420021fc014200212b0b20fb0120e6016a280200210141082138410021064100213f024020fb01280228220420e9016c222720e901490d002004ad20ea0186220320eb0188a70d3b2003a7220520e101480d3b200510262238450d102004213f0b02402001200120276a460d0041002106203821040340200120ee016a2903002107200120e6016a2903002103200241a8066a20fb01106e02400240024020022d00a80620df01470d00200241a0056a20e2016a20e00120e2016a290000370300200241a0056a20e3016a20e00120e3016a290000370300200241a0056a20e4016a20e00120e4016a290000370300200220e0012900003703a00520024190086a200241a0056a106b20e7012802002205450d0120024190086a20e4016a2903002108200229039008210920e801280200450d02200510230c020b20e70120e1013602000b42002109420021080b200241e0006a200720f00120092008107c220820f001109804200241f0006a200320f001200820f00110980420024190086a20e4016a220520f001370300200220f0013703900820f20120f10120024190086a1000200241d0006a20f00120f001200320f001109804200241a8066a20e4016a200529030037030020022002290390083703a8062002290358212f2002290368212d200229035021092002290360212e200241f0006a20e4016a29030021082002350274212a02400240200241a8066a20e30120f50120e10120e101100120f601460d00200220f00137039808200220f00137039008200241a8066a20e30120024190086a20e30120e1011001222820f601460d08202820f8014d0d08200241c0006a200229039008200529030020f40120f001109704200241c0006a20e4016a290300222c20f0012002290340222920f90156202c20f00152202c501b22051b212c202920f90120051b21290c010b4200212c420121290b200241306a2029202c20f401202a2008202e20097c7c220920eb018684202d202f8420f0015220092008547222051b20f301200920eb018820051b1098042004200337030020042007370308200420ee016a200120e2016a290300370300200420e6016a200120e3016a290300370300200420e2016a200120e4016a290300370300200420e3016a2001290300370300200420ec016a200241306a20e4016a290300370300200420e9016a2002290330370300200420ef016a2104200620df016a2106200120e9016a2101202720f7016a22270d000b0b20fa0120fc0137030020fa01202b37030820fa01203836023020fa0120ec016a200636020020fa0120ed016a203f36020020fa0120ee016a204029030037030020fa0120e6016a204129030037030020fa0120e2016a204229030037030020fa0120022903d00437031020da0120df016a21da0120fa0120ef016a21fa0120fb0120e5016a22fb0120db01470d130c340b200241a8066a20bd02106e02400240024020022d00a806208202470d00200241a0056a2085026a2083022085026a290000370300200241a0056a2086026a2083022086026a290000370300200241a0056a2087026a2083022087026a29000037030020022083022900003703a00520024190086a200241a0056a106b20024190086a2084026a2802002204450d0120024190086a2087026a29030021be0220022903900821bf02208802280200450d02200410230c020b20024190086a2084026a2092023602000b420021bf02420021be020b200241a8066a2085026a22c00220bd022085026a290000370300200241a8066a2086026a22c10220bd022086026a290000370300200241a8066a2087026a22c20220bd022087026a290000370300200220bd022900003703a8060240024020022802c00422c30220fd01460d0020022802c40421c4020c010b208902102622c302450d10410021c40220c30241003b010620c302410036020020c3022087026a20024190086a208a021094041a200241003602c404200220c3023602c0040b20bd022084026a21bd020c200b20fd02450d3420fd022802382204450d2920fd0228023022fe02200420e602746a21ff0220fd0220e9026a2180034106216d0c270b208803208e036a220429030021032088032903002107200241a8066a208f036a2238208903208f036a290000370300200241a8066a208c036a2240208903208c036a290000370300200241a8066a208e036a2241208903208e036a29000037030020022089032900003703a8062088032802282227ad2091037e220820920388a70d382008a722012090034c0d38208803208f036a290300210820042903002109208803290310212f208803290300212d208803280220210402400240024002402001450d00200110262228450d0e2027450d020c010b410821282027450d010b200420272093036c6a2106410021052028210103402001200429030037030020012004208e036a29030037030820012094036a20042094036a2903003703002001208b036a2004208b036a2903003703002001208f036a2004208f036a2903003703002001208c036a2004208c036a29030037030020012093036a2101200520a1036a210520042093036a22042006470d000c020b0b410021050b20024190086a208f036a2008370300208d03202f3703002095032005360200209603202736020020970320283602002002202d37039008200220093703980820980310262204450d0520042099036a209a03290097f6403700002004209a03290090f6403700002004209803209b031027223f450d06203f20022903a80637000f203f209c036a2038290300370000203f209d036a2040290300370000203f209e036a2041290300370000200241d0046a208f036a2204209f03370300200241d0046a208c036a2201209f03370300200241d0046a208e036a2205209f033703002002209f033703d004203f209b03200241d0046a1002200241a0056a208f036a2004290300370300200241a0056a208c036a2001290300370300200241a0056a208e036a2005290300370300200220022903d0043703a005200241e8056a208e036a2206209a03360200200220a0033703e805200220024190086a3602b007200241b0076a200241e8056a10662002208d033602b007200241b0076a200241e8056a10662097032802002104200220950328020022013602b007200241b0076a200241e8056a104102402001450d0020012093036c21270340024002400240024020022802ec052205200628020022016b208b034f0d002001208b036a22282001490d3d200520a103742238202820282038491b2228209a03480d3d2005450d0120022802e80520052028102722050d020c080b20022802e80521050c020b202810262205450d060b200220283602ec05200220053602e8050b20062001208b036a360200200520016a2201208e036a2004208f036a2900003700002001208c036a2004208b036a2900003700002001208f036a20042094036a29000037000020012004208c036a290000370000200220043602b007200241b0076a200241e8056a106620042093036a2104202720a6036a22270d000b0b200720dc01542104200320de01512101200320de0154210520022802ec052127200241a0056a208b0320022802e80522282006280200100402402027450d00202810230b2004200520011b21042087032090036a218703203f10230240209603280200450d0020970328020010230b200320de0120041b21de01200720dc0120041b21dc01208703450d340240208a032085032f01064f0d00208503208a032093036c6a20a2036a218803208503208a0320a303746a208e036a218903208a0320a1036a218a03410721270c1b0b4101210102402085032f0104220520850328020022042f0106490d00410121010340200120a1036a210120042f01042205200428020022042f01064f0d000b0b200420052093036c6a20a2036a2188032004200520a303746a208e036a2189032004200520a403746a20a5036a2802002185034100218a03200120a103460d1120a10320016b210403402085032802f806218503200420a1036a22040d000c130b0b0240024020b40320aa032f01064f0d0020aa0320b40320ae036c6a220420af036a280200210620b40320ad036a21b403200420b0036a2802002201450d360c010b0240024020aa032802002204450d0020aa0333010420b1038620ab03ad842103410121050c010b20ab03ad2103410021050b20aa0310232003a721ab030240200320b10388a7220620042f0106490d0003400240024020042802002201450d00200520ad036a2105200433010420b1038620ab03ad8421030c010b20ab03ad21030b200410232003a721ab0320012104200320b10388a7220620012f01064f0d000b0b2004200620b203746a20b3036a28020021aa032004200620ae036c6a220420af036a2802002106200420b0036a28020021010240200520ad03460d0020ad0320056b2104034020aa032802f80621aa03200420ad036a22040d000b0b410021b4032001450d350b20a90320ac036a21a90302402006450d00200110230b20a9030d120c340b41d4aac10041331021000b20284101102a000b41f8fec400104f000b20044108102a000b410f4101102a000b412f4101102a000b41d4aac10041331021000b41124101102a000b41324101102a000b20014108102a000b41b899c100104f000b20054108102a000b41f8064108102a000b41b899c100104f000b410021270c070b410421270c080b410721270c090b410721270c090b410821270c090b410021040c3d0b410121040c3c0b410221040c3b0b410321040c3a0b410321040c390b410321040c380b410321040c370b410321040c360b410321040c350b410321040c340b4104216d0c060b410021040c070b410221040c060b410121040c050b410321040c040b410321040c030b410321040c020b410321040c010b410321040b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0400010204040b20990120796a219f012034203520756c6a21a001207621a101203421710240024002400340207121a20120a00120716b207d4d0d0620a201207e6a2d0000450d0120a201207f6a2d0000450d0220a2012081016a2d0000450d0320a1012083016a21a10120a2012084016a217120a2012085016a2d00000d000b20a201410320756c6a21a201207120a001470d2e0c2d0b20a20120756a227120a001470d290c280b20a2012080016a217120a201410120756c6a21a201207120a001470d2a0c290b20a2012082016a217120a201410220756c6a21a201207120a001460d2c410121040c390b20a201207a6a290300210320a20129030021070340207120756a210402402071207e6a2d0000450d002004217120772004470d010c2e0b2071207a6a2903002208200320712903002209200754200820035420082003511b22011b21032009200720011b2107207120a20120011b21a2012004217120772004470d000b410221040c380b20a20120793a0040209c01450d0220a2012090016a21a30120a2012091016a21a4014102216d0c2d0b410221040c610b024002400240206d0e070001020405060a0a0b206c226e204e6a216c200241e0076a216f20022802e40721700c340b0240209e012802282204450d00200420756c2105209e012802202091016a210403402035200428020022014d0d0b02402034200120756c6a22012d00400d002001290310220320012087016a290300220784500d0020024180026a209e01207a6a290300209501209401209501109804200241b0026a209e012903002208209501209401209501109804200241f0016a2095012095012008209501109804200241a0026a20960120022903b00220022903880220022903f8018420950152200241b0026a207a6a290300220820022903800220022903f0017c7c22092008547222061b209601200920061b2003200710970420024190026a209e012097016a350200209e012087016a2903002203208e0186842003208e018820022903a002200241a0026a207a6a2903001098042001207a6a22062096012006290300220320024190026a207a6a2903007c200129030022072002290390027c22082007542206ad7c22072006200720035420072003511b22061b3703002001209601200820061b3703000b200420756a210420052092016a22050d000b0b209e01207c6a229e01209d01470d1e410021040c360b209b01207c6a21380240209b012802282201450d00209b012802202104200120756c21010340024020a3012004460d0020042093016a20a401209101109604450d00200420756a210420012092016a22010d010c020b209b012087016a2205290300210320a201207a6a22062903002107200420a2012903002208209b01208a016a222829030022097d3703002004200720037d2008200954ad7d37030820a20129030021032005200629030037030020282003370300200420756a210420012092016a22010d000b0b2038219b012038209d01470d1e0b20880120a2012086016a290000370300208b0120a2012089016a29000037030020024190086a207a6a220120a201208c016a290000370300200220a201290020370390080240209a01209901470d002099012079742204209f01209f012004491b229a01ad208d01862203208e0188a70d452003a722042078480d450240209901450d002073209901208f01742004102722730d010c0f0b200410262273450d0e0b2073209901208f01746a220420022903900837000020042087016a2088012903003700002004208a016a208b012903003700002004207a6a200129030037000020342130209f01219901209f012072490d100c390b20ce01220620b4016a2101200620ae016a21ce01207321040240024002400240024002400240034020a90120046b20b5014d0d0120042001460d022004200120b601109604450d020240200420b6016a22052001460d002005200120b601109604450d00200420b7016a22052001460d002005200120b601109604450d00200420b8016a22052001460d00200420b9016a21042005200120b6011096040d010b0b20d4012005460d030c020b200420a901460d02034020012004460d012004200120b601109604450d0120a901200420b6016a2204470d000c030b0b20d40120042205460d010b200520d40120b601109604450d00024020a70120bb016a2903002208200629030022038520a70120ba016a2903002207200620a5016a2903002209858450450d004200210342808080801021070c030b200241d0016a200920c70120c60120c701109804200241e0016a200320c70120c60120c701109804200241c0016a20c70120c701200320c70110980420022903d80120022903c8018420c70152200241e0016a20a5016a290300222f20022903d00120022903c0017c7c222d202f5472450d01200820c20188200720c20186842208200720c20188220784500d0c200241a0016a2003200920082007109704200241a0016a20a5016a290300210320022903a00121070c020b20ce0120cf01470d200c020b200820c801200820c80156200720c701522007501b22041b2203200720c70120041b220784500d0b200241b0016a20022903e001202d20032007109704200241b0016a20a5016a290300210320022903b00121070b20062007370310200620ba016a20033703002002200620bc016a2d00003a008205200220062f00243b0180052002200620b0016a2900003703f0042002200620bd016a2900003700f504200620b1016a2800002101200620b2016a2800002105200620be016a2800002128200620bf016a2800002106024020d50120d701470d0020d50120c0016a220420d501490d4520d50120c001742238200420042038491b2204ad20c1017e220820c20188a70d452008a7223820aa01480d450240024020d501450d0020d60120d50120c3016c2038102722d6010d010c0b0b2038102622d601450d0a0b200421d5010b20022d008205213820022f018005213f20d60120d70120c3016c6a2204200136000f2004200536000b20042028360007200420063600032004203f3b0100200420c4016a20383a000020042007370320200420c5016a2003370300200420ba016a20022900f504370000200420022903f00437001320d70120c0016a21d70120ce0120cf01470d1f0b02400240024020d701450d0020d70120c3016c2201450d0120d60120b6016a210442002103420021070340200420a5016a29030020077c2004290300220720037c2203200754ad7c2107200420c3016a2104200120cc016a22010d000c030b0b20d501450d3720d60110230c370b42002103420021070b20024190016a20c70120c60120037d2208200820c6015620c70120077d200320c60156ad7d220320c701522003501b22041b222d20c701200320041b220320d701ad222e20c70110970420022903900121090240202d202e5420aa012003501b0d0020024190016a20a5016a290300212f20d60120b6016a210420d70121010340200420a5016a220520ca0120052903002203202f7c2004290300220720097c22082007542205ad7c22072005200720035420072003511b22051b370300200420ca01200820051b370300200420c3016a2104200120cb016a22010d000b0b20024180016a20092003202e20031098040240202d2002290380017da72206450d0041002104034020d601200420d7017020c3016c6a220120c5016a220520ca01200529030022082001290320220320c8017c22072003542205ad7c220920052009200854200720035a1b22051b370300200120ca01200720051b370320200420c0016a22042006490d000b0b200220022d00aa063a009e05200220022f01a8063b019c05200220022903900837038805200220022900950837008d050240207220cd01470d00207220c0016a22042072490d44207220c001742201200420042001491b2204ad20c9017e220320c20188a70d442003a7220120aa01480d44024002402072450d002074207220b3016c2001102722740d010c0d0b200110262274450d0c0b200421720b20022d009e05210120022f019c052105207420cd0120b3016c6a220420d00136000f200420d10136000b200420d201360007200420d301360003200420053b0100200420c4016a20013a0000200420ba016a200229008d053700002004200229038805370013200420d701360228200420d501360224200420d60136022020cd0120c0016a21cd0120a70120a6016a22a70120a801470d100c390b20c3022087026a210520c302208b026a213820c3022f0106222820fe01742101417f21040240024002400240024003402001450d0120042082026a210420ab02208202200241a8066a20052084021096042206209202481b20920220061b2206450d04200120bb026a210120052084026a21052006208202460d000b20c4020d010c020b2028210420c402450d010b20c40220ab026a21c40220c302200420a502746a2089026a28020021c3024104216d0c2f0b20024190076a2085026a220120c00229030037030020024190076a2086026a220520c10229030037030020024190076a2087026a220620c202290300370300200220022903a80637039007200241c0046a2087026a222820282802002082026a360200200241e8056a2085026a22c5022001290300370300200241e8056a2086026a22c6022005290300370300200241e8056a2087026a22c702200629030037030020022002290390073703e80520382f01002205208c024f0d0120c302200420fe01746a2201208d026a20012087026a2206200520046b20fe01741095041a20012084026a20c50229030037000020012085026a20c60229030037000020012086026a20c702290300370000200620022903e80537000020c3022004208e026c6a22012090026a2001208f026a220620c302208b026a22052f010020046b208e026c1095041a20012091026a20920236020020012093026a20940237030020012095026a20be0237030020012096026a20bf0237030020012097026a20be02370300200620bf02370300200520052f01002082026a3b010020bd0220ff01470d150c3f0b20c3022004208e026c6a22042095026a20be0237030020042096026a20bf0237030020042097026a20be023703002004208f026a20bf0237030020042091026a209202360200200420bc026a280200210520042093026a22012802002104200120940237030002402004450d002005450d00200410230b20bd0220ff01470d110c3e0b20890210262205450d0c20052092023b0106200520920236020020052087026a20024190086a208a02109404210620024190086a208d026a22c80220c3022098026a29030037030020024190086a2084026a22c90220c3022099026a29030037030020024190086a2085026a22ca0220c302209a026a29030037030020024190086a2086026a22cb0220c302209b026a29030037030020024190086a2087026a22cc0220c302209c026a290300370300200241f0066a2085026a22cd0220c302209d026a290000370300200241f0066a2086026a22ce0220c302209e026a290000370300200241f0066a2087026a22cf0220c302209f026a290000370300200220c3022903880537039008200220c3022900c8013703f006200620c30220a0026a20c302208b026a22282f010020a1026a220120fe017410940421062005208f026a20c30220a2026a2001208e026c109404213f2028208b023b0100200520013b0106200220022d00f2063a009e05200220022f01f0063b019c05200220810229000037038805200220810220fe016a22d00229000037008d05200241f0066a208c026a22d10228000021d20220a40228000021d30220022800f30621d40220022800f70621d502200241a8066a208d026a22d60220c802290300370300200241a8066a2084026a22d70220c90229030037030020c00220ca0229030037030020c10220cb0229030037030020c20220cc0229030037030020022002290390083703a806024002402004208b024b0d0020c3022087026a200420fe01746a22012084026a200120382f010020046b20fe01741095041a20012085026a20c50229030037000020012086026a20c60229030037000020012087026a20c702290300370000200120022903e80537000020c302208f026a2004208e026c6a2201208e026a200120382f010020046b208e026c1095041a20012085026a20be02370300200120bf02370310200120be02370308200120bf023703002001208d026a20920236020020012094023703200c010b2006200420fe01746a20ba026a2006200420a1026a222820fe01746a2206200120a9027120286b20fe01741095041a20062085026a20c50229030037000020062086026a20c60229030037000020062087026a20c702290300370000200620022903e805370000203f2004208e026c6a220420b2026a200420b1026a22012005208b026a22382f010020286b208e026c1095041a200420b5026a20be02370300200420b6026a20bf02370300200420b7026a20be02370300200120bf02370300200420b3026a209202360200200420b4026a2094023703000b203820382f01002082026a3b010020a60220022d009e053a0000200241a0056a2087026a22d80220c202290300370300200241a0056a2086026a22d90220c102290300370300200241a0056a2085026a22da0220c002290300370300200241a0056a2084026a22db0220d702290300370300200241a0056a208d026a22dc0220d602290300370300200220022f019c053b01f80720022002290388053703d0042002200229008d053700d504200220022903a8063703a005200241b0076a208d026a22dd0220dc02290300370300200241b0076a2084026a22de0220db02290300370300200241b0076a2085026a22df0220da02290300370300200241b0076a2086026a22e00220d902290300370300200241b0076a2087026a22e10220d802290300370300200220022903a0053703b007200220a6022d00003a008205200220022f01f8073b018005200220022903d0043703f004200220022900d5043700f50420c30228020022e202450d0120c3022f010421e302410021e402200521e5020c1e0b20024188086a20a5026a224120022d0082053a0000200220022f0180053b018808200220022903f0043703f807200220022900f5043700fd0720dc0220dd0229030037030020db0220de0229030037030020da0220df0229030037030020d90220e00229030037030020d80220e102290300370300200220022903b0073703a00520e30220a90271212820e2022f0106220420aa024d0d0220a70210262206450d0920062092023b0106200620920236020020062087026a20024190086a20a802109404210120cd0220e202209d026a29000037030020ce0220e202209e026a29000037030020cf0220e202209f026a290000370300200220e2022900c8013703f00620c80220e2022098026a29030037030020c90220e2022099026a29030037030020ca0220e202209a026a29030037030020cb0220e202209b026a29030037030020cc0220e202209c026a290300370300200220e2022903880537039008200120e20220a0026a20e202208b026a223f2f0100220520a1026a220420fe017410940421422006208f026a20e20220a2026a2004208e026c109404214420062089026a20e20220ae026a200520af026a223820a502741094042140203f208b023b0100200620043b010602402038450d00410021042040210103402001280200220520043b010420052006360200200120ad026a2101203820042082026a2204470d000b0b20d60220c80229030037030020d70220c90229030037030020c00220ca0229030037030020c10220cb0229030037030020c20220cc0229030037030020022002290390083703a806200220022f01f0063b019c05200220022d00f2063a009e0520d102290000210320022900f3062107200220d00229000037008d05200220810229000037038805200241d0046a208c026a2238200337000020800220022903880537000020800220fe016a2243200229008d05370000200220073700d304200220022d009e053a00d204200220022f019c053b01d00420c80220d60229030037030020c90220d70229030037030020ca0220c00229030037030020cb0220c10229030037030020cc0220c202290300370300200220022903a806370390080240024020e30220a902712201208b024b0d0020e2022087026a220420282082026a220520fe01746a2004202820fe01746a2204203f2f0100224020286b224220fe01741095041a200420d30236000f200420d20236000b200420d502360007200420d402360003200420a5026a20412d00003a0000200420022f0188083b0000200420022903f80737001320042085026a20022900fd0737000020e202208f026a2028208e026c6a2204208e026a20042042208e026c1095041a2004208d026a20dc0229030037030020042084026a20db0229030037030020042085026a20da0229030037030020042086026a20d90229030037030020042087026a20d802290300370300200420022903a005370300203f20402082026a22043b010020e2022089026a2240202820a5027422416a2087026a2040200520a502746a2240200420a9027120056b20a502741095041a204020e5023602002001203f2f010022054f0d0120e20220416a20b0026a210403402004280200220120282082026a22283b0104200120e202360200200420ad026a210420052028470d000c020b0b2042202820af026a220520fe01746a2042202820a1026a220420fe01746a22012006208b026a223f2f010020046b20fe01741095041a20012085026a20022900fd07370000200120d30236000f200120d20236000b200120d502360007200120d402360003200120a5026a20412d00003a0000200120022f0188083b0000200120022903f80737001320442028208e026c6a220120b2026a200120b1026a2241203f2f0100224220046b208e026c1095041a200120b3026a20dc02290300370300200120b4026a20db02290300370300200120b5026a20da02290300370300200120b6026a20d902290300370300200120b7026a20d802290300370300204120022903a005370300203f20422082026a22013b01002040202820a5027422416a20b8026a2040200520a502746a2228200120a9027120056b20a502741095041a202820e5023602002005203f2f010022284b0d00200620416a20b9026a210103402001280200220520042082026a22043b010420052006360200200120ad026a210120282004470d000b0b20e4022082026a2128200241f4076a20a5026a220420022d00d2043a000020c70220cc0229030037030020c60220cb0229030037030020c50220ca02290300370300200241e8056a2084026a220120c902290300370300200241e8056a208d026a220520c802290300370300200220022f01d0043b01f40720022002290390083703e80520022080022900003703e007200220432900003700e507203828000021d202200241d0046a20a3026a28000021d30220022800d30421d40220022800d70421d50220dd02200529030037030020de02200129030037030020df0220c50229030037030020e00220c60229030037030020e10220c702290300370300200220022903e8053703b007200220042d00003a008205200220022f01f4073b018005200220022903e0073703f004200220022900e5073700f504024020e2022802002204450d0020e2022f010421e302200241c0046a1a20e2021a200421e202200621e502202821e4024105216d0c2e0b20e2021a200241c0046a22011a2006210520a702102622040d010c0c0b200241c0046a21012005210520a70210262204450d0b0b200441003b01062004410036020020042087026a20024190086a20a80210940421272004200128020022063602f80620012004360200200120012802042082026a360204200641003b010420062004360200202720042f0106220620fe01746a220120022f0180053b0000200120d30236000f200120d20236000b200120d502360007200120d402360003200120022903f004370013200120a5026a20022d0082053a000020012085026a20022900f50437000020042006208e026c6a22012091026a20dd0229030037030020012093026a20de0229030037030020012095026a20df0229030037030020012096026a20e00229030037030020012097026a20e1022903003703002001208f026a20022903b00737030020042089026a20062082026a220120a502746a2005360200200420013b0106200520013b01042005200436020020c3021a20bd0220ff01470d0f0c3a0b20e2022087026a220120282082026a220520fe01746a2001202820fe01746a2201200420286b220620fe01741095041a200120d30236000f200120d20236000b200120d502360007200120d402360003200120a5026a20412d00003a0000200120022f0188083b0000200120022903f80737001320012085026a20022900fd0737000020e2022028208e026c6a22012090026a2001208f026a22272006208e026c1095041a20012091026a20dc0229030037030020012093026a20db0229030037030020012095026a20da0229030037030020012096026a20d90229030037030020012097026a20d802290300370300202720022903a00537030020e202208b026a220120042082026a22043b010020e2022089026a2206202820a502746a2087026a2006200520a502746a2206200420a9027120056b20a502741095041a200620e5023602000240202820012f010022044f0d0020e50220053b010420e50220e20236020020052004460d00200420ab026a210620e202200520ab026a220420a502746a20ac026a2101034020012802002205200420a5026a3b0104200520e202360200200120ad026a2101200620042082026a2204470d000b0b41001a200241c0046a1a20c3021a20bd0220ff01470d0d0c390b20fe0222810320e9026a21820320810320e8026a21fe02200241c0046a21830320022802c4042184030c2b0b41c8eec300200120351029000b20384108102a000b41d8eec300104f000b41f0eec300104f000b20014104102a000b41a8074108102a000b20044101102a000b41f8064108102a000b41a8074108102a000b410221270c050b410321270c050b410521270c050b410521270c050b410521270c050b410521270c050b410321040c480b410321040c470b410321040c460b410321040c450b410321040c440b410321040c430b4101216d0c0c0b4102216d0c0d0b4103216d0c0d0b4103216d0c0d0b4105216d0c0e0b410221040c120b410121040c110b410221040c100b410121040c0f0b410221040c0e0b410121040c0d0b410221040c0c0b410221040c0b0b410321040c0a0b410321040c090b410321040c080b410321040c070b410321040c060b410321040c050b410321040c040b410321040c030b410021040c010b410121040b0240024002400240024002400240024002400240024003400240024020040e020001010b206f2802002206204d6a210520062f010622382053742101417f2104024002400240024003402001450d01200420456a210420522045206e2005204e10960422282055481b205520281b2228450d042001205d6a21012005204e6a210520282045460d000b20700d010c020b203821042070450d010b207020526a217020062004205b746a205c6a216f410021040c030b206c206a470d080c110b203520062004205b746a205e6a220428020022014d0d0320342001205f6c6a220129031021032001204b6a290300210720682067107c21082035200428020022014d0d0420342001205f6c6a2201204b6a20602007200320087c22082003542205ad7c220920052009200754200820035a1b22051b37030020012060200820051b370310200241f0066a204b6a2201206e204b6a290000370300200241f0066a204c6a2205206e204c6a290000370300200241f0066a204d6a2206206e204d6a2900003703002002206e2900003703f0062004280200212802402062206b470d00206220456a22042062490d1e20622045742238200420042038491b2204ad20507e2203205188a70d1e2003a722382055480d1e024002402062450d0020692062205f6c2038102722690d010c080b203810262269450d070b200421620b2069206b205f6c6a22042057370300200420283602202004204b6a20573703002004204c6a20573703002004204d6a2057370300200420596a2001290300370200200420586a2005290300370200200420616a2006290300370200200420022903f006370224206b20456a216b206c206a470d080c100b208303280200220620ea026a210520062f0106223820eb02742101417f210402400240024003402001450d01200420f1026a210420ec0220f102208203200520ef02109604222820f002481b20f00220281b2228450d03200120f2026a2101200520ef026a2105202820f102460d000b2084030d010c040b20382104208403450d030b20840320ec026a2184032006200420ed02746a20ee026a218303410121040c010b0b200620f4026a200420f3026c6a2204450d00200420ea026a220120f6022001290300220320810320f5026a22012903007c2004290300220720810320f3026a22052903007c22082007542206ad7c22072006200720035420072003511b22061b370300200420f602200820061b37030020024190086a20f7026a20800320f7026a290000220337030020024190086a20e9026a20800320e9026a290000220737030020024190086a20ea026a20800320ea026a290000220837030020022080032900002209370390082001290300212f2005290300212d200241a8066a20ea026a22282008370300200241a8066a20f7026a22382003370300200241a8066a20e9026a223f2007370300200220093703a806200420f9026a2105200420ef026a2106024002400240024020042802282201200420f8026a280200470d00200120f1026a22042001490d1f200120f102742240200420042040491b2240ad20fa027e220320fb0288a70d1f2003a7224120f002480d1f2001450d012006280200200120f3026c2041102722040d020c080b200628020021040c020b204110262204450d060b20062004360200200620fc026a2040360200200528020021010b2004200120f3026c6a2204202f3703082004202d370300200420022903a806370310200420f9026a2038290300370300200420ef026a203f290300370300200420f7026a20282903003703002005200528020020f1026a3602000b20fe0220ff02470d060c0b0b41a889c400200120351029000b41c8eec300200120351029000b20384108102a000b20414108102a000b4100216d0c020b4100216d0c020b4106216d0c020b410321040c020b410321040c010b410321040c000b0b20fd0220e8026a22fd0220e702460d0a41062127410321040c290b20a70120a6016a22a70120a801460d0341032127410321040c280b200241d0046a204b6a22042064290300370300200241d0046a204c6a22012065290300370300200241d0046a204d6a22052066290300370300200220022903b0073703d00420682067107c210320024190076a204b6a2206200429030037030020024190076a204c6a2204200129030037030020024190076a204d6a22012005290300370300200220022903d0043703900702402063450d00203e10230b2069450d0020024190086a204b6a2227200629030037030020024190086a204c6a2206200429030037030020024190086a204d6a222820012903003703002002200229039007370390080240200241f8076a204d6a2205280200220120022802fc07470d00200241a8066a2033107820022802fc072204200528020022386b205220022802a806223e20456a223f203f203e491b223e4f0d002038203e6a223e2038490d0d20042045742238203e203e2038491b223ead20547e2207205188a70d0d2007a722382055480d0d024002402004450d0020022802f807200420566c2038102722040d010c1a0b203810262204450d190b2002203e3602fc07200220043602f8070b20022802f807200120566c6a22042069360220200420022903900837022c200420476a206b360200200420496a20623602002004205737031020042057370308200420033703002004204b6a2057370300200420586a2028290300370200200420596a20062903003702002004205a6a20272903003702002005200120456a360200200241a8066a20331079200241a8066a204e6a280200223e0d1d0b203310230240203520324f0d0002402037450d00203610230b024020024180086a2802002271450d00207141d0006c210420022802f80741206a217103400240207141046a280200450d00207128020010230b207141d0006a2171200441b07f6a22040d000b0b024020022802fc07450d0020022802f80710230b20022802e00720022802e407200241e8076a280200107d0c030b2035203120352031491b2272ad2203421b88a70d0c2003420586a72204417f4c0d0c024002402004450d002004102622730d0120044101102a000b410121730b2003422c7e2203422088a70d0c2003a72204417f4c0d0c0240024002402004450d00200410262274450d1b2072450d020c010b410421742072450d010b41c80021752034203541c8006c22766a217741002178410121794108217a200241f8076a41086a217b41d000217c419f02217d41c000217e418801217f41900121800141d00121810141d80121820141e07d21830141a0022184014198022185014138218601411821870120024190086a41186a21880141302189014110218a0120024190086a41106a218b014128218c014205218d014220218e014105218f01417c219001412021910141b87f21920141242193014280808080102194014200219501427f2196014114219701420121980141002199012072219a01410221270c200b4100219f014100219a010b410821a5010240200241f8076a41086a2802002204450d0041d00021a60120022802f80722a701200441d0006c6a21a8012073209f014105746a21a901410021aa01412e21ab01413f21ac0141c40021ad0141c80021ae01413b21af01413721b001413321b101412f21b201412c21b301412421b40141ff0021b501412021b60141c00021b70141e00021b80141800121b901411821ba01411021bb01412621bc01413c21bd01412b21be01412721bf01410121c001423021c101422021c201413021c301410221c401412821c50142808080801021c601420021c701420121c801422c21c901427f21ca01417f21cb01415021cc01410021cd01410321270c200b410021cd010b02402037450d00203610230b024020024180086a2802002204450d00200441d0006c210120022802f80741206a210403400240200441046a280200450d00200428020010230b200441d0006a2104200141b07f6a22010d000b0b024020022802fc07450d0020022802f80710230b410821d80120022802e00720022802e407200241e0076a41086a280200107d2073450d0020cd01412c6c2204412c6e21d901410021da012004412c490d0120d901ad4206862203422088a70d092003a722014100480d092001102622d801450d192074207420046a22db01470d020c030b420021dc0120024190086a41086a22714200370300200242003703900841d099c100411120024190086a1000200241a8066a41086a207129030037030020022002290390083703a806410021dd0102400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012271417f460d162071410f4d0d1620024198086a29030021de0120022903900821dc010c010b420021de010b0c070b410021d9012074207420046a22db01460d010b410121df01200241a8066a41017221e001410021e101411821e201411021e301410821e401412c21e501412021e60120024190086a41206a21e701200241b4086a21e801413021e901420621ea01422021eb01413821ec01413421ed01412821ee0141c00021ef01420021f001411621f10141ecb5c10021f20142ffffffff0f21f301427f21f40141a886c50021f501417f21f601415021f701410f21f801420121f901410021da0120d80121fa01207421fb01410421270c1c0b200242003702c40441f098c40021fd01200241f098c4003602c004209f01450d00410521fe012073209f014105746a21ff01200241d0046a41136a218002200241f0066a41136a2181024101218202200241a8066a4101722183024120218402411821850241102186024108218702200241b4086a21880241f80621890241f006218a024106218b02410b218c024128218d024130218e0241e802218f024198032190024190032191024100219202418803219302420821940241800321950241f80221960241f00221970241b00521980241a80521990241a005219a02419805219b02419005219c0241e001219d0241d801219e0241d001219f0241e80121a002417921a10241b80521a202410f21a302200241f0066a410f6a21a402410221a502200241f8076a41026a21a60241a80721a70241a00721a80241ffff0321a902410a21aa02417f21ab0241800721ac02410421ad0241940721ae02417a21af0241fc0621b00241b07d21b10241e07d21b20241d87d21b30241d07d21b40241c87d21b50241c07d21b60241b87d21b702416c21b80241e00621b90241c07e21ba02416021bb02418c0321bc02207321bd02410521270c1c0b410621e60220da014106742204450d0020d80120046a21e70241c00021e802411021e902410821ea02410521eb02417f21ec02410221ed0241f80621ee02412021ef02410021f002410121f102416021f202413021f30241e80221f402413821f502427f21f602411821f702412421f802412821f902423021fa02422021fb02410421fc0220d80121fd02410621270c1c0b20024190086a41086a22044200370300200242003703900841a299c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a8064100213a024002400240200241a8066a411041a886c500410041001001417f460d00200242103702a4052002200241a8066a3602a00520024190086a200241a0056a1028200228029008223b450d14200228029408213a20024198086a28020041057422420d010c020b4101213b41004105742242450d010b203b21040340410f10262201450d08200141076a4100290097f64037000020014100290090f6403700002001410f412f10272201450d092001200429000037000f200141276a200441186a223f2900003700002001411f6a200441106a2240290000370000200141176a200441086a2241290000370000200241d0046a41186a22054200370300200241d0046a41106a22064200370300200241d0046a41086a22274200370300200242003703d0042001412f200241d0046a1002200241a0056a41186a22432005290300370300200241a0056a41106a22442006290300370300200241a0056a41086a2285032027290300370300200220022903d0043703a005200241a0056a4120100320011023411210262201450d0a200141106a41002f00a6f54022393b0000200141086a410029009ef540220337000020014100290096f540220737000020014112413210272201450d0b200120042900003700122001412a6a203f290000370000200141226a20402900003700002001411a6a2041290000370000200542003703002006420037030020274200370300200242003703d00420014132200241d0046a1002200241f0066a41186a2005290300370300200241f0066a41106a2006290300370300200241f0066a41086a2027290300370300200220022903d0043703f006410021280240200241f0066a412041a886c500410041001001417f460d002002410036029008200241f0066a412020024190086a41044100100141016a41044d0d082002280290082138200241f0066a41201003410121280b2001102302402038410020281b222841014d0d00411210262201450d0d200141106a20393b0000200141086a20033700002001200737000020014112413210272201450d0e200120042900003700122001412a6a203f290000370000200141226a20402900003700002001411a6a2041290000370000200542003703002006420037030020274200370300200242003703d00420014132200241d0046a100220432005290300370300204420062903003703002085032027290300370300200220022903d0043703a00520022028417f6a36029008200241a0056a412020024190086a41041004200110230b200441206a2104204241606a22420d000b0b0240203a450d00203b10230b20022802c004218503024020022802c4042204450d002004210103402085032802f8062185032001417f6a22010d000b03402004417f6a22040d000b0b4108218603024002400240200241c0046a41086a280200228703450d002085032f0106450d0120850341e8026a21880320850341086a2189034101218a030c020b427f21dc01427f21de010c020b024002402085032f0104228b0320850328020022042f01064f0d00410121010c010b410121010340200141016a210120042f0104228b03200428020022042f01064f0d000b0b2004208b0341306c6a41e8026a2188032004208b034105746a41086a2189032004208b034102746a41fc066a2802002185034100218a0320014101460d00410120016b210403402085032802f806218503200441016a22040d000b0b4110218c0320024190086a41106a218d03427f21dc014108218e034118218f03417f219003423021910342202192034130219303412821940320024190086a41286a219503200241b4086a2196034120218b0320024190086a41206a219703410f21980341072199034100219a03412f219b034127219c03411f219d034117219e034200219f03420121a003410121a10341e80221a203410521a303410221a40341fc0621a503415021a603427f21de010c150b20024190086a2086036a22044200370300200242003703900841d099c100411120024190086a1000200241a8066a2086036a2201200429030037030020022002290390083703a806200220de0137039808200220dc0137039008200241a8066a411020024190086a4110100420044200370300200242003703900841a299c100411620024190086a10002001200429030037030020022002290390083703a806200241003602980820024201370390082002209f013602a005200241a0056a20024190086a104102400240209f01450d00209f014105742128410020024190086a41086a28020022016b2106200228029008213820022802940821272073210403400240202720066a411f4b0d00200141206a22052001490d062027410174223f20052005203f491b22054100480d06024002402027450d00203820272005102722380d010c110b200510262238450d100b200521270b203820016a22052004290000370000200541186a200441186a290000370000200541106a200441106a290000370000200541086a200441086a290000370000200641606a2106200141206a2101200441206a2104202841606a22280d000b20024198086a2001360200200220273602940820022038360290080c010b20024198086a2802002101200228029408212720022802900821380b200241a8066a411020382001100402402027450d00203810230b02400240024002400240209f014105742204450d00200441057522a703ad4205862203422088a70d072003a722014100480d072001102622dd01450d16207320046a2073460d020c010b410121dd01410021a703207320046a2073460d010b209f01410574220541606a410576212720024190086a410172210620dd012104207321010340200241a8066a41186a200141186a290000370300200241a8066a41106a200141106a290000370300200241a8066a41086a200141086a290000370300200220012900003703a80620024190086a200241a8066a106e0240024020022d0090084101470d00200241d0046a41186a200641186a290000370300200241d0046a41106a200641106a290000370300200241d0046a41086a200641086a290000370300200220062900003703d0040c010b200241d0046a41186a4200370300200241d0046a41106a4200370300200241d0046a41086a4200370300200242003703d0040b200141206a2101200420022903d004370000200441186a200241d0046a41186a290300370000200441106a200241d0046a41106a290300370000200441086a200241d0046a41086a290300370000200441206a2104200541606a22050d000b202741016aad42208621a803209a01450d020c010b420021a803209a01450d010b207310230b200241c8046a28020021a90320022802c00421aa03024020022802c4042204450d00034020aa032802f80621aa032004417f6a22040d000b0b20a903450d00410021ab03417f21ac03410121ad03413021ae03418c0321af0341880321b003422021b103410221b20341fc0621b303410021b403410821270c1c0b024020aa0341f098c400460d0020aa03280200217120aa0310232071450d0020712802002104207110232004450d00024020042802002271450d0003402004102320712104207128020022a201217120a2010d000b0b200410230b024020da01450d0020da01410674210420d80141306a217103400240207141046a280200450d00207128020010230b207141c0006a2171200441406a22040d000b0b024020d901450d0020d80110230b20a703ad2103024020cd01450d0020cd01412c6c2104207441206a217103400240207141046a280200450d00207128020010230b2071412c6a2171200441546a22040d000b0b20a80320038421032072450d00207410230b20024190086a41086a22714200370300200242003703900841d49cc100411520024190086a1000200241a8066a41086a207129030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0c20022802900821710c010b413c21710b200241206a20dc0120de01428094ebdc034200109704200241106a200229032022f001200241206a41086a29030022074280ec94a37c427f109804200220f00120072071ad2208420010980420024190086a41086a22714200370300200242003703900841db98c100411c20024190086a1000200241a8066a41086a207129030037030020022002290390083703a8062002200229030022f001200820dc0120022903107c7e428094ebdc038042ffffffff0f837c2207370390082002200241086a290300200720f00154ad7c37039808200241a8066a411020024190086a4110100420002003370204200020dd01360200200241b00f6a24000f0b101e000b101d000b41d4aac10041331021000b410f4101102a000b412f4101102a000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b20054101102a000b41d4aac10041331021000b20384108102a000b41d4aac10041331021000b20044104102a000b41d4aac10041331021000b20014101102a000b20014108102a000b410121270c010b410721270c060b410321040c070b410321040c060b410321040c050b410321040c040b410321040c030b410321040c020b410321040c010b410321040c000b0bae07020b7f077e230041b0026b22022400200241086a2001280200200128020428020c1100000240024020022903084201520d00200241e8016a4101722103200241086a41086a2104200241b8016a2105200241bc016a2106200141046a2107200241fb006a21080340200241f8006a41186a2209200441186a290000370300200241f8006a41106a220a200441106a290000370300200241f8006a41086a220b200441086a29000037030020022004290000370378200241e8016a200241f8006a106e02400240024020022d00e8014101470d0020024190026a41186a200341186a29000037030020024190026a41106a200341106a29000037030020024190026a41086a200341086a290000370300200220032900003703900220024198016a20024190026a106b2005280200220c450d0120024198016a41086a290300210d200229039801210e2006280200450d02200c10230c020b200541003602000b4200210e4200210d0b200241e8016a41186a220c2009290300370300200241e8016a41106a2209200a290300370300200241e8016a41086a220a200b290300370300200220022903783703e80120024198016a41186a220b200c29030037030020024198016a41106a220c200929030037030020024198016a41086a2209200a290300370300200220022903e8013703980102400240200e200d107c220f4200510d0020024190026a41186a200b29030037030020024190026a41106a200c29030037030020024190026a41086a200929030037030020022002290398013703900220022002280078360270200220082800003600734200211041002109200f2111200e2112200d21130c010b410221090b200241d0006a41186a20024190026a41186a290300370300200241d0006a41106a20024190026a41106a290300370300200241d0006a41086a20024190026a41086a2903003703002002200229039002370350200220022802703602482002200228007336004b20094102470d02200241086a2001280200200728020028020c11000020022903084201510d000b0b200041023a0040200241b0026a24000f0b20002011370310200042003703082000420037030020002002290350370320200020093a004020002002280248360041200041186a2010370300200041d0006a2013370300200041c8006a2012370300200041c4006a200228004b360000200041286a200241d8006a290300370300200041306a200241e0006a290300370300200041386a200241d0006a41186a290300370300200241b0026a24000be01f03017f027e397f23004180066b22032400200241d8006a2903002104200241d0006a2903002105200228020021062003410c6a200241046a41cc001094041a200341d8006a2003410c6a41046a41c8001094041a20012802002107200341c0026a41186a220820034190016a290300370300200341c0026a41106a220920034188016a290300370300200341c0026a41086a220a20034180016a290300370300200320032903783703c00202400240024041c80010262202450d002002420037030020022006360220200241186a4200370300200241106a4200370300200241086a42003703002002200341f8006a220b2902003702242002412c6a200b41086a290200370200200241346a200b41106a2902003702002002413c6a200b41186a29020037020020052004107c2104200341e8016a41186a2008290300370300200341e8016a41106a2009290300370300200341e8016a41086a200a290300370300200320032903c0023703e8010240024002400240200741046a28020020072802082208470d00200841016a22092008490d032008410174220a20092009200a491b220aad42d0007e2205422088a70d032005a7220c4100480d032008450d012007280200200841d0006c200c10272209450d020c050b200728020021090c050b200c102622090d030b200c4108102a000b101e000b41c8004108102a000b20072009360200200741046a200a360200200741086a28020021080b2009200841d0006c6a22084200370310200842003703082008200437030020082002360220200820032903e80137022c200841186a4200370300200841246a428180808010370200200841c4006a200341e8016a41186a22022903003702002008413c6a200341e8016a41106a2209290300370200200841346a200341e8016a41086a2208290300370200200741086a2207200728020041016a3602002001280208210d2002200b41186a2900003703002009200b41106a2900003703002008200b41086a2900003703002003200b2900003703e8010240024002400240200d280200220a41f098c400460d00200d280204210e0c010b4194031026220a450d014100210e200a41003b0106200a4100360200200a41086a200341c0026a418c031094041a200d4100360204200d200a3602000b0c010b4194034104102a000b41002102024003400240024002400240024002400240024020020e020001010b200a41086a210b200a41066a2109200a2f010622014105742108417f21020240024002400240024003402008450d01200241016a2102417f4101200341e8016a200b412010960422074100481b410020071b2207450d04200841606a2108200b41206a210b20074101460d000b200e0d010c020b20012102200e450d010b200e417f6a210e200a20024102746a4194036a280200210a410021020c0a0b200341a0016a41186a2207200341e8016a41186a2208290300370300200341a0016a41106a220f200341e8016a41106a220b290300370300200341a0016a41086a2201200341e8016a41086a2210290300370300200320032903e8013703a001200d200d28020841016a36020820082007290300370300200b200f29030037030020102001290300370300200320032903a0013703e80120092f0100220f410b4f0d01200a41086a2207200241016a22014105746a200720024105746a2207200f20026b4105741095041a200741186a2008290300370000200741106a200b290300370000200741086a2010290300370000200720032903e801370000200a41e8026a220820014102746a200820024102746a220b200a41066a22082f010020026b4102741095041a200b2006360200200820082f010041016a3b01000c0a0b200a20024102746a41e8026a20063602000c090b41940310262211450d04201141003b010620114100360200201141086a200341c0026a418c03109404210b2003200a41e0016a2900003700ad022003200a2900db013703a8022003200a41ca016a2d00003a00be022003200a2f00c8013b01bc02200a41cb016a2800002112200a41cf016a2800002113200a41d3016a2800002114200a41d7016a2800002115200a280280032116200b200a41e8016a200a41066a22102f010041796a2208410574109404210b201141e8026a200a4184036a20084102741094042107201041063b0100201120083b0106200320032d00be023a00a602200320032f01bc023b01a402200320032903a80237039002200320032900ad023700950202400240200241064b0d00200a41086a2208200241016a220b4105746a200820024105746a220820092f010020026b4105741095041a200841186a200341e8016a41186a290300370000200841106a200341e8016a41106a290300370000200841086a200341e8016a41086a290300370000200820032903e801370000200a41e8026a2208200b4102746a200820024102746a220820092f010020026b4102741095041a0c010b200b2002417a6a220f4105746a200b200241796a22104105746a2202200841ffff037120106b4105741095041a200241186a200341e8016a41186a290300370000200241106a200341e8016a41106a290300370000200241086a200341e8016a41086a290300370000200220032903e8013700002007200f4102746a200720104102746a2208201141066a22092f010020106b4102741095041a0b2008200636020041012110200920092f010041016a3b0100410221172003418c026a41026a221820032d00a6023a0000200320032f01a4023b018c0220032003290390023703d80120032003290095023700dd01200341d4016a41026a221920182d00003a0000200320032900dd013700c501200320032903d8013703c001200320032f018c023b01d401200a280200221a450d01200a2f0104211b41ffff03211c410a211d41c403211e4100211f4108212041bc03212141ca01212241db01212341e001212441cb01212541cf01212641d301212741d7012128418003212941e801212a4106212b4179212c4105212d418403212e41e802212f41b00321304194032131417a21324118213341980321344104210f416c213541fc0221360c060b201820192d00003a0000200320032f01d4013b018c02200320032903c0013703e801200320032900c5013700ed01201b201c712101201a2f01062202201d4d0d01201e10262207450d022007201f3b01062007201f360200200720206a200341c0026a202110940421082003201a20226a2d00003a00be022003201a2f00c8013b01bc022003201a20236a2900003703a8022003201a20246a2900003700ad02201a20256a2800002137201a20266a280000213a201a20276a2800002139201a20286a2800002138201a20296a280200213b2008201a202a6a201a202b6a220c2f0100220b202c6a2202202d74109404213c2007202f6a201a202e6a2002201774109404213d200720316a201a20306a200b20326a2209201774109404213e200c202b3b0100200720023b010602402009450d0041002102203e210803402008280200220b20023b0104200b20073602002008200f6a21082009200220106a2202470d000b0b200320032d00be023a00a602200320032f01bc023b01a402200320032903a80237039002200320032900ad0237009502200341d8016a20176a220920032d00a6023a0000200320032f01a4023b01d80120032003290390023703c00220032003290095023700c50202400240201b201c712208202b4b0d00201a20206a2202200120106a221b202d746a20022001202d746a2202200c2f010020016b202d741095041a200220336a20032900ed013700002002201536000f2002201436000b2002201336000720022012360003200220176a20182d00003a0000200220032f018c023b0000200220032903e801370013201a202f6a220b201b20177422136a200b200120177422026a220b200c2f0100221420016b2017741095041a200b2016360200200c201420106a220b3b0100201a20316a220c20026a20206a200c20136a220c200b201c71220b201b6b2017741095041a200c20113602002008200b4f0d01201a20026a20346a2102034020022802002208200120106a22013b01042008201a3602002002200f6a2102200b2001470d000c020b0b203c200120326a220b202d746a203c2001202c6a2202202d746a22082007202b6a221b2f010020026b202d741095041a200820336a20032900ed013700002008201536000f2008201436000b2008201336000720082012360003200820176a20182d00003a0000200820032f018c023b0000200820032903e801370013203d200b20177422086a203d20022017746a220c201b2f0100221320026b2017741095041a200c2016360200201b201320106a220c3b0100203e2001201774221b6a20356a203e20086a2208200c201c712201200b6b2017741095041a20082011360200200b20014b0d002007201b6a20366a210803402008280200220b200220106a22023b0104200b20073602002008200f6a210820012002470d000b0b201920092d00003a0000200320032f01d8013b01d401200320032903c0023703c001200320032900c5023700c5010240201a2802002202450d00201a2f0104211b203721122038211520392114203a21132002211a203b211620072111410121020c070b203721122038211520392114203a211320072111203b21160b41c40310262202450d03200241003b010620024100360200200241086a200341c0026a41bc0310940421102002200d280200220836029403200d2002360200200d200d28020441016a360204200841003b010420082002360200201020022f0106220b4105746a220820032903c001370013200820032f01d4013b00002008201536000f2008201436000b2008201336000720082012360003200841186a20032900c501370000200841026a200341d4016a41026a2d00003a00002002200b4102746a41e8026a201636020020024194036a200b41016a22084102746a2011360200200220083b0106201120083b0104201120023602000c060b201a41086a2208200141016a220b4105746a200820014105746a2208200220016b4105741095041a200841186a20032900ed013700002008201536000f2008201436000b2008201336000720082012360003200841026a2003418c026a41026a2d00003a0000200820032f018c023b0000200820032903e801370013201a41e8026a2202200b41027422086a2002200141027422106a2202201a41066a22072f0100220f20016b4102741095041a200220163602002007200f41016a22023b0100201a4194036a220720106a41086a200720086a2208200241ffff03712210200b6b4102741095041a20082011360200201b41ffff037120104f0d05201a200b417f6a22024102746a4198036a210803402008280200220b200241016a22023b0104200b201a360200200841046a210820102002470d000c060b0b41c4034104102a000b4194034104102a000b41c4034104102a000b410121020c000b0b2000200341d8006a41c8001094041a20034180066a24000b0900200042003702000bc70703037f047e047f230022022103200241a0026b416071220224002001411c6a22042902002105200420022903d801370200200141146a22042902002106200420022903d0013702002001410c6a22042902002107200420022903c801370200200241003a00c00120012902042108200120022903c00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241c0016a41176a22042002290038370000200241c0016a41106a220a2002290031370300200241c0016a41086a220b2002290029370300200220022900213703c001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903c001370300411210262204450d01200441106a41002f00acc7403b0000200441086a41002900a4c7403700002004410029009cc74037000020044112413210272204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241c0016a41186a220a4200370300200241c0016a41106a220b4200370300200241c0016a41086a220c4200370300200242003703c00120044132200241c0016a100220024190016a41186a200a29030037030020024190016a41106a200b29030037030020024190016a41086a200c290300370300200220022903c0013703900120024190016a412041a886c500410041001001417f460d03200242203702b401200220024190016a3602b001200241c0016a200241b0016a10880120022d00cc014102460d0420024180016a41086a220a200241c0016a41086a280200360200200220022903c00137038001200241206a200241cd016a41c3001094041a20024190016a41086a220b200a280200360200200220022903800137039001200241c0016a200241206a41c1001094041a200141246a20024180026a2d00003a00002001411c6a200241f8016a290000370000200141146a200241f0016a2900003700002001410c6a200241c0016a41286a290000370000200120022900e00137000420002002290300370000200041086a200241086a290300370000200041106a200241106a290300370000200041176a200241176a290000370000200020093a001f200041286a200b280200360200200020022903900137022020041023200324000f0b20004100360220200324000f0b41124101102a000b41324101102a000b41faccc40041d7001021000b41d4aac10041331021000b9c0d04057f017e197f027e230041f0026b2204240002400240410d10262205450d00200541056a41002900ee9c41370000200541002900e99c413700002005410d412d10272205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41186a22064200370300200441a0026a41106a22074200370300200441a0026a41086a22084200370300200442003703a0022005412d200441a0026a1002200441e0016a41186a2006290300370300200441e0016a41106a2007290300370300200441e0016a41086a2008290300370300200420042903a0023703e001024002400240024002400240200441e0016a412041a886c500410041001001417f460d00200441003a00a002200441e0016a4120200441a0026a41014100100141016a41014d0d0520042d00a002220641034f0d052005102320064101460d0320064102470d01200441a0026a2001106e20042d00a0024101470d02200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a20022003107e20043502384201852102200441386a41106a2903002103200441386a41086a29030021090c040b200510230b200441f8006a2001106e20042d00784101470d00200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2207290000370300200420042900793703a001200441a0026a200441a0016a106b200441c0016a41186a22082005290000370300200441c0016a41106a220a2006290000370300200441c0016a41086a220b2007290000370300200420042900793703c00120042802c002220c450d00200441e0016a41186a220d2008290300370300200441e0016a41106a220e200a290300370300200441e0016a41086a220f200b290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2207200441a0026a41106a2208290300370300200441e0016a41386a2210200441a0026a41186a2211290300370300200441086a41086a2212200441cc026a2213290200370300200441086a41106a2214200441d4026a2215290200370300200441086a41186a2216200441dc026a2217290200370300200441086a41206a2218200441e4026a2219290200370300200441086a41286a221a200441ec026a221b280200360200200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221c2010290300370300200441386a41306a221d2007290300370300200441386a41286a221e2005290300370300200441386a41206a221f200429038002370300200441386a41186a2220200d290300370300200441386a41106a2221200e290300370300200441386a41086a2222200f290300370300200420042903e0013703382010201c2903003703002007201d2903003703002005201e290300370300200441e0016a41206a221c201f290300370300200d2020290300370300200e2021290300370300200f2022290300370300200420042903383703e001200441f8006a41186a2020290300370300200441f8006a41106a2021290300370300200441f8006a41086a202229030037030020042004290338370378201120102903003703002008200729030037030020062005290300370300200441c4026a2205200429030837020020132012290300370200201520142903003702002017201629030037020020192018290300370200201b201a2802003602002004200c3602c0022004201c2903003703a00220082008290300220920027c22233703002011201129030020037c2023200954ad7c37030020062903002109200420042903a002222320027c22243703a0022006200920037c2024202354ad7c370300200441c0016a200120022003107e20043502c0012102200a2903002103200b2903002109200441f8006a200441a0026a107f02402005280200450d00200441a0026a41206a28020010230b200242018521020c020b420021020c010b200441a0026a200120022003107e20043502a0024201852102200441b0026a2903002103200441a8026a29030021090b2000200937030820002002370300200041106a2003370300200441f0026a24000f0b41d4aac10041331021000b410d4101102a000b412d4101102a000bcc0202047f047e230041206b22012400200141106a41086a220242003703002001420037031041ecb5c1004116200141106a1000200141086a22032002290300370300200120012903103703000240024002402001411041a886c500410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b2000280200220041086a290300210720002903002108200242003703002001420037031041ecb5c1004116200141106a100020032002290300370300200120012903103703002001427f200520077c200620087c22072006542202ad7c22062002200620055420062005511b22021b3703182001427f200720021b37031020014110200141106a41101004200141206a24000f0b41d4aac10041331021000baa0204017f017e017f017e230041c0006b2202240042002103200241306a41086a220442003703002002420037033041ecb5c1004116200241306a1000200241206a41086a200429030037030020022002290330370320024002400240200241206a411041a886c500410041001001417f460d002002420037033820024200370330200241206a4110200241306a4110410010012204417f460d022004410f4d0d02200241106a2002290330200241306a41086a290300427f42001097042002290310220342012003420156200241106a41086a29030022034200522003501b22041b22052003420020041b22038450450d0141a0c9c300104f000b420121050b2002200020012005200310970420022903002103200241c0006a240020030f0b41d4aac10041331021000b920303017f017e027f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d00410021034100210103402002417f6a21020240200120002f01064f0d00200141016a210120020d010c020b0240024020002802002201450d0020003301044220862003ad842104410121050c010b2003ad210441002105410021010b200010232004a72103024002402004422088a7220620012f01064f0d00200121000c010b03400240024020012802002200450d00200541016a210520013301044220862003ad8421040c010b2003ad2104410021000b200110232004a72103200021012004422088a7220620002f01064f0d000b0b200020064102746a4198036a2802002100024020054101460d00410120056b210103402000280294032100200141016a22010d000b0b4100210120020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002100200110232000450d00024020002802002201450d000340200010232001210020012802002203210120030d000b0b200010230b0b8b0404027f017e037f027e230041d0006b2204240020042001103402400240024002400240024002402004290300200441086a290300844200510d00411410262205450d05200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d06200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310200441106a412041a886c500410041001001417f460d012004420037033820044200370330200441106a4120200441306a4110410010012207417f460d042007410f4d0d04200441386a290300210a200429033021060c020b20004193b5c100360204200041086a4122360200410121010c020b4200210a0b200510232001200620027c220b200a20037c200b200654ad7c10df01200041106a2003370300200041086a2002370300410021010b20002001360200200441d0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bd90201047f230041d0006b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410f106202400240410e10262203450d00200341066a41002900c6c740370000200341002900c0c7403700002003410e412e10272203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241306a41186a22004200370300200241306a41106a22044200370300200241306a41086a22054200370300200242003703302003412e200241306a1002200241106a41186a2000290300370300200241106a41106a2004290300370300200241106a41086a200529030037030020022002290330370310200241203602342002200241106a3602302001200241306a106720031023200241d0006a24000f0b410e4101102a000b412e4101102a000b02000bec0301087f23004180016b22032400200341c0006a20011082010240024020032903404201520d002002417f732104200341c0006a41086a21020340200341086a41306a2205200241306a290300370300200341086a41286a2206200241286a290300370300200341086a41206a2207200241206a290300370300200341086a41186a2208200241186a290300370300200341086a41106a2209200241106a290300370300200341086a41086a220a200241086a29030037030020032002290300370308200341c0006a41306a2005290300370300200341c0006a41286a2006290300370300200341c0006a41206a2007290300370300200341c0006a41186a2008290300370300200341c0006a41106a20092903003703002002200a29030037030020032003290308370340200441016a2204450d02200341c0006a200110820120032903404201510d000b0b2000420037030020034180016a24000f0b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a29030037030020034180016a24000bbf0703037f047e047f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042002290038370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a001370300411210262204450d01200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41186a220a4200370300200241a0016a41106a220b4200370300200241a0016a41086a220c4200370300200242003703a00120044132200241a0016a1002200241f0006a41186a200a290300370300200241f0006a41106a200b290300370300200241f0006a41086a200c290300370300200220022903a001370370200241f0006a412041a886c500410041001001417f460d0320024220370294012002200241f0006a36029001200241a0016a20024190016a106420022d00b8014102460d04200241a0016a41086a290300210820022802b001210a20022903a0012105200241206a200241b9016a41c7001094041a200241a0016a200241206a41c1001094041a200241206a200241a0016a41c1001094041a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2008370300200041286a2005370300200041386a200a360200200020093a00272000420137030020041023200324000f0b20004200370300200324000f0b41124101102a000b41324101102a000b41faccc40041d7001021000b41d4aac10041331021000be7d00106037f037e107f017e0f7f057e230041e0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410c4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0d0008050602090a070e040c0103000b200141306a2903002106200141286a29030021072001411d6a29000021082001411c6a2d000021092001411b6a2d0000210a200141196a2f0000210b200141186a2d0000210c200141176a2d0000210d200141156a2f0000210e200141146a2d0000210f200141136a2d00002110200141116a2f00002111200141106a2d000021122001410c6a2802002113200141086a2802002114200141076a2d00002115200141056a2f00002116200141046a2d0000211720012d000121182002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f01002125412a210441db94c300210520022d0000450d144101212641002127410021280c150b4101212620022d000120022d0000720d0b200141046a2802002102200341e0036a41086a22054200370300200342003703e00341a8f5c0004119200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200320023602e00320034188016a4110200341e0036a410410040c720b200141106a2903002108200141086a2903002106200141186a28020021142002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f0100212541db94c3002105412a210420022d0000450d0c4101212641002127410021280c0d0b200141086a280200211b200141046a280200211c20022d000120022d000072450d0d41002126201b450d09201c102320012d000021040c090b4101212620022d000120022d0000720d08200141046a2802002102200341e0036a41086a22054200370300200342003703e00341f399c1004116200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200320023602e00320034188016a4110200341e0036a410410040c6f0b200141106a2903002108200141086a29030021062002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f01002125412a210441db94c300210520022d0000450d0c4101212641002127410021280c0d0b20022d00000d0420022d00014101470d04200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703e801200320053a00e701200320043a00e601200320263b01e401200320273a00e301200320283a00e2012003201a3b01e0012003201b3a00df012003201c3a00de012003201d3b01dc012003201e3a00db01200320253a00d201200320143b01d001200320212020410874201f41187472723600d701200320242023410874722022411874723600d301200341e0036a200341d0016a106b2003280280042228450d0d200341c0046a41086a220220034194046a290200370300200341c0046a41106a22052003419c046a290200370300200341c0046a41186a2204200341a4046a29020037030020032003418c046a2902003703c004200341e0036a41186a290300212920034188046a280200211b200341ec036a350200211920032903f003212a200328028404211c20033502e003210620032902e4032108200341a0026a41186a2004290300370300200341a0026a41106a2005290300370300200341a0026a41086a2002290300370300200320032903c0043703a002200341e0036a41086a22024200370300200342003703e00341e199c1004112200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880141002126024020034188016a411041a886c500410041001001417f460d00200341003602e00320034188016a4110200341e0036a41044100100141016a41044d0d3c20032802e00321260b20194220862008422088842119200842208620068421080240201b41186c2202450d00202820026a2127200241686a2105202821020340200241086a2903002107200229030021062026200241106a2802002204490d264200201920077d2008200654ad7d2207200820067d2206200856200720195620072019511b22041b21194200200620041b2108200541686a2105200241186a22022027470d000b0b4108211a41002104201c450d28202810234100211b0c2f0b20022d00000d0320022d00014101470d0320012d00012109200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703a001200320053a009f01200320043a009e01200320263b019c01200320273a009b01200320283a009a012003201a3b0198012003201b3a0097012003201c3a0096012003201d3b0194012003201e3a009301200320253a008a01200320143b01880120032021202041087472201f4118747236008f012003202420234108747220224118747236008b01200341e0036a20034188016a106b2003280280042205450d0c200341c0046a41086a220220034194046a290200370300200341c0046a41106a22042003419c046a290200370300200341c0046a41186a2226200341a4046a29020037030020032003418c046a2902003703c0042003280284042127200341d0016a41186a2026290300370300200341d0016a41106a2004290300370300200341d0016a41086a2002290300370300200320032903c0043703d001410d10262202450d3f200241056a41002900ee9c41370000200241002900e99c413700002002410d412d10272202450d40200220032903d00137000d200241256a200341d0016a41186a2903003700002002411d6a200341d0016a41106a290300370000200241156a200341d0016a41086a290300370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22284200370300200342003703c0042002412d200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341203602e4032003200341c0036a3602e0032009200341e0036a1068200210232027450d6c200510230c6c0b20022d00000d0220022d00014101470d02200141106a2903002119200141086a2903002108200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703d803200320053a00d703200320043a00d603200320263b01d403200320273a00d303200320283a00d2032003201a3b01d0032003201b3a00cf032003201c3a00ce032003201d3b01cc032003201e3a00cb03200320253a00c203200320143b01c003200320212020410874201f41187472723600c703200320242023410874722022411874723600c303200341e0036a200341c0036a106e20032d00e0034101470d1c200341e0036a410c6a22272d00002102200341ed036a2900002106200341f5036a280000210520032f00e103210420032d00e303212620032902e40321072003200341f9036a290000370358200320053602542003200637024c200320023a004b20032007370043200320263a0042200320043b0140200341e0036a200341c0006a106b2003280280042205450d0b200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2228200341e0036a41c4006a29020037030020032003418c046a2902003703c004200341ac046a280200211a200341e0036a41286a280200211b20273502002106200341e0036a41186a290300212920032802e003212720032902e403210720032903f003212a200328028404210220034188016a41186a221c202829030037030020034188016a41106a2228202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a22042029370300200341d0016a410c6a20063e0200200341d0016a41286a201b360200200341f4016a221b2002360200200341d0016a41346a2026290300370200200341d0016a413c6a2028290300370200200341d0016a41c4006a201c2903003702002003202a3703e001200320073702d401200320053602f001200320273602d0012003201a36029c0220032003290388013702fc01200341186a200341c0036a10840102402003290318220620032903d001222b7d222c200656200341186a41086a2903002207200341d0016a41086a290300222d7d2006202b54ad7d220620075620062007511b0d00200341d0016a41106a2008202c202c200856200620195620062019511b22021b2208202a7c220737030020042019200620021b221920297c2007200854ad7c37030020032008202b7c22063703d00120032019202d7c2006200854ad7c3703d801200341c0006a200341d0016a107f201b28020021020b2002450d6b200341f0016a28020010230c6b0b2001410c6a280200211c200141086a280200211b200141046a28020021282002411a6a2901002119200241196a2d0000211d200241186a2d0000211e200241166a2f0100211f200241156a2d00002120200241146a2d00002121200241126a2f01002122200241116a2d00002123200241106a2d000021242002410e6a2f010021252002410d6a2d00002114200241046a2d00002109200241026a2f0100210a41db94c3002105412a210420022d0000450d0d41012126410021274100211a0c0e0b20022d00000d0020022d00014101470d00200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a290100370358200320053a0057200320043a0056200320263b0154200320273a0053200320283a00522003201a3b01502003201b3a004f2003201c3a004e2003201d3b014c2003201e3a004b200320253a0042200320143b014020032021202041087472201f4118747236004720032024202341087472202241187472360043200341e0036a200341c0006a106b2003280280042202450d09200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2227200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002128200341e0036a41286a280200211a200341e0036a410c6a3502002119200341e0036a41186a290300210820032802e003211b20032902e403210620032903f0032107200328028404210520034188016a41186a221c202729030037030020034188016a41106a2227202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a2008370300200341d0016a410c6a20193e0200200341d0016a41286a201a360200200341f4016a2005360200200341d0016a41346a2026290300370200200341d0016a413c6a2027290300370200200341d0016a41c4006a201c290300370200200320073703e001200320063702d401200320023602f0012003201b3602d0012003202836029c0220032003290388013702fc01200341d0016a412c6a220410850120041086012005450d69200210230c690b41db94c3002105412a21020c82010b4101212620022d000120022d000072450d0c0b41b394c300210541282102200441ff01712204410d4b0d11410120047441be3f710d840120044106460d102004410d470d112026450d8401200141086a280200450d8401200141046a28020010230c84010b2001411d6a29000021082001411c6a2d000021092001411b6a2d0000210a200141196a2f0000210b200141186a2d0000210c200141176a2d0000210d200141156a2f0000210e200141146a2d0000210f200141136a2d00002110200141116a2f00002111200141106a2d000021122001410c6a2802002117200141086a280200211a200141076a2d00002115200141056a2f00002116200141046a2d000021132002411a6a2901002119200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d00002124200241046a2d00002125200241026a2f0100211441db94c3002105412a210420022d0000450d0b4101212641002127410021280c0c0b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172202841187472210220260d7d200320193703d8022003201a3a00d7022003201b3a00d6022003201c3b01d4022003201d3a00d3022003201e3a00d2022003201f3b01d002200320203a00cf02200320213a00ce02200320223b01cc02200320233a00cb02200320023600c702200320053600c302200320243a00c202200320253b01c002200341e0036a200341c0026a106b2003280280042202450d03200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2227200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002128200341e0036a41286a280200211a200341e0036a410c6a3502002119200341e0036a41186a290300210720032802e003211b20032902e403212920032903f003212a200328028404210520034188016a41186a221c202729030037030020034188016a41106a2227202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a2007370300200341d0016a410c6a20193e0200200341d0016a41286a201a360200200341f4016a2005360200200341d0016a41346a2026290300370200200341d0016a413c6a2027290300370200200341d0016a41c4006a201c2903003702002003202a3703e001200320293702d401200320023602f0012003201b3602d0012003202836029c0220032003290388013702fc012014410a4d0d0f02402005450d00200210230b41bf9fc1002105411b21020c7d0b2001410c6a2802002102200341e0036a41086a22054200370300200342003703e0034181f5c0004115200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200341003602e803200342013703e003200320023602d001200341d0016a200341e0036a10412002450d1020024105742127200341e0036a41086a280200210520032802e003212820032802e4032126201c210203400240024002400240202620056b41204f0d00200541206a22042005490d7a2026410174221a20042004201a491b221a4100480d7a2026450d0120282026201a102722280d020c320b200541206a21040c020b201a10262228450d300b201a21260b202820056a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a29000037000020042105200241206a2102202741606a22270d000b200341e8036a2004360200200320263602e403200320283602e0030c110b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202841ffff0371410874202741187472200441ff017172210220260d7a200320193703582003201a3a00572003201b3a00562003201c3b01542003201d3a00532003201e3a00522003201f3b0150200320203a004f200320213a004e200320223b014c200320233a004b2003200236004720032005360043200320243a0042200320253b0140200341e0036a200341c0006a106b2003280280042204450d00200341c0046a41086a2226200341e0036a41346a290200370300200341c0046a41106a2227200341e0036a413c6a290200370300200341c0046a41186a2228200341e0036a41c4006a29020037030020032003418c046a2902003703c004200341ac046a280200211a200341e0036a41286a2802002105200341e0036a410c6a3502002129200341e0036a41186a290300211920032802e003211b20032902e403212a20032903f0032107200328028404210220034188016a41186a221c202829030037030020034188016a41106a2228202729030037030020034188016a41086a22272026290300370300200320032903c00437038801200341d0016a41186a2019370300200341d0016a410c6a20293e0200200341d0016a41286a2005360200200341f4016a2002360200200341d0016a41346a2027290300370200200341d0016a413c6a2028290300370200200341d0016a41c4006a201c290300370200200320073703e0012003202a3702d401200320043602f0012003201b3602d0012003201a36029c0220032003290388013702fc012005411f4d0d0d02402002450d00200410230b419c9fc1002105412321020c7a0b41819fc1002105411021020c790b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202841ffff0371410874202741187472200441ff017172210220260d77200320193703a0012003201a3a009f012003201b3a009e012003201c3b019c012003201d3a009b012003201e3a009a012003201f3b019801200320203a009701200320213a009601200320223b019401200320233a0093012003200236008f012003200536008b01200320243a008a01200320253b018801410e10262202450d29200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d2a200220032903880137000e200241266a20034188016a41186a2903003700002002411e6a20034188016a41106a290300370000200241166a20034188016a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f460d0641ed9ec1002105411421020c770b41012126410021274100211a20022d00014101470d002002410c6a2d0000211a2002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172201a41187472210220260d7320032019370398032003201d3a0097032003201e3a0096032003201f3b019403200320203a009303200320213a009203200320223b019003200320233a008f03200320243a008e03200320253b018c03200320143a008b0320032002360087032003200536008303200320093a0082032003200a3b018003200341e0036a20034180036a106b200328028004221a450d03200341c0046a41086a2202200341e0036a41346a290200370300200341c0046a41106a2205200341e0036a413c6a290200370300200341c0046a41186a2204200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002126200341e0036a41286a2802002127200341e0036a410c6a3502002119200341e0036a41186a290300210820032802e003211d20032902e403210620032903f0032107200328028404211e20034188016a41186a221f200429030037030020034188016a41106a2204200529030037030020034188016a41086a22052002290300370300200320032903c00437038801200341d0016a41186a2008370300200341d0016a410c6a20193e0200200341d0016a41286a2027360200200341d0016a41246a201e360200200341d0016a41346a2005290300370200200341d0016a413c6a2004290300370200200341d0016a41c4006a201f290300370200200320073703e001200320063702d4012003201a3602f0012003201d3602d0012003202636029c0220032003290388013702fc01201c450d0b201c41246c2202450d0d200341a0026a41026a2205202841036a2d00003a0000200341c0046a41086a2227202841146a290000370300200341c0046a410d6a221d202841196a290000370000200320282f00013b01a0022003202829000c3703c004202841246a210420282d0000221f4102460d0e2028280008212020282800042126200341e0026a41026a20052d00003a000020034188016a41086a202729030037030020034188016a410d6a201d290000370000200320032f01a0023b01e002200320032903c00437038801201f4101470d15200341a0036a202641067610870120032802a003212720032802a8032026413f7122054d0d1a200341c0026a41026a202720054105746a220541026a2d00003a0000200341c8006a200541136a290000370300200341cd006a200541186a290000370000200320052f00003b01c0022003200529000b37034020052800072120200528000321264101210520032802a403450d680c670b41012126200341013a00d001200341e0036a41086a22024200370300200342003703e003418f99c1004113200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880120034188016a4110200341d0016a41011004410021050c5b0b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172202841187472210220260d72200320193703b8022003201b3a00b7022003201c3a00b6022003201d3b01b4022003201e3a00b3022003201f3a00b202200320203b01b002200320213a00af02200320223a00ae02200320233b01ac02200320243a00ab02200320023600a702200320053600a302200320253a00a202200320143b01a002200341e0036a200341a0026a106e41012126024020032d00e0034101470d00200341ec036a2d00002102200341ed036a2900002119200341f5036a280000210520032f00e103210420032d00e303212620032902e40321062003200341f9036a2900003703d802200320053602d402200320193702cc02200320023a00cb02200320063700c302200320263a00c202200320043b01c002201341ff01714101470d56200341e0036a201a41067610870120032802e003210520032802e803201a413f7122024d0d0d200520024105746a2202290018210820022d0017210920022d0016210a20022f0014210b20022d0013210c20022d0012210d20022f0010210e20022d000f210f20022d000e211020022f000c211120022d000b2112200228000721262002280003212720022d0002211520022f000021164101210420032802e403450d550c540b41919fc1002105410b21024101212720012d00002204410d4d0d740c750b4110210241819fc10021054100212741012126201b0d700c720b201741ff01714101470d50200341e0036a201441067610870120032802e003210520032802e8032014413f7122024d0d0c200520024105746a2202290018210820022d0017210920022d0016210a20022f0014210b20022d0013210c20022d0012210d20022f0010210e20022d000f210f20022d000e211020022f000c211120022d000b2112200228000721262002280003212720022d0002211520022f000021164101210420032802e403450d4f0c4e0b200141086a280200450d73200141046a28020010230c730b200141086a280200450d72200141046a28020010230c720b200341d0016a412c6a2205108601200320083703302003200637032820032014360238411210262202450d23200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d24200220052900003700122002412a6a200541186a290000370000200241226a200541106a2900003700002002411a6a200541086a290000370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00420024132200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d082003422037028c012003200341c0036a36028801200341e0036a20034188016a106420032d00f80322264102460d28200341a0026a41186a20034191046a290000370300200341a0026a41106a20034189046a290000370300200341a0026a41086a20034181046a290000370300200341e0026a41086a200341a2046a290100370300200341e0026a41106a200341aa046a290100370300200341e0026a41186a200341b2046a290100370300200320032900f9033703a00220032003419a046a2901003703e00220034199046a2d000021280c440b200720062007200654201920085420192008511b22051b22062019200820051b220884500d34200341d0016a41106a200720067d370300200341e8016a201920087d2007200654ad7d370300200341e0036a41086a22024200370300200342003703e0034182b6c100411b200341e0036a100020034188016a41086a2002290300370300200320032903e00337038801024020034188016a411041a886c500410041001001417f460d00200342003703e803200342003703e00320034188016a4110200341e0036a4110410010012202417f460d252002410f4d0d25200341e0016a2202290300220720032903e0035a200341e8016a22052903002219200341e8036a29030022295a20192029511b0d002005420037030020024200370300201920087c200720067c2206200754ad7c21080b200341e0036a41086a22024200370300200342003703e00341e199c1004112200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880120034188016a411041a886c500410041001001417f460d0a200341003602e00320034188016a4110200341e0036a41044100100141016a41044d0d2120032802e00341a0056a21040c0b0b200341e8036a280200210420032802e403212620032802e00321280b20034188016a411020282004100402402026450d00202810230b410121270240201b450d00201c10230b410021260c620b41f9a0c10021054117210241012104201e450d660c650b41919fc1002105410b21020c680b202821040b41002126410121054100211f410021024100450d5b0c5c0b4100210420032802e4030d460c470b20044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00441a69ac100411a200341c0046a100220034188016a41186a200429030037030020034188016a41106a202629030037030020034188016a41086a2027290300370300200320032903c0043703880120034188016a412041a886c500410041001001417f460d06200341d8036a4200370300200341c0036a41106a4200370300200341c0036a41086a4200370300200342003703c00320034188016a4120200341c0036a4120410010012204417f460d202004411f4d0d20200341e0036a41186a2204200341c0036a41186a290300370300200341e0036a41106a2226200341c0036a41106a290300370300200341e0036a41086a2227200341c0036a41086a290300370300200320032903c0033703e00320034180036a41186a2228200429030037030020034180036a41106a2204202629030037030020034180036a41086a22262027290300370300200320032903e00337038003200341a0036a41186a2028290300370300200341a0036a41106a2004290300370300200341a0036a41086a202629030037030020032003290380033703a003411210262204450d23200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d24200420032903a0033700122004412a6a200341a0036a41186a290300370000200441226a200341a0036a41106a2903003700002004411a6a200341a0036a41086a290300370000200341c0046a41186a22264200370300200341c0046a41106a22274200370300200341c0046a41086a22284200370300200342003703c00420044132200341c0046a1002200341c0036a41186a2026290300370300200341c0036a41106a2027290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d25200342203702442003200341c0036a360240200341e0036a200341c0006a106420032d00f80322264102460d26200341e0036a41086a290300211920032802f003212720032903e003210820034188016a200341f9036a41c7001094041a200341c0006a20034188016a41c1001094041a200320263a00e003200341e0036a410172200341c0006a41c1001094041a200341a4016a20034182046a410020032d0081044101461b36020020032019370390012003200837038801200320053602a0012003202736029801200341c0046a41186a22264200370300200341c0046a41106a22274200370300200341c0046a41086a22284200370300200342003703c00420044132200341c0046a1002200341c0036a41186a2026290300370300200341c0036a41106a2027290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341003602482003420137034020034188016a41106a200341c0006a1041200320034188016a3602c004200341c0046a200341c0006a1066200328024421262003280248212720032802a001221b450d0d20262027470d0e202741016a22262027490d5d20274101742228202620262028491b22264100480d5d2027450d1020032802402027202610272228450d110c2d0b4100210420032802e4030d410c420b41181026221a450d20201a2006370300201a2004360210201a20073703082005450d08200241186a211d2028201b41186c6a41686a211f410121044101211b0340201d210202400340200241086a2903002107200229030021062026200241106a2802002205490d014200201920077d2008200654ad7d2207200820067d2206200856200720195620072019511b22051b21194200200620051b2108200241186a22022027470d000c0c0b0b0240201b2004470d00200441016a221b2004490d5d2004410174221d201b201b201d491b221bad42187e222b422088a70d5d202ba7221d4100480d5d02402004450d00201a200441186c201d1027221a0d010c220b201d1026221a450d210b200241186a211d201a200441186c6a221e2007370308201e2006370300201e2005360210200441016a2104201f2002470d000c0a0b0b41a00521040b0240200341f8016a2802002202200341f4016a280200470d00200241016a22052002490d5a20024101742226200520052026491b2226ad42187e2219422088a70d5a2019a722274100480d5a2002450d04200341f0016a280200200241186c202710272205450d050c270b200341f0016a28020021050c270b200341c0026a41026a200341e0026a41026a2d00003a0000200341c0006a41086a20034188016a41086a290300370300200341c0006a410d6a20034188016a410d6a290000370000200320032f01e0023b01c00220032003290388013703400c530b4100211b0c060b200341c0046a41186a220442003703002026420037030020274200370300200342003703c00441a69ac100411a200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003412010262204450d2020042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c0036a412020044120100420041023410021280c330b2027102622050d220b20274108102a000b4100210520032802a4030d4c0c4d0b410121044101211b0b201c450d00202810230b200341e0036a41186a202937030020034188046a200436020020034184046a2202201b360200200341a4046a200341a0026a41186a2903003702002003419c046a200341b0026a29030037020020034194046a200341a8026a2903003702002003202a3703f003200320083703e003200320032903a00237028c042003201a36028004200320193703e803200341d0016a200341e0036a107f2002280200450d3d20034180046a28020010230c3d0b20262027470d01202741016a22262027490d4f20274101742228202620262028491b22264100480d4f2027450d0420032802402027202610272228450d050c1a0b200328024021280c1f0b200328024021280c190b2026102622280d1c0b20264101102a000b2026102622280d150b20264101102a000b200341f4036a4101360200200341013602d4012003418898c4003602d001200342013702e403200341d497c4003602e0032003200341d0016a3602f003200341e0036a41c49ec1001061000b201a4101102a000b410e4101102a000b412e4101102a000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41d4aac10041331021000b410d4101102a000b412d4101102a000b41d4aac10041331021000b41d4aac10041331021000b201d4108102a000b41184108102a000b41124101102a000b41324101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b20032026360244200320283602400b200341c8006a202741016a221a360200202820276a41003a0000200341a4016a28020022270d050c060b200341f4016a2026360200200341f0016a2005360200200341f8016a28020021020b2005200241186c6a220220083703082002200637030020022004360210200341f8016a2202200228020041016a360200200341c0006a200341d0016a107f200341f4016a28020021020b2002450d1d200341f0016a28020010230c1d0b20032026360244200320283602400b200341c0006a41086a221c202741016a360200202820276a41013a0000024002400240024002402003280244221a201c28020022276b411f4b0d00202741206a22262027490d33201a410174221d20262026201d491b22264100480d33201a450d012028201a202610272228450d020c030b201a21260c030b2026102622280d010b20264101102a000b20032026360244200320283602400b201c202741206a221a360200202820276a222741086a201b41086a290000370000202741106a201b41106a290000370000202741186a201b41186a2900003700002027201b290000370000200341a4016a2802002227450d010b2026201a470d08202641016a221b2026490d2d2026410174221c201b201b201c491b221b4100480d2d2026450d0120282026201b10272228450d020c070b2026201a470d05202641016a22272026490d2c2026410174221b20272027201b491b22274100480d2c2026450d0220282026202710272228450d030c040b201b102622280d050b201b4101102a000b2027102622280d010b20274101102a000b20032027360244200320283602400b200341c8006a2226201a41016a3602002028201a6a41003a00002026280200211b20032802442128200328024021260c020b2003201b360244200320283602400b200341c8006a2226201a41016a3602002028201a6a41013a000002400240024002400240200328024422282026280200221a6b41204f0d00201a41206a2226201a490d292028410174221b20262026201b491b221b4100480d292028450d0120032802402028201b10272226450d020c030b200328024021260c030b201b102622260d010b201b4101102a000b2003201b36024420032026360240201b21280b200341c0006a41086a201a41206a221b3602002026201a6a221a41086a202741086a290000370000201a41106a202741106a290000370000201a41186a202741186a290000370000201a20272900003700000b200341c0036a41202026201b100402402028450d00202610230b20041023200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00441a69ac100411a200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003412010262204450d0220042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c0036a412020044120100420041023200341e0026a41186a200341a0036a41186a290300370300200341e0026a41106a200341a0036a41106a290300370300200341e0026a41086a200341a0036a41086a290300370300200320032903a0033703e002410121280b410021260b200341e0036a41186a200341a0026a41186a290300370300200341e0036a41106a200341a0026a41106a290300370300200341e0036a41086a200341a0026a41086a29030037030020034188016a41086a200341e0026a41086a29030037030020034188016a41106a200341e0026a41106a29030037030020034188016a41186a200341e0026a41186a290300370300200320032903a0023703e003200320032903e00237038801200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22274200370300200342003703c00420024132200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2027290300370300200320032903c0043703c0032003410036024820034201370340200341286a41106a200341c0006a10412003200341286a3602c004200341c0046a200341c0006a10662003280244210520032802482104024002400240024002400240024020264101470d0020052004470d01200441016a22052004490d2820044101742226200520052026491b22054100480d282004450d0320032802402004200510272226450d040c0a0b20052004470d01200441016a22052004490d2720044101742226200520052026491b22054100480d272004450d0420032802402004200510272226450d050c070b200328024021260c090b200328024021260c060b2005102622260d060b20054101102a000b2005102622260d020b20054101102a000b41204101102a000b20032005360244200320263602400b200341c8006a200441016a2227360200202620046a41003a00000c020b20032005360244200320263602400b200341c0006a41086a221a200441016a360200202620046a41013a00000240024002400240024020032802442227201a28020022046b411f4b0d00200441206a22052004490d212027410174221b20052005201b491b22054100480d212027450d0120262027200510272226450d020c030b202721050c030b2005102622260d010b20054101102a000b20032005360244200320263602400b201a200441206a2227360200202620046a220441086a200341e0036a41086a290300370000200441106a200341e0036a41106a290300370000200441186a200341e0036a41186a290300370000200420032903e0033700000b0240024002400240024002400240024002400240202841ff01714101470d0020052027470d08200541016a22042005490d2520054101742228200420042028491b22044100480d252005450d0120262005200410272226450d020c070b20052027470d05200541016a22042005490d2420054101742228200420042028491b22044100480d242005450d0220262005200410272226450d030c040b2004102622260d050b20044101102a000b2004102622260d010b20044101102a000b20032004360244200320263602400b200341c8006a2205202741016a360200202620276a41003a00002005280200212720032802442104200328024021050c020b20032004360244200320263602400b200341c8006a2205202741016a360200202620276a41013a00000240024002400240024020032802442204200528020022266b41204f0d00202641206a22052026490d2120044101742227200520052027491b22274100480d212004450d0120032802402004202710272205450d020c030b200328024021050c030b2027102622050d010b20274101102a000b2003202736024420032005360240202721040b200341c0006a41086a202641206a2227360200200520266a222641086a20034188016a41086a290300370000202641106a20034188016a41106a290300370000202641186a20034188016a41186a29030037000020262003290388013700000b200341c0036a412020052027100402402004450d00200510230b20021023200341f4016a280200450d08200341f0016a28020010230c080b200510230b202741d9cac40020041b21052026411520041b21022004450d2020052114200221130b200320083703e801200320093a00e7012003200a3a00e6012003200b3b01e4012003200c3a00e3012003200d3a00e2012003200e3b01e0012003200f3a00df01200320103a00de01200320113b01dc01200320123a00db01200320133600d701200320143600d301200320153a00d201200320163b01d0010240024002400240024002400240410e10262202450d00200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d01200220032903d00137000e200241266a200341d0016a41186a22272903003700002002411e6a200341d0016a41106a2228290300370000200241166a200341d0016a41086a221a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f470d0a200341e0036a41186a2027290300370300200341e0036a41106a2028290300370300200341e0036a41086a201a290300370300200320032903d0013703e003410e10262202450d02200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d03200220032903880137000e200241266a20034188016a41186a2903003700002002411e6a20034188016a41106a290300370000200241166a20034188016a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003412010262205450d04200520032903e003370000200541186a200341e0036a41186a290300370000200541106a200341e0036a41106a290300370000200541086a200341e0036a41086a290300370000200341c0036a41202005412010042005102320021023410d10262202450d05200241056a41002900ee9c41370000200241002900e99c413700002002410d412d10272202450d06200220032903880137000d200241256a20034188016a41186a22052903003700002002411d6a20034188016a41106a2204290300370000200241156a20034188016a41086a2226290300370000200341c0046a41186a22274200370300200341c0046a41106a22284200370300200341c0046a41086a221a4200370300200342003703c0042002412d200341c0046a1002200341c0036a41186a2027290300370300200341c0036a41106a2028290300370300200341c0036a41086a201a290300370300200320032903c0043703c003200341203602e4032003200341c0036a3602e0032018200341e0036a106820021023200341086a20034188016a108401200341086a41086a29030021192003290308210820034188046a4100360200200341e0036a41186a201920062008200754201920065420192006511b22021b2219370300200341a4046a20052903003702002003419c046a200429030037020020034194046a2026290300370200200342083703800420032008200720021b22083703f003200320193703e803200320083703e003200320032903880137028c04200341d0016a200341e0036a107f20034184046a280200450d0c200341e0036a41206a28020010230c0c0b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b41204101102a000b410d4101102a000b412d4101102a000b200510230b202741d9cac40020041b21052026411520041b21022004450d1d2005211a200221170b200320083703f802200320093a00f7022003200a3a00f6022003200b3b01f4022003200c3a00f3022003200d3a00f2022003200e3b01f0022003200f3a00ef02200320103a00ee02200320113b01ec02200320123a00eb02200320173600e7022003201a3600e302200320153a00e202200320163b01e002410e10262202450d04200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d05200220032903e00237000e200241266a200341e0026a41186a2903003700002002411e6a200341e0026a41106a290300370000200241166a200341e0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f470d00200341e0026a200341c0026a4120109604450d02410e10262202450d06200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d07200220032903a00237000e200241266a200341a0026a41186a2903003700002002411e6a200341a0026a41106a290300370000200241166a200341a0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003412010262205450d08200520032903e002370000200541186a200341e0026a41186a290300370000200541106a200341e0026a41106a290300370000200541086a200341e0026a41086a290300370000200341c0036a41202005412010042005102320021023410e10262202450d0941002105200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d0a200220032903c00237000e200241266a200341c0026a41186a2903003700002002411e6a200341c0026a41106a290300370000200241166a200341c0026a41086a290300370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c0030240200341c0036a412041a886c500410041001001417f460d002003422037022c2003200341c0036a360228200341e0036a200341286a106c2003280280042205450d0c200341c0046a41186a200341e0036a41186a290300370300200341c0046a41106a200341e0036a41106a290300370300200341c0046a41086a200341e0036a41086a290300370300200341d0016a41086a2003418c046a290200370300200341d0016a41106a20034194046a290200370300200341d0016a41186a2003419c046a290200370300200341d0016a41206a200341a4046a290200370300200341f8016a200341ac046a280200360200200320032903e0033703c00420032003290284043703d001200341c0036a412010030b200341a0036a41186a2004290300370300200341a0036a41106a2026290300370300200341a0036a41086a202729030037030020034188016a41086a200341d0016a41086a29030037030020034188016a41106a200341d0016a41106a29030037030020034188016a41186a200341d0016a41186a29030037030020034188016a41206a200341d0016a41206a29030037030020034188016a41286a2204200341d0016a41286a280200360200200320032903c0043703a003200320032903d001370388012005450d0120034180036a41186a2226200341a0036a41186a29030037030020034180036a41106a2227200341a0036a41106a29030037030020034180036a41086a2228200341a0036a41086a290300370300200341c0006a41086a221a20034188016a41086a290300370300200341c0006a41106a221b20034188016a41106a290300370300200341c0006a41186a221c20034188016a41186a290300370300200341c0006a41206a221d20034188016a41206a290300370300200341c0006a41286a221e2004280200360200200320032903a00337038003200320032903880137034020021023200341e0036a41186a2026290300370300200341e0036a41106a2027290300370300200341e0036a41086a202829030037030020034184046a20032903403702002003418c046a201a29030037020020034194046a201b2903003702002003419c046a201c290300370200200341a4046a201d290300370200200341ac046a201e280200360200200320053602800420032003290380033703e003410e10262202450d0c200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d0d200220032903e00237000e200241266a200341e0026a41186a2903003700002002411e6a200341e0026a41106a290300370000200241166a200341e0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341203602d4012003200341c0036a3602d001200341e0036a200341d0016a10672002102320034184046a280200450d02200341e0036a41206a28020010230c020b41d49ec1002105411921020c1b0b200210230b41002105410121260b4101212720012d00002204410d4d0d1a0c1b0b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b41204101102a000b410e4101102a000b412e4101102a000b41d4aac10041331021000b410e4101102a000b412e4101102a000b202710230b20050d0041d9cac4002126410121054100211f4100210241d9cac4000d020c010b200341286a41026a2227200341c0026a41026a2d00003a0000200341e0036a41086a2205200341c0006a41086a290300370300200341e0036a410d6a221d200341c0006a410d6a290000370000200320032f01c0023b0128200320032903403703e003200341c0036a410d6a221f201d290000370000200341c0036a41086a221d2005290300370300200320032903e0033703c0030240024002400240412010262205450d00200520032f01283b00002005202036000720052026360003200520032903c00337000b200541026a20272d00003a0000200541136a201d290300370000200541186a201f2900003700000240024002400240202820026a22152004460d00200341a0026a41026a2202202841276a2d00003a0000200341c0046a41086a2226202841386a290000370300200341c0046a410d6a22272028413d6a290000370000200320282f00253b01a002200320282900303703c004202841c8006a2104202841246a2d0000221f4102460d01202828002c21092028280028211d200341e0026a41026a20022d00003a000020034188016a41086a202629030037030020034188016a410d6a2027290000370000200320032f01a0023b01e002200320032903c00437038801201f4101470d02200341e0036a201d41067610870120032802e003212620032802e803201d413f7122024d0d03200341c0026a41026a202620024105746a220241026a2d00003a0000200341c8006a200241136a290000370300200341cd006a200241186a290000370000200320022f00003b01c0022003200229000b370340200228000721092002280003211d4101210220032802e403450d060c050b201521040b4101211f410021264101210241000d070c060b200341c0026a41026a200341e0026a41026a2d00003a0000200341c0006a41086a20034188016a41086a290300370300200341c0006a410d6a20034188016a410d6a290000370000200320032f01e0023b01c00220032003290388013703400c040b410021022020210920032802e4030d010c020b41204101102a000b202610230b20020d004101211f41d9cac40021264101210241d9cac4000d020c010b200341286a41026a2224200341c0026a41026a220d2d00003a0000200341c0036a41086a2225200341c0006a41086a220e290300370300200341c0036a410d6a2214200341c0006a410d6a220f290000370000200320032f01c0023b0128200320032903403703c003201c41246c41b87f6a2112200341cb046a212141022122412021204102211f410021274101210202400240024002400340202120032903c003370000202141086a20252903003700002021410d6a2014290000370000200320093600c7042003201d3600c304200320032f01283b01c004200320242d00003a00c2040240201f417f6a2002470d002022201f201f2022491b2202ad4205862219422088a70d0a2019a722264100480d0a20052020202610272205450d050b200520206a222620032903c004370000202641186a200341c0046a41186a290300370000202641106a200341c0046a41106a290300370000202641086a200341c0046a41086a2223290300370000202741f803460d02024020122027460d00200341a0026a41026a220a202820276a222641cb006a2d00003a00002023202641dc006a290000370300200341c0046a410d6a220b202641e1006a2900003700002003202641c9006a2f00003b01a0022003202641d4006a2900003703c004202641c8006a2d0000220c4102460d02202641d0006a2800002110202641cc006a280000211d200341e0026a41026a2211200a2d00003a000020034188016a41086a220a202329030037030020034188016a410d6a2223200b290000370000200320032f01a0023b01e002200320032903c0043703880102400240200c4101470d00200341a0036a201d410676108701201d413f7121234100210a20032802a003210b0240200341a0036a41086a28020020234d0d00200d200b20234105746a221d41026a2d00003a0000200e201d41136a290000370300200f201d41186a2900003700002003201d2f00003b01c0022003201d29000b370340201d2800072109201d280003211d4101210a0b024020032802a403450d00200b10230b200a0d010c060b200d20112d00003a0000200e200a290300370300200f2023290000370000200320032f01e0023b01c0022003200329038801370340201021090b200441246a21042024200d2d00003a0000200341e0036a41086a2226200e290300370300200341e0036a410d6a2223200f290000370000200320032f01c0023b0128200320032903403703e0032014202329000037000020252026290300370300200320032903e0033703c003202241026a2122202041206a2120201f41016a211f202741246a21270c010b0b201521044100212641000d050c040b202641ec006a21040b4100212641000d030c020b202641ec006a210441d9cac400212641d9cac4000d020c010b20264101102a000b410021200c010b4101212002402002450d00200510230b20262105411521020b200341d0016a412c6a211d2028201c41246c6a21270240034020272004460d0120042d00002126200441246a210420264102470d000b0b0240201b450d00202810230b02402020450d0041002104201e0d050c060b201d1085012003201f3602c802200320023602c402200320053602c0020240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027221c450d01201c201d290000370012201c412a6a201d41186a290000370000201c41226a201d41106a290000370000201c411a6a201d41086a290000370000200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201c4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c0030240200341c0036a412041a886c500410041001001417f460d002003422037028c012003200341c0036a36028801200341e0036a20034188016a10880120032d00ec0322024102460d03200341a0026a41086a200341f5036a290000370300200341a0026a41106a200341fd036a290000370300200341a0026a41186a20034185046a290000370300200341e0026a41086a20034196046a290100370300200341e0026a41106a2003419e046a290100370300200341e0026a41186a200341a6046a290100370300200320032900ed033703a00220032003418e046a2901003703e0022003418d046a2d0000210520032802e403450d0d20032802e00310230c0d0b20024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c00441c09ac100411a200341c0046a100220034188016a41186a200229030037030020034188016a41106a200529030037030020034188016a41086a2004290300370300200320032903c00437038801024002400240024020034188016a412041a886c500410041001001417f460d00200341d8036a4200370300200341c0036a41106a4200370300200341c0036a41086a4200370300200342003703c00320034188016a4120200341c0036a4120410010012202417f460d072002411f4d0d07200341e0036a41186a2202200341c0036a41186a290300370300200341e0036a41106a2205200341c0036a41106a290300370300200341e0036a41086a2204200341c0036a41086a290300370300200320032903c0033703e003200341a0036a41186a22262002290300370300200341a0036a41106a22022005290300370300200341a0036a41086a22052004290300370300200320032903e0033703a003200341c0006a41186a2026290300370300200341c0006a41106a2002290300370300200341c0006a41086a2005290300370300200320032903a003370340411210262202450d08200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027221b450d09201b2003290340370012201b412a6a200341c0006a41186a290300370000201b41226a200341c0006a41106a290300370000201b411a6a200341c0006a41086a290300370000200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201b4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d0a200342203702c4042003200341c0036a3602c004200341e0036a200341c0046a10880120032d00ec0322054102460d0b20032802e403211f20032802e003211e20032802e803210220034188016a200341ed036a41c3001094041a200320053a00e003200341e0036a41017220034188016a41c1001094041a20032d0081042120200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c004201b4132200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c00320034201370388012003410036029001200320023602c004200341c0046a20034188016a104120032802900121052002450d012002410574211a410020056b2104200328028c012126201e210203400240024002400240202620046a41204f0d00200541206a22272005490d1720264101742228202720272028491b22284100480d172026450d0120032802880120262028102722270d020c080b20032802880121270c020b202810262227450d060b2003202836028c012003202736028801202821260b20034188016a41086a200541206a2228360200202720056a220541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a29000037000020052002290000370000200441606a210420282105200241206a2102201a41606a221a0d000c030b0b200341c0046a41186a220242003703002005420037030020044200370300200342003703c00441c09ac100411a200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003412010262202450d0b2002201d290000370000200241186a201d41186a290000370000200241106a201d41106a290000370000200241086a201d41086a290000370000200341c0036a412020024120100420021023410021050c0e0b200521280b024002400240200328028c012028470d00202841016a22022028490d1220284101742205200220022005491b22054100480d122028450d012003280288012028200510272202450d020c0d0b20032802880121020c0d0b2005102622020d0b0b20054101102a000b20284101102a000b41124101102a000b41324101102a000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b2003200536028c0120032002360288010b20034188016a41086a2226202841016a360200200220286a41013a000002400240024002400240200328028c012227202628020022046b411f4b0d00200441206a22052004490d0820274101742228200520052028491b22054100480d082027450d0120022027200510272202450d020c030b202721050c030b2005102622020d010b20054101102a000b2003200536028c0120032002360288010b2026200441206a2228360200200220046a222641086a201d41086a290000370000202641106a201d41106a290000370000202641186a201d41186a2900003700002026201d29000037000002400240024002400240024002400240024002400240024020034182046a410020204101461b2226450d0020052028470d01200541016a22272005490d0f2005410174221a20272027201a491b22274100480d0f2005450d0320022005202710272202450d040c090b20052028470d01200541016a22262005490d0e20054101742227202620262027491b221a4100480d0e2005450d0420022005201a10272202450d050c060b200521270c080b2005211a0c050b2027102622020d050b20274101102a000b201a102622020d010b201a4101102a000b2003201a36028c0120032002360288010b20034190016a200441216a2204360200200220286a41003a00000c020b2003202736028c0120032002360288010b20034188016a41086a2220200441216a2205360200200220286a41013a000002400240024002400240202720056b411f4b0d00200541206a22282005490d092027410174221a20282028201a491b221a4100480d092027450d0120022027201a10272202450d020c030b2027211a0c030b201a102622020d010b201a4101102a000b2003201a36028c0120032002360288010b2020200441c1006a2204360200200220056a220541086a202641086a290000370000200541106a202641106a290000370000200541186a202641186a290000370000200520262900003700000b200341c0036a41202002200410040240201a450d00200210230b0240201f450d00201e10230b201b1023200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c00441c09ac100411a200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003412010262202450d052002201d290000370000200241186a201d41186a290000370000200241106a201d41106a290000370000200241086a201d41086a290000370000200341c0036a412020024120100420021023200341e0026a41186a200341c0006a41186a290300370300200341e0026a41106a200341c0006a41106a290300370300200341e0026a41086a200341c0006a41086a290300370300200320032903403703e002410121050b410021020b20034185046a20053a000020034186046a20032903e002370100200341ed036a200341a0026a41086a290300370000200341f5036a200341a0026a41106a290300370000200341fd036a200341a0026a41186a2903003700002003418e046a200341e0026a41086a29030037010020034196046a200341e0026a41106a2903003701002003419e046a200341e0026a41186a290300370100200320023a00e403200320032903a0023700e5032003200341c0026a3602e003200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201c4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c0032003410036029001200342013703880120032802c00221022003200341c0026a41086a2802002205360240200341c0006a20034188016a104102402005450d0020054105742128410020034188016a41086a28020022056b2126200328028801211a200328028c01212703400240202720266a411f4b0d00200541206a22042005490d042027410174221b20042004201b491b22044100480d04024002402027450d00201a202720041027221a0d010c070b20041026221a450d060b200421270b201a20056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000202641606a2126200541206a2105200241206a2102202841606a22280d000b20034190016a20053602002003202736028c012003201a360288010b200341e0036a41047220034188016a105d200328028c012102200341c0036a4120200328028801220520034188016a41086a280200100402402002450d00200510230b201c1023024020032802c402450d0020032802c00210230b0240200341f4016a280200450d00200341f0016a28020010230b41002127410121260b4100210520012d00002204410d4d0d090c0a0b101e000b20044101102a000b41204101102a000b201a10230b20040d00410021274101212620012d00002204410d4d0d040c050b4100212741012126201b450d020b2028102320012d00002204410d4d0d020c030b41012126410121270b20012d00002204410d4b0d010b410120047441be3f710d01024020044106460d002004410d470d012026450d02200141086a280200450d02200141046a28020010230c020b2027450d01200141086a280200450d01200141046a28020010230c010b200141086a280200450d00200141046a28020010230b2000200236020420002005360200200341e0046a24000b9a0304027f017e027f017e230041c0006b2202240002400240411410262203450d00200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034134200241206a1002200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a2903002107200229032021040c010b420021070b200310232000200737030820002004370300200241c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b9c1501077f230041c0036b220124000240024002400240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e0026a41186a22004200370300200141e0026a41106a22034200370300200141e0026a41086a22044200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2000290300370300200141b0026a41106a2003290300370300200141b0026a41086a2004290300370300200120012903e0023703b00202400240200141b0026a412041a886c500410041001001417f460d002001422037026c2001200141b0026a360268200141e0026a200141e8006a106420012d00f80222034102460d0420014188016a41186a20014191036a29000037030020014188016a41106a20014189036a29000037030020014188016a41086a20014181036a290000370300200141e8016a41086a200141a2036a290100370300200141e8016a41106a200141aa036a290100370300200141e8016a41186a200141b2036a290100370300200120012900f9023703880120012001419a036a2901003703e80120014199036a2d00002104200141b0026a412010030c010b410221030b200141286a41186a20014188016a41186a290300370300200141286a41106a220020014188016a41106a290300370300200141286a41086a220520014188016a41086a290300370300200141086a41086a2206200141e8016a41086a290300370300200141086a41106a2207200141e8016a41106a290300370300200141086a41186a200141e8016a41186a2903003703002001200129038801370328200120012903e8013703082002102320034102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2000290300370300200141e8006a41086a2005290300370300200141c8006a41086a2006290300370300200141c8006a41106a2007290300370300200141c8006a41186a200141086a41186a2903003703002001200129032837036820012001290308370348410021020240200441ff01714101470d00411210262202450d06200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d07200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d00411210262200450d09200041106a41002f00bec7403b0000200041086a41002900b6c740370000200041002900aec74037000020004112413210272200450d0a200020012903683700122000412a6a200141e8006a41186a290300370000200041226a200141e8006a41106a2903003700002000411a6a200141e8006a41086a290300370000200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220004132200141e0026a1002200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041a886c500410041001001417f460d0b200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a106420012d00f80222074102460d0c20014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001094041a200120073a00a00120014188016a41196a200141e8016a41c7001094041a200141c1016a20043a0000200141c2016a2001290348370100200141ca016a200141c8006a41086a290300370100200141d2016a200141c8006a41106a290300370100200141da016a200141c8006a41186a290300370100200141e0026a41186a220442003703002005420037030020064200370300200142003703e00220004132200141e0026a1002200141b0026a41186a2004290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a1065200010234101210420020d010c0e0b200141e0026a41186a22004200370300200141e0026a41106a22054200370300200141e0026a41086a22064200370300200142003703e00241a69ac100411a200141e0026a1002200141b0026a41186a2000290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b0020240200441ff01714101470d00412010262200450d0d20002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141b0026a412020004120100420001023410021004100210420020d010c0e0b200141b0026a4120100341002100410021042002450d0d0b200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041a886c500410041001001417f460d03200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a106420012d00f8024102460d0420014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001094041a20014188016a41196a200141e8016a41c7001094042001290368370000200141a9016a200141e8006a41086a290300370000200141b1016a200141e8006a41106a290300370000200141b9016a200141e8006a41186a290300370000200120033a00a001200141e0026a41186a220342003703002005420037030020064200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2003290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a106520021023410121032004200045720d0e0c0d0b41124101102a000b41324101102a000b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b410021032004200045720d010b200010230b2002452003720d00200210230b200141c0036a24000bf41a010f7f230041a0036b220124000240024002400240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc74037000020024112413210272202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141d0026a41186a22004200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00220024132200141d0026a1002200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a00202400240200141a0026a412041a886c500410041001001417f460d002001422037026c2001200141a0026a360268200141d0026a200141e8006a10880120012d00dc0222054102460d0420014188016a41086a200141e5026a29000037030020014188016a41106a200141ed026a29000037030020014188016a41186a200141f5026a290000370300200141d8016a41086a20014186036a290100370300200141d8016a41106a2001418e036a290100370300200141d8016a41186a20014196036a290100370300200120012900dd02370388012001200141fe026a2901003703d801200141fd026a2d0000210020012802d402210620012802d0022107200141a0026a412010030c010b410221050b200141286a41186a20014188016a41186a290300370300200141286a41106a220320014188016a41106a290300370300200141286a41086a220420014188016a41086a290300370300200141086a41086a2208200141d8016a41086a290300370300200141086a41106a2209200141d8016a41106a290300370300200141086a41186a200141d8016a41186a2903003703002001200129038801370328200120012903d8013703082002102320054102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2003290300370300200141e8006a41086a2004290300370300200141c8006a41086a2008290300370300200141c8006a41106a2009290300370300200141c8006a41186a200141086a41186a29030037030020012001290328370368200120012903083703484100210a0240200041ff01714101470d00411210262202450d06200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027220a450d07200a2001290348370012200a412a6a200141e0006a290300370000200a41226a200141c8006a41106a290300370000200a411a6a200141c8006a41086a2903003700000b0240024002400240024020054101470d00411210262202450d0c200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027220b450d0d200b2001290368370012200b412a6a200141e8006a41186a290300370000200b41226a200141e8006a41106a290300370000200b411a6a200141e8006a41086a290300370000200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d002200b4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a002200141a0026a412041a886c500410041001001417f460d0e200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10880120012d00dc0222024102460d0f20014188016a41086a2203200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001094041a200120023a00940120014188016a410d6a200141d8016a41c3001094041a200141b5016a20003a0000200141b6016a2001290348370100200141be016a200141c8006a41086a290300370100200141c6016a200141c8006a41106a290300370100200141ce016a200141c8006a41186a290300370100200141d0026a41186a22024200370300200141d0026a41106a22004200370300200c4200370300200142003703d002200b4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d002200128028801210d2001200328020022023602d801200141d8016a200141d0026a104102402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d4022108200d210203400240200820046a411f4b0d00200041206a22032000490d052008410174220f20032003200f491b22034100480d05024002402008450d00200e200820031027220e0d010c090b20031026220e450d080b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a105d20012802d4022102200141a0026a412020012802d0022200200c280200100402402002450d00200010230b0240200128028c01450d00200d10230b200b10234101210d200a0d010c110b200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00241c09ac100411a200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a0020240200041ff01714101470d00412010262202450d1020022001290348370000200241186a200141c8006a41186a290300370000200241106a200141c8006a41106a290300370000200241086a200141c8006a41086a290300370000200141a0026a4120200241201004200210234100210b4100210d200a0d010c110b200141a0026a412010034100210b4100210d200a450d100b200141d0026a41186a22024200370300200141d0026a41106a22004200370300200141d0026a41086a22034200370300200142003703d002200a4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a2003290300370300200120012903d0023703a002200141a0026a412041a886c500410041001001417f460d06200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10880120012d00dc024102460d0720014188016a41086a2202200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001094041a20014188016a410d6a200141d8016a41c30010940420012903683700002001419d016a200141e8006a41086a290300370000200141a5016a200141e8006a41106a290300370000200141ad016a200141e8006a41186a290300370000200120053a009401200141d0026a41186a22004200370300200141d0026a41106a22034200370300200c4200370300200142003703d002200a4132200141d0026a1002200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d00220012802880121052001200228020022023602d801200141d8016a200141d0026a104102402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d40221082005210203400240200820046a411f4b0d00200041206a22032000490d032008410174220f20032003200f491b22034100480d03024002402008450d00200e200820031027220e0d010c060b20031026220e450d050b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a105d20012802d4022102200141a0026a412020012802d0022200200c280200100402402002450d00200010230b0240200128028c01450d00200510230b200a102341012102200d200b45720d110c100b101e000b20034101102a000b20034101102a000b41124101102a000b41324101102a000b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b41002102200d200b45720d010b200b10230b02400240200a45200272450d002006450d020c010b200a10232006450d010b200710230b200141a0036a24000bc30201047f230041d0006b22022400024002400240410f10262203450d00200341076a41002900849544370000200341002900fd94443700002003410f411e10272203450d012003200136000f200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034113200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a102820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031023200241d0006a24000f0b410f4101102a000b411e4101102a000b41d4aac10041331021000bb80a010b7f230041f0016b22022400200220011028024020022802002203450d00200241086a28020021042002280204210541002106200241003a00d00120012802002001280204200241d0016a410120012802081001210720012001280208200741016a41014b22076a220836020802402007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220641002001280200200141046a280200200241d0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d01200241b0016a41186a22072009290300370300200241b0016a41106a2206200a290300370300200241b0016a41086a2209200b290300370300200220022903d0013703b00120024190016a41186a220a200729030037030020024190016a41106a2207200629030037030020024190016a41086a22062009290300370300200220022903b00137039001200241f0006a41186a200a290300370300200241f0006a41106a2007290300370300200241f0006a41086a20062903003703002002200229039001370370410121060b200241d0006a41186a200241f0006a41186a290300370300200241d0006a41106a200241f0006a41106a290300370300200241d0006a41086a200241f0006a41086a2903003703002002200229037037035041002109200241003a00d0012001280200200141046a280200200241d0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220741002001280200200141046a280200200241d0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d01200241b0016a41186a22012009290300370300200241b0016a41106a2207200a290300370300200241b0016a41086a2208200b290300370300200220022903d0013703b00120024190016a41186a2209200129030037030020024190016a41106a2201200729030037030020024190016a41086a22072008290300370300200220022903b00137039001200241f0006a41186a2009290300370300200241f0006a41106a2001290300370300200241f0006a41086a20072903003703002002200229039001370370410121090b200241106a41186a2201200241f0006a41186a290300370300200241106a41106a2207200241f0006a41106a290300370300200241106a41086a2208200241f0006a41086a29030037030020022002290370370310200241306a41186a220a200241d0006a41186a290300370300200241306a41106a220b200241d0006a41106a290300370300200241306a41086a220c200241d0006a41086a29030037030020022002290350370330200020063a000c2000200436020820002005360204200020033602002000412d6a20093a00002000200229033037000d200041156a200c2903003700002000411d6a200b290300370000200041256a200a2903003700002000412e6a2002290310370000200041366a20082903003700002000413e6a2007290300370000200041c6006a2001290300370000200241f0016a24000f0b200041023a000c02402005450d00200310230b200241f0016a24000f0b200041023a000c200241f0016a24000bae23032a7f037e257f230041c0026b2205240002400240024020014115490d00410121064102210741032108413221094105210a417f210b4120210c4100210d411f210e410b210f41602110411821114110211241082113419fc000211441807f2115416821164170211741782118412821194130211a4138211b4101211c4101211d4100211e0c010b410021200c010b410121200b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020200e020001010b20014102490d0c41602149200041606a214a4101214b4105214c417f214d4120214e4118214f411021504108215141002152413821534130215441282155410121564101211e0c010b024002400240201e0e03000d01010b201c201d71211f0c010b203b203e200a746a212002400340203d203e200b6a223e4f0d01200541c0016a2020200c1096042122202020106a222121202022200d480d000c100b0b200020052903c00137000020332038290300370000203520392903003700002037203a2903003700002001203d20066a2220490d0820002020200a746a2100200120206b22014115490d020b2004450d090240201c2006710d0020002001108a012004200b6a21040b2001200776222020086c21212020200674212241002123024020012009490d0020202020200b6a222320002020200a746a20002023200a746a200c1096042224200d4822251b2226202020066a22272023202020251b222020002027200a746a20002020200a746a200c109604200d4822271b222020002020200a746a20002026200a746a200c1096042226200d481b212020222022200b6a222320002022200a746a20002023200a746a200c1096042228200d4822291b222a2022200672222b2023202220291b22222000202b200a746a20002022200a746a200c1096042229200d481b222220002022200a746a2000202a200a746a200c109604222a200d481b212220212021200b6a222320002021200a746a20002023200a746a200c109604222b200d48222c1b222d202120066a222e20232021202c1b22212000202e200a746a20002021200a746a200c1096042223200d481b222120002021200a746a2000202d200a746a200c109604222c200d481b21212007200620251b2024200e7620271b2026200e766a2028200e766a2029200e766a202a200e766a202b200e766a2023200e766a202c200e766a21230b20002022200a746a20002020200a746a200c1096042225200e7620236a20002021200a746a2000202020222025200d4822251b2224200a746a200c1096042226200e766a21230240024002402000202120242026200d481b2221200a746a20002022202020251b222c200a746a200c109604200b4a0d00202320066a2223200f4b0d0120234521200c020b2021212c20234521200c010b024020012006762221450d0020002001200a746a20106a2120200021220340200541206a20116a2223202220116a2225290000370300200541206a20126a2224202220126a2226290000370300200541206a20136a2227202220136a222829000037030020052022290000370320202020136a2229290000212f202020126a222a2900002130202029000021312025202020116a222b290000370000202620303700002028202f370000202220313700002020200529032037000020292027290300370000202a2024290300370000202b2023290300370000202020106a21202022200c6a21222021200b6a22210d000b0b2001202c200b736a212c410121200b0240201f200b73202045722006710d0020002001108b010d0c0b024002402003450d00202c20014f0d0a20032000202c200a746a2220200c109604200d480d01200541206a20116a2232200020116a2233290000370300200541206a20126a2234200020126a2235290000370300200541206a20136a2236200020136a223729000037030020052000290000370320202020136a2222290000212f202020126a22212900002130202029000021312033202020116a2223290000370000203520303700002037202f3700002000203137000020232032290300370000202120342903003700002022203629030037000020202005290320370000200541c0016a20116a22382033290000370300200541c0016a20126a22392035290000370300200541c0016a20136a223a2037290000370300200520002900003703c001200020106a213b2000200c6a213c4100213d41002001223e200b6a22224f0d040c100b2001450d070b202c20014f0d05200541206a20116a221d200020116a223f290000370300200541206a20126a222d200020126a2240290000370300200541206a20136a222e200020136a2241290000370300200520002900003703202000202c200a746a2220290000212f202020136a22222900002130202020126a22212900002131203f202020116a222329000037000020402031370000204120303700002000202f370000202020052903203700002022202e2903003700002021202d2903003700002023201d290300370000200520116a2242203f290000370300200520126a22432040290000370300200520136a22442041290000370300200520002900003703002000200c6a21264100214502402001200b6a2221450d0020262120034020202005200c109604200b4a0d012020200c6a2120204520066a22452021490d000b0b20002001200a746a21202021212202400340202021232022224620454d0d012046200b6a2122202320106a22202005200c109604200d4e0d000b0b20462045490d0420212046490d03418001212c410021244100212a4100212541002129418001211c20262045200a746a2247212603400240024002400240024002400240202320266b222020144b22480d002020200a76222020156a2020202a202449202920254922227222211b21202021450d01201c202020221b211c2020202c20221b212c0b20292025470d020c010b20202020200676221c6b212c20292025470d010b201c450d0141002120200541c0006a22292125202621220340202520203a0000202520222005200c109604200b73200e766a21252022200c6a2122201c202020066a2220470d000b0b202a2024470d020c010b200541c0006a22252129202a2024470d010b0240202c450d00202320106a212041002122200541c0016a222a21240340202420223a0000202420202005200c109604200e766a2124202020106a2120202c202220066a2222470d000c020b0b200541c0016a2224212a0b02402024202a6b2220202520296b2222202220204b1b222b450d00201d202620292d0000200a746a222020116a290000370300202d202020126a290000370300202e202020136a29000037030020052020290000370320202620292d0000200a746a22202023202a2d0000200b73200a746a2222290000370000202020116a202220116a290000370000202020126a202220126a290000370000202020136a202220136a2900003700000240202b2006460d004100212003402023202a20206a22272d0000200b73200a746a22222026202920206a20066a22282d0000200a746a2221290000370000202220116a202120116a290000370000202220126a202120126a290000370000202220136a202120136a290000370000202620282d0000200a746a22222023202720066a2d0000200b73200a746a2221290000370000202220116a202120116a290000370000202220126a202120126a290000370000202220136a202120136a290000370000202020076a2122202020066a222121202022202b490d000b202a20216a212a202920216a21290b2023202a2d0000200b73200a746a22202005290320370000202020116a201d290300370000202020126a202d290300370000202020136a202e290300370000202a20066a212a202920066a21290b2023202c200a746b2023202a2024461b21232026201c200a746a202620292025461b212620480d000b02400240202920254f0d000340201d20262025200b6a22252d0000200a746a222220116a2221290000370300202d202220126a2224290000370300202e202220136a222729000037030020052022290000370320202320106a2220290000212f202320166a22282900002130202320176a222a29000021312021202320186a222329000037000020242031370000202720303700002022202f370000202020052903203700002028202e290300370000202a202d2903003700002023201d2903003700002020212320292025490d000c020b0b0240202a20244f0d002026212003402024200b6a22242d00002122201d202020116a2221290000370300202d202020126a2225290000370300202e202020136a22262900003703002005202029000037032020232022200b73200a746a2222290000212f202220136a22272900002130202220126a222829000021312021202220116a222929000037000020252031370000202620303700002020202f370000202220052903203700002027202e2903003700002028202d2903003700002029201d2903003700002020200c6a2120202a2024490d000c020b0b202621200b203f20422903003700002040204329030037000020412044290300370000200020052903003700000240024002402001202020476b200a7620456a22224d0d00201d203f290000370300202d2040290000370300202e20412900003703002005200029000037032020002022200a746a2220290000212f202020136a22212900002130202020126a22232900002131203f202020116a222529000037000020402031370000204120303700002000202f370000202020052903203700002021202e2903003700002023202d2903003700002025201d290300370000200120226b2221450d0120212022202220214b1b2123200120087621252020200c6a21240240024020222021200b6a22014f0d002000202220022003200410890120202103202421000c010b20242001200220202004108901202221010b202320254f211c204620454d211d200141154f0d02410021200c160b41f4a1c100202220011029000b4184a2c100104f000b4100211e410121200c130b410121200c120b410021200c110b4102211e410121200c100b20462021108c01000b204520461048000b41f4a1c100202c20011029000b41e4a1c100410041001029000b202020011048000b419ca2c100202c20011029000b20002001108d01200541c0026a24000f0b2056204c7421202056204d6a21222056204b6a21560240200020206a222020002022204c746a2221204e109604204d4a0d00200541c0016a204f6a22232020204f6a2225290000370300200541c0016a20506a2224202020506a2226290000370300200541c0016a20516a2227202020516a2228290000370300200520202900003703c001202020212900003700002028202120516a2900003700002026202120506a29000037000020252021204f6a2900003700004100212102402022450d00204a212002400340200541c0016a2020204e10960420524e0d012020204e6a2020290000370000202020536a2020204f6a290000370000202020546a202020506a290000370000202020556a202020516a290000370000202020496a21202022204d6a22220d000c020b0b202221210b20002021204c746a222020052903c0013700002020204f6a2023290300370000202020506a2024290300370000202020516a20272903003700000b204a204e6a214a20562001470d010b200541c0026a24000f0b4101211e410121200c060b2032203c203d200a746a222020116a22222900003703002034202020126a22232900003703002036202020136a2225290000370300200520202900003703202021200c6a2224290000212f202120196a222629000021302021201a6a2227290000213120222021201b6a222129000037000020232031370000202520303700002020202f37000020212032290300370000202720342903003700002026203629030037000020242005290320370000203d20066a223d203e200b6a22224f0d010b203c203d200a746a212002400340200541c0016a2020200c109604200b4c0d012020200c6a2120203d20066a223d2022490d000b4102211e0c020b4102211e0c020b4102211e0c020b410121200c020b410121200c010b410121200c000b0bd40608077f027e017f017e017f017e017f017e230041206b22022400024002400240024020014108490d00200141017641feffffff07712203417f6a220420014f0d032001410d74200173220541117620057322054105742005732206417f2001417f6a677622077122054100200120052001491b6b220520014f0d01200020044105746a220441186a22082900002109200020054105746a2205290000210a200541086a220b290000210c200541106a220d290000210e2008200541186a220f290000370000200441106a220829000021102008200e370000200441086a2208290000210e2008200c3700002004290000210c2004200a370000200241186a2009370300200241106a2010370300200241086a200e370300200f2009370000200d2010370000200b200e3700002005200c3700002002200c370300200320014f0d022006410d7420067322054111762005732205410574200573220620077122054100200120052001491b6b220520014f0d01200020034105746a220441186a22082900002109200020054105746a2205290000210a200541086a220b290000210c200541106a220d290000210e2008200541186a220f290000370000200441106a220829000021102008200e370000200441086a2208290000210e2008200c3700002004290000210c2004200a370000200241186a2009370300200241106a2010370300200241086a200e370300200f2009370000200d2010370000200b200e3700002005200c3700002002200c3703002003410172220420014f0d032006410d742006732205411176200573220541057420057320077122054100200120052001491b6b220520014f0d01200020044105746a220141186a22042900002109200020054105746a2200290000210a200041086a2205290000210c200041106a2203290000210e2004200041186a2206290000370000200141106a220429000021102004200e370000200141086a2204290000210e2004200c3700002001290000210c2001200a370000200241186a2009370300200241106a2010370300200241086a200e37030020062009370000200320103700002005200e3700002000200c3700002002200c3703000b200241206a24000f0b41f4a1c100200520011029000b200321040b41e4a1c100200420011029000b970909077f017e037f017e027f017e027f017e047f230041206b220224000240200141324f0d00410121030240200141014d0d00200041206a200041201096044100480d00200041c0006a21044102210503402005220320014f0d01200341016a21052004200441606a41201096042106200441206a2104200641004e0d000b0b200241206a240020032001460f0b200041a07f6a210741012103410021080240024003400240024002400240200320014f0d00200020034105746a210403402004200441606a41201096044100480d02200441206a2104200341016a22032001490d000b0b4100210420032001460d010c020b4101210420032001470d010b200241206a240041010f0b2003417f6a220520014f0d012004450d02200020054105746a22042900002109200420002003410574220a6a220529000037000020052009370000200241186a220b200441186a220c290000220d370300200241106a220e200441106a220f2900002210370300200241086a2211200441086a221229000022133703002012200541086a221429000037000020142013370000200f200541106a221529000037000020152010370000200c200541186a22162900003700002016200d37000020022009370300024020034102490d00200420002003417e6a22064105746a22174120109604417f4a0d002004290000210920042017290000370000200b200c290000370300200e200f290000370300201120122900003703002012201741086a290000370000200f201741106a290000370000200c201741186a290000370000200220093703004100210c02402006450d002007200a6a21040240034020022004412010960441004e0d01200441206a2004290000370000200441386a200441186a290000370000200441306a200441106a290000370000200441286a200441086a290000370000200441606a21042006417f6a22060d000c020b0b2006210c0b2000200c4105746a22042002290300370000200441186a200b290300370000200441106a200e290300370000200441086a20112903003700000b200841016a21080240200120036b220f4102490d00200541206a220420054120109604417f4a0d002005290000210920052004290000370000200b2016290000370300200e2015290000370300201120142900003703002014200441086a2900003700002015200441106a2900003700002016200441186a29000037000020022009370300410121120240200f4103490d00200541c0006a20024120109604417f4a0d00410321064102210c024003402005200c4105746a220441606a2004290000370000200441786a200441186a290000370000200441706a200441106a290000370000200441686a200441086a2900003700002006200f4f0d0120064105742104200c21122006210c200641016a2106200520046a200241201096044100480d000c020b0b200c21120b200520124105746a22042002290300370000200441186a200b290300370000200441106a200e290300370000200441086a20112903003700000b20084105490d000b200241206a240041000f0b41e4a1c100200520011029000b41f4a1c100200320011029000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241b488c5003602082002200241046a360228200220023602202002200241206a360218200241086a41c488c5001061000be308090d7f017e027f017e017f027e017f017e0d7f230041206b2202240002400240024020014101762203450d00417f210441022105410521064120210741002108411821094108210a4110210b4100210c0c010b410021180c010b410121180b0340024002400240024002400240024002400240024002400240024020180e020001010b4102211920014102490d01417f211a4118211b4105211c4108211d4110211e4101211f4120212041002121200121224101210c0c0a0b02400240200c0e020001010b200320046a2203210d0340200d410174221041017221180240201020056a221020014f0d00201820014f0d0620102018200020182006746a200020102006746a20071096042008481b21180b0240201820014f0d00200d20014f0d042000200d2006746a220d200020182006746a2210200710960420044a0d00200d20096a220e290000210f2010200a6a221129000021122010200b6a2213290000211420102900002115200e201020096a2216290000370000200d200b6a220e2900002117200e2014370000200d200a6a220e2900002114200e2012370000200d2900002112200d2015370000200220096a200f3703002002200b6a20173703002002200a6a20143703002016200f370000201320173700002011201437000020102012370000200220123703002018210d0c010b0b20030d07410021180c0c0b2022201a6a222220014f0d052000201b6a220d290000210f20002022201c746a221829000021152018201d6a221029000021122018201e6a220e2900002114200d2018201b6a22112900003700002000201e6a220d2900002117200d20143700002000201d6a220d2900002114200d201237000020002900002112200020153700002002201b6a220c200f3703002002201e6a222320173703002002201d6a222420143703002011200f370000200e20173700002010201437000020182012370000200220123703004100210d0340200d201f742210201f7221180240201020196a221020224f0d00201820224f0d062010201820002018201c746a20002010201c746a20201096042021481b21180b0240201820224f0d00200d20224f0d042000200d201c746a220d20002018201c746a22102020109604201a4a0d00200d201b6a220e290000210f2010201d6a221129000021122010201e6a2213290000211420102900002115200e2010201b6a2216290000370000200d201e6a220e2900002117200e2014370000200d201d6a220e2900002114200e2012370000200d2900002112200d2015370000200c200f37030020232017370300202420143703002016200f370000201320173700002011201437000020102012370000200220123703002018210d0c010b0b2022201f4b0d070b200241206a24000f0b41f8a3c100200d20011029000b41f8a3c100200d20221029000b41e8a3c100201820011029000b41e8a3c100201820221029000b41f4a1c100202220011029000b4100210c0c010b4101210c0c020b410121180c020b410121180c010b410121180c000b0baa23032a7f037e257f230041c0026b2204240002400240024020014115490d004101210541022106410321074132210841052109417f210a4120210b4100210c411f210d410b210e4160210f411821104110211141082112419fc000211341807f211441682115417021164178211741282118413021194138211a4101211b4101211c4100211d0c010b4100211f0c010b4101211f0b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240201f0e020001010b20014102490d0c41602148200041606a21494101214a4105214b417f214c4120214d4118214e4110214f4108215041002151413821524130215341282154410121554101211d0c010b024002400240201d0e03000d01010b201b201c71211e0c010b203a203d2009746a211f02400340203c203d200a6a223d4f0d01200441c0016a201f200b1096042121201f200f6a2220211f2021200c480d000c100b0b200020042903c0013700002032203729030037000020342038290300370000203620392903003700002001203c20056a221f490d082000201f2009746a21002001201f6b22014115490d020b2003450d090240201b2005710d0020002001108a012003200a6a21030b2001200676221f20076c2120201f200574212141002122024020012008490d00201f201f200a6a22222000201f2009746a200020222009746a200b1096042223200c4822241b2225201f20056a22262022201f20241b221f200020262009746a2000201f2009746a200b109604200c4822261b221f2000201f2009746a200020252009746a200b1096042225200c481b211f20212021200a6a2222200020212009746a200020222009746a200b1096042227200c4822281b22292021200572222a2022202120281b22212000202a2009746a200020212009746a200b1096042228200c481b2221200020212009746a200020292009746a200b1096042229200c481b212120202020200a6a2222200020202009746a200020222009746a200b109604222a200c48222b1b222c202020056a222d20222020202b1b22202000202d2009746a200020202009746a200b1096042222200c481b2220200020202009746a2000202c2009746a200b109604222b200c481b21202006200520241b2023200d7620261b2025200d766a2027200d766a2028200d766a2029200d766a202a200d766a2022200d766a202b200d766a21220b200020212009746a2000201f2009746a200b1096042224200d7620226a200020202009746a2000201f20212024200c4822241b22232009746a200b1096042225200d766a21220240024002402000202020232025200c481b22202009746a20002021201f20241b222b2009746a200b109604200a4a0d00202220056a2222200e4b0d01202245211f0c020b2020212b202245211f0c010b024020012005762220450d00200020012009746a200f6a211f200021210340200441206a20106a2222202120106a2224290000370300200441206a20116a2223202120116a2225290000370300200441206a20126a2226202120126a222729000037030020042021290000370320201f20126a2228290000212e201f20116a2229290000212f201f29000021302024201f20106a222a2900003700002025202f3700002027202e37000020212030370000201f20042903203700002028202629030037000020292023290300370000202a2022290300370000201f200f6a211f2021200b6a21212020200a6a22200d000b0b2001202b200a736a212b4101211f0b0240201e200a73201f45722005710d0020002001108b010d0c0b024002402002450d00202b20014f0d0a20022000202b2009746a221f200b109604200c480d01200441206a20106a2231200020106a2232290000370300200441206a20116a2233200020116a2234290000370300200441206a20126a2235200020126a223629000037030020042000290000370320201f20126a2221290000212e201f20116a2220290000212f201f29000021302032201f20106a22222900003700002034202f3700002036202e37000020002030370000202220312903003700002020203329030037000020212035290300370000201f2004290320370000200441c0016a20106a22372032290000370300200441c0016a20116a22382034290000370300200441c0016a20126a22392036290000370300200420002900003703c0012000200f6a213a2000200b6a213b4100213c41002001223d200a6a22214f0d040c100b2001450d070b202b20014f0d05200441206a20106a221c200020106a223e290000370300200441206a20116a222c200020116a223f290000370300200441206a20126a222d200020126a2240290000370300200420002900003703202000202b2009746a221f290000212e201f20126a2221290000212f201f20116a22202900002130203e201f20106a2222290000370000203f20303700002040202f3700002000202e370000201f20042903203700002021202d2903003700002020202c2903003700002022201c290300370000200420106a2241203e290000370300200420116a2242203f290000370300200420126a22432040290000370300200420002900003703002000200b6a21254100214402402001200a6a2220450d002025211f0340201f2004200b109604200a4a0d01201f200b6a211f204420056a22442020490d000b0b200020012009746a211f2020212102400340201f21222021224520444d0d012045200a6a21212022200f6a221f2004200b109604200c4e0d000b0b20452044490d0420202045490d03418001212b41002123410021294100212441002128418001211b202520442009746a2246212503400240024002400240024002400240202220256b221f20134b22470d00201f200976221f20146a201f2029202349202820244922217222201b211f2020450d01201b201f20211b211b201f202b20211b212b0b20282024470d020c010b201f201f200576221b6b212b20282024470d010b201b450d014100211f200441c0006a222821242025212103402024201f3a0000202420212004200b109604200a73200d766a21242021200b6a2121201b201f20056a221f470d000b0b20292023470d020c010b200441c0006a2224212820292023470d010b0240202b450d002022200f6a211f41002121200441c0016a222921230340202320213a00002023201f2004200b109604200d766a2123201f200f6a211f202b202120056a2221470d000c020b0b200441c0016a222321290b0240202320296b221f202420286b22212021201f4b1b222a450d00201c202520282d00002009746a221f20106a290000370300202c201f20116a290000370300202d201f20126a2900003703002004201f290000370320202520282d00002009746a221f202220292d0000200a732009746a2221290000370000201f20106a202120106a290000370000201f20116a202120116a290000370000201f20126a202120126a2900003700000240202a2005460d004100211f034020222029201f6a22262d0000200a732009746a222120252028201f6a20056a22272d00002009746a2220290000370000202120106a202020106a290000370000202120116a202020116a290000370000202120126a202020126a290000370000202520272d00002009746a22212022202620056a2d0000200a732009746a2220290000370000202120106a202020106a290000370000202120116a202020116a290000370000202120126a202020126a290000370000201f20066a2121201f20056a2220211f2021202a490d000b202920206a2129202820206a21280b202220292d0000200a732009746a221f2004290320370000201f20106a201c290300370000201f20116a202c290300370000201f20126a202d290300370000202920056a2129202820056a21280b2022202b2009746b202220292023461b21222025201b2009746a202520282024461b212520470d000b02400240202820244f0d000340201c20252024200a6a22242d00002009746a222120106a2220290000370300202c202120116a2223290000370300202d202120126a2226290000370300200420212900003703202022200f6a221f290000212e202220156a2227290000212f202220166a222929000021302020202220176a2222290000370000202320303700002026202f3700002021202e370000201f20042903203700002027202d2903003700002029202c2903003700002022201c290300370000201f212220282024490d000c020b0b0240202920234f0d002025211f03402023200a6a22232d00002121201c201f20106a2220290000370300202c201f20116a2224290000370300202d201f20126a22252900003703002004201f29000037032020222021200a732009746a2221290000212e202120126a2226290000212f202120116a222729000021302020202120106a2228290000370000202420303700002025202f370000201f202e370000202120042903203700002026202d2903003700002027202c2903003700002028201c290300370000201f200b6a211f20292023490d000c020b0b2025211f0b203e2041290300370000203f204229030037000020402043290300370000200020042903003700000240024002402001201f20466b20097620446a22214d0d00201c203e290000370300202c203f290000370300202d204029000037030020042000290000370320200020212009746a221f290000212e201f20126a2220290000212f201f20116a22222900002130203e201f20106a2224290000370000203f20303700002040202f3700002000202e370000201f20042903203700002020202d2903003700002022202c2903003700002024201c290300370000200120216b2220450d0120202021202120204b1b212220012007762124201f200b6a21230240024020212020200a6a22014f0d002000202120022003108e01201f2102202321000c010b20232001201f2003108e01202121010b202220244f211b204520444d211c200141154f0d024100211f0c160b41f4a1c100202120011029000b4184a2c100104f000b4100211d4101211f0c130b4101211f0c120b4100211f0c110b4102211d4101211f0c100b20452020108c01000b204420451048000b41f4a1c100202b20011029000b41e4a1c100410041001029000b201f20011048000b419ca2c100202b20011029000b20002001108d01200441c0026a24000f0b2055204b74211f2055204c6a21212055204a6a215502402000201f6a221f20002021204b746a2220204d109604204c4a0d00200441c0016a204e6a2222201f204e6a2224290000370300200441c0016a204f6a2223201f204f6a2225290000370300200441c0016a20506a2226201f20506a22272900003703002004201f2900003703c001201f20202900003700002027202020506a29000037000020252020204f6a29000037000020242020204e6a2900003700004100212002402021450d002049211f02400340200441c0016a201f204d10960420514e0d01201f204d6a201f290000370000201f20526a201f204e6a290000370000201f20536a201f204f6a290000370000201f20546a201f20506a290000370000201f20486a211f2021204c6a22210d000c020b0b202121200b20002020204b746a221f20042903c001370000201f204e6a2022290300370000201f204f6a2023290300370000201f20506a20262903003700000b2049204d6a214920552001470d010b200441c0026a24000f0b4101211d4101211f0c060b2031203b203c2009746a221f20106a22212900003703002033201f20116a22222900003703002035201f20126a22242900003703002004201f2900003703202020200b6a2223290000212e202020186a2225290000212f202020196a2226290000213020212020201a6a2220290000370000202220303700002024202f370000201f202e37000020202031290300370000202620332903003700002025203529030037000020232004290320370000203c20056a223c203d200a6a22214f0d010b203b203c2009746a211f02400340200441c0016a201f200b109604200a4c0d01201f200b6a211f203c20056a223c2021490d000b4102211d0c020b4102211d0c020b4102211d0c020b4101211f0c020b4101211f0c010b4101211f0c000b0bed0b05077f017e027f017e027f23004190026b22022400200241f0016a41186a22034200370300200241f0016a41106a22044200370300200241f0016a41086a22054200370300200242003703f001200241f0016a2001280200220620012802042207412020074120491b22081094041a2001200720086b3602042001200620086a360200024002402007411f4d0d00200241d0016a41186a22072003290300370300200241d0016a41106a22082004290300370300200241d0016a41086a22062005290300370300200220022903f0013703d001200241b0016a41186a2007290300370300200241b0016a41106a2008290300370300200241b0016a41086a2006290300370300200220022903d0013703b001410121070c010b410021070b200241f0016a41186a2208200241b0016a41186a290300370300200241f0016a41106a2206200241b0016a41106a290300370300200241f0016a41086a2203200241b0016a41086a290300370300200220022903b0013703f001024002400240024002402007450d00200241f0006a41186a2008290300370300200241f0006a41106a2006290300370300200241f0006a41086a2003290300370300200220022903f0013703702002200110462002290300a7450d0120022903082109200241f0016a41186a22054200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200241f0016a20012802002204200141046a22032802002207412020074120491b22081094041a2003200720086b22063602002001200420086a22083602002007411f4d0d02200241d0016a41186a22072005290300370300200241d0016a41106a2204200a290300370300200241d0016a41086a2205200b290300370300200220022903f0013703d00120024190016a41186a200729030037030020024190016a41106a200429030037030020024190016a41086a2005290300370300200220022903d00137039001200241f0016a2006412020064120491b22076a41004100412020076b2007411f4b1b1093041a200241f0016a200820071094041a2003200620076b3602002001200820076a3602002006411f4d0d03200241d0016a41186a2207200241f0016a41186a290300370300200241d0016a41106a2208200241f0016a41106a290300370300200241d0016a41086a2206200241f0016a41086a290300370300200220022903f0013703d001200241b0016a41186a22032007290300370300200241b0016a41106a22072008290300370300200241b0016a41086a22082006290300370300200220022903d0013703b001200241f0016a200110900120022802f0012201450d0420022902f401210c200241d0006a41186a2206200241f0006a41186a290300370300200241d0006a41106a2204200241f0006a41106a290300370300200241d0006a41086a2205200241f0006a41086a290300370300200241306a41086a220a20024190016a41086a290300370300200241306a41106a220b20024190016a41106a290300370300200241306a41186a220d20024190016a41186a290300370300200241106a41086a220e2008290300370300200241106a41106a22082007290300370300200241106a41186a22072003290300370300200220022903703703502002200229039001370330200220022903b0013703102000200c37020c2000200136020820002009370300200041146a20022903503702002000411c6a2005290300370200200041246a20042903003702002000412c6a2006290300370200200041346a20022903303702002000413c6a200a290300370200200041c4006a200b290300370200200041cc006a200d290300370200200041ec006a2007290300370200200041e4006a2008290300370200200041dc006a200e290300370200200041d4006a200229031037020020024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000b9d0d03027f017e137f230041f0006b22022400200241106a2001104502400240024002400240024002400240024002402002280210450d0020022802142203ad42247e2204422088a70d092004a72205417f4c0d092005450d01200510262206450d032003450d020c040b20004100360200200241f0006a24000f0b4104210620030d020b4100210e4100210d0c020b20054104102a000b200241d0006a41046a21072002413d6a2108200241d7006a2109200241e3006a220a41056a210b4100210c2003210d4100210e0340200141046a220f2802002105200241003a0050200241d0006a20012802002210200541004722111094041a02400240024002400240024020052011490d00200f200520116b22123602002001201020116a221336020002400240024002400240024002402005450d004105211120022d0050220541064b0d0a024020050e07000d030d020405000b200241086a200110452002280208450d0a200228020c2210417f4c0d122010450d05201010ac012212450d0820122001280200200f2802002205201020052010491b22051094041a200f28020022132005490d09200f201320056b3602002001200128020020056a36020020052010470d060c0b0b410521110c090b200241d0006a200110a30220022802542210450d0820022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410221110c0a0b200241d0006a2012412020124120491b22056a41004100412020056b2005411f4b1b1093041a200241d0006a201320051094041a200f201220056b3602002001201320056a3602002012411f4d0d07200241c0006a41086a200941086a280000360200200220092900003703402002200a2900003703302002200b29000037003520022f0150210520022d0052211120022800532115200841026a200241cd006a41026a2d00003a0000200820022f004d3b0000201541087621142005201141107472211741002111200228024021100c090b200241d0006a200110a30220022802542210450d0620022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410321110c080b200241d0006a200110a30220022802542210450d0520022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410121110c070b4101211241002010460d050b2010450d03201210230c030b201120051048000b20104101102a000b200520131048000b0c010b200241c0006a41086a2002280250360200200241306a41086a200741086a2902003703002002200729020037033020022010ad22044220862004843703402012410876211441042111201221150b20072002290330370200200741086a200241306a41086a2903003702002002200241c0006a41086a28020036025020114105460d022002280244210f200241186a41106a2212200241d0006a41106a280200360200200241186a41086a2213200241d0006a41086a290200370300200220022902503703180240200e200d470d00200d41016a2205200d490d04200d4101742216200520052016491b2205ad42247e2204422088a70d042004a722164100480d0402400240200d450d002006200d41246c2016102722060d010c070b201610262206450d060b2005210d0b2006200c6a220520113a00002005410c6a200f360200200541086a2010360200200541046a2014410874201541ff017172360200200541036a20174110763a0000200541016a20173b0000200541206a2012280200360200200541186a2013290300370200200541106a2002290318370200200c41246a210c200e41016a220e2003490d000b0b2000200d36020420002006360200200041086a200e360200200241f0006a24000f0b200041003602000240200e450d002006210503400240024020052d0000221141034b0d0002400240024020110e0404000102040b2005410c6a280200450d03200541086a2802001023200541246a2105200c415c6a220c0d040c050b2005410c6a280200450d02200541086a2802001023200541246a2105200c415c6a220c0d030c040b2005410c6a280200450d01200541086a2802001023200541246a2105200c415c6a220c0d020c030b200541086a280200450d00200541046a28020010230b200541246a2105200c415c6a220c0d000b0b0240200d450d00200610230b200241f0006a24000f0b101e000b20164104102a000b101d000bf71c09017f017e037f017e057f037e027f027e027f230041c0006b2200240020004188a4c10041101092012000290308210120002802002102200041306a41086a220342003703002000420037033041f3a6c1004115200041306a1000200041106a41086a2003290300370300200020002903303703100240024002400240024002400240024002400240024002400240024002400240200041106a411041a886c500410041001001417f460d00200041003a0030200041106a4110200041306a41014100100141016a41014d0d0120002d00300d050b410810262204450d0120044200370300200041306a41086a22034200370300200042003703304198a4c1004115200041306a1000200041106a41086a200329030037030020002000290330370310200041003602382000420137033020004101360220200041206a200041306a10412004290300210502400240024020002802342206200028023822076b41084f0d00200741086a22082007490d0820064101742203200820082003491b22094100480d082006450d0120002802302006200910272203450d020c050b200741086a2108200028023021030c050b2009102622030d030b20094101102a000b41d4aac10041331021000b41084108102a000b2000200936023420002003360230200921060b200041306a41086a2008360200200320076a2005370000200041106a411020032008100402402006450d00200310230b20041023024002400240410810262208450d0020084200370300200041306a41086a22034200370300200042003703304188a7c1004116200041306a1000200041106a41086a200329030037030020002000290330370310200041003602382000420137033020004101360220200041206a200041306a10412008290300210502400240024020002802342207200028023822066b41084f0d00200641086a22032006490d0720074101742204200320032004491b22034100480d072007450d0120002802302007200310272204450d020c040b200028023021040c040b2003102622040d020b20034101102a000b41084108102a000b2000200336023420002004360230200321070b200041306a41086a2203200641086a2209360200200420066a2005370000200041106a411020042009100402402007450d00200410230b200810232003420037030020004200370330419ea7c1004110200041306a1000200041106a41086a220420032903003703002000200029033037031020004200370330200041106a4110200041306a41081004200041013a0020200342003703002000420037033041f3a6c1004115200041306a10002004200329030037030020002000290330370310200041106a4110200041206a410110040b4108210a4200210b200041306a41086a22034200370300200042003703304198a4c1004115200041306a1000200041106a41086a200329030037030020002000290330370310024002400240024002400240024002400240200041106a411041a886c500410041001001417f460d00200042103702242000200041106a360220200041306a200041206a1093012000280230220a450d012000290234210b0b410821074200210c200041306a41086a22034200370300200042003703304188a7c1004116200041306a1000200041106a41086a2003290300370300200020002903303703100240200041106a411041a886c500410041001001417f460d00200042103702242000200041106a360220200041306a200041206a10930120002802302207450d022000290234210c0b200041306a41086a220342003703002000420037033041aea7c1004114200041306a1000200041106a41086a20032903003703002000200029033037031002400240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d014201200029033022052005501b210d200b422088a7210e20020d050c040b42e500210d200b422088a7210e2002450d030c040b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b200e417f6a2203200e4b0d012003200e4f0d01200a20034103746a2203450d01200329030021010b4100200e41016a2203200da7417f200d428080808010541b6b2204200420034b1b220f200e4b0d01200a200f4103746a21090240024002400240200f450d00200c4220882110200a21020340200229030021054100210302402010a722044101460d002004450d0341002103034020032004410176220820036a22062005200720064103746a290300541b2103200420086b220441014b0d000b0b2005200720034103746a22042903002211520d0320102003ad580d042004200441086a2003417f732010a76a4103741095041a200c42ffffffff0f8320104220864280808080707c84210c2010427f7c2110200241086a22022009470d000b0b200b42ffffffff0f8321100240200e200f6b2203450d000240200f450d00200a200920034103741095041a0b2003ad42208620108421100b410021030240200c4220882205a72202450d00024020024101460d004100210320022104034020032004410176220820036a22062001200720064103746a290300541b2103200420086b220441014b0d000b0b200320032001200720034103746a2903002211566a20012011511b220320024b0d060b2002200ca7470d06200241016a22042002490d072005a722064101742208200420042008491bad220c4203862211422088a70d072011a722044100480d07024002402002450d0020072006410374200410272207450d010c080b2004102622070d070b20044108102a000b4100109401000b200320052011566a109401000b41fcc3c200104f000b41c2a7c10041261021000b41cce3c400104f000b4180e4c400104f000b200720034103746a220441086a2004200220036b4103741095041a2004200137030002402010a72010422088220ba72203470d00200341016a22042003490d0120034101742208200420042008491bad22104203862211422088a70d012011a722044100480d01024002402003450d00200a200341037420041027220a450d010c020b20041026220a0d010b20044108102a000b200a20034103746a20013703002005a7221241016a2213450d052013410176220320134f0d06200720034103746a2903002111024020134101710d002003417f6a220320134f0d08200720034103746a29030020117c42018821110b200041306a41086a220f4200370300200042003703304198a4c1004115200041306a1000200041106a41086a200f2903003703002000200029033037031020004100360238200042013703302000200b42017c2201a72203360220200041206a200041306a1041024002402003450d002003410374210e4100200f28020022036b210420002802342106200a21080340200829030021050240024002400240200620046a41084f0d00200341086a22022003490d0720064101742209200220022009491b22094100480d072006450d01200028023020062009102722020d020c090b200028023021020c020b200910262202450d070b2000200936023420002002360230200921060b200841086a2108200f200341086a2209360200200220036a2005370000200441786a210420092103200e41786a220e0d000c020b0b200f280200210920002802342106200028023021020b200041106a411020022009100402402006450d00200210230b02402010a7450d00200a10230b200041306a41086a220f4200370300200042003703304188a7c1004116200041306a1000200041106a41086a200f29030037030020002000290330370310200042013703302000410036023820002013360220201241037441086a2109200041206a200041306a10414100200028023822036b210420002802342106200721080340200829030021050240024002400240200620046a41084f0d00200341086a22022003490d052006410174220e20022002200e491b220e4100480d052006450d0120002802302006200e102722020d020c060b200028023021020c020b200e10262202450d040b2000200e36023420002002360230200e21060b200841086a2108200f200341086a220e360200200220036a2005370000200441786a2104200e2103200941786a22090d000b200041106a41102002200e100402402006450d00200210230b0240200ca7450d00200710230b42002105200041306a41086a2203420037030020004200370330419ea7c1004110200041306a1000200041106a41086a220420032903003703002000200029033037031020002011370330200041106a4110200041306a410810040240200d200142ffffffff0f83520d00200342003703002000420037033041af98c300410d200041306a100020042003290300370300200020002903303703100240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d05200029033021050b200041306a41086a220342003703002000420037033041c0a8c1004117200041306a1000200041106a41086a20032903003703002000200029033037031002400240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d07200029033021100c010b42e80721100b2011200d4201887c20107c2005560d00200041306a41086a220342003703002000420037033041aec8c3004117200041306a1000200041106a41086a200329030037030020002000290330370310410810262203450d092003200d427f7c37000020034108411010272203450d0a20032011370008200041106a4110200341101004200310230b200041c0006a24000f0b101e000b200e4101102a000b20094101102a000b41d4aac10041331021000b41d4aac10041331021000b4198a8c100104f000b41b0a8c100200320131029000b41b0a8c100200320131029000b41084101102a000b41104101102a000bbd0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1000200341086a2005290300370300200320032903103703000240024002402003411041a886c500410041001001417f460d002003420037031020034110200341106a41084100100141016a41084d0d0220032903102106200341101003420121040c010b0b2000200437030020002006370308200341206a24000f0b41d4aac10041331021000bc10304027f017e087f017e230041106b2202240020022001104a02400240024002400240024002400240024002402002280200450d0020022802042203ad2204421d88a70d032004420386a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241106a24000f0b4108210620030d030b410021054100210b0c030b101d000b20054108102a000b200141046a210741002108410021094100210a2003210b034020024200370308200141086a2205410020012802002007280200200241086a410820052802001001220c200c417f461b220c4108200c4108491b20052802006a360200200c41074d0d02200a41016a2105200229030821040240200a200b470d002008200520052008491b220bad420386220d422088a70d04200da7220c4100480d040240200a450d0020062009200c102722060d010c060b200c10262206450d050b200620096a2004370300200841026a2108200941086a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610230b200241106a24000f0b101e000b200c4108102a000b7d01017f230041c0006b220124002001412e36020c200141e8a7c100360208200120003602142001413c6a41063602002001412c6a4102360200200141013602342001420237021c2001419083c5003602182001200141146a3602382001200141086a3602302001200141306a360228200141186a41a083c5001061000b1300200041013602042000419ca9c1003602000b8c0605027f027e017f027e027f230041a0016b22022400200028020021000240024002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0120054290ce005441002004501b0d0241272100200241186a21060340200241106a200520044290ce0042001097042002200229031022072006290300220842f0b17f427f109804200241206a20006a2203417c6a200520022903007ca7220941e4006e220a41017441ea86c5006a2f00003b00002003417e6a200a419c7f6c20096a41017441ea86c5006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000b2007a7220341e3004a0d030c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d032001410141d889c5004102200241206a20006a41800120006b1097012100200241a0016a240020000f0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d032001410141d889c5004102200241206a20006a41800120006b1097012100200241a0016a240020000f0b412721002005a7220341e3004c0d030b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441ea86c5006a2f00003b0000200941094a0d030c040b20004180011048000b20004180011048000b2003220941094c0d010b200241206a2000417e6a22006a200941017441ea86c5006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141a886c5004100200241206a20006a412720006b1097012100200241a0016a240020000bd70601067f024002400240024002400240024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21082006410471450d010c020b200541016a2108412d2107200028020022064104710d010b410021024101210120002802084101470d010c020b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21084101210120002802084101460d010b20002007200220031082040d012000280218200420052000411c6a28020028020c1102000f0b024002400240024002400240024002402000410c6a280200220920084d0d0020064108710d01200920086b210b410120002d0030220120014103461b2201410371450d0220014102460d03200b21094100210b0c040b20002007200220031082040d072000280218200420052000411c6a28020028020c1102000f0b41012101200041013a00302000413036020420002007200220031082040d06200920086b21084101200041306a2d0000220120014103461b2201410371450d0320014102460d0420082109410021080c050b410021090c010b200b4101762109200b41016a410176210b0b417f2101200041046a210a200041186a21082000411c6a210602400340200141016a220120094f0d012008280200200a2802002006280200280210110300450d000b41010f0b200041046a280200210a4101210120002007200220031082040d03200041186a2209280200200420052000411c6a220328020028020c1102000d0320092802002100417f2109200328020041106a21030340200941016a2209200b4f0d05410121012000200a2003280200110300450d000c040b0b410021090c010b20084101762109200841016a41017621080b417f2101200041046a210a200041186a21032000411c6a210202400340200141016a220120094f0d012003280200200a2802002002280200280210110300450d000b41010f0b200041046a280200210a41012101200041186a2209280200200420052000411c6a220328020028020c1102000d0020092802002100417f2109200328020041106a21030340200941016a220920084f0d03410121012000200a2003280200110300450d000b0b20010f0b41000f0b41000b11002000280200200028020420011099010b951102167f017e230041206b22032400410121040240200228021841222002411c6a2802002802101103000d00024002402001450d00200020016a2105200241186a21062002411c6a210720002108410021094100210a024003402008210b200841016a210c024002400240024002400240024002400240024020082c0000220d4100480d00200d41ff0171210d0c010b024002400240200c2005460d00200c2d0000413f71210e200841026a2208210c200d411f71210f200d41ff0171220d41e001490d010c020b4100210e20052108200d411f71210f200d41ff0171220d41e0014f0d010b200e200f41067472210d0c010b0240024020082005460d00200841016a220c211020082d0000413f71200e41067472210e200d41f001490d010c030b200521104100200e41067472210e200d41f0014f0d020b200e200f410c7472210d0b200c21084102210c200d41776a220f411e4d0d010c020b0240024020102005460d00201041016a210820102d0000413f71210d0c010b4100210d200c21080b200e410674200f411274418080f0007172200d72220d418080c400460d084102210c200d41776a220f411e4b0d010b41f400210e024002400240200f0e1f07010505000505050505050505050505050505050505050505040505050504070b41f200210e0c010b41ee00210e0b0c040b200d41dc00470d010b0c010b0240200d1086040d0002400240200d41ffff034b0d00200d4180fe0371410876211141a098c5002112410021134100210c0c010b0240200d41ffff074b0d00200d4180fe0371410876211641db9dc5002117410021184101210c0c010b200d41ef83384b0d01200d41e28b746a41e28d2c490d01200d419fa8746a419f18490d01200d41dee2746a410e490d01200d41feffff0071419ef00a460d01200d41a9b2756a4129490d01200d41cb91756a410a4d0d010c040b0240034002400240200c0e020001010b201241026a2114201320122d0001220c6a2110024002400240024002400240024020122d0000220e2011470d0020102013490d06201041b0024f0d05201341f098c5006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c0b0b0b200e20114b0d012010211320142112201441f098c500470d030c010b2010211320142112201441f098c500470d010b200d41ffff0371210e419f9bc500210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b0240201041db9dc500460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41b88ac500104f000b200f410173210f200c41db9dc500470d000b0b200f410171450d070c0a0b4100210c0c040b4100210c0c030b201041af02108c01000b201320101048000b201741026a2114201820172d0001220c6a211002400240024002400240024020172d0000220e2016470d0020102018490d072010419f014f0d052018419d9ec5006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c090b0b200e20164b0d0120102118201421172014419d9ec500470d030c010b20102118201421172014419d9ec500470d010b200d41ffff0371210e41bb9fc500210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b0240201041b8a2c500460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41b88ac500104f000b200f410173210f200c41b8a2c500470d000b0b200f410171450d050c080b4101210c0c020b4101210c0c010b0b2010419e01108c01000b201820101048000b200d41017267410276410773ad4280808080d0008421194103210c0b200d210e0b2003200136020420032000360200200320093602082003200a36020c02400240200a2009490d0002402009450d0020092001460d00200920014f0d01200020096a2c000041bf7f4c0d010b0240200a450d00200a2001460d00200a20014f0d012000200a6a2c000041bf7f4c0d010b2006280200200020096a200a20096b200728020028020c1102000d0103400240024002400240024002400240200c4101460d0041dc0021090240200c4102460d00200c4103470d062019422088a741ff0171417f6a220c41044b0d060240200c0e050006040503000b201942ffffffff8f608321194103210c41fd0021090c070b4101210c0c060b4100210c200e21090c050b201942ffffffff8f60834280808080c0008421194103210c0c040b201942ffffffff8f60834280808080208421194103210c41fb0021090c030b201942ffffffff8f60834280808080308421194103210c41f50021090c020b200e2019a7220f410274411c7176410f71220c413072200c41d7006a200c410a491b21090240200f450d002019427f7c42ffffffff0f832019428080808070838421194103210c0c020b201942ffffffff8f60834280808080108421194103210c0c010b4101210c0240200d418001490d004102210c200d418010490d0041034104200d41808004491b210c0b200c200a6a2109200a200b6b20086a210a20052008470d050c060b200628020020092007280200280210110300450d000b200341206a240041010f0b20032003410c6a3602182003200341086a36021420032003360210200341106a108a04000b200341206a240041010f0b200a200b6b20086a210a20052008470d000b0b2009450d0120092001460d010240200920014f0d00200020096a2c000041bf7f4a0d020b2000200120092001108304000b410021090b200241186a220c280200200020096a200120096b2002411c6a220a28020028020c1102000d00200c2802004122200a28020028021011030021040b200341206a240020040bc9bb02092b7f017efa017f027e7d7f017e797f027e057f230041e0006b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410d4b0d00024020040e0e00090607030a0c080e050d02040b000b200141186a2802002105200141146a2802002106200141106a28020021072001410c6a2802002108200141086a2802002109200141046a280200210a200241046a280200200241086a2802002204470d16200441016a220b2004490d5a2004410174220c200b200b200c491b220c4100480d5a2004450d2d20022802002004200c1027220b450d2e0c570b2001410c6a280200210b200141086a2802002107200141046a280200210520012d0001210d200241046a280200200241086a2802002204470d0d200441016a22062004490d592004410174220e20062006200e491b220e4100480d592004450d1c20022802002004200e10272206450d1d0c540b2001410c6a280200210f200141086a2802002110200141046a2802002111200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d1d2002280200200420051027220b450d1e0c510b2001410c6a2802002112200141086a2802002113200141046a2802002114200241046a280200200241086a2802002204470d0d200441016a220b2004490d5720044101742205200b200b2005491b22054100480d572004450d1e2002280200200420051027220b450d1f0c4e0b200141146a2802002115200141106a28020021162001410c6a2802002117200141086a2802002118200141056a2d00002119200141046a2d0000211a200241046a280200200241086a2802002204470d0d200441016a220b2004490d5720044101742205200b200b2005491b22054100480d572004450d1f2002280200200420051027220b450d200c4b0b2001410c6a280200211b200141086a280200211c200141046a280200211d200241046a280200200241086a2802002204470d0d200441016a220b2004490d5520044101742205200b200b2005491b22054100480d552004450d202002280200200420051027220b450d210c480b2001410c6a2802002106200141086a280200211e200141046a280200211f200241046a280200200241086a2802002204470d0d200441016a220b2004490d5420044101742205200b200b2005491b22054100480d542004450d212002280200200420051027220b450d220c450b2001410c6a2802002106200141086a2802002120200141046a2802002121200241046a280200200241086a2802002204470d0d200441016a220b2004490d5320044101742205200b200b2005491b22054100480d532004450d222002280200200420051027220b450d230c420b2001410c6a2802002106200141086a2802002122200141046a2802002123200241046a280200200241086a2802002204470d0d200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d232002280200200420051027220b450d240c3f0b2001410c6a2802002106200141086a2802002124200141046a2802002125200241046a280200200241086a2802002204470d0e200441016a220b2004490d5120044101742205200b200b2005491b22054100480d512004450d262002280200200420051027220b450d270c3c0b2001410c6a2802002126200141086a2802002127200141046a2802002128200241046a280200200241086a2802002204470d0e200441016a220b2004490d5020044101742205200b200b2005491b22054100480d502004450d272002280200200420051027220b450d280c390b200141286a2802002108200141246a2802002129200141206a280200212a2001411c6a280200212b200141186a280200212c200141146a280200212d2001410c6a290200212e200141086a280200212f200141046a2802002130200241046a280200200241086a2802002231470d0e203141016a22042031490d5020314101742232200420042032491b22324100480d502031450d2820022802002031203210272204450d290c360b2001410c6a2802002133200141086a2802002134200141046a2802002135200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d292002280200200420051027220b450d2a0c330b2001410c6a2802002136200141086a2802002137200141046a2802002138200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d2a2002280200200420051027220b450d2b0c300b200141046a2802002104200241046a280200200241086a280200220b470d0e200b41016a2205200b490d4c200b4101742206200520052006491b22064100480d4c200b450d2b2002280200200b200610272205450d2c0c2d0b200228020021060c470b2002280200210b0c440b2002280200210b0c410b2002280200210b0c3e0b2002280200210b0c3b0b2002280200210b0c380b2002280200210b0c350b2002280200210b0c320b2002280200210b0c410b2002280200210b0c2e0b2002280200210b0c2b0b200228020021040c280b2002280200210b0c250b2002280200210b0c220b200228020021050c1f0b200e102622060d370b200e4101102a000b20051026220b0d330b20054101102a000b20051026220b0d2f0b20054101102a000b20051026220b0d2b0b20054101102a000b20051026220b0d270b20054101102a000b20051026220b0d230b20054101102a000b20051026220b0d1f0b20054101102a000b20051026220b0d1b0b20054101102a000b200c1026220b0d290b200c4101102a000b20051026220b0d150b20054101102a000b20051026220b0d110b20054101102a000b2032102622040d0d0b20324101102a000b20051026220b0d090b20054101102a000b20051026220b0d050b20054101102a000b2006102622050d010b20064101102a000b20022005360200200241046a2006360200200241086a280200210b0b200241086a200b41016a3602002005200b6a41083a00004101210e410021064100210b024002400240024003400240200b2006470d0020064101742205200641016a220720072005491b22054100480d23024002402006450d00200e200620051027220e0d010c040b20051026220e450d030b200521060b200e200b6a200441807f72200441ff0071200441077622051b3a0000200b41016a210b2005210420050d000b200b417f6a2109200241086a2107200241046a2139200b210503400240024002400240203928020020072802002204470d00200441016a220d2004490d2620044101742208200d200d2008491b22084100480d262004450d012002280200200420081027220d0d020c060b2002280200210d0c020b20081026220d450d040b2002200d36020020392008360200200728020021040b2007200441016a360200200d20046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b0240200241046a2802002205200241086a28020022046b20094d0d00200228020021050c040b2004200b6a22072004490d2120054101742204200720072004491b22044100480d21024002402005450d0020022802002005200410272205450d010c040b2004102622050d030b20044101102a000b20054101102a000b20084101102a000b20022005360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200520046a200e200b1094041a4101213902402006450d00200e10230b4101210e4101210d410621040c1c0b2002200b360200200241046a2005360200200241086a28020021040b41012196024108219702200241086a200441016a360200200b20046a410a3a000041002198022003412c6a229902410036020020034201370224200320023602202038203641186c6a219a024107219b0241ff00219c0241807f219d024100219e024100219f02203621a0020240024041004100460d00411621450c010b41152145410e21040c1b0b410e21040c1a0b2002200b360200200241046a2005360200200241086a28020021040b41012189024108218a02200241086a200441016a360200200b20046a41063a00004100218b02200341dc006a228c0241003602002003420137025420032002360250203520334104746a218d024107218e0241ff00218f0241807f2190024100219102410021920220332193020240024041004100460d00411221450c010b41112145410e21040c190b410e21040c180b20022004360200200241046a2032360200200241086a28020021310b200241086a203141016a360200200420316a41003a0000202e422088a72106410121324100210b4100213141002104202ea722880221050240024002400340024020312004470d00200441016a220b2004490d1d20044101742207200b200b2007491b220b4100480d1d024002402004450d0020322004200b102722320d010c040b200b10262232450d030b200b21040b203220316a200541807f72200541ff0071200541077622071b3a0000203141016a21312007210520070d000b200420316b2088024f0d0220312088026a220b2031490d1b20044101742205200b200b2005491b220b4100480d1b024002402004450d0020322004200b10272232450d010c030b200b102622320d020b200b4101102a000b200b4101102a000b200b21040b203220316a20302088021094041a0240202f450d0020301023200b21040b20880220316a2131024002400240024002400340024020312004470d00200441016a220b2004490d1f20044101742205200b200b2005491b220b4100480d1f024002402004450d0020322004200b102722320d010c040b200b10262232450d030b200b21040b203220316a200641807f72200641ff0071200641077622051b3a0000203141016a21312005210620050d000b024002400240202d450d00202b210503400240024002400240200b2031470d00200b41016a2231200b490d25200b4101742204203120312004491b22044100480d25200b450d012032200b2004102722320d020c090b200b21040c020b200410262232450d070b200b21312004210b0b203220316a200541807f72200541ff0071200541077622061b3a0000203141016a21312006210520060d000b200420316b202b4f0d062031202b6a220b2031490d2020044101742205200b200b2005491b220b4100480d202004450d0120322004200b10272232450d020c050b200b21044101212f0c060b200b102622320d030b200b4101102a000b200b4101102a000b20044101102a000b200b21040b203220316a202d202b1094041a2031202b6a21314100212f202c450d00202d10230b202a20084104746a21302008210b024002400340024002400240024020042031470d00200441016a22312004490d1f20044101742205203120312005491b222b4100480d1f2004450d0120322004202b102722320d020c050b2004212b0c020b202b10262232450d030b20042131202b21040b203220316a200b41807f72200b41ff0071200b41077622051b3a0000203141016a21312005210b20050d000b02402008450d0041102184034108218503410c218603417f218703410621880341012189034100218a034107218b0341ff00218c0341807f218d034102218e034103218f0341c00021900341ff0121910341042192034105219303202a218802412121450c020b202a218802410821040c180b202b4101102a000b410e21040c160b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41053a000020282026410c6c6a21f9014100210b410021fa01410021fb01410121fc0120262104024002400340024020fa0120fb01470d00200b20fa0141016a22052005200b491b22fb014100480d190240200b450d0020fc0120fa0120fb01102722fc010d010c030b20fb01102622fc01450d020b20fc0120fa016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20fa0141016a21fa012005210420050d000b02402026450d00410c21fd01410221fe01410121ff01410821800241002181024104218202410721830241ff0021840241807f2185022028218602411021450c020b2028218702410721040c160b20fb014101102a000b410e21040c140b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41013a0000202520064104746a21e9014100210b410021ea01410021eb01410121ec0120062104024002400340024020ea0120eb01470d00200b20ea0141016a22052005200b491b22eb014100480d170240200b450d0020ec0120ea0120eb01102722ec010d010c030b20eb01102622ec01450d020b20ec0120ea016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ea0141016a21ea012005210420050d000b02402006450d00411021ed01410521ee01410121ef01410021f001410421f101410221f201410721f30141ff0021f40141807f21f501410321f601202521f701410f21450c020b202521f801410521040c140b20eb014101102a000b410e21040c120b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41073a00002023200641146c6a21d9014100210b410021da01410021db01410121dc0120062104024002400340024020da0120db01470d00200b20da0141016a22052005200b491b22db014100480d150240200b450d0020dc0120da0120db01102722dc010d010c030b20db01102622dc01450d020b20dc0120da016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20da0141016a21da012005210420050d000b02402006450d00411421dd01410421de01410121df01411021e001410721e10141ff0021e20141807f21e301410021e401410221e501202321e601410e21450c020b202321e701410421040c120b20db014101102a000b410e21040c100b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41033a0000202120064102746a21cd014100210b410021ce01410021cf01410121d001200621040240024002400340024020ce0120cf01470d00200b20ce0141016a22052005200b491b22cf014100480d140240200b450d0020d00120ce0120cf01102722d0010d010c030b20cf01102622d001450d020b20d00120ce016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ce0141016a21ce012005210420050d000b2006450d01410121d101410721d20141ff0021d30141807f21d401410021d501410221d601410421d701202121d801410d21450c020b20cf014101102a000b410121040c0f0b410e21040c0e0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41023a0000201f200641286c6a21aa014100210b410021ab01410021ac01410121ad0120062104024002400340024020ab0120ac01470d00200b20ab0141016a22052005200b491b22ac014100480d110240200b450d0020ad0120ab0120ac01102722ad010d010c030b20ac01102622ad01450d020b20ad0120ab016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ab0141016a21ab012005210420050d000b02402006450d00412821ae01410421af01412421b001412021b101411c21b201411a21b301411921b401411421b501411021b601410721b70141ff0021b80141807f21b901410121ba01410021bb01410221bc0141f00021bd01410321be01417f21bf01413f21c00141c00021c10141ff0121c201201f21c301410c21450c020b201f21c301410321040c0e0b20ac014101102a000b410e21040c0c0b2002200b360200200241046a2005360200200241086a28020021040b41012181014108218201200241086a200441016a360200200b20046a41093a00004100218301200341dc006a22840141003602002003420137025420032002360250201d201b411c6c6a218501410721860141ff0021870141807f21880141002189014100218a01201b218b010240024041004100460d00410821450c010b41072145410e21040c0b0b410e21040c0a0b2002200b360200200241046a2005360200200241086a28020021040b4101216d200241086a200441016a3602004100216e200b20046a41003a0000024002400240024002400240024041041026226f450d00206f41eec2b5ab063600000240024002400240024002400240201a4101460d000240201a4102460d002018217020172171201621724101217341012174201a4103460d0e41012170410021044100210b20162105034002400240024002402004200b470d00200441016a220b2004490d1e20044101742206200b200b2006491b22714100480d1e2004450d01207020042071102722700d020c0b0b200421710c020b207110262270450d090b2004210b207121040b2070200b6a200541807f72200541ff0071200541077622061b3a0000200b41016a210b2006210520060d000b2071200b6b20164f0d0d200b20166a2204200b490d1920714101742205200420042005491b22044100480d192071450d0420702071200410272270450d050c0c0b2003410036024820034201370340200341c8006a2194034101210741002105410021042018210b0340024020042005470d00200541016a22062005490d1a20054101742208200620062008491b22064100480d1a024002402005450d00200720052006102722070d010c0a0b200610262207450d090b2003200636024420032007360240200621050b209403200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b201720154104746a2194032018450d0120172195032015450d0220940341706a2196034100219703410121980341102199034104219a03417f219b034108219c034107219d0341ff00219e0341807f219f03411a21a003200341dc006a21a103410021a203201821a303201721a403410621450c0a0b4100216d2003410036024820034201370340200341086a410c6a2015360200200341086a41086a20163602002003201736020c20032018360208200341d0006a200341086a200341c0006a109b01024020032d00502279411a470d00200341c0006a41086a2802002172200328024421712003280240217041012173410021744100216e41012119410121754101102622760d080c190b200341d0006a41086a35020021a803200328025421a90320032d005321a50320032d005221a60320032d005121a703200341d0006a410c6a350200422086212e02402003280244450d00200328024010230b202e20a8038421a803410b21040c150b20172195030b209503209403460d06410c21040c130b2004102622700d070b20044101102a000b20714101102a000b20064101102a000b41044101102a000b410021040c0d0b410d21040c0c0b410e21040c0b0b200421710b2070200b6a201820161094041a200b20166a21724101216d02402017450d00201810230b41002174410121734101216e410021190b41012175410110262276450d0b410021040c080b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41043a000020142012410c6c6a215d4100210b4100215e4100215f41012160201221040240024003400240205e205f470d00200b205e41016a22052005200b491b225f4100480d0b0240200b450d002060205e205f102722600d010c030b205f10262260450d020b2060205e6a200441807f72200441ff0071200441077622051b3a0000200b41026a210b205e41016a215e2005210420050d000b02402012450d00410c21614102216241082163410121644100216541f0002166410421674107216841ff00216941807f216a2014216b410521450c020b2014216c410221040c080b205f4101102a000b410e21040c060b2002200b360200200241046a2005360200200241086a28020021040b4101213a4108213b200241086a200441016a360200200b20046a410b3a00004100213c200341dc006a223d410036020020034201370254200320023602502011200f411c6c6a213e4107213f41ff00214041807f21414100214241002143200f21440240024041004100460d00410121450c010b41002145410e21040c050b410e21040c040b20022006360200200241046a200e360200200241086a28020021040b200241086a220e200441016a360200200620046a200d3a000002400240024002400240200241046a2802002206200e28020022046b200b4f0d002004200b6a220d2004490d0820064101742204200d200d2004491b22044100480d082006450d0120022802002006200410272206450d020c030b200228020021060c030b2004102622060d010b20044101102a000b20022006360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200620046a2005200b1094041a4100210e4101213902402007450d00200510230b4101210d410621040c020b2002200b360200200241046a200c360200200241086a28020021040b4101210c200241086a200441016a360200410021e801200b20046a41003a00002003411c6a2005360200200341186a200636020020032007360214200320083602102003200936020c2003200a360208200341d0006a200341086a2002109c01200320032900513703402003200341d0006a41086a29000037004702400240024020032d00502204411a470d004101210e410021394101210d0c010b20002003290340370001200020043a0000200041086a20032900473700000c010b410621040c010b410a21040b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0f000102030405060708090a2324252c2c0b207620193a0000410121044101210b20722105034002400240024002402004200b470d00200420756a220b2004490d8c0220042075742206200b200b2006491b22774100480d8c022004450d01207620042077102722760d020c2e0b200421770c020b207710262276450d2c0b2004210b207721040b2076200b6a200541807f72200541ff0071200541077622061b3a0000200b20756a210b2006210520060d000b2077200b6b20724f0d1c200b20726a2204200b490d870220774101742205200420042005491b22044100480d87022077450d1a20762077200410272276450d1d0c1b0b02402020450d00202110230b200241086a2105200241046a210720ce01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d8a022004410174220d20062006200d491b220d4100480d8a022004450d0120022802002004200d102722060d020c290b200228020021060c020b200d10262206450d270b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20ce014f0d00200420ce016a22052004490d8602200b4101742204200520052004491b22044100480d8602200b450d122002280200200b20041027220b450d150c130b2002280200210b0c130b20142012410c6c6a206c6b2104024003402004450d01200441746a2104206c280204210b206c410c6a216c200b4102470d000b0b02402013450d00201410230b200241086a2105200241046a2107205e210b03400240024002400240200728020020052802002204470d00200441016a22062004490d89022004410174220d20062006200d491b220d4100480d89022004450d0120022802002004200d102722060d020c290b200228020021060c020b200d10262206450d270b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b205e4f0d002004205e6a22052004490d8502200b4101742204200520052004491b22044100480d8502200b450d0d2002280200200b20041027220b450d100c0e0b2002280200210b0c0e0b20c30120aa01460d9101034020c30141186a2d00004104460d920120c30141106a280200210420c301410c6a280200210b024020c30141046a280200450d0020c30128020010230b02402004450d00200b10230b20c30141286a22c30120aa01470d000c92010b0b20e70120d901460d8f01034020e701410c6a2802004104460d9001024020e70141046a280200450d0020e70128020010230b20e70141146a22e70120d901470d000c90010b0b20f80120e901460dd801034020f801410d6a2d00004105460dd901024020f80141046a280200450d0020f80128020010230b20f80141106a22f80120e901470d000cd9010b0b410121c4010c8f010b20282026410c6c6a2087026b2104024003402004450d01200441746a2104208702280204210b208702410c6a218702200b4102470d000b0b02402027450d00202810230b200241086a2105200241046a210720fa01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d84022004410174220d20062006200d491b220d4100480d84022004450d0120022802002004200d102722060d020c250b200228020021060c020b200d10262206450d230b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20fa014f0d00200420fa016a22052004490d8002200b4101742204200520052004491b22044100480d8002200b450d042002280200200b20041027220b450d070c050b2002280200210b0c050b024003402030208802460d01208802280200210420880241106a21880220044108470d000b0b02402029450d00202a10230b200241086a2105200241046a21072031210b03400240024002400240200728020020052802002204470d00200441016a22062004490d84022004410174220d20062006200d491b220d4100480d84022004450d0120022802002004200d102722060d020c250b200228020021060c020b200d10262206450d230b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20314f0d00200420316a22052004490d8002200b4101742204200520052004491b22044100480d8002200b450d0f2002280200200b20041027220b450d120c100b2002280200210b0c100b02402034450d00203510230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22072802002204470d00200441016a22062004490d82022004410174220e20062006200e491b220e4100480d82022004450d0120052802002004200e102722060d020c260b200528020021060c020b200e10262206450d240b20052006360200200d200e360200200728020021040b2007200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490dfe01200b4101742204200620062004491b22044100480dfe01200b450d162005280200200b20041027220b450d190c170b2005280200210b0c170b410121050c6f0b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420fa016a360200200b20046a20fc0120fa011094041a4100210841012139024020fb01450d0020fc0110230b4101210e4101210d410121c401410121cc01410121070c8b010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a2004205e6a360200200b20046a2060205e1094041a41002107410121390240205f450d00206010230b4101210e4101210d410121c401410121cc010c86010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ce016a360200200b20046a20d00120ce011094041a410021cc0141012139024020cf01450d0020d00110230b4101210e4101210d410121c4010c81010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420316a360200200b20046a203220311094041a0240202b450d00203210230b410021c901410121390240202d450d00202f450d00202c450d00202d10230b4101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b4101210a410121060ccf010b20044101102a000b200410262276450d020b200421770b2076200b6a207020721094041a02402071450d00207010230b200b20726a2178024002400240201a450d000240201a4101460d00201a4102470d02411a21792073450d692015450d684104217a201720154104746a217b4110217c410c217d4108217e4174217f2017218001412521450c130b411a2179206d450d682015450d672015410c6c210b201721040340024020042802002205450d00200441046a280200450d00200510230b2004410c6a2104200b41746a220b0d000c680b0b411a2179201745206e720d670c010b411a21792017452074720d660b201810230c650b20044101102a000b20041026220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b41002145410121394101210e4101210d410121c401410121cc0141012107410121080c780b20044101102a000b4100217741012176410021780c600b4110218f04410c21900441742191044104219204412321450c090b02402016450d00201710230b200341c8006a2802002172200328024421712003280240217041022119410021734101216d410021744100216e410121754101102622760d140ce3010b200d4101102a000b200d4101102a000b200d4101102a000b200d4101102a000b20774101102a000b200e4101102a000b024002400240024002400240024002400240024002400240024002400240024002400240024020450e280100030562076b0a090c0e5d0f101112bf01b201b3016766a801a90187018601797877765958575675555453085251510b200328025421040c010b2042203a6a22042042490dec012042203a74220b20042004200b491b220b203c480dec01024002402042450d0020032802542042200b102722040d010c3f0b200b10262204450d3e0b200341d0006a203b6a200b36020020032004360254203d28020021430b203d2043203a6a360200200420436a204420417220442040712044203f7622041b3a000002402004450d0020042144200341d0006a203b6a2802002242203d2802002243470d29410021450c180b20112146200f450d01411c214741182148411421494108214a4107214b41ff00214c41807f214d200341dc006a214e4101214f41002150411a215120112152410221450c160b205220476a214620522802042209450d00205220486a2802002108205220496a280200210a2052204a6a290200212e2052280200210b2052280210214503400240024002400240200341d0006a204a6a2205280200204e2802002204470d002004204f6a22062004490def012004204f742207200620062007491b22072050480def012004450d01200328025420042007102722060d020c4a0b200328025421060c020b200710262206450d480b2005200736020020032006360254204e28020021040b204e2004204f6a360200200620046a200b204d72200b204c71200b204b7622041b3a00002004210b20040d000b2003202e37024420032009360240200341086a200341c0006a200341d0006a109d0120032d000822532051470d5f2008210b034002400240024002402005280200204e2802002204470d002004204f6a22062004490def012004204f742207200620062007491b22072050480def012004450d01200328025420042007102722060d020c480b200328025421060c020b200710262206450d460b2005200736020020032006360254204e28020021040b204e2004204f6a360200200620046a200b204d72200b204c71200b204b7622041b3a00002004210b20040d000b02400240024002402005280200220b204e28020022046b20084f0d00200420086a22062004490dee01200b204f742204200620062004491b22042050480dee01200b450d012003280254200b20041027220b0d020c350b2003280254210b0c020b20041026220b450d330b200520043602002003200b360254204e28020021040b204e200420086a360200200b20046a204520081094041a0240200a450d00204510230b204621522046203e470d260c020b2046203e460d01411c215441142155410c21564108215741042158411021594109215a41ffffffff03215b4170215c410321450c130b20462802042205450d00204620556a2802002106204620576a2802002107204628021021080240204620566a2802002204450d002004205874210b200521040340024020042d0000205a470d00200420576a280200205b71450d00200420586a28020010230b200420596a2104200b205c6a220b0d000b0b02402007450d00200510230b204620546a214602402006450d00200810230b2046203e470d230b02402010450d00201110230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490dec012004410174220e20072007200e491b220e4100480dec012004450d0120052802002004200e102722070d020c3b0b200528020021070c020b200e10262207450d390b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b200541046a280200220b200541086a28020022046b20394f0d7d200420396a22062004490de701200b4101742204200620062004491b22044100480de701200b450d532005280200200b20041027220b450d550c540b206b20616a216c206b28020422092062460d16206b20636a2802002107206b2802002104024002400240205f205e470d00205e20646a220b205e490de801205e2064742205200b200b2005491b220b2065480de801205e450d012060205e200b102722600d020c370b205f210b0c010b200b10262260450d350b2060205e6a20663a00000240024002400240200b205e20646a2205470d00200b20646a2205200b490de901200b206474225e20052005205e491b225f2065480de901200b450d012060200b205f102722600d020c370b200b215f0c020b205f10262260450d350b200b21050b206020056a20092064463a0000200520646a215e2005206474220b20676a2108200b20626a210503402008210b0240205e205f470d00205e20646a2206205e490de7012005200620062005491b225f2065480de7010240205e450d002060205e205f102722600d010c450b205f10262260450d440b2060205e6a2004206a722004206971200420687622061b3a0000200b20626a2108200520626a2105205e20646a215e2006210420060d000b024020092064470d0003400240205e205f470d00205e20646a2204205e490de801200b20042004200b491b225f2065480de8010240205e450d002060205e205f102722600d010c410b205f10262260450d400b2060205e6a2007206a722007206971200720687622041b3a0000200b20626a210b205e20646a215e2004210720040d000b0b206c216b206c205d470d20205d216c0c170b2080012206207c6a218001024020062802042204450d0002402006207d6a280200220b450d00200b207d6c210b0340024020042802002205450d002004207a6a280200450d00200510230b2004207d6a2104200b207f6a220b0d000b0b2006207e6a280200450d002006207a6a28020010230b208001207b470d180c5f0b200328025421040c010b2089012081016a2204208901490de30120890120810174220b20042004200b491b220b208301480de30102400240208901450d002003280254208901200b102722040d010c350b200b10262204450d340b200341d0006a2082016a200b36020020032004360254208401280200218a010b208401208a012081016a3602002004208a016a208b0120880172208b0120870171208b012086017622041b3a000002402004450d002004218b01200341d0006a2082016a280200228901208401280200228a01470d1c410721450c0c0b201d218c01201b450d01411c218d014118218e014114218f014108219001410721910141ff0021920141807f219301200341dc006a21940141012195014100219601411a21970141022198014104219901201d219a01410921450c0a0b209a01208d016a218c01209a012802042208450d00209a01208e016a2802002107209a01208f016a280200219b01209a012090016a290200212e209a01280210219c01209a01280200210b03400240024002400240200341d0006a2090016a229d012802002094012802002204470d0020042095016a22052004490de6012004209501742206200520052006491b2206209601480de6012004450d01200328025420042006102722050d020c400b200328025421050c020b200610262205450d3e0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b2003202e37024420032008360240200341086a200341c0006a200341d0006a109d0120032d0008229e01209701470d51209c012007209801746a219f012007210b03400240024002400240209d012802002094012802002204470d0020042095016a22052004490de6012004209501742206200520052006491b2206209601480de6012004450d01200328025420042006102722050d020c3e0b200328025421050c020b200610262205450d3c0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b2007450dbc01209c0121a001410021040c7b0b208c01208501460dbc01411c21a101411421a201410c21a301410821a401410421a501411021a601410921a70141ffffffff0321a801417021a901410a21450c070b208c012802042205450dbb01208c0120a2016a2802002106208c0120a4016a2802002107208c0128021021080240208c0120a3016a2802002204450d00200420a50174210b200521040340024020042d000020a701470d00200420a4016a28020020a80171450d00200420a5016a28020010230b200420a6016a2104200b20a9016a220b0d000b0b02402007450d00200510230b208c0120a1016a218c0102402006450d00200810230b208c01208501470d170cbb010b20c301220420ae016a21c30120042d001822c40120af01460d0d200420b0016a2800002109200420b1016a28000021c501200420b2016a2800002107200420b3016a2d000021c601200420b4016a2c000021c701200420b5016a280200210a200420b6016a28020021c801200428020c21c901200428020421ca01200428020021cb014101214520ab01410174210620ab01210b200428020822cc0121050340204521040240200b20ac01470d00200b20ba016a22ac01200b490ddf01200620ac0120ac012006491b22ac0120bb01480ddf010240200b450d0020ad01200b20ac01102722ad010d010c420b20ac01102622ad01450d410b20ad01200b6a200520b90172200520b80171200520b7017622081b3a0000200420ba016a2145200620bc016a2106200b20ba016a210b2008210520080d000b024020ac01200b6b20cc014f0d00200b20cc016a2205200b490dde0120ac0120ba01742206200520052006491b220520bb01480dde010240024020ac01450d0020ad0120ac012005102722ad010d010c2d0b2005102622ad01450d2c0b200521ac010b20ad01200b6a20cb0120cc011094041a024020ca01450d0020cb0110230b20ab0120cc016a210620bb0120ab016b20cc016b2108200a210b03400240200620046a220520ac01470d00200520ba016a22ab012005490ddf01200520ba017422ac0120ab0120ab0120ac01491b22ac0120bb01480ddf01024020082004470d0020ac01102622ad010d010c410b20ad01200520ac01102722ad01450d400b20ad0120066a20046a200b20b90172200b20b80171200b20b7017622051b3a0000200420ba016a21042005210b20050d000b024002400240200820ac016a20046b200a4f0d00200620046a2205200a6a220b2005490de00120ac0120ba01742205200b200b2005491b220b20bb01480de00120ac01450d0120ad0120ac01200b102722ad010d020c2c0b20ac01210b0c010b200b102622ad01450d2a0b20ad0120066a20046a20c901200a1094041a2006200a6a2205200b6b21ab01024020c801450d0020c90110230b200520046a210520ab0120046a2104024002400240024002400240024002400240024002400240024002400240024002400240024020c40120ba01460d00024020c40120bc01460d0020c40120be01470d022004450d05200b21ab010c0f0b2004450d02200b21040c080b2004450d02200b21ab010c0a0b2004450d03200b21ac010c0f0b200b20ba016a2204200b490ded01200b20ba01742205200420042005491b220420bb01480ded01200b450d0320ad01200b2004102722ad010d040c2f0b200b20ba016a2204200b490dec01200b20ba01742205200420042005491b22ab0120bb01480dec01200b450d0520ad01200b20ab01102722ad010d060c2d0b200b20ba016a2204200b490deb01200b20ba01742205200420042005491b22ab0120bb01480deb01200b450d0720ad01200b20ab01102722ad010d080c2b0b200b20ba016a2204200b490dea01200b20ba01742205200420042005491b22ac0120bb01480dea01200b450d0920ad01200b20ac01102722ad010d0a0c290b2004102622ad01450d2b0b200b21050b20ad0120056a20bc013a000002400240024002402004200520ba016a220b470d00200420ba016a220b2004490deb01200420ba01742205200b200b2005491b22ac0120bb01480deb012004450d0120ad01200420ac01102722ad010d020c320b200421ac010c020b20ac01102622ad01450d300b2004210b0b20ad01200b6a20c50120ba01463a0000200b20ba016a21ab01200b20ba0174220420af016a2106200420bc016a210b034020062104024020ab0120ac01470d0020ab0120ba016a220520ab01490de901200b20052005200b491b22ac0120bb01480de901024020ab01450d0020ad0120ab0120ac01102722ad010d010c410b20ac01102622ad01450d400b20ad0120ab016a200720b90172200720b80171200720b7017622051b3a0000200420bc016a2106200b20bc016a210b20ab0120ba016a21ab012005210720050d000b20c50120ba01470d090340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de9012004200b200b2004491b22ac0120bb01480de901024020ab01450d0020ad0120ab0120ac01102722ad010d010c3e0b20ac01102622ad01450d3d0b20ad0120ab016a200920b90172200920b80171200920b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2109200b0d000c0a0b0b20ab01102622ad01450d270b200b21050b20ad0120056a20ba013a0000024002400240024020ab01200520ba016a220b470d0020ab0120ba016a220420ab01490de80120ab0120ba0174220b20042004200b491b220420bb01480de80120ab01450d0120ad0120ab012004102722ad010d020c2e0b20ab0121040c020b2004102622ad01450d2c0b20ab01210b0b20ad01200b6a20bd013a000002400240024002402004200b20ba016a220b470d00200420ba016a220b2004490de801200420ba01742205200b200b2005491b22ac0120bb01480de8012004450d0120ad01200420ac01102722ad010d020c2d0b200421ac010c020b20ac01102622ad01450d2b0b2004210b0b20ad01200b6a20c50120ba01463a0000200b20ba016a21ab01200b20ba0174220420af016a2106200420bc016a210b034020062104024020ab0120ac01470d0020ab0120ba016a220520ab01490de601200b20052005200b491b22ac0120bb01480de601024020ab01450d0020ad0120ab0120ac01102722ad010d010c3d0b20ac01102622ad01450d3c0b20ad0120ab016a200720b90172200720b80171200720b7017622051b3a0000200420bc016a2106200b20bc016a210b20ab0120ba016a21ab012005210720050d000b20c50120ba01470d060340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de6012004200b200b2004491b22ac0120bb01480de601024020ab01450d0020ad0120ab0120ac01102722ad010d010c3a0b20ac01102622ad01450d390b20ad0120ab016a200920b90172200920b80171200920b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2109200b0d000c070b0b20ab01102622ad01450d230b200b21050b20ad0120056a20be013a0000024002400240024020ab01200520ba016a220b470d0020ab0120ba016a220420ab01490de50120ab0120ba0174220b20042004200b491b220420bb01480de50120ab01450d0120ad0120ab012004102722ad010d020c290b20ab0121040c020b2004102622ad01450d270b20ab01210b0b20ad01200b6a20c70120bf0173220520c0017120c10172200520c70120bf014a1b3a000002400240024002402004200b20ba016a220b470d00200420ba016a220b2004490de501200420ba01742205200b200b2005491b22ac0120bb01480de5012004450d0120ad01200420ac01102722ad010d020c280b200421ac010c020b20ac01102622ad01450d260b2004210b0b20ad01200b6a20c60120c2017120bb01473a0000200b20ba016a21ab0120c30120aa01470d180c6f0b20ac01102622ad01450d1f0b200b21050b20ad0120056a20bb013a0000200520ba016a21ab01200520ba017420bc016a21040340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de0012004200b200b2004491b22ac0120bb01480de001024020ab01450d0020ad0120ab0120ac01102722ad010d010c360b20ac01102622ad01450d350b20ad0120ab016a200720b90172200720b80171200720b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2107200b0d000b0b20c30120aa01470d150c6b0b20ce0120d10174210b20d80128020021040340024020ce0120cf01470d0020ce0120d1016a220520ce01490dde01200b20052005200b491b22cf0120d501480dde01024020ce01450d0020d00120ce0120cf01102722d0010d010c420b20cf01102622d001450d410b20d00120ce016a200420d40172200420d30171200420d2017622051b3a0000200b20d6016a210b20ce0120d1016a21ce012005210420050d000b20d80120d7016a22d80120cd01470d12410121040cdb010b20e60120dd016a21e70120e60128020c220920de01460d0a20e601280204214520e601280200210820da0120df0174210520e60120e0016a280200210420e6012802082207210b0340024020da0120db01470d0020da0120df016a220620da01490ddd012005200620062005491b22db0120e401480ddd01024020da01450d0020dc0120da0120db01102722dc010d010c3e0b20db01102622dc01450d3d0b20dc0120da016a200b20e30172200b20e20171200b20e1017622061b3a0000200520e5016a210520da0120df016a21da012006210b20060d000b02400240024020db0120da016b20074f0d0020da0120076a220b20da01490dde0120db0120df01742205200b200b2005491b220b20e401480dde0120db01450d0120dc0120db01200b102722dc010d020c290b20db01210b0c010b200b102622dc01450d270b20dc0120da016a200820071094041a2007200b6b20da016a210502402045450d00200810230b024002402005450d00200720da016a2105200b21db010c010b200b20df016a2205200b490ddc01200b20df017422da012005200520da01491b22db0120e401480ddc0102400240200b450d0020dc01200b20db01102722dc010d010c270b20db01102622dc01450d260b200b21050b20dc0120056a20093a0000200520df016a21da01200520df017420e5016a210b0340024020da0120db01470d0020da0120df016a220520da01490ddd01200b20052005200b491b22db0120e401480ddd01024020da01450d0020dc0120da0120db01102722dc010d010c3d0b20db01102622dc01450d3c0b20dc0120da016a200420e30172200420e20171200420e1017622051b3a0000200b20e5016a210b20da0120df016a21da012005210420050d000b20e70121e60120e70120d901470d100c680b20f70120ed016a21f80120f7012d000d220920ee01460d0820f7012d000c210420f701280208210820f701280204210a20f70128020021f701024020eb0120ea01470d0020ea0120ef016a220b20ea01490ddb0120ea0120ef01742205200b200b2005491b22eb0120f001480ddb01024020ea01450d0020ec0120ea0120eb01102722ec010d010c260b20eb01102622ec01450d250b20ec0120ea016a20043a000020ea0120ef016a210420ea0120ef0174220b20f1016a2107200b20f2016a21052008210b0340200721060240200420eb01470d00200420ef016a22ea012004490ddc01200520ea0120ea012005491b22eb0120f001480ddc0102402004450d0020ec01200420eb01102722ec010d010c3b0b20eb01102622ec01450d3a0b20ec0120046a200b20f50172200b20f40171200b20f3017622ea011b3a0000200620f2016a2107200520f2016a2105200420ef016a210420ea01210b20ea010d000b2008450dad014100210502400340200420056a210b20f70120056a2d0000220720f6014b0db00141ff0021ea0102400240024002400240024020070e0401000203010b41fe0021ea010b200b20eb01470d030c020b41fd0021ea01200b20eb01460d010c020b41fc0021ea01200b20eb01470d010b200b20ef016a2207200b490ddd012006200720072006491b22eb0120f001480ddd010240200b450d0020ec01200b20eb01102722ec010d010c030b20eb01102622ec01450d020b20ec0120046a20056a20ea013a0000200620f2016a21062008200520ef016a2205470d000b200420056a210b200a0db0010cb1010b20eb014101102a000b410e21040cd8010b410e21040cd7010b410e21040cd6010b410e21040cd5010b410e21040cd4010b410e21040cd3010b410e21040cd2010b410e21040cd1010b410521040cd0010b410421040ccf010b410321040cce010b410221040ccd010b410221040ccc010b410021040ccb010b41252145410e21040cca010b410e2145410e21040cc9010b410d2145410e21040cc8010b410c2145410e21040cc7010b410c2145410e21040cc6010b410a2145410e21040cc5010b41082145410e21040cc4010b41052145410e21040cc3010b41032145410e21040cc2010b41022145410e21040cc1010b41012145410e21040cc0010b20ac014101102a000b20ab014101102a000b20ab014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20db014101102a000b20eb014101102a000b200b4101102a000b200b4101102a000b20054101102a000b205f4101102a000b200b4101102a000b200e4101102a000b200b4101102a000b200b4101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b205f4101102a000b20064101102a000b20074101102a000b20064101102a000b20074101102a000b205f4101102a000b20eb014101102a000b20db014101102a000b20db014101102a000b20ac014101102a000b20ac014101102a000b20cf014101102a000b20a504220420a4046a21a504024020042802042206450d00200428020821070240200420a6046a2802002204450d00200420a6046c210b200621040340024020042802002205450d00200420a8046a280200450d00200510230b200420a6046a2104200b20a7046a220b0d000b0b2007450d00200610230b20a504209403460d1a41272145410e21040c9a010b209c042206209e046a219c04024020062802042204450d0002402006209b046a280200220b450d00200b209b046c210b0340024020042802002205450d00200420a0046a280200450d00200510230b2004209b046a2104200b20a1046a220b0d000b0b2006209f046a280200450d00200620a0046a28020010230b209c04209d04460d4e41262145410e21040c99010b20a102280200220b450d3520a1022094046a280200210420a1022095046a280200210620a10228020c2105024020a102280204450d00200b10230b02402004450d00200420960474210b200521040340024020042d0000209704470d0020042098046a28020020990471450d0020042096046a28020010230b20042095046a2104200b209a046a220b0d000b0b20a1022093046a21a10202402006450d00200510230b20a102209a02460d3541242145410e21040c98010b2095032204208f046a219503024020042802042206450d0020042802082107024020042090046a2802002204450d0020042090046c210b200621040340024020042802002205450d0020042092046a280200450d00200510230b20042090046a2104200b2091046a220b0d000b0b2007450d00200610230b0240209503209403470d00410d21040c98010b41232145410e21040c97010b2089042206208b046a218904024020062802042204450d00024020062088046a280200220b450d00200b2088046c210b0340024020042802002205450d002004208d046a280200450d00200510230b20042088046a2104200b208e046a220b0d000b0b2006208c046a280200450d002006208d046a28020010230b208904208a04460d8d0141222145410e21040c96010b024020800420fd036a280200220b450d002080042802042104200b20ff0374210b0340024020042d0000208504470d0020042082046a28020020860471450d00200420ff036a28020010230b20042084046a2104200b2087046a220b0d000b0b02402080042082046a280200450d0020800420ff036a28020010230b20800420fe036a210402402080042083046a280200450d0020800428021010230b20042180042004208104460d4641202145410e21040c95010b024020f603280208220b450d0020f6032802002104200b20f50374210b0340024020042d000020f903470d00200420fa036a28020020fb0371450d00200420f5036a28020010230b200420f8036a2104200b20fc036a220b0d000b0b20f60320f8036a2104024020f60320f5036a280200450d0020f60328020010230b200421f603200420f703460d43411f2145410e21040c94010b024020ed0320ea036a280200220b450d0020ed032802042104200b20ec0374210b0340024020042d000020f203470d00200420ef036a28020020f30371450d00200420ec036a28020010230b200420f1036a2104200b20f4036a220b0d000b0b024020ed0320ef036a280200450d0020ed0320ec036a28020010230b20ed0320eb036a2104024020ed0320f0036a280200450d0020ed0328021010230b200421ed03200420ee03460d3c411e2145410e21040c93010b024020e20320e1036a280200450d0020e20328020010230b024020e20320e4036a280200220b450d0020e20328020c2104200b20e10374210b0340024020042d000020e603470d00200420e7036a28020020e80371450d00200420e1036a28020010230b200420e5036a2104200b20e9036a220b0d000b0b20e20320e0036a2104024020e20320e5036a280200450d0020e20320df036a28020010230b200421e203200420e303460d36411d2145410e21040c92010b20041026220b450d010b2005200b360200200541046a2004360200200541086a28020021040c290b20044101102a000b208c012802042205450d01208c0120d7036a2802002106208c0120d9036a2802002107208c0128021021080240208c0120d8036a2802002204450d00200420da0374210b200521040340024020042d000020dc03470d00200420d9036a28020020dd0371450d00200420da036a28020010230b200420db036a2104200b20de036a220b0d000b0b02402007450d00200510230b208c0120d6036a218c0102402006450d00200810230b208c01208501460d01410b2145410e21040c8e010b200341146a28020021d003200341106a28020021d103200328020c21d20320032d000b21d30320032d000a21d40320032d000921d5030240209b01450d00209c0110230b208c01208501460d00411c21d603411421d703410c21d803410821d903410421da03411021db03410921dc0341ffffffff0321dd03417021de03410b21450c020b0240201c450d00201d10230b0240200341d0006a41086a280200450d00200328025410230b200020d5033a00012000209e013a00002000410c6a20d003360000200041086a20d103360000200041046a20d203360000200041036a20d3033a0000200041026a20d4033a000041002105410121e8014101210c0b410121060c290b410e21040c8a010b20462802042205450d01204620c8036a2802002106204620ca036a2802002107204628021021080240204620c9036a2802002204450d00200420cb0374210b200521040340024020042d000020cd03470d00200420ca036a28020020ce0371450d00200420cb036a28020010230b200420cc036a2104200b20cf036a220b0d000b0b02402007450d00200510230b204620c7036a214602402006450d00200810230b2046203e460d0141042145410e21040c89010b200341146a28020021c103200341106a28020021c203200328020c21c30320032d000b21c40320032d000a21c50320032d000921c6030240200a450d00204510230b2046203e460d00411c21c703411421c803410c21c903410821ca03410421cb03411021cc03410921cd0341ffffffff0321ce03417021cf03410421450c010b02402010450d00201110230b0240200341d0006a41086a280200450d00200328025410230b200020c6033a0001200020533a00002000410c6a20c103360000200041086a20c203360000200041046a20c303360000200041036a20c4033a0000200041026a20c5033a000041002107410121e8014101210c41012105410121060c260b410e21040c86010b20bb0320bc036a2d000020bd03460d4e20bb03280204210620bb032802002105024020bb032802082204450d00200420b80374210b200521040340024020042d000020be03470d00200420bf036a28020020c00371450d00200420b8036a28020010230b200420ba036a2104200b20b9036a220b0d000b0b20bb0320ba036a21bb0302402006450d00200510230b20bb03208d02460d4e41142145410e21040c85010b0240024020940220ab036a2d000020ac03460d002094022802042106209402280200210502402094022802082204450d00200420ad0374210b200521040340024020042d000020ae03470d00200420af036a28020020b00371450d00200420ad036a28020010230b200420aa036a2104200b20b1036a220b0d000b0b20940220aa036a21940202402006450d00200510230b0240209402208d02470d00410921040c87010b411321450c010b410921040c85010b410e21040c84010b2016450d00201710230b0b0240024002402079411a470d002003411c6a2078360200200341086a41106a20773602002003207636021420034284808080c00037020c2003206f360208200341d0006a200341086a2002109c01200320032900513703402003200341d0006a41086a29000037004720032d00502204411a470d0141002106410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b4101210a0c660b20a50341ff017141107420a60341ff01714108747220a70341ff017172210402402077450d00207610230b200041086a20a803370200200041046a20a90336020020002004410874207972360200206f10230c010b20002003290340370001200020043a0000200041086a20032900473700000b4100210b410121e8014101210c41012105410121064101210720012d00002204410e4b0d220c210b20a4032105024003402005209a036a28020022080d0120a2032098036a21a20320940320052099036a2205470d000c080b0b20052099036a21a40320a2032098036a210a20a303209b036a21a3032005209c036a290200212e20052802002109200341c0006a209c036a227928020021042003280244210b034002400240024002402004200b470d00200b2098036a2206200b490d8701200b209803742207200620062007491b2207209703480d8701200b450d012003280240200b2007102722060d020c060b200328024021060c020b200710262206450d040b20032007360244200320063602402007210b0b207920042098036a2207360200200620046a20a203209f037220a203209e037120a203209d037622061b3a000020072104200621a20320060d000b200341086a209c036a202e3703002003200836020c20032009360208200341d0006a200341086a200341c0006a109b01024020032d0050227920a003470d00024020a303450d00200a21a2032096032005470d040b200541106a229503209403470d060c050b20a10335020021a204200341d0006a209c036a35020021a304200328025421a90320032d005321a50320032d005221a60320032d005121a70320940341706a2005460d00411021a404200541106a21a504410c21a604417421a704410421a804412721450c080b02402016450d00201710230b20a20442208621a80302402003280244450d00200328024010230b20a80320a3048421a8030c020b20074101102a000b410621450c040b410b21040c7c0b410d21040c7b0b410c21040c7a0b410d21040c790b410e21040c780b410e21040c770b20880222052084036a2188020240024002400240024020052802002206208503460d0020052085036a28020021042005280204210b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020062087036a22062088034b0d0020052086036a2802002108024002400240024020060e0700050203010607000b202b2031470d0b202b2089036a2231202b490dd201202b208903742205203120312005491b2206208a03480dd201202b450d1b2032202b2006102722320d1c0c490b202b2031470d06202b2089036a2231202b490dd101202b208903742205203120312005491b2206208a03480dd101202b450d0e2032202b2006102722320d0f0c450b202b2031470d06202b2089036a2231202b490dd001202b208903742205203120312005491b2206208a03480dd001202b450d102032202b2006102722320d110c450b202b2031470d06202b2089036a2231202b490dcf01202b208903742205203120312005491b2206208a03480dcf01202b450d122032202b2006102722320d130c450b202b2031470d06202b2089036a2231202b490dce01202b208903742205203120312005491b2206208a03480dce01202b450d142032202b2006102722320d150c410b202b2031470d07202b2089036a2231202b490dcd01202b208903742205203120312005491b2206208a03480dcd01202b450d192032202b2006102722320d1a0c450b202b2031470d07202b2089036a2231202b490dcc01202b208903742205203120312005491b2206208a03480dcc01202b450d1b2032202b2006102722320d1c0c450b202b2031470d07202b2089036a2231202b490dcb01202b208903742205203120312005491b2206208a03480dcb01202b450d1d2032202b2006102722320d1e0c450b202b21060c090b202b21060c0b0b202b21060c0d0b202b21060c0f0b202b21060c110b202b21060c130b202b21060c150b202b21060c170b200610262232450d360b202b21310b203220316a2093033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dc5012006208903742205203120312005491b2205208a03480dc5012006450d01203220062005102722320d020c270b200621050c020b200510262232450d250b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dc501200520890374220b20312031200b491b220b208a03480dc5012005450d0120322005200b102722320d020c280b2005210b0c020b200b10262232450d260b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc801200b208903742205203120312005491b2205208a03480dc801200b450d012032200b2005102722320d020c380b200b21050c020b200510262232450d360b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dc1012005208903742204203120312004491b222b208a03480dc1012005450d1720322005202b102722320d180c3c0b2005212b0c180b200610262232450d340b202b21310b203220316a208f033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dc2012006208903742205203120312005491b2205208a03480dc2012006450d01203220062005102722320d020c260b200621050c020b200510262232450d240b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dc201200520890374220b20312031200b491b220b208a03480dc2012005450d0120322005200b102722320d020c270b2005210b0c020b200b10262232450d250b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc501200b208903742205203120312005491b2205208a03480dc501200b450d012032200b2005102722320d020c360b200b21050c020b200510262232450d340b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dbe012005208903742204203120312004491b222b208a03480dbe012005450d1720322005202b102722320d180c3a0b2005212b0c180b200610262232450d320b202b21310b203220316a2092033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dbf012006208903742205203120312005491b2205208a03480dbf012006450d01203220062005102722320d020c250b200621050c020b200510262232450d230b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dbf01200520890374220b20312031200b491b220b208a03480dbf012005450d0120322005200b102722320d020c260b2005210b0c020b200b10262232450d240b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc201200b208903742205203120312005491b2205208a03480dc201200b450d012032200b2005102722320d020c340b200b21050c020b200510262232450d320b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dbb012005208903742204203120312004491b222b208a03480dbb012005450d1720322005202b102722320d180c380b2005212b0c180b200610262232450d2c0b202b21310b203220316a208a033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dbc012006208903742205203120312005491b2205208a03480dbc012006450d01203220062005102722320d020c1c0b200621050c020b200510262232450d1a0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dbc01200520890374220b20312031200b491b222b208a03480dbc012005450d0120322005202b102722320d020c1d0b2005212b0c020b202b10262232450d1b0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c0d0b0b200610262232450d2d0b202b21310b203220316a2089033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db9012006208903742205203120312005491b2205208a03480db9012006450d01203220062005102722320d020c210b200621050c020b200510262232450d1f0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db901200520890374220b20312031200b491b222b208a03480db9012005450d0120322005202b102722320d020c220b2005212b0c020b202b10262232450d200b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c0a0b0b200610262232450d2b0b202b21310b203220316a208e033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db6012006208903742205203120312005491b2205208a03480db6012006450d01203220062005102722320d020c200b200621050c020b200510262232450d1e0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db601200520890374220b20312031200b491b222b208a03480db6012005450d0120322005202b102722320d020c210b2005212b0c020b202b10262232450d1f0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c070b0b200610262232450d290b202b21310b203220316a2088033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db3012006208903742205203120312005491b2205208a03480db3012006450d01203220062005102722320d020c1f0b200621050c020b200510262232450d1d0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db301200520890374220b20312031200b491b222b208a03480db3012005450d0120322005202b102722320d020c200b2005212b0c020b202b10262232450d1e0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c040b0b200610262232450d270b202b21310b203220316a208b033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db0012006208903742205203120312005491b2205208a03480db0012006450d01203220062005102722320d020c1e0b200621050c020b200510262232450d1c0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db001200520890374220b20312031200b491b222b208a03480db0012005450d0120322005202b102722320d020c1f0b2005212b0c020b202b10262232450d1d0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000b0b2088022030470d280c090b202b10262232450d240b200521310b203220316a20093a000020312089036a21312088022030470d260c060b202b10262232450d220b200521310b203220316a20093a000020312089036a21312088022030470d250c030b202b10262232450d200b200521310b203220316a20093a000020312089036a21312088022030470d210b20302188020c220b20054101102a000b202b4101102a000b20054101102a000b200b4101102a000b20054101102a000b200b4101102a000b20054101102a000b200b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b20054101102a000b20054101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b202b4101102a000b202b4101102a000b202b4101102a000b412121450c050b412121450c050b412121450c050b412121450c050b410821040c7b0b410821040c7a0b410e21040c790b410e21040c780b410e21040c770b410e21040c760b024020fc0220f9026a280200220b450d0020fc022802042104200b20fb0274210b0340024020042d0000208103470d00200420fe026a28020020820371450d00200420fb026a28020010230b20042080036a2104200b2083036a220b0d000b0b024020fc0220fe026a280200450d0020fc0220fb026a28020010230b20fc0220fa026a2104024020fc0220ff026a280200450d0020fc0228021010230b200421fc02200420fd02460d66411c2145410e21040c750b024020f202280208220b450d0020f2022802002104200b20f10274210b0340024020042d000020f502470d00200420f6026a28020020f70271450d00200420f1026a28020010230b200420f4026a2104200b20f8026a220b0d000b0b20f20220f4026a2104024020f20220f1026a280200450d0020f20228020010230b200421f202200420f302460d63411b2145410e21040c740b024020e90220e6026a280200220b450d0020e9022802042104200b20e80274210b0340024020042d000020ee02470d00200420eb026a28020020ef0271450d00200420e8026a28020010230b200420ed026a2104200b20f0026a220b0d000b0b024020e90220eb026a280200450d0020e90220e8026a28020010230b20e90220e7026a2104024020e90220ec026a280200450d0020e90228021010230b200421e902200420ea02460d5c411a2145410e21040c730b024020de0220dd026a280200450d0020de0228020010230b024020de0220e0026a280200220b450d0020de0228020c2104200b20dd0274210b0340024020042d000020e202470d00200420e3026a28020020e40271450d00200420dd026a28020010230b200420e1026a2104200b20e5026a220b0d000b0b20de0220dc026a2104024020de0220e1026a280200450d0020de0220db026a28020010230b200421de02200420df02460d5641192145410e21040c720b02402022450d00202310230b200241086a2105200241046a210720da01210b024003400240024002400240200728020020052802002204470d00200441016a22062004490d782004410174220d20062006200d491b220d4100480d782004450d0120022802002004200d102722060d020c050b200228020021060c020b200d10262206450d030b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200241046a280200220b200241086a28020022046b20da014f0d00200420da016a22052004490d78200b4101742204200520052004491b22044100480d78200b450d012002280200200b20041027220b450d040c020b2002280200210b0c020b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420da016a360200200b20046a20dc0120da011094041a4100210541012139024020db01450d0020dc0110230b4101210e4101210d410121c401410121cc014101210741012108410121450c080b20044101102a000b200d4101102a000b0240201e450d00201f10230b200241086a2105200241046a210720ab01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d762004410174220d20062006200d491b220d4100480d762004450d0120022802002004200d102722060d020c0c0b200228020021060c020b200d10262206450d0a0b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200241046a280200220b200241086a28020022046b20ab014f0d00200420ab016a22052004490d75200b4101742204200520052004491b22044100480d75200b450d012002280200200b20041027220b450d0a0c020b2002280200210b0c020b20041026220b450d080b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ab016a360200200b20046a20ad0120ab011094041a410021c40141012139024020ac01450d0020ad0110230b4101210e4101210d0b410121cc010b410121070b410121080b410121450b410121050b410121090c490b20044101102a000b200d4101102a000b2005280200210b0b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b4100210a410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b0c470b20a102280200220b450d2520a10220d4026a280200210420a10220d5026a280200210620a10228020c2105024020a102280204450d00200b10230b02402004450d00200420d60274210b200521040340024020042d000020d702470d00200420d8026a28020020d90271450d00200420d6026a28020010230b200420d5026a2104200b20da026a220b0d000b0b20a10220d3026a21a10202402006450d00200510230b20a102209a02460d2541182145410e21040c650b20c00220a4026a21a10220c00228020022c102450d2320c00220a5026a28020021c20220c00220a6026a28020021c30220c00228020c21c40220c002290204212e410021c50220a8024100360200200320a90237024420c102202e20aa0288a722c60220ab02746a21c7022003200341206a360240202ea721c802410021c902024041004100460d00410121040c010b410221040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000102040607070b20a001280200210b03400240024002400240209d012802002094012802002204470d0020042095016a22052004490d84012004209501742206200520052006491b2206209601480d84012004450d01200328025420042006102722050d020c0d0b200328025421050c020b200610262205450d0b0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b20a0012099016a22a001209f01470d130c5a0b200328024421040c010b20c50220a2026a220420c502490d7d20c50220a20274220b20042004200b491b220b20af02480d7d0240024020c502450d00200328024420c502200b102722040d010c0a0b200b10262204450d090b20b102200b3602002003200436024420a80228020021c9020b20a80220c90220a2026a360200200420c9026a20c60220ae027220c60220ad027120c60220ac027622041b3a000002402004450d00200421c60220b10228020022c50220a80228020022c902470d12410221040c170b20c70220c102460d0120c10221ca02410321040c160b20ca0220b0026a21cb0220ca02290200222e20aa0288a7220420bc027120b202460d13200420a4027420a402752107202ea7210b0340024002400240024020b10228020020a8022802002204470d00200420a2026a22052004490d8001200420a202742206200520052006491b220620af02480d80012004450d01200328024420042006102722050d020c0a0b200328024421050c020b200610262205450d080b20b10220063602002003200536024420a80228020021040b20a802200420a2026a360200200520046a200b20ae0272200b20ad0271200b20ac027622041b3a00002004210b20040d000b024002400240024020b10228020020a8022802002204470d00200420a2026a220b2004490d7f200420a202742205200b200b2005491b220520af02480d7f2004450d012003280244200420051027220b0d020c0c0b2003280244210b0c020b20051026220b450d0a0b20b10220053602002003200b36024420a80228020021040b20a802200420a2026a360200200b20046a200720bd0273220420be027120bf02722004200720bd024a1b3a000020cb0221ca0220cb0220c702470d1120c70220c70222cb02470d140c030b20c10221cb02410421040c140b20c70220cb02460d01410521040c130b20cb022d0004210420cb0220b0026a21cb02200420b202470d0f0b024020c802450d0020c10210230b20c40220c20220b2027422046a210602400240024002400240024002400240024020c202450d0020c40220a4026a210b200420b6026a210720c4022104034020042d0000210520b802200420ab026a2d00003a00002003200420a2026a2f00003b0108200520b502460d02200341306a20b7026a220820b8022d00003a0000200320032f01083b0130200420b2026a290200212e200341086a20a7026a200420a7026a28020036020020a30220032f01303b000020a30220b7026a20082d00003a0000200320053a00082003202e37020c200341d0006a200341086a200341c0006a109e0120032d005022cc0220b902462205450d05200b20a6026a210b200720b6026a2107200420a6026a22042006470d000c040b0b20c40222042006460d020c010b200420a6026a22042006460d010b03400240024020042d0000220b20b302460d00200b20b502470d010c030b200420b0026a28020020b40271450d00200420b2026a28020010230b200420a6026a22042006470d000b0b024020c302450d0020c40210230b20b102280200210a200328024421092003280240210520a80228020022c002210b03400240024002400240200520b0026a2208280200200520a7026a22062802002204470d00200420a2026a22072004490d8101200420a202742245200720072045491b224520af02480d81012004450d01200520b2026a28020020042045102722070d020c0d0b200520b2026a28020021070c020b204510262207450d0b0b20082045360200200520b2026a2007360200200628020021040b2006200420a2026a360200200720046a200b20ae0272200b20ad0271200b20ac027622041b3a00002004210b20040d000b02402008280200220b200628020022046b20c0024f0d00200420c0026a22072004490d7d200b20a202742204200720072004491b220420af02480d7d200b450d02200520b2026a280200200b20041027220b0d030c0b0b200520b2026a280200210b0c030b200341d0006a20a7026a28020021cd02200341d0006a20b0026a28020021ce02200328025421cf0220032d005321d00220032d005221d10220032d005121d20202402007450d00034002400240200b20ba026a22042d0000220720b302460d00200720b502470d010c030b200b28020020b40271450d00200b20bb026a28020010230b200b20a6026a210b200420a6026a2006470d000b0b024020c302450d0020c40210230b024020b102280200450d00200328024410230b2005450d0320a10221c00220a102209a02470d0b0c390b20041026220b450d080b20082004360200200520b2026a200b360200200628020021040b2006200420c0026a360200200b20046a200920c0021094041a0240200a450d00200910230b20a10221c00220a102209a02470d070c360b20a102209a02460d1241182193044114219404411021950441042196044109219704410821980441ffffffff032199044170219a04412421450c0a0b20064101102a000b20064101102a000b200b4101102a000b20454101102a000b20054101102a000b20044101102a000b411721450c010b411721450c010b410e21040c6c0b410e21040c6b0b410e21040c6a0b410021040c050b410121040c040b410321040c030b410421040c020b410421040c010b410521040c000b0b02402037450d00203810230b0240200341206a41086a280200450d00200328022410230b200020d2023a0001200020cc023a00002000410c6a20cd02360000200041086a20ce02360000200041046a20cf02360000200041036a20d0023a0000200041026a20d1023a000041002106410121e8014101210c410121050b410121070b4101210b20012d00002204410e4b0d010b024020040e0f000c0b0a05070d0e12011003080602000b200141086a280200450d63200141046a2802001023200341e0006a24000f0b2001109f01200341e0006a24000f0b0240200141086a280200450d00200141046a28020010230b0240200141146a2802002202450d00200141186a280200450d00200210230b200141246a280200450d61200141206a2802001023200341e0006a24000f0b2006450d60410c21df032001410c6a2802002204450d00411821e003410421e103200141046a28020022e203200441186c6a21e303411421e403411021e503410921e603410821e70341ffffffff0321e803417021e903411d21450c130b200141086a280200450d5f200141046a2802001023200341e0006a24000f0b200141086a280200450d5e200141046a2802001023200341e0006a24000f0b200b450d5d200141046a2d000022044102460d0d20044101460d0c20040d0f2001410c6a280200450d5d200141086a2802001023200341e0006a24000f0b200141086a280200450d5c200141046a2802001023200341e0006a24000f0b2007450d5b410c21ea032001410c6a2802002204450d00411c21eb03410421ec03200141046a28020022ed032004411c6c6a21ee03410821ef03411421f003411021f103410921f20341ffffffff0321f303417021f403411e21450c0f0b200141086a280200450d5a200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a2802002102203141286c213103400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241286a2102203141586a22310d000b0b200141086a280200450d59200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a28020021022031410474213103400240200241046a280200450d00200228020010230b200241106a2102203141706a22310d000b0b200141086a280200450d58200141046a2802001023200341e0006a24000f0b20e801450d570240200141086a280200450d00200141046a28020010230b200141146a280200450d57200141106a2802001023200341e0006a24000f0b200141086a280200450d56200141046a2802001023200341e0006a24000f0b200c450d552001410c6a2802002204450d00410421f503200141046a28020022f60320044104746a21f703411021f803410921f903410821fa0341ffffffff0321fb03417021fc03411f21450c0a0b200141086a280200450d54200141046a2802001023200341e0006a24000f0b2005450d53410c21fd032001410c6a2802002204450d00411c21fe03410421ff03200141046a2802002280042004411c6c6a218104410821820441142183044110218404410921850441ffffffff032186044170218704412021450c090b200141086a280200450d52200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a2802002102203141146c213103400240200241046a280200450d00200228020010230b200241146a21022031416c6a22310d000b0b200141086a280200450d51200141046a2802001023200341e0006a24000f0b0240200141146a2802002231450d002001410c6a28020021022031410c6c21310340024020022802002204450d00200241046a280200450d00200410230b2002410c6a2102203141746a22310d000b0b200141106a280200450d502001410c6a2802001023200341e0006a24000f0b200141146a2802002204450d00410c219b042001410c6a280200229c0420044104746a219d044110219e044108219f04410421a004417421a104412621450c060b200141106a280200450d4e2001410c6a2802001023200341e0006a24000f0b2001410c6a280200450d4d200141086a2802001023200341e0006a24000f0b410e21040c480b410e21040c470b410e21040c460b410e21040c450b410e21040c440b209e022096026a2204209e02490d45209e0220960274220b20042004200b491b220b209802480d45024002400240209e02450d002003280224209e02200b102722040d010c020b200b10262204450d010b200341206a2097026a200b36020020032004360224209902280200219f020c020b200b4101102a000b200328022421040b209902209f022096026a3602002004209f026a20a002209d027220a002209c027120a002209b027622041b3a000002402004450d00200421a002200341206a2097026a280200229e02209902280200229f02470d03411521450c040b203821a1022036450d00410121a202200341086a41017221a302411821a402411421a502411021a602410c21a702200341c0006a410c6a21a802420121a902422021aa02410321ab02410721ac0241ff0021ad0241807f21ae02410021af02410821b002200341c0006a41086a21b102410421b202410921b30241ffffffff0321b40241ac0121b502417021b602410221b702200341086a41026a21b802411a21b902417821ba02417c21bb0241ff0121bc02417f21bd02413f21be0241c00021bf02203821c002411721450c050b20a102209a02460d00411821d302411421d402411021d502410421d602410921d702410821d80241ffffffff0321d902417021da02411821450c050b02402037450d00203810230b200341206a41086a2802002145200328022421082003280220220541046a210d2003412c6a2802002239210b024003400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490d472004410174220e20072007200e491b220e4100480d472004450d0120052802002004200e102722070d020c050b200528020021070c020b200e10262207450d030b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490d47200b4101742204200620062004491b22044100480d47200b450d012005280200200b20041027220b450d040c020b2005280200210b0c020b20041026220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b4100210b410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121090c210b20044101102a000b200e4101102a000b411621450c010b410e21040c3d0b410e21040c3c0b410e21040c3b0b410e21040c3a0b2091022089026a2204209102490d3a20910220890274220b20042004200b491b220b208b02480d3a024002400240209102450d002003280254209102200b102722040d010c020b200b10262204450d010b200341d0006a208a026a200b36020020032004360254208c022802002192020c020b200b4101102a000b200328025421040b208c022092022089026a36020020042092026a20930220900272209302208f0271209302208e027622041b3a000002402004450d002004219302200341d0006a208a026a280200229102208c02280200229202470d04411121450c070b2035219402024002402033450d004100210602400340200341086a41086a2209203520066a220b41086a2802003602002003200b290200370308200b410d6a2d0000220a4102460d01200341306a41086a2204200928020036020020032003290308370330200b410c6a2d0000219502200341206a41086a22cc012004280200360200200320032903303703200240024002400240200341d0006a41086a2207280200200341d0006a410c6a22052802002204470d00200441016a22082004490d40200441017422c4012008200820c401491b22c4014100480d402004450d012003280254200420c401102722080d020c090b200328025421080c020b20c40110262208450d070b200720c40136020020032008360254200528020021040b2005200441016a360200200820046a41fdf9ff7720950241037441187141107376413f7141c000723a00000240024002400240200728020020052802002204470d00200441016a22082004490d40200441017422950220082008209502491b2295024100480d402004450d0120032802542004209502102722080d020c0a0b200328025421080c020b20950210262208450d080b200720950236020020032008360254200528020021040b2005200441016a360200200820046a200a4100473a0000200341c0006a41086a20cc0128020036020020032003290320370340200341086a200341c0006a200341d0006a109d0120032d0008229502411a470d03200641106a2106200b41106a208d02470d000c090b0b200b41106a2194020b209402208d02460d05411021aa03410d21ab03410221ac03410421ad03410921ae03410821af0341ffffffff0321b003417021b103411321450c090b200341086a410c6a28020021b203200928020021b303200328020c21b40320032d000b21b50320032d000a21b60320032d000921b703410421b803417021b903203341047441706a2006460d00411021ba03200b41106a21bb03410d21bc03410221bd03410921be03410821bf0341ffffffff0321c003411421450c090b02402034450d00203510230b0240200341d0006a41086a280200450d00200328025410230b200020b7033a000120002095023a00002000410c6a20b203360000200041086a20b303360000200041046a20b403360000200041036a20b5033a0000200041026a20b6033a00004100210c410121e801410a21040c360b20c4014101102a000b2095024101102a000b411221450c030b410921040c320b410921040c310b410e21040c300b410e21040c2f0b410e21040c2e0b410e21040c2d0b20860220fd016a218702024002400240208602280204220920fe01460d002086022080026a2802002107208602280200210b0240024002400240024020fb0120fa01470d0020fa0120ff016a220420fa01490d3520fa0120ff01742205200420042005491b22fb01208102480d35024020fa01450d0020fc0120fa0120fb01102722fc010d010c020b20fb01102622fc01450d010b20fc0120fa016a200920ff01463a000020fa0120ff016a210420fa0120ff017422052082026a2108200520fe016a21fa01024002400340200821050240200420fb01470d00200420ff016a22062004490d3820fa012006200620fa01491b22fb01208102480d3802402004450d0020fc01200420fb01102722fc010d010c030b20fb01102622fc01450d020b20fc0120046a200b20850272200b20840271200b2083027622061b3a0000200520fe016a210820fa0120fe016a21fa01200420ff016a21042006210b20060d000b02400240200920ff01470d00200421fa010340024020fa0120fb01470d0020fa0120ff016a220420fa01490d3a2005200420042005491b22fb01208102480d3a024020fa01450d0020fc0120fa0120fb01102722fc010d010c060b20fb01102622fc01450d050b20fc0120fa016a20072085027220072084027120072083027622041b3a0000200520fe016a210520fa0120ff016a21fa012004210720040d000b20870221860220870220f901470d050c010b200421fa0120870221860220870220f901470d050b20f9012187020c050b20fb014101102a000b20fb014101102a000b20fb014101102a000b411021450c030b411021450c030b410721040c2f0b410721040c2e0b410e21040c2d0b410e21040c2c0b2004210b0b200a450d010b20f70110230b024002400240024002400240200920f101470d0020eb01200b470d02200b20ef016a2204200b490d2f200b20ef01742205200420042005491b22eb0120f001480d2f200b450d0120ec01200b20eb01102722ec010d020c070b024020eb01200b470d00200b20ef016a2204200b490d2f200b20ef01742205200420042005491b220420f001480d2f200b450d0320ec01200b2004102722ec010d040c080b20eb0121040c030b20eb01102622ec01450d050b20ec01200b6a20f0013a00000c020b2004102622ec01450d040b20ec01200b6a20ef013a000002400240024002402004200b20ef016a220b470d00200420ef016a220b2004490d2e200420ef01742205200b200b2005491b22eb0120f001480d2e2004450d0120ec01200420eb01102722ec010d020c080b200421eb010c020b20eb01102622ec01450d060b2004210b0b20ec01200b6a200920f3017120f401733a00000b200b20ef016a21ea0120f80121f70120f80120e901470d040b02402024450d00202510230b200241086a2105200241046a210720ea01210b024003400240024002400240200728020020052802002204470d00200441016a22062004490d2e2004410174220d20062006200d491b220d4100480d2e2004450d0120022802002004200d102722060d020c050b200228020021060c020b200d10262206450d030b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200241046a280200220b200241086a28020022046b20ea014f0d00200420ea016a22052004490d2e200b4101742204200520052004491b22044100480d2e200b450d012002280200200b20041027220b450d040c020b2002280200210b0c020b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ea016a360200200b20046a20ec0120ea011094041a4100210d41012139024020eb01450d0020ec0110230b4101210e410621040c290b20044101102a000b200d4101102a000b20eb014101102a000b20044101102a000b20eb014101102a000b410f2145410e21040c230b0240209b01450d00209c0110230b208c01219a01208c01208501470d1c0b0240201c450d00201d10230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490d282004410174220e20072007200e491b220e4100480d282004450d0120052802002004200e102722070d020c1f0b200528020021070c020b200e10262207450d1d0b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490d27200b4101742204200620062004491b22044100480d27200b450d012005280200200b20041027220b450d190c020b2005280200210b0c020b20041026220b450d170b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b41002109410121394101210e4101210d410121c401410121cc01410121074101210841012145410121050b4101210b0b4101210a0b410121060b410121c9010b2000411a3a000020012d00002204410e4b0d0f02400240024020040e0f000b0a0904060c0d11120f02070501000b200e450d22200141086a280200450d22200141046a2802001023200341e0006a24000f0b20c901450d210240200141086a280200450d00200141046a28020010230b0240200141146a2802002202450d00200141186a280200450d00200210230b200141246a280200450d21200141206a2802001023200341e0006a24000f0b200b450d20410c21db022001410c6a2802002204450d00411821dc02410421dd02200141046a28020022de02200441186c6a21df02411421e002411021e102410921e202410821e30241ffffffff0321e402417021e502411921450c170b200141086a280200450d1f200141046a2802001023200341e0006a24000f0b20cc01450d1e200141086a280200450d1e200141046a2802001023200341e0006a24000f0b2006450d1d200141046a2d000022044102460d0f20044101460d0e20040d112001410c6a280200450d1d200141086a2802001023200341e0006a24000f0b2007450d1c200141086a280200450d1c200141046a2802001023200341e0006a24000f0b200a450d1b410c21e6022001410c6a2802002204450d00411c21e702410421e802200141046a28020022e9022004411c6c6a21ea02410821eb02411421ec02411021ed02410921ee0241ffffffff0321ef02417021f002411a21450c130b200141086a280200450d1a200141046a2802001023200341e0006a24000f0b20c401450d1902402001410c6a2802002231450d00200141046a2802002102203141286c213103400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241286a2102203141586a22310d000b0b200141086a280200450d19200141046a2802001023200341e0006a24000f0b200d450d1802402001410c6a2802002231450d00200141046a28020021022031410474213103400240200241046a280200450d00200228020010230b200241106a2102203141706a22310d000b0b200141086a280200450d18200141046a2802001023200341e0006a24000f0b2039450d170240200141086a280200450d00200141046a28020010230b200141146a280200450d17200141106a2802001023200341e0006a24000f0b2008450d16200141086a280200450d16200141046a2802001023200341e0006a24000f0b2045450d152001410c6a2802002204450d00410421f102200141046a28020022f20220044104746a21f302411021f402410921f502410821f60241ffffffff0321f702417021f802411b21450c0e0b200141086a280200450d14200141046a2802001023200341e0006a24000f0b2009450d13410c21f9022001410c6a2802002204450d00411c21fa02410421fb02200141046a28020022fc022004411c6c6a21fd02410821fe02411421ff024110218003410921810341ffffffff032182034170218303411c21450c0d0b200141086a280200450d12200141046a2802001023200341e0006a24000f0b2005450d1102402001410c6a2802002231450d00200141046a2802002102203141146c213103400240200241046a280200450d00200228020010230b200241146a21022031416c6a22310d000b0b200141086a280200450d11200141046a2802001023200341e0006a24000f0b2001109f010c100b20044101102a000b0240200141146a2802002231450d002001410c6a28020021022031410c6c21310340024020022802002204450d00200241046a280200450d00200410230b2002410c6a2102203141746a22310d000b0b200141106a280200450d0e2001410c6a2802001023200341e0006a24000f0b200141146a2802002204450d00410c2188042001410c6a28020022890420044104746a218a044110218b044108218c044104218d044174218e04412221450c080b200141106a280200450d0c2001410c6a2802001023200341e0006a24000f0b2001410c6a280200450d0b200141086a2802001023200341e0006a24000f0b200e4101102a000b41092145410e21040c050b410e21040c040b410e21040c030b410e21040c020b410e21040c010b410e21040c000b0b101e000b101e000b41014101102a000b200341e0006a24000bf807030e7f017e017f200241086a2103200241046a21042001280200220521060240024002400240024003400240024002400240200428020020032802002207470d00200741016a22082007490d0520074101742209200820082009491b22094100480d052007450d01200228020020072009102722080d020c060b200228020021080c020b200910262208450d040b2002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b2001280204220a2001410c6a2802002206410c6c6a210b200141086a280200210c200a2107024002402006450d00200a21072005450d00200b41746a210d200241086a210341002107200a210e0340200e2108024003402008280200220f0d01200741016a2107200b2008410c6a2208470d000c040b0b2008410c6a210e200741016a21102005417f6a2105200841046a290200211103400240024002400240200241046a220428020020032802002206470d00200641016a22092006490d0820064101742201200920092001491b22014100480d082006450d01200228020020062001102722090d020c0a0b200228020021090c020b200110262209450d080b2002200936020020042001360200200328020021060b2003200641016a360200200920066a200741807f72200741ff0071200741077622061b3a00002006210720060d000b2011422088a72212210603400240024002400240200428020020032802002207470d00200741016a22092007490d0820074101742201200920092001491b22014100480d082007450d01200228020020072001102722090d020c0b0b200228020021090c020b200110262209450d090b2002200936020020042001360200200328020021070b2003200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b024002400240024020042802002206200328020022076b20124f0d00200720126a22092007490d0720064101742207200920092007491b22074100480d072006450d01200228020020062007102722060d020c0b0b200228020021060c020b200710262206450d090b2002200636020020042007360200200328020021070b2003200720126a360200200620076a200f20121094041a02402011a7450d00200f10230b0240200d2008460d002010210720050d010b0b2008410c6a21070b2007200b460d000340024020072802002206450d00200741046a280200450d00200610230b2007410c6a2207200b470d000b0b0240200c450d00200a10230b2000411a3a00000f0b101e000b20094101102a000b20014101102a000b20014101102a000b20074101102a000bd806010a7f200128020421032001280200210441002105410121064100210720012802082208210902400240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d05024002402005450d0020062005200a102722060d010c040b200a10262206450d030b200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d032005410174220a20092009200a491b22094100480d03024002402005450d0020062005200910272206450d010c030b2009102622060d020b20094101102a000b200a4101102a000b200921050b200620076a200420081094041a02402003450d00200410230b200128020c210c02400240024002400240200520086b20076b200141146a28020022094f0d00200820076a220a20096a2203200a490d052005410174220a20032003200a491b220a4100480d052005450d0120062005200a10272206450d020c030b200820096a20076a21030c030b200a102622060d010b200a4101102a000b200a21050b200620086a20076a200c20091094041a200241086a210a200241046a210820032109034002400240024002402008280200200a2802002207470d00200741016a220b2007490d0520074101742204200b200b2004491b22044100480d052007450d012002280200200720041027220b0d020c060b2002280200210b0c020b20041026220b450d040b2002200b36020020082004360200200a28020021070b200a200741016a360200200b20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b024002400240200241046a2802002209200241086a28020022076b20034f0d00200720036a220a2007490d0320094101742207200a200a2007491b22074100480d032009450d0120022802002009200710272209450d020c050b200228020021090c050b2007102622090d030b20074101102a000b101e000b20044101102a000b20022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a200620031094041a02402005450d00200610230b2000411a3a00000240200141106a280200450d00200c10230b0bbd04020d7f017e230041c0006b22032400200128020022042001280208220541047422066a2107200128020421082004210102400240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d02400340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b013020012d0000220e41ac01460d012003410c6a41026a220f200b2d00003a0000200320032f01303b010c200141046a2902002110200341306a410c6a2001410c6a280200360200200920032f010c3b0000200941026a200f2d00003a00002003200e3a003020032010370234200341206a200341306a200210ae022003200c2900003703102003200d29000037001720032d0020220e411a470d042006200a41106a220a470d000c030b0b200141106a21010b20012007460d0003400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a22012007470d000b0b02402008450d00200410230b2000411a3a00000c010b200020032903103700012000200e3a0000200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d002001417c6a28020010230b200141106a2101200a41106a2007470d000b0b2008450d0020041023200341c0006a24000f0b200341c0006a24000bd3ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610272205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610272205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810272209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810272206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610272205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810272209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810272209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810272209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610272205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810272209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610272205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910272206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610272205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510272208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610272205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810272209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910272206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610272205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610272205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610272205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610272208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510272208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610272205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610272205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610272205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610272205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610272205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510272208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910272206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610272205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510272208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610272205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610272205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610272205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610272205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610272205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610272205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810272209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610272205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810272209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610272205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610272205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610272205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610272205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610272205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610272205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610272205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610272205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610272205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610272205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610272205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610272205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610272205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810272209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810272209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610272205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610272205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610272205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810272209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810272209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610272205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610272205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610272205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610272205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610272205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610272205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610272205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610272205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810272209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610272205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610272205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610272205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610272205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610272205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610272205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610272205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910272206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610272205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610272205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610272205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610272205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610272205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610272205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610272205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510272208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810272209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610272205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610272205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610272205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610272205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610272205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610272205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610272205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610272205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610272205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610272205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610272205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610272205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610272205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610272205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610272205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610272205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610272205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610272205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610272205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610272205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610272205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610272205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610272205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610272205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610272205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610272205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610272205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610272205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610272205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810272209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810272205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910272206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610272205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610272205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610272205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610272205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610272205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610272205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610272205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610272205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610272205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610272205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610272205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610272205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610272205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610272205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610272205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610272205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610272205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610272205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610272205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810272209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810272209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610272205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610272205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610272205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910272206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610272205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610272205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610272205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810272209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610272205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610272205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610272205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610272205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610272205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610272205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610272205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610272205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510272208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610272205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610272205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810272209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610272205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610272205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810272209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810272209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610272205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110272206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810272209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610272205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810272209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510272208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610272205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510272208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610272205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102622050db4050b20064101102a000b2008102622090dad050b20084101102a000b2008102622060da9050b20084101102a000b2006102622050da5050b20064101102a000b2008102622090da1050b20084101102a000b2008102622090d9a050b20084101102a000b2008102622090d96050b20084101102a000b2006102622050d92050b20064101102a000b2008102622090d8e050b20084101102a000b2006102622050d8a050b20064101102a000b2009102622060d86050b20094101102a000b2006102622050d82050b20064101102a000b2005102622080dfe040b20054101102a000b2006102622050dfa040b20064101102a000b2008102622090df6040b20084101102a000b2009102622060df2040b20094101102a000b2006102622050dee040b20064101102a000b2006102622050dea040b20064101102a000b2006102622050de6040b20064101102a000b2006102622080de2040b20064101102a000b2005102622080dde040b20054101102a000b2006102622050dda040b20064101102a000b2006102622050dd6040b20064101102a000b2006102622050dd2040b20064101102a000b2006102622050dce040b20064101102a000b2006102622050dca040b20064101102a000b2005102622080dc6040b20054101102a000b2009102622060dc2040b20094101102a000b2006102622050dbe040b20064101102a000b2005102622080dba040b20054101102a000b2006102622050db6040b20064101102a000b2006102622050db2040b20064101102a000b2006102622050dae040b20064101102a000b2006102622050daa040b20064101102a000b2006102622050da6040b20064101102a000b2006102622050da2040b20064101102a000b2006102622050dee040b20064101102a000b2008102622090d9c040b20084101102a000b2006102622050d98040b20064101102a000b2008102622090d94040b20084101102a000b2006102622050d90040b20064101102a000b2006102622050d8c040b20064101102a000b2006102622050d88040b20064101102a000b2006102622050d84040b20064101102a000b2006102622050d80040b20064101102a000b2006102622050dfc030b20064101102a000b2006102622050df8030b20064101102a000b2006102622050df4030b20064101102a000b2006102622050df0030b20064101102a000b2006102622050dec030b20064101102a000b2006102622050de8030b20064101102a000b2006102622050de4030b20064101102a000b2006102622050de0030b20064101102a000b2008102622090ddc030b20084101102a000b2008102622090dd8030b20084101102a000b2006102622050dd4030b20064101102a000b2006102622050dd0030b20064101102a000b2006102622050dcc030b20064101102a000b2008102622090dc8030b20084101102a000b2008102622090dc4030b20084101102a000b2006102622050dc0030b20064101102a000b2006102622050dbc030b20064101102a000b2006102622050db8030b20064101102a000b2006102622050db4030b20064101102a000b2006102622050db0030b20064101102a000b2006102622050dac030b20064101102a000b2006102622050da8030b20064101102a000b2006102622050da4030b20064101102a000b2008102622090da0030b20084101102a000b2006102622050d9c030b20064101102a000b2006102622050d98030b20064101102a000b2006102622050d94030b20064101102a000b2006102622050d90030b20064101102a000b2006102622050d8c030b20064101102a000b2006102622050d88030b20064101102a000b2006102622050d84030b20064101102a000b2009102622060d80030b20094101102a000b2006102622050dfc020b20064101102a000b2006102622050df8020b20064101102a000b2006102622050df4020b20064101102a000b2006102622050df0020b20064101102a000b2006102622050dec020b20064101102a000b2006102622050de8020b20064101102a000b2006102622050de4020b20064101102a000b2005102622080de0020b20054101102a000b2008102622090ddc020b20084101102a000b2006102622050dd8020b20064101102a000b2006102622050dd3020b20064101102a000b2006102622050dcf020b20064101102a000b2006102622050dcb020b20064101102a000b2006102622050dc7020b20064101102a000b2006102622050dc3020b20064101102a000b2006102622050dbf020b20064101102a000b2006102622050dbb020b20064101102a000b2006102622050db7020b20064101102a000b2006102622050db3020b20064101102a000b2006102622050daf020b20064101102a000b2006102622050dab020b20064101102a000b2006102622050da7020b20064101102a000b2006102622050da3020b20064101102a000b2006102622050d9f020b20064101102a000b2006102622050d9b020b20064101102a000b2006102622050d97020b20064101102a000b2006102622050d93020b20064101102a000b2006102622050d8f020b20064101102a000b2006102622050d8b020b20064101102a000b2006102622050d87020b20064101102a000b2006102622050d83020b20064101102a000b2006102622050dff010b20064101102a000b2006102622050dfb010b20064101102a000b2006102622050df7010b20064101102a000b2006102622050df3010b20064101102a000b2006102622050def010b20064101102a000b2006102622050deb010b20064101102a000b2006102622050de7010b20064101102a000b2008102622090de3010b20084101102a000b2008102622050ddf010b20084101102a000b2009102622060ddb010b20094101102a000b2006102622050dd7010b20064101102a000b2006102622050dd3010b20064101102a000b2006102622050dcf010b20064101102a000b2006102622050dcb010b20064101102a000b2006102622050dc7010b20064101102a000b2006102622050dc3010b20064101102a000b2006102622050dbf010b20064101102a000b2006102622050dbb010b20064101102a000b2006102622050db7010b20064101102a000b2006102622050db3010b20064101102a000b2006102622050daf010b20064101102a000b2006102622050dab010b20064101102a000b2006102622050da7010b20064101102a000b2006102622050da3010b20064101102a000b2006102622050d9f010b20064101102a000b2006102622050d9b010b20064101102a000b2006102622050d97010b20064101102a000b2006102622050d93010b20064101102a000b2006102622050d8f010b20064101102a000b2008102622090d8b010b20084101102a000b2008102622090d87010b20084101102a000b2006102622050d83010b20064101102a000b2006102622050d7f0b20064101102a000b2006102622050d7b0b20064101102a000b2009102622060d770b20094101102a000b2006102622050d730b20064101102a000b2006102622050d6f0b20064101102a000b2006102622050d6b0b20064101102a000b2008102622090d670b20084101102a000b2006102622050d630b20064101102a000b2006102622050d5f0b20064101102a000b2006102622050d5b0b20064101102a000b2006102622050d570b20064101102a000b2006102622050d530b20064101102a000b2006102622050d4f0b20064101102a000b2006102622050d4b0b20064101102a000b2006102622050d470b20064101102a000b2005102622080d430b20054101102a000b2006102622050d3f0b20064101102a000b2006102622050d3b0b20064101102a000b2008102622090d370b20084101102a000b2006102622050d330b20064101102a000b2006102622050d2f0b20064101102a000b2008102622090d2b0b20084101102a000b2008102622090d270b20084101102a000b2006102622050d230b20064101102a000b2001102622060d1f0b20014101102a000b2008102622090d1b0b20084101102a000b2006102622050d170b20064101102a000b2008102622090d130b20084101102a000b2005102622080d0f0b20054101102a000b2006102622050d0b0b20064101102a000b2005102622080d070b20054101102a000b2006102622050d030b20064101102a000b101e000b101e000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d4101102a000b20094101102a000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210af020240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102722050d020c060b200928020021050c020b200810262205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10230b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1023200341106a24000f0b20084101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210b00220032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a200210b10220032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001023200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d4101102a000b20094101102a000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b20094101102a000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102722080d020c050b200b28020021080c020b200710262208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610272205450d020c040b200b28020021050c040b2006102622050d020b20064101102a000b20074101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102722060d020c070b200728020021060c020b200910262206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b101e000b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102722050d020c070b200728020021050c020b200910262205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b101e000b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200341106a24000bf30f01347f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002201410d4b0d00024020010e0e000203040506070809140a0b0c0d000b200041086a280200450d13200041046a28020010230f0b0240200041086a280200450d00200041046a28020010230b0240200041146a2802002201450d00200041186a280200450d00200110230b200041246a280200450d12200041206a28020010230f0b0240200041086a280200450d00200041046a28020010230b200041146a280200450d11200041106a28020010230f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b200041086a280200450d10200041046a28020010230f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200241586a22020d000b0b200041086a280200450d0f200041046a28020010230f0b200041086a280200450d0e200041046a28020010230f0b200041086a280200450d0d200041046a28020010230f0b200041086a280200450d0c200041046a28020010230f0b2000410c6a2802002201450d0a41042103200041046a280200220420014104746a210541102106410921074108210841ffffffff0321094170210a410021010c050b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d00200128020010230b200141146a21012002416c6a22020d000b0b200041086a280200450d0a200041046a28020010230f0b410c210b2000410c6a2802002201450d07411c210c4104210d200041046a280200220e2001411c6c6a210f4108211041142111411021124109211341ffffffff03211441702115410121010c030b410c21162000410c6a2802002201450d054118211741042118200041046a2802002219200141186c6a211a4114211b4110211c4109211d4108211e41ffffffff03211f41702120410221010c020b410c21212000410c6a2802002201450d03411c212241042123200041046a28020022242001411c6c6a21254108212641142127411021284109212941ffffffff03212a4170212b410321010c010b024002400240200041046a2d000022014102460d0020014101460d0120010d022000410c6a280200450d09200041086a28020010230f0b200041146a2802002201450d03410c212c2000410c6a280200222d20014104746a212e4110212f410821304104213141742132410421010c020b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002206450d00200141046a280200450d00200610230b2001410c6a2101200241746a22020d000b0b200041106a280200450d072000410c6a28020010230f0b2000410c6a280200450d06200041086a28020010230f0b0340024002400240024002400240024002400240024020010e050001020304040b024020042802082202450d0020042802002101200220037421020340024020012d00002007470d00200120086a280200200971450d00200120036a28020010230b200120066a21012002200a6a22020d000b0b200420066a21010240200420036a280200450d00200428020010230b2001210420012005470d040c0e0b0240200e200b6a2802002202450d00200e28020421012002200d7421020340024020012d00002013470d00200120106a280200201471450d002001200d6a28020010230b200120126a2101200220156a22020d000b0b0240200e20106a280200450d00200e200d6a28020010230b200e200c6a21010240200e20116a280200450d00200e28021010230b2001210e2001200f470d040c0c0b0240201920186a280200450d00201928020010230b02402019201b6a2802002202450d00201928020c2101200220187421020340024020012d0000201d470d002001201e6a280200201f71450d00200120186a28020010230b2001201c6a2101200220206a22020d000b0b201920176a210102402019201c6a280200450d00201920166a28020010230b200121192001201a470d040c0a0b0240202420216a2802002202450d0020242802042101200220237421020340024020012d00002029470d00200120266a280200202a71450d00200120236a28020010230b200120286a21012002202b6a22020d000b0b0240202420266a280200450d00202420236a28020010230b202420226a21010240202420276a280200450d00202428021010230b2001212420012025470d040c080b202d2233202f6a212d024020332802042201450d0002402033202c6a2802002202450d002002202c6c21020340024020012802002234450d00200120316a280200450d00203410230b2001202c6a2101200220326a22020d000b0b203320306a280200450d00203320316a28020010230b202d202e470d040c060b410021010c040b410121010c030b410221010c020b410321010c010b410421010c000b0b200041106a280200450d042000410c6a28020010230c040b200041086a280200450d03200041046a28020010230f0b200041086a280200450d02200041046a28020010230f0b200041086a280200450d01200041046a28020010230f0b200041086a280200450d00200041046a28020010230f0b0be3da012d067f017e017f017e027f017e027f017e3b7f027e107f017e0f7f027e067f017e117f027e0e7f017e0b7f027e107f027e177f027e177f017e067f017e017f017e027f017e017f017e1a7f017e097f017e0b7f017e0b7f017e277f230041f080046b2202240002400240200141046a280200220320012802082204470d00200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802dc8004210120022802d88004210420004101360200200041003a00042001450d01200410230c010b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d01200128020020046a2d00002104200141086a20053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004410b4b0d0002400240024002400240024002400240024002400240024020040e0c00070405020809060b030a01000b200241c0006a200110a301410121062002280244210720022802404101470d1220074108762101200241d0006a2802002104200241c0006a41086a29030021080cb0010b200241c0006a200110a40120022802404101470d0b200228024422014108762109200241c0006a41086a290300220a4220882108200241d0006a280200210b0cc3010b200241c0006a200110a40120022802404101470d0b200228024422044108762103200241c0006a41086a2903002208422088210a200241d0006a28020021010cc0010b200241c0006a200110a40120022802404101470d0b20022802442201410876210c200241c0006a41086a290300220d4220882108200241d0006a280200210e0cbd010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cba010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb7010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb4010b200241c0006a200110a40120022802404101470d0c200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb1010b200241c0006a200110a40120022802404101470d0c200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cae010b200241c0006a200110a40120022802404101470d0c2002280244220f4108762101200241c0006a41086a29030022104220882108200241d0006a28020021110cab010b200241c0006a200110a40120022802404101470d0c200228024422124108762101200241c0006a41086a2903002208422088210a200241d0006a28020021130ca8010b200241c0006a200110a40120022802404101470d0c200041013602002000200241c0006a41047222012902003702042000410c6a200141086a290200370200200241f080046a24000f0b200041123a000420004101360200200041056a20043a0000200241f080046a24000f0b200241386a200241d4006a280200360200200241306a2214200241c0006a410c6a2902003703002002200229024437032841002109410021014100211503402001411f4b0d0c20142802002205200241286a410c6a22162802002204460d1d200441016a21032004417f460d5820052003490d59200228022820046a2d0000210420162003360200200441ff00712001411f71742015722115200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a41002109410d21170c0c0b200241e880046a200241d4006a280200360200200241e080046a2201200241cc006a290200370300200220022902443703d88004200128020021034100210420022802e48004210120022802d8800421184100211903402004411f4b0d0d20032001460d1d2001417f460d592003200141016a2207490d5a201820016a2d0000220541ff00712004411f71742019722119200441076a2104200721012005418001710d000b200241e480046a200736020020044120490d2a20056741686a41ff017141044f0d2a41002104410d21070c0d0b200241e880046a200241d4006a280200360200200241e080046a221a200241c0006a410c6a290200370300200220022902443703d880044100210c410021014100211b03402001411f4b0d0e201a2802002205200241d880046a410c6a221c2802002204460d1d200441016a21032004417f460d5a20052003490d5b20022802d8800420046a2d00002104201c2003360200200441ff00712001411f7174201b72211b200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a4100210c410d211d0c0e0b200241e880046a200241d4006a280200360200200241e080046a221e200241c0006a410c6a290200370300200220022902443703d880044100211f410021014100210603402001411f4b0d0f201e2802002205200241d880046a410c6a22202802002204460d1d200441016a21032004417f460d5b20052003490d5c20022802d8800420046a2d0000210420202003360200200441ff00712001411f71742006722106200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a410d2101410021070cad010b200241d4006a2802002121200241d0006a2802002101200241cc006a2802002122200241c8006a28020021232002280244212441002120410021044100212503402004411f4b0d0f20222001460d1d2001417f460d5c2022200141016a2226490d5d202420016a2d0000220341ff00712004411f71742025722125200441076a2104202621012003418001710d000b20044120490d2a20036741686a41ff017141044f0d2a410d2101410021040caa010b200241e880046a200241d4006a280200360200200241e080046a2227200241c0006a410c6a290200370300200220022902443703d8800441002128410021014100212903402001411f4b0d0f20272802002205200241d880046a410c6a22202802002204460d1d200441016a21032004417f460d5d20052003490d5e20022802d8800420046a2d0000210420202003360200200441ff00712001411f71742029722129200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a410d2101410021070ca7010b200241c0006a4100418080011093041a410021184100210502402007450d00200141086a2125200141046a21294101210641002118410021034100211903402029280200221b202528020022056b200720196b220441808001200441808001491b2204490d25200520046a22222005490d69201b2022490d6a200241c0006a200128020020056a20041094041a202520223602000240024002400240201820036b20044f0d00200320046a22052003490d890120184101742222200520052022491b22224100480d89012018450d01200620182022102722060d020c6f0b200420036a21050c020b202210262206450d6d0b202221180b200620036a200241c0006a20041094041a200521032007200420196a22194b0d000b0b200241003602d08004200220053602cc8004200220063602c88004200241c0006a200241c880046a10a301410121292002280244210720022802404101470d1520074108762101200241c0006a41086a2903002208422088a72122200241d0006a28020021042008a721250c9c010b200241d4006a280200212a200241d0006a2802002101200241cc006a2802002107200241c8006a280200212b2002280244212c41002120410021044100212d03402004411f4b0d0e20072001460d1c2001417f460d5d2007200141016a222e490d5e202c20016a2d0000220341ff00712004411f7174202d72212d200441076a2104202e21012003418001710d000b20044120490d2920036741686a41ff017141044f0d29410d2101410021070ca3010b200241e880046a200241d4006a280200360200200241e080046a2201200241cc006a290200370300200220022902443703d88004200128020021054100210420022802e48004210120022802d8800421184100210303402004411f4b0d0e20052001460d1c2001417f460d5e2005200141016a2207490d5f201820016a2d0000221941ff00712004411f71742003722103200441076a2104200721012019418001710d000b200241e480046a200736020020044120490d2920196741686a41ff017141044f0d2941002104410d21180c0e0b200241e880046a200241d4006a280200360200200241e080046a222f200241c0006a410c6a290200370300200220022902443703d8800441002130410021014100212003402001411f4b0d0f202f2802002211200241d880046a410c6a22052802002204460d1c200441016a21032004417f460d5f20112003490d6020022802d88004221f20046a2d0000210420052003360200200441ff00712001411f71742020722120200141076a21012004418001710d000b20014120490d2920046741686a41ff017141044f0d29410d210f410021310c9d010b200241d4006a2802002132200241d0006a2802002101200241cc006a2802002118200241c8006a280200213320022802442134410021044100213503402004411f4b0d0f20182001460d1c2001417f460d602018200141016a2219490d61203420016a2d0000220341ff00712004411f71742035722135200441076a2104201921012003418001710d000b20044120490d2920036741686a41ff017141034b0d29410d21120c0f0b200241d4006a2802002106200241d0006a2802002101200241cc006a2802002103200241c8006a280200212220022802442118410021044100210503402004411f4b0d1020032001460d1d2001417f460d612003200141016a2219490d62201820016a2d0000220741ff00712004411f71742005722105200441076a2104201921012007418001710d000b024020044120490d00410d210120076741686a41ff01714104490d1e0b2006201946210102402022450d00201810230b2001450d2b410921040c95010b410f21170b41002136410021370ca9010b200241e480046a200136020041002104410f21070b41002118410021220ca5010b410f211d0b41002138410021390ca1010b410f2101410021070c9e010b410f2101410021040c9b010b410f2101410021070c98010b410f2101410021070c95010b200241e480046a200136020041002104410f21180b41002122410021060c91010b410f210f410021310c8e010b410f21120b0c0c0b410f21010c0d0b2007450d18200241c0006a41004180081093041a200241d080046a222d280200210420022802cc8004211520022802c8800421354101212941002125410021034100211b0340201520046b2007201b6b22014180082001418008491b2201490d1a200420016a22192004490d5520152019490d56200241c0006a203520046a20011094041a202d20193602000240024002400240202520036b20014f0d00200320016a22222003490d7220254101742204202220222004491b22044100480d722025450d01202920252004102722290d020c5b0b200120036a21220c020b200410262229450d590b200421250b202920036a200241c0006a20011094041a201921042022210320072001201b6a221b4b0d000b200241c0006a2029202210a50120022802404101470d27410821072025450d2a202910230c86010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7213620022802e08004210b2008a7213741052117410021090c99010b200241e480046a2003360200200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72118200228023021012008a7212241052107410021040c96010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a721382002280230210e2008a721394105211d4100210c0c93010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a7211f200228023021032008a72107410521010c90010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7212020022802e0800421032008a72104410521010c8d010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72128200228023021032008a72107410521010c8a010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7212020022802e0800421032008a72107410521010c87010b200241e480046a2005360200200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72122200228023021032008a7210641052118410021040c84010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72130200228023021112008a721314105210f0c81010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802e08004211320022903d880042108410521120b2008422088a7213a2008a7213b0c7d0b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201410521010b2000200136020420004101360200200041086a20022902d88004370200200041106a200241d880046a41086a2802003602002022450d8f0120181023200241f080046a24000f0b200241013a00c88004200241ec80046a410136020020024107360224200242013702dc80042002419cf6c4003602d880042002200241c880046a3602202002200241206a3602e88004200241286a200241d880046a10a20120022802302104200229032821084105210702402018450d00200610230b0c790b2015450d0c4100213c4104213d4101213e411f213f410c2140200241286a410c6a214141082142200241286a41086a2143417f214441ff002145410721464180012147416821484120214941ff01214a41808004214b421c214c4220214d411c214e4110214f410321504118215141142152410421054100211441002116410021200c540b2019450d0c41042105200241d880046a410c6a21294108211b4100210641002125024020032007460d000340200741016a21012007417f460d4a20032001490d4b201820076a2c000021042029200136020020044100480d1d41072107200441c00071450d1e200441807f7222044170470d20200241c0006a200241d880046a10a60120022f004520022d004741107472210420022d0044210720022802404101460d1f200241c0006a410c6a2802002103200241c0006a41086a280200211802400240024020252006470d0020064101742201200641016a222220222001491b2222ad420c7e2208422088a70d622008a722014100480d622006450d0120052006410c6c2001102722050d020c530b200621220c010b200110262205450d510b2005201b6a220120033602002001417b6a200441ffffff077122044110763a0000200141796a20043b00002001417c6a2018360200200141786a20073a0000202541016a220120194f0d21201b410c6a211b20022802d8800421182022210620012125200241d880046a41086a280200220320292802002207470d000b0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200241306a2802002101200228022c211820022802282122410521070c1e0b201b450d0c4100215f4104216041012161411f2162410c2163200241d880046a410c6a216441082165200241d880046a41086a2166417f216741ff00216841072169418001216a4168216b4120216c41ff01216d421c216e4220216f411c2170411021714103217241182173411421744102217542022176417c2177410421054100211a4100211c410121200c530b2006450d0c41042178410021794101217a410c217b200241c0006a410c6a217c4108217d200241c0006a41086a217e417f217f4103218001411f21810141ff0021820141072183014180012184014168218501412021860141ff01218701422821880142202189014128218a01411c218b01411a218c014119218d014118218e014114218f014110219001410221910141c00021920141807f219301417021940141fc012195014100211e4104210541002196014100219701410221200c530b410421052025450d0c41002199014101219a01411f219b01417f219c0141ff00219d014107219e01418001219f01416821a001412021a10141ff0121a201410321a301420221a401422021a501410221a601410021a701410021a801410321200c530b2029450d0c410421a901410021aa01410121ab01410c21ac01410821ad01417f21ae01410321af01411f212841ff0021b001410721b10141800121b201416821b301412021b40141ff0121b501421421b601422021b701411421b8014100212741042105410021b901410021ba01410421200c530b202d450d0c410021bb01410020076b21bc01410421bd01410121be01417f21bf0141e00021c001410321c101411f21c20141ff0021c301410721c40141800121c501416821c601412021c70141ff0121c801411021c901410821ca0141c00021cb0141807f21cc0141fb0121cd014180807c21ce01420421cf01422021d001410221d101410021d20141042105410021d301410021d401410521200c530b2003450d0c200241c0006a410c6a2129200241c0006a41086a21154100212541002119410021014100211b410421050340200241c0006a200241d880046a10a60120022f004520022d0047411074722104202928020021222015280200210620022d0044211820022802404101460d14200141016a210702402001201b470d002025200720072025491b221bad420c7e2208422088a70d592008a7222d4100480d5902402001450d0020052019202d102722050d010c440b202d10262205450d430b200520196a220120183a0000200141036a20044110763a0000200141016a20043b0000200141086a2022360200200141046a2006360200202541026a21252019410c6a21192007210120072003490d000c0e0b0b2020450d0d200241d880046a410c6a215c200241c0006a41086a215b4100215941002158410021544100212f41042153410421d60141042105024020112003460d000340200341016a21042003417f460d4520112004490d46201f20036a2c00002101205c200436020020014100480d1c4106210f200141c00071450d1d200141807f72225d41ff017141fc01490d1e20112004460d1f200341026a21032004417f460d4720112003490d48201f20046a2d00002101410c210f200241d880046a410c6a20033602004100210302402001450d0020014101470d2241800221030b200241c0006a200241d880046a10a701200241c0006a410c6a2802002130205b28020021312002280244210f20022802404101460d22205441016a210402402054202f470d002059200420042059491b222fad420486225e422088a70d59205ea722014100480d59024002402054450d00205320582001102722530d010c4d0b200110262253450d4c0b205321d601205321050b200520586a2201200f3602002001410c6a205a4180807c71205d417f7341ff017172200372225a360200200141086a2030360200200141046a2031360200200420204f0d23205941026a2159205841106a215820022802d88004211f20042154200241d880046a41086a2802002211205c2802002203470d000b0b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2010c1e0b2035450d0d200241c9006a21d701410021d801410421d901410121da01411f21db01417f21dc0141ff0021dd01410721de0141800121df01416821e001412021e10141ff0121e2014180800121e301411021e401200241286a41106a21e501410c21e601200241286a410c6a21e701422021e801410221e901410821ea01200241c0006a41086a21eb01410621ec01411421ed01200241c0006a41146a21ee01420421ef01410321f001421821f101411821f201417e21f301420321f401410721f501420121f601419cf6c40021f70141c00021f80141807f21f90141fb0121fa014180807c21fb0141042105410021fc01410021fd01410621200c510b4100210741002122410021250c0f0b200241013a00c78004200241ec80046a410136020020024107360224200242013702dc80042002419cf6c4003602d880042002200241c780046a3602202002200241206a3602e88004200241286a200241d880046a10a20120022903282208422088a72122200228023021042008a72103410521074100210102402025450d00202910230b200321250c6c0b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201200241cb006a200241e080046a280200360000200220022903d88004370043200041053a000420004101360200200020022900403700052000410c6a200241c7006a290000370000200241f080046a24000f0b410021144104210541002116410021010c500b4100212241042105410021040c130b4100211a410421054100211c410121010c4e0b410021960141042105410021010c640b410021a701410021a8010c620b410021b90141042105410021010c600b410021d30141042105410021590c5e0b41042105410021074100211b0b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b2001450d022007ad422086201bad84210a410621040c600b41042105410021044100212f0c460b410021fc0141042105410021fd01410221010c460b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088210a200228023021034105210141002104201b450d66200510230c660b202941087621070b2005200241d080046a2802002203490d37200520036b2204417f4c0d38024002402004450d00200410262201450d3b2001200620036a20041094041a0c010b410121010b2022ad42208621082025ad210a2004ad220d422086211002402018450d00200610230b2008200a84210a2010200d8421082007410874202941ff0171722105410121040c5b0b200241d0006a2802002103201b450d62200510230c620b0c5b0b411821070b0c010b20044180feff07714108762103200241d0006a2802002101200241cc006a2802002118200241c0006a41086a28020021220b2003410874200441ff01717221042006450d69200510230c690b202541016a21040b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b02402001450d002004ad4220862022ad84210a410521040c540b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088210a2002280230210141052104410021032022450d68200510230c680b4118210f0b0c030b205d21010c020b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2010b20022802302111200228022c2130200228022821314105210f0b200141ff0171410874200f72210f2054450d3f0c330b200241d0006a280200211120540d320c3e0b205441016a21040c320b417f20051048000b20052003108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2003108c01000b417f20031048000b20032005108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2022108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2007108c01000b417f200141016a1048000b200141016a2005108c01000b417f20031048000b20032011108c01000b417f200141016a1048000b200141016a2018108c01000b417f200141016a1048000b200141016a2003108c01000b200520221048000b2022201b108c01000b20224101102a000b200420191048000b20192015108c01000b20044101102a000b202d4104102a000b417f20011048000b20012003108c01000b417f20041048000b20042011108c01000b417f20031048000b20032011108c01000b20014104102a000b20014104102a000b200320051048000b101d000b20044101102a000b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b200520586a21be02411021bf02410421c002410921c102410821c20241ffffffff0321c302417021c402410c2120410321010c010b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b02402001450d002004ad422086202fad84210a410721040c190b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201422021910220022903282110200228023021112004450d124104219202200520044104746a21930241102194024109219502410821960241ffffffff032197024170219802200521990241082120410321010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010206060b200241346a28020020022802384621010240200228022c450d00200228022810230b2001450d032016ad4220862014ad84210a410c21040cdf010b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b2001450d01201cad422086201aad84210a410a21040cde010b2019203246210102402033450d00203410230b2001450d0220fd01ad42208620fc01ad84210a410b21040cdd010b20024103410220011b3a00c880044114219a02200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2014220219b022002290328210d2002280230210e201c450d03411c219c022005201c411c6c6a219d02410c219e024108219f02410421a002411021a102410921a20241ffffffff0321a302417021a402200521a502410921200cb9010b20024103410220011b3a00c88004411421a602200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241d880046a200241c0006a10a201422021a70220022903d88004210a20022802e08004210b2016450d04411c21a80220052016411c6c6a21a902410c21aa02410821ab02410421ac02411021ad02410921ae0241ffffffff0321af02417021b002200521b102410a21200cba010b20024103410220011b3a0028411421b202200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201422021b30220022903d88004210820022802e08004211320fd01450d05411821b402200520fd0141186c6a21b502410421b602411021b702410c21b802410921b902410821ba0241ffffffff0321bb02417021bc02200521bd02410b21200cbb010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024020200e0f000102030405060b0d1416181c202c2c0b20162253203e6a2116410021014100211f0340410021092001203f4b0d0c2043280200225420412802002204460d0e2004203e6a210320042044460d7420542003490d75200228022820046a2d000021042041200336020020042045712001203f7174201f72211f200120466a210120042047710d000b024020012049490d0020046720486a204a71203d490d530b200241c0006a200241286a10a7012002280240203e460d53200241c0006a20406a2802002155200241c0006a20426a280200215620022802442157410021044100215803402004203f4b0d1d2043280200225420412802002203460d1f2003203e6a210120032044460d840120542001490d85012002280228225920036a2d000021032041200136020020032045712004203f71742058722158200420466a210420032047710d000b024020042049490d0020036720486a204a71203d490d5e0b4100215a200241c0006a4100204b1093041a024002402058450d004100215a4101215b410021034100215c0340205420016b2058205c6b2204204b2004204b491b2204490d3d200120046a225d2001490d9b012054205d490d9c01200241c0006a205920016a20041094041a2041205d3602000240024002400240205a20036b20044f0d00200320046a225d2003490ddd01205a203e742201205d205d2001491b2201203c480ddd01205a450d01205b205a20011027225b0d020ca1010b200420036a215d0c020b20011026225b450d9f010b2001215a0b205b20036a200241c0006a20041094041a20582004205c6a225c4d0d02204128020021012043280200215420022802282159205d21030c000b0b4101215b4100215d0b024020142053470d002014203e7422012014203e6a220420042001491b2204ad204c7e225e204d88a70dd701205ea72201203c480dd701024002402014450d0020052014204e6c2001102722050d010c9e010b200110262205450d9d010b200421140b20052053204e6c6a2201201f20427622043b00012001205b360210200120573602042001201f3a0000200120506a2004204f763a0000200120516a205d360200200120526a205a360200200120406a2055360200200120426a205636020020162015490dae010cbd010b201c225820616a211c410021014100211f03404100210c200120624b0d072066280200225420642802002204460d09200420616a210320042067460d7120542003490d7220022802d8800420046a2d00002104206420033602002004206871200120627174201f72211f200120696a21012004206a710d000b02402001206c490d00200467206b6a206d712060490d4b0b200241c0006a200241d880046a10a70120022802402061460d4b200241c0006a20636a2201280200215c200241c0006a20656a2204280200215d2002280244215a200241c0006a200241d880046a10a80120022802402061460d4c2004280200215b2002280244215902400240024020012802002201450d00200120757422032075752253ad207686225e206f88a70dd801205ea72201205f480dd801200110262254450d9e01200320776a21552054210120592104034020012004280200360200200120606a2101200420606a2104200320776a22030d000b205520757620616a2104205b450d020c010b410021534104215441002104205b450d010b205910230b0240201a2058470d00201a2061742201201a20616a220320032001491b2203ad206e7e225e206f88a70dd601205ea72201205f480dd60102400240201a450d002005201a20706c2001102722050d010c9f010b200110262205450d9e010b2003211a0b2005205820706c6a2201201f20657622033b0001200120543602102001205a3602042001201f3a0000200120726a20032071763a0000200120736a2004360200200120746a2053360200200120636a205c360200200120656a205d360200201c201b490dae010cbd010b200241c0006a200241d880046a10a901207c280200211f207e280200215d2002280244215b2002280240207a460d23200241c0006a200241d880046a10a901207c2802002157207e2802002153200228024421552002280240207a460d24200241d880046a207d6a2802002203200241d880046a207b6a22592802002220460d252020207a6a21012020207f460d850120032001490d860120022802d88004225c20206a2d00002104205920013602004100215a20042080014b0d2602400240024002400240024020040e0400030102000b4100215a4100210441002120034020042081014b0d1d20032001460d1e2001207f460d7f20032001207a6a2258490d8001205c20016a2d000021542059205836020020542082017120042081017174202072212020042083016a2104205821012054208401710d000b4100215a02402004208601490d002054672085016a208701712078490d5b0b209601209701460d030c040b200241c0006a200241d880046a10a601207e290300215e200228024421202002280240207a460d424102215a209601209701460d020c030b20032001460d4320202091016a21582001207f460d9f0120032058490da001205c20016a2c000021042059205836020020042079480d44200420920171450d38200420930172220420870171209501490d3820032058460d4820202080016a21012058207f460da10120032001490da2012004207f732154205c20586a2d00002104410c2120200241d880046a410c6a20013602004103215a4100210302402004450d002004207a470d4b410121030b209601209701460d010c020b20032001460d4120202091016a21042001207f460d900120032004490d9101205c20016a2c00002101205920043602002001207f4c0d44200120920171450d382001209301722201209401470d38200241c0006a200241d880046a10a601207e290300215e200228024421202002280240207a460d484101215a209601209701470d010b209601207a742201209601207a6a220420042001491b2204ad2088017e22980120890188a70dd501209801a722012079480dd50102400240209601450d002005209601208a016c2001102722050d010c93010b200110262205450d92010b20042196010b2005209701208a016c6a2201205536020c2001201f3602082001205d3602042001205b36020020012086016a205e3702002001208b016a20203602002001208c016a20033a00002001208d016a20543a00002001208e016a205a3a00002001208f016a205736020020012090016a2053360200201e208a016a211e209701207a6a220121970120012006490dae010cea010b20a701221f209a016a21a70120262101410021044100210303402004209b014b0d0420222001460d062001209c01460d6d20222001209a016a2226490d6e202420016a2d00002220209d01712004209b01717420037221032004209e016a2104202621012020209f01710d000b0240200420a101490d0020206720a0016a20a2017120a3014d0d480b024020a801201f470d00201f209a0174220120a70120a7012001491b22a801ad20a40186225e20a50188a70dd401205ea72201209901480dd4010240201f450d002005201f20a601742001102722050d010ca1010b200110262205450da0010b2005201f20a601746a200336020020a7012025490dae010ce8010b200241c0006a200241d880046a10a901200228024020ab01460d2b200241c0006a20ad016a280200215a2002280244215d200241d880046a20ad016a2802002204200241d880046a20ac016a22202802002203460d2c200320ab016a2101200320ae01460d8f0120042001490d9001200241c0006a20ac016a280200215320022802d88004221f20036a2d0000215c20202001360200205c20af014b0d2f02400240024002400240205c0e0400030102000b4100215c41002154410021030340205420284b0d1e20042001460d24200120ae01460d86012004200120ab016a2259490d8701201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4100215c205420b401490d0320586720b3016a20b5017120a9014f0d030c620b41002154410021030340205420284b0d1220042001460d21200120ae01460d89012004200120ab016a2259490d8a01201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4102215c205420b401490d0220586720b3016a20b5017120a9014f0d020c550b41002154410021030340205420284b0d1120042001460d21200120ae01460d7e2004200120ab016a2259490d7f201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4103215c205420b401490d0120586720b3016a20b5017120a9014f0d010c540b41002154410021030340205420284b0d1020042001460d1e200120ae01460d7b2004200120ab016a2259490d7c201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4101215c205420b401490d0020586720b3016a20b5017120a901490d530b200241c880046a20ad016a20033602002002205c3602cc8004200220533602c8800420022902cc8004215e024020b90120ba01470d0020b90120ab0174220120b90120ab016a220420042001491b2204ad20b6017e22980120b70188a70dd301209801a7220120aa01480dd3010240024020b901450d00200520b90120b8016c2001102722050d010c94010b200110262205450d93010b200421b9010b200520ba0120b8016c6a2201205e37020c200120533602082001205a3602042001205d360200202720b8016a212720ba0120ab016a220121ba0120012029490dae010ce6010b2007202e460d34202e20be016a2101202e20bf01460d910120072001490d9201202c202e6a2d0000225820c001470d3820d40120be016a2159202e20c1016a211f4100215841002104410021200340201f212e200420c2014b0d0c20072001460d0d200120bf01460d732007200120be016a2203490d74202c20016a2d0000225420c30171200420c20171742020722120202e20be016a211f200420c4016a210420032101205420c501710d000b0240200420c701490d0020546720c6016a20c8017120bd01490d510b41002104024002402020450d0020bc0120036a2153202c20036a215b4101215a41002154410021014100215d0340205320016a450d30202e450da2012007202e490da301205b20016a2c0000225820bb01480d324106215c205820cb0171450d33205820cc0172225820c8017120cd014d0d33200120be016a211f02402001205d470d002054201f201f2054491b225d20bb01480dd50102402001450d00205a2001205d1027225a0d010ca3010b205d1026225a450da2010b205a20016a205820bf01733a0000205420d1016a2154202e20be016a212e201f2101201f2020490d000b2003201f6a21030c010b4101215a4100211f4100215d0b205a20c9017620c901742253205a20ca017620c8017120ca0174225b72205a20c80171225a72215441002101034041002158200420c2014b0d2820072003460d2a200320bf01460d87012007200320be016a222e490d8801202c20036a2d0000222020c30171200420c20171742001722101200420c4016a2104202e2103202020c501710d000b0240200420c701490d0020206720c6016a20c8017120bd01490d620b024002400240200120be01460d0020010d654104210420d30120d401460d010c020b2007202e460d65202e20bf01460da9012007202e20be016a2201490daa01202c202e6a2c0000225820bb01480d664106215c205820cb0171450d2a205820cc0172225820c8017120cd014d0d2a205820bf017321042001212e20d30120d401470d010b20d30120be0174220120d30120be016a220320032001491b2203ad20cf0186225e20d00188a70dd201205ea7220120bb01480dd2010240024020d301450d00200520d30120bd01742001102722050d010ca4010b200110262205450da3010b200321d3010b200520d40120bd01746a220120d50120ce0171200420c8017120ca01747220c0017222d50136020c2001201f3602082001205d3602042001205b205a7220537236020020d20120c9016a21d201205921d4012059202d490dae010ce4010b20fd01225d20da016a21fd0141002101410021030340200120db014b0d0920182019460d0a201920dc01460d702018201920da016a2204490d71203420196a2d0000221f20dd0171200120db0171742003722103200120de016a210120042119201f20df01710d000b0240200120e101490d00201f6720e0016a20e2017120d901490d4f0b41002158200241c0006a410020e3011093041a024002402003450d004100215c4101215a41002154410021590340201820046b200320596b220120e301200120e301491b2201490d21200420016a22192004490d7e20182019490d7f200241c0006a203420046a20011094041a0240024002400240205c20546b20014f0d00205420016a221f2054490dd701205c20da01742204201f201f2004491b220420d801480dd701205c450d01205a205c20041027225a0d020c8e010b200120546a211f0c020b20041026225a450d8c010b2004215c0b205a20546a200241c0006a20011094041a20192104201f21542003200120596a22594b0d000c020b0b4101215a200421194100215c4100211f0b20e501201f36020020e70141003602002002205a3602282002201fad20e80186205cad8437022c41002101410021590340200120db014b0d24201f2058460d25205820dc01460d8901201f205820da016a2203490d8a01205a20586a2d0000210420e7012003360200200420dd0171200120db0171742059722159200120de016a210120032158200420df01710d000b0240200120e101490d0020046720e0016a20e2017120d901490d5e0b4100215b024002402059450d004100215c410421554100215a0340205a225320da016a215a410021014100211f02400240024002400340200120db014b0d01200241286a20ea016a280200225420e7012802002204460d02200420da016a2103200420dc01460d7b20542003490d7c2002280228225820046a2d0000211220e7012003360200201220dd0171200120db017174201f72211f200120de016a2101201220df01710d000b02400240200120e101490d0020126720e0016a20e2017120f0014d0d010b0240024020542003470d00200220da013a00c8800420ee0120da01360200200220f501360224200241c0006a20e4016a200241206a360200200220f601370244200220f7013602402002200241c880046a360220200241d880046a200241c0006a10a201200241d880046a20ea016a28020021fe0120022802dc800421ff0120022802d880042180024105211f0c010b200420e9016a2101200320dc01460daa0120542001490dab01205820036a2c0000210420e701200136020002400240200420d801480d00200420f801710d014106211f0c020b4118211f0c010b0240200420f90172220120e2017120fa014d0d00201f20fb01712103201f20ea01762104200120dc01732101410021540c060b4106211f200121040b20800220ea0176218102410121544100210320ff0121820220fe0121830220800221010c040b203b2101203a218202410d211f0c020b410f211f203b2101203a2182020c010b200220da013a00c8800420ee0120da01360200200220f501360224200241c0006a20e4016a200241206a360200200220f601370244200220f7013602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e20e80188a7218202200241d880046a20ea016a2802002113205ea721014105211f0b200120ea017621810241012154410021042013218302410021032001213b208202213a0b2003200420e2017120ea017472201f20e2017172211220540d3b0240205c2053470d00205c20da01742204205c20da016a220320032004491b2204ad20f40186225e20e80188a70dd401205ea7220320d801480dd40102400240205c450d002055205c20f001742003102722550d010ca9010b200310262255450da8010b2004215c0b2055205320f001746a220420013a000420042012360200205a2059490d000c020b0b410421554100215c4100215a0b4101211f4108215641002101410021034100218402034020012104200241c0006a200241286a10aa01200228024020da01460d3a200241d880046a20e9016a220120d70120e9016a2d00003a0000200220d7012f00003b01d88004200241c0006a20e6016a2802002159200241c0006a20e4016a280200215820ee0128020021530240024020eb012d0000225420ec01470d00201f20dc016a211f0c010b205420f3016a20e9014b0d00201f20da016a2257201f4f2185022057211f208502450d540b200241c0006a20e9016a225720012d00003a0000200220022f01d880043b014002402003208402470d00200320da016a22012003490dd201205b20012001205b491b228402ad20ef0186225e20e80188a70dd201205ea7220120d801480dd20102402003450d00205620042001102722560d010ca7010b200110262256450da6010b205620046a220120543a0000200120e6016a2053360200200120ea016a2058360200200120d9016a2059360200200120f0016a20572d00003a0000200120da016a20022f01403b0000205b20e9016a215b200420e4016a2101200320da016a2103201f0d000b20e70128020020e5012802004621010240200228022c450d00200228022810230b2001450d64024020fc01205d470d0020fc0120da0174220120fc0120da016a220420042001491b2204ad20f1017e225e20e80188a70dd101205ea7220120d801480dd1010240024020fc01450d00200520fc0120f2016c2001102722050d010ca8010b200110262205450da7010b200421fc010b2005205d20f2016c6a2201205636020c2001205a3602082001205c36020420012055360200200120ed016a2003360200200120e4016a20840236020020fd012035490dae010cb9010b410f210120a8010de1010cf4010b410f211d20580d480c490b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802e08004210320022802dc8004212020022802d8800421044105210120a801450df2010cdf010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a2012002290328225e422088a72138200241306a280200210e205ea721394105211d0c440b02402090022088026a2802002204450d0020900228020421012004208b027421040340024020012d0000208d02470d0020012089026a280200208e0271450d002001208b026a28020010230b2001208c026a21012004208f026a22040d000b0b02402090022089026a280200450d00209002208b026a28020010230b2090022086026a21010240209002208a026a280200450d0020900228021010230b20012190022001208702470daa010c460b410f211720530d540c550b02402099022802082204450d00209902280200210120042092027421040340024020012d0000209502470d0020012096026a28020020970271450d0020012092026a28020010230b20012094026a210120042098026a22040d000b0b2099022094026a210102402099022092026a280200450d0020990228020010230b20012199022001209302470da9010cda010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a72136200241e080046a280200210b205ea721374105211720530d520c530b410f2112205d0d5e0c5f0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a7213a200241e080046a2802002113205ea7213b41052112205d0d5d0c5e0b410f215c0cc8010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a20120022903d880042208422088a72120200241e080046a28020021012008a721074105215c0cc7010b410f21014100215c0cc7010b024020a502209e026a2802002204450d0020a5022802042101200420a0027421040340024020012d000020a202470d002001209f026a28020020a30271450d00200120a0026a28020010230b200120a1026a2101200420a4026a22040d000b0b024020a502209f026a280200450d0020a50220a0026a28020010230b20a502209c026a2101024020a502209a026a280200450d0020a50228021010230b200121a5022001209d02470da3010b200d209b02882108410521014100210c201a450deb01200510230ceb010b024020b10220aa026a2802002204450d0020b1022802042101200420ac027421040340024020012d000020ae02470d00200120ab026a28020020af0271450d00200120ac026a28020010230b200120ad026a2101200420b0026a22040d000b0b024020b10220ab026a280200450d0020b10220ac026a28020010230b20b10220a8026a2101024020b10220a6026a280200450d0020b10228021010230b200121b102200120a902470da2010b200a20a70288210841052101410021092014450ded01200510230ced010b024020bd0220b6026a280200450d0020bd0228020010230b024020bd0220b2026a2802002204450d0020bd0228020c2101200420b6027421040340024020012d000020b902470d00200120ba026a28020020bb0271450d00200120b6026a28020010230b200120b7026a2101200420bc026a22040d000b0b20bd0220b4026a2101024020bd0220b7026a280200450d0020bd0220b8026a28020010230b200121bd02200120b502470da1010b200820b30288210a410521124100210120fc01450dd901200510230cd9010b410f21200cc6010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c210820022802282107410521204100215a0cc6010b024020052802082204450d0020052802002101200420c0027421040340024020012d000020c102470d00200120c2026a28020020c30271450d00200120c0026a28020010230b200120bf026a2101200420c4026a22040d000b0b200520bf026a21010240200520c0026a280200450d00200528020010230b2001210520be022001470d9e010cc3010b410f211720550d410c420b410f21010cbc010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a72136200241e080046a280200210b205ea72137410521170c1c0b024020cf0220c7026a2802002204450d0020cf022802042101200420ca027421040340024020012d000020cc02470d00200120c8026a28020020cd0271450d00200120ca026a28020010230b200120cb026a2101200420ce026a22040d000b0b024020cf0220c8026a280200450d0020cf0220ca026a28020010230b20cf0220c5026a2101024020cf0220c9026a280200450d0020cf0228021010230b200121cf02200120c602470d9b010c410b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c100b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c0f0b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c0e0b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a201200229022c210820022802282107410521010cb6010b200241013a00c78004200241ec80046a410136020020024107360224200241e880046a200241206a360200200242013702dc80042002419cf6c4003602d880042002200241c780046a360220200241c880046a200241d880046a10a20120022903c88004225e422088a7213a200241d080046a2802002113205ea7213b41052112205c450d46205a1023205d0d480c490b200241d0006a2802002103205d2107205b21012097010dbf010cc0010b200241d0006a2802002103205321072057211f20552101205d0dbc010cbd010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c210820022802282107410521204100215a410021030cba010b41092120410021030cb9010b410f2112200228022c0d3a0c3b0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a7218202200241e080046a280200218302205ea7213b410521120c300b024020da0220d2026a280200450d0020da0228020010230b024020da0220d3026a2802002204450d0020da0228020c2101200420d2027421040340024020012d000020d602470d00200120d7026a28020020d80271450d00200120d2026a28020010230b200120d4026a2101200420d9026a22040d000b0b20da0220d0026a2101024020da0220d4026a280200450d0020da0220d5026a28020010230b200121da02200120d102470d90010c420b410f215c0b205d0daf010cb0010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c205d450daf010cae010b2002200241cc006a2902003703c88004200241c8006a28020021072002280244210120022802c88004212820022802cc8004210320ba010dab010cac010b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010b200229022c210820022802282107410521014100215c0ca8010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e080046a280200210120022802dc8004212020022802d8800421074105215c205d0d030ca6010b410a21010ca6010b4118215c0b205d450da3010b205a10230ca2010b41062120410021030caa010b410721030c0c0b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c0ca4010b200241013a00c78004200241ec80046a410136020020024107360224200241e880046a200241206a360200200242013702dc80042002419cf6c4003602d880042002200241c780046a360220200241c880046a200241d880046a10a201200241d080046a280200210b20022802cc8004213620022802c88004213741052117205a0d010b2055450d230c220b205b102320550d210c220b4117215c0ca0010b20810220ea0174200120e2017172213b205c0d1d0c1c0b200241d0006a280200218302200241cc006a280200218202200241c8006a280200213b200228024421122003450d1a0c190b200241c0006a41086a200241d0006a2802003602002020418080807871215a20204180807c712103202041087621040c97010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200241306a28020021042002290328215e410521030c040b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a20141052120200229022c210820022802282107410021030c9f010b41182120410021030c9e010b411821030b0b200141ff017141087420037221200c90010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c21082002280228210741052120410021030c9a010b200241d0006a28020021040c8e010b4100215a0c98010b410d210120a8010d9d010cb0010b410d211d20580d040c050b2002280244221d410876210c200241d0006a280200210e200241cc006a2802002138200241c0006a41086a280200213920580d030c040b2002280244211d200241c0006a41106a280200210e200241cc006a2802002138200241c0006a41086a28020021390240205c450d00205c4104742104205a21010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b201d410876210c205d0d010b2058450d020c010b205a10232058450d010b411c21860220052058411c6c6a218702410c21880241082189024114218a024104218b024110218c024109218d0241ffffffff03218e024170218f022005219002410721200c760b201a450dad01200510230cad010b410d211720530d0d0c0e0b200228024422174108762109200241d0006a280200210b200241cc006a2802002136200241c0006a41086a280200213720530d0c0c0d0b410d2112205d0d180c190b410d215c0c83010b410d21014100215c0c83010b410d21200c88010b024020544109470d00205841ffffffff0371450d00205910230b411521820241a4c5c200213b410421122003450d010b205621010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b0240208402450d00205610230b205c0d010b200228022c450d090c080b20551023200228022c0d070c080b410d21172055450d010b20554104742104205721010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b4100210902402056450d00205710230b2053450d010b411c21c50220052053411c6c6a21c602410c21c702410821c802411421c902410421ca02411021cb02410921cc0241ffffffff0321cd02417021ce02200521cf02410d21200c700b2014450da101200510230ca1010b410d21010c770b410d2112200228022c450d010b200228022810230b208202213a20830221130c050b410d215c205d0d760c770b4104215c41eb93c300210741242120205d0d750c760b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c205d0d740c750b4118215c205d0d730c740b200220f00120e90120011b3a00c88004200241d4006a410136020020024107360224200241c0006a41106a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a201200241d880046a41086a280200211320022802dc8004213a20022802d88004213b02402003450d00200441106a21034100210103400240205620016a22042d00004109470d00200441086a28020041ffffffff0371450d00200441046a28020010230b2003200141106a2201470d000b0b0240208402450d00205610230b41052112205c0d010b205d450d020c010b20551023205d450d010b411821d0022005205d41186c6a21d102410421d202411421d302411021d402410c21d502410921d602410821d70241ffffffff0321d802417021d902200521da02410e21200c650b20fc01450d8201200510230c82010b417f200141016a1048000b200141016a2022108c01000b417f20031048000b20032054108c01000b417f20031048000b20032054108c01000b417f201941016a1048000b201941016a2018108c01000b417f200141016a1048000b200141016a2007108c01000b417f20031048000b20032054108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2004108c01000b417f200141016a1048000b200141016a2004108c01000b200420191048000b20192018108c01000b417f20011048000b20012054108c01000b417f200141016a1048000b200141016a2004108c01000b417f20011048000b20012003108c01000b417f200141016a1048000b200141016a2004108c01000b417f200341016a1048000b200341016a2007108c01000b20044101102a000b417f205841016a1048000b205841016a201f108c01000b417f20041048000b20042003108c01000b20014104102a000b417f20011048000b20012004108c01000b20014104102a000b417f20011048000b20012007108c01000b2001205d1048000b205d2054108c01000b20014101102a000b20014104102a000b20014104102a000b20014104102a000b417f20581048000b20582003108c01000b417f20011048000b20012003108c01000b20014104102a000b205d4101102a000b417f202e1048000b202e2007108c01000b20014104102a000b417f20011048000b20012054108c01000b20034104102a000b20014108102a000b20014104102a000b417f202e41016a1048000b202e41016a2007108c01000b410021200c110b410121200c110b410221200c110b410321200c110b410421200c110b410521200c110b410621200c110b410721200c120b410821200c120b410921200c130b410a21200c140b410b21200c150b410c21200c150b410d21200c160b410e21200c170b410021010c170b410121010c160b410221010c150b410321010c140b410321010c130b410321010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b410321010c0a0b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b410321010c010b410321010c000b0b101e000b200241c0006a41086a20043602002020418080807871215a20204180807c712103202041087621040b2002205e37034020022902442108205ea721070c090b20014110762104200141087621030c040b205c4108742001722101200220083703c880042008a721280240205a450d00205d10230b20022802cc8004210320ba01450d010b2005210403400240200441046a280200450d00200428020010230b200441146a21042027416c6a22270d000b0b20b901450d1c200510230c1c0b205410230b200341ff0171410874200141ff017172210320044110742104205841ff01714108742119024020d401450d002005210103400240200141046a280200450d00200128020010230b200141106a210120d20141706a22d2010d000b0b200320047221032019205c72210120d301450d18200510230c180b202f450d1320d60110230c130b0b41002103410021040b202041ff0171200441ff0171410874722003418080fc077172205a7221012008422088a721032008a7211f02402053450d00205510230b205d450d010b205b10230b209701450d010b2005210403400240200441046a280200450d00200428020010230b0240200441106a280200450d002004410c6a28020010230b200441286a2104201e41586a221e0d000b0b209601450d16200510230c160b20102091028821084105210f41002101202f450d0c200510230c0c0b200510230c120b202e202a4621010240202b450d00202c10230b02402001450d002059ad42208620d301ad84210a410221040c040b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d88004210820022802e08004210302402059450d00205941047421042005210103400240200141046a280200450d00200128020010230b200141106a2101200441706a22040d000b0b2008422088210a410521014100210420d301450d0e200510230c0e0b200241e480046a28020020022802e88004462104024020022802dc8004450d0020022802d8800410230b02402004450d002001ad42208620b901ad84210a410821040c030b20024103410220041b3a00c88004200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201200229032821082002280230210302402001450d00200141146c21042005210103400240200141046a280200450d00200128020010230b200141146a21012004416c6a22040d000b0b2008422088210a410521014100210420b901450d0f200510230c0f0b2026202146210102402023450d00202410230b02402001450d0020a701ad42208620a801ad84210a410421040c020b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088210a20022802e080042103410521014100210420a801450d10200510230c100b200241e480046a28020020022802e88004462104024020022802dc8004450d0020022802d8800410230b2004450d012001ad422086209601ad84210a410321040b200020043a000420004100360200200041056a20022f001d3b0000200041186a2008370200200041146a20013602002000410c6a200a370200200041086a2005360200200041206a200229020c370200200041076a2002411f6a2d00003a0000200041286a2002410c6a41086a290200370200200241f080046a24000f0b20024103410220041b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201200229032821082002280230210302402001450d00200141286c21042005210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200441586a22040d000b0b2008422088210a4105210141002104209601450d0f200510230c0f0b2022ad4220862025ad8421082018450d00200610230b20004101360200200041106a2004360200200041086a200837020020002001410874200741ff017172360204200241f080046a24000f0b20124108762101203aad220a422086203bad8421082033450d00203410230b20004101360200200041106a2013360200200041086a200a422086200842ffffffff0f838437020020002001410874201241ff017172360204200241f080046a24000f0b200f41087621012030ad22084220862031ad84211020022802dc8004450d0020022802d8800410230b20004101360200200041106a2011360200200041086a2008422086201042ffffffff0f838437020020002001410874200f41ff017172360204200241f080046a24000f0b200441ffffff07712204410874201841ff01717221012022ad220a4220862006ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200141087621042020ad220a4220862007ad842108202b450d00202c10230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200141087621042028ad220a4220862007ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b2020ad220a4220862004ad842108410021042023450d00202410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b20014108762104201fad220a4220862007ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200c410874201d41ff01717221012038ad22084220862039ad84210d20022802dc8004450d0020022802d8800410230b20004101360200200041106a200e360200200041086a2008422086200d42ffffffff0f83843702002000200c410874200141ff017172360204200241f080046a24000f0b200441ffffff07712203410874200741ff01717221042018ad220a4220862022ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2001360200200041086a200a422086200842ffffffff0f838437020020002003410874200441ff017172360204200241f080046a24000f0b2009410874201741ff01717221012036ad22084220862037ad84210a200228022c450d00200228022810230b20004101360200200041106a200b360200200041086a2008422086200a42ffffffff0f838437020020002009410874200141ff017172360204200241f080046a24000f0b200241f080046a24000b6b000240024020002d000022004101460d0020004102470d0120012802184190f6c400410b2001411c6a28020028020c1102000f0b20012802184183f6c400410d2001411c6a28020028020c1102000f0b200128021841f7f5c400410c2001411c6a28020028020c1102000b800301067f230041306b22022400200128020021030240024002400240024002400240200128020422044103742205450d00200341046a2106410021070340200628020020076a2107200641086a2106200541786a22050d000b200141146a280200450d010c020b41002107200141146a2802000d010b200721060c010b2004450d02024002402007410f4b0d002003280204450d010b200720076a220620074f0d010b4101210541002106200241086a21070c010b2006417f4c0d02200241086a210702402006450d002006102622050d0120064101102a000b41012105410021060b200241003602102002200636020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a290200370300200220012902003703180240200241146a41c482c500200241186a10e2030d0020002007290200370200200041086a200741086a280200360200200241306a24000f0b10fb03000b41b482c500410041001029000b101d000b960301087f230041c0006b2202240041002103200141086a2104200141046a210541002106024002400240024002400340200341204f0d012005280200220720042802002208460d02200841016a21092008417f460d0420072009490d05200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b20034120490d0220086741686a41ff017141034b0d02200041013602002000410d3a0004200241c0006a24000f0b200041013602002000410f3a0004200241c0006a24000f0b200241013a000f200241346a41013602002002410736023c200242013702242002419cf6c40036022020022002410f6a3602382002200241386a360230200241106a200241206a10a2012002412b6a200241186a28020036000020022002290310370023200041053a000420004101360200200020022900203700052000410c6a200241276a290000370000200241c0006a24000f0b2000410036020020002006360204200241c0006a24000f0b417f20091048000b20092007108c01000ba005010c7f230041c080016b22022400200241086a200110a30141012103024020022802084101470d002000200229020c370204200041013602002000410c6a200241086a410c6a290200370200200241c080016a24000f0b200228020c2104200241086a4100418080011093041a41002105410021060240024002400240024002402004450d00200141086a2107200141046a21084100210941002105410121034100210a03402008280200220b200728020022066b2004200a6b220c41808001200c41808001491b220c490d022006200c6a220d2006490d03200b200d490d04200241086a200128020020066a200c1094041a2007200d3602000240024002400240200520096b200c4f0d002009200c6a22062009490d092005410174220d20062006200d491b220d4100480d092005450d0120032005200d102722030d020c0a0b200c20096a21060c020b200d10262203450d080b200d21050b200320096a200241086a200c1094041a200621092004200c200a6a220a4b0d000b0b2000200336020420004100360200200041146a2006360200200041106a41003602002000410c6a2006360200200041086a2005360200200241c080016a24000f0b200241013a008f8001200241b480016a4101360200200241073602bc8001200242013702a480012002419cf6c4003602a0800120022002418f80016a3602b880012002200241b880016a3602b080012002419080016a200241a080016a10a201200241ab80016a2002419880016a2802003600002002200229039080013700a38001200041053a000420004101360200200020022900a080013700052000410c6a200241a780016a29000037000002402005450d00200310230b200241c080016a24000f0b2006200d1048000b200d200b108c01000b101e000b200d4101102a000bbd0602057f027e0240024002402002450d00200241796a4100200241074b1b2103410021040340024002400240024002400240024002400240024002400240024002400240200120046a22052d000022064118744118752207417f4c0d002005410371450d01200441016a22042002490d0f0c100b42808080801021082006419684c5006a2d000022054104460d0120054103460d0220054102470d08200441016a220620024f0d094280808080802021094280808080102108200120066a2d000041c00171418001460d0d0c110b0240200420034f0d000340200120046a220641046a280200200628020072418081828478710d01200441086a22042003490d000b0b0240200420024f0d000340200120046a2c00004100480d01200441016a22042002490d000b0b20042002490d0d0c0e0b42002109200441016a220520024f0d08200120056a2d00002105200641f001460d01200641f401470d022005411874411875417f4a0d06200541ff0171418f014d0d030c060b42002109200441016a220520024f0d07200120056a2d00002105200641e001460d03200641ed01470d042005411874411875417f4a0d05200541ff017141a001490d090c050b200541f0006a41ff01714130490d010c040b200541ff017141bf014b0d032007410f6a41ff017141024b0d03200541187441187541004e0d030b200441026a220620024f0d04200120066a2d000041c00171418001470d0a42002108200441036a220620024f0d0b200120066a2d000041c00171418001460d070c050b200541e0017141a001470d010c050b02402007411f6a41ff0171410c4f0d002005411874411875417f4a0d01200541ff017141bf014d0d050c010b200541ff017141bf014b0d00200741fe017141ee01470d0020054118744118754100480d040b4280808080802021090c080b420021090b420021080c060b428080808080e000210942808080801021080c050b42002108200441026a220620024f0d04200120066a2d000041c00171418001470d030b200641016a22042002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210942808080801021080b200020092008842004ad84370204200041013602000be607010a7f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204470d00200241013a000f2002413c6a4101360200200241073602242002420137022c2002419cf6c40036022820022002410f6a3602202002200241206a360238200241106a200241286a10a201200241326a200241186a2802003601002002200229031037012a20022002412e6a29010037010620022002290128370300410521050c010b200441016a21062004417f460d0b20032006490d0c2001280200220720046a2d00002108410c21052001410c6a2006360200410021064100210902402008450d004101210920084101470d010b410120036b210a200441026a21042001410c6a210b4100210503402006411f4b0d02200a20046a4102460d032004450d0a20032004490d0b200720046a417f6a2d00002108200b2004360200200841ff00712006411f71742005722105200441016a2104200641076a21062008418001710d000b024020064120490d00410d210620086741686a41ff017141034d0d040b2009450d042004417f6a2104410021062001410c6a210b4100210a03402006411f4b0d0720032004460d082004417f460d0e2003200441016a2201490d0f200720046a2d00002108200b2001360200200841ff00712006411f7174200a72210a200641076a2106200121042008418001710d000b024020064120490d00410d210420086741686a41ff017141034d0d090b410121040c050b200020083a0005200020053a000420002002290300370106200041013602002000410c6a2002290106370100200241c0006a24000f0b410f21060c010b200241013a00102002413c6a4101360200200241073602242002420137022c2002419cf6c4003602282002200241106a3602202002200241206a3602382002200241286a10a201410521060b2000200636020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b410021040b20002005360204200041003602002000410c6a200a360200200041086a2004360200200241c0006a24000f0b410f21040c010b200241013a00102002413c6a4101360200200241073602242002420137022c2002419cf6c4003602282002200241106a3602202002200241206a3602382002200241286a10a201410521040b2000200436020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b417f20041048000b20042003108c01000b417f20061048000b20062003108c01000b417f200441016a1048000b200441016a2003108c01000bd503020a7f017e230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a200110aa0120022802184101460d01200220032900003703082002200429000037000f200241186a41086a2d0000210a2002200229000f37001f20022002290308370318024020072008470d00200741016a220b2007490d032005200b200b2005491b2208ad420486220c422088a70d03200ca7220b4100480d0302402007450d0020092006200b102722090d010c050b200b10262209450d040b200920066a220b200a3a0000200b41086a200229001f370000200b41016a2002290318370000200541026a2105200641106a2106200741016a2107200a41ff01714106470d000b20002009360204200041003602002000410c6a2007360200200041086a2008360200200241306a24000f0b2000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a28020010230b200741106a2107200641706a22060d000b0b02402008450d00200910230b200241306a24000f0b101e000b200b4108102a000bbf07030d7f017e017f230041c0006b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0920072009490d0a200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d032001410c6a2107200141086a210a4100210b4104210c4100210d0340200d220e41016a210d410021034100210403402003411f4b0d07200a280200220520072802002208460d08200841016a21092008417f460d0c20052009490d0d200128020020086a2d0000210820072009360200200841ff00712003411f71742004722104200341076a21032008418001710d000b024020034120490d0020086741686a41ff01714104490d090b0240200b200e470d00200b4101742203200b41016a220820082003491b2203ad420286220f422088a70d0e200fa722084100480d0e02400240200b450d00200c200b41027420081027220c0d010c110b20081026220c450d100b2003210b0b20044108762110200c200e4102746a2004360200200d2006490d000c050b0b410f21030c010b200241013a000f2002413c6a4101360200200241073602142002420137022c2002419cf6c40036022820022002410f6a3602102002200241106a360238200241186a200241286a10a201410521030b200241086a2208200241186a41086a280200360200200220022902183703002000200336020420004101360200200041086a2002290300370200200041106a20082802003602000c0c0b4104210c4100210b4100210d0b2000200c360204200041003602002000410c6a200d360200200041086a200b360200200241c0006a24000f0b410f21030c080b200241013a00002002413c6a4101360200200241073602142002420137022c2002419cf6c400360228200220023602102002200241106a360238200241186a200241286a10a20120022802202104200228021c21092002280218210841002110410521030c070b410d21030c060b417f20091048000b20092007108c01000b417f20091048000b20092005108c01000b101e000b20084104102a000b20004101360200200041106a20043602002000410c6a2009360200200041086a200836020020002010410874200372360204200b450d00200c1023200241c0006a24000f0b200241c0006a24000bcf07010d7f230041c0086b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d082001280200220a20086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d03200241086a41004180081093041a2001410c6a210b200141086a210c4101210d4100210e41002108410021040340200720096b200620046b22034180082003418008491b2203490d05200920036a22052009490d0920072005490d0a200241086a200a20096a20031094041a200b20053602000240024002400240200e20086b20034f0d00200820036a22052008490d0f200e4101742209200520052009491b22094100480d0f200e450d01200d200e20091027220d0d020c100b200320086a21050c020b20091026220d450d0e0b2009210e0b200d20086a200241086a20031094041a02402006200320046a22044d0d00200b2802002109200c28020021072001280200210a200521080c010b0b200241086a200d200510a50120022802084101470d050240200e450d00200d10230b200041083a000420004101360200200241c0086a24000f0b410f21030c010b200241013a0098082002411c6a41013602002002410736028c082002420137020c2002419cf6c400360208200220024198086a36028808200220024188086a360218200241a8086a200241086a10a201410521030b2000200336020420004101360200200041086a20022902a808370200200041106a200241a8086a41086a2802003602000c090b2000428080808010370200200041086a4200370200200241c0086a24000f0b200241013a009708200241bc086a41013602002002410736028c08200242013702ac082002419cf6c4003602a808200220024197086a36028808200220024188086a3602b80820024198086a200241a8086a10a201200241b3086a200241a0086a28020036000020022002290398083700ab08200041053a000420004101360200200020022900a8083700052000410c6a200241af086a290000370000200e450d07200d1023200241c0086a24000f0b2000200d3602042000410c6a2005360200200041086a200e36020020004100360200200241c0086a24000f0b417f20091048000b20092007108c01000b200920051048000b20052007108c01000b101e000b20094101102a000b200241c0086a24000bcbbe0103087f017e037f230041e0006b22022400024020012802082203200128020c2204470d00200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d000021072001410c6a220820053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070ec001b504b50400840124b504aa01aa01aa01aa01aa01a801a501a701a101200b11aa01aa01aa01aa01aa01aa01aa01aa01a60103aa01aa01aa01aa0112189801511aaa01aa01aa0121520533069f0186016f238f019e01a40132080d8801379b01a20104013841714970548b010209441476783f8101752226778701070c252c1016920194011f96019a01a3015ba0011599015e1b5a0f9c019d011d900174720a0e42452813950119602f91018e01890129173497013a27644b5565624a7d407b2e8a0185012b8c0193011c463e2d8d016e3b1e7c5f487982012a3130363d6d5c6c80017f3583014e4f7e7366617a695d39533c674c436a4d6b5768634756505859b5040b20032005470dae01200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cb0020b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db30220046741686a41ff017141034b0db302410d21010cb2010b200320056b41084f0da801200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a2012002290318210a200041106a2002280220360200200041086a200a37020020004281808080d000370300200241e0006a24000f0b410e21070ca5010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de8012001450da70320032001490da803200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb1010b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb2010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb3010b413d21070ca1010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db00220046741686a41ff017141034b0db002410d21010cb3010b413121070c9f010b41d70021070c9e010b410021014100210903402001411f4b0db20120032005460de9012005417f460da8032003200541016a2207490da903200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dea010b410b21070ca8040b413e21070c9c010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dac0220046741686a41ff017141034b0dac02410d21010cb1010b41d80021070c9a010b41d00021070c99010b41c10021070c98010b410021014100210903402001411f4b0daf0120032005460de7012005417f460da6032003200541016a2204490da703200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b024020014120490d00410d210120076741686a41ff017141034d0de8010b20032004470dbf02200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b410021014100210903402001411f4b0daf0120032005460de8012005417f460da7032003200541016a2207490da803200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de9010b410f21070ca1040b41dc0021070c95010b413321070c94010b41cb0021070c93010b41c20021070c92010b41e50021070c91010b410021014100210903402001411f4b0daa0120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411021070c9b040b41de0021070c8f010b410021014100210903402001411f4b0da90120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411321070c99040b41ce0021070c8d010b41f90021070c8c010b41d30021070c8b010b41800121070c8a010b41c50021070c89010b410a21070c88010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d990220046741686a41ff017141034b0d9902410d21010ca3010b413921070c86010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d980220046741686a41ff017141034b0d9802410d21010ca3010b20032005470d8701200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090c88020b413f21070c83010b413a21070c82010b41e90021070c81010b41db0021070c80010b41e40021070c7f0b41860121070c7e0b41f60021070c7d0b41c00021070c7c0b41fc0021070c7b0b41f30021070c7a0b41e00021070c790b41880121070c780b41870121070c770b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c96010b410120036b2107200441026a2101410021054100210903402005411f4b0d9701200720016a4102460dd3012001450d920320032001490d9303200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c97010b41e60021070c740b41900121070c730b41890121070c720b410120036b2107200441026a2101410021054100210903402005411f4b0d9501200720016a4102460dd1012001450d900320032001490d9103200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c95010b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c96010b419b0121070c6f0b41e80021070c6e0b41ff0021070c6d0b419d0121070c6c0b418a0121070c6b0b41fb0021070c6a0b413621070c690b41f10021070c680b410120036b2107200441026a2101410021054100210903402005411f4b0d8f01200720016a4102460dcb012001450d8a0320032001490d8b03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dff0120046741686a41ff017141034b0dff01410d21010c8f010b41d90021070c660b41a00121070c650b413221070c640b41da0021070c630b41fa0021070c620b41a70121070c610b41830121070c600b20032005470d63200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41ef0021070c5e0b41eb0021070c5d0b419f0121070c5c0b41a20121070c5b0b41920121070c5a0b41930121070c590b41a90121070c580b410021014100210903402001411f4b0d810120032005460dbd012005417f460dfc022003200541016a2207490dfd02200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dbe010b411221070ce2030b410120036b2107200441026a2101410021054100210903402005411f4b0d8101200720016a4102460dbe012001450dfd0220032001490dfe02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490def0120046741686a41ff017141034b0def01410d21010c81010b419c0121070c550b4200210a410021010340410e21072001413f4b0dff0120032005460dbe012005417f460dfd022003200541016a2209490dfe02200620056a2d0000210420082009360200200441ff0071220bad2001413f71ad86200a84210a200141076a210120092105200441187441187522094100480d000b200941c0007121052001413f4b0dee012005450dee01200a427f2001413f71ad8684210a412e21070cde030b41ec0021070c530b41a80121070c520b41a40121070c510b41aa0121070c500b41ab0121070c4f0b41cf0021070c4e0b41c90021070c4d0b418c0121070c4c0b419a0121070c4b0b41cd0021070c4a0b41820121070c490b41df0021070c480b41970121070c470b41ee0021070c460b41a60121070c450b41ea0021070c440b41ed0021070c430b41960121070c420b419e0121070c410b41a50121070c400b41990121070c3f0b41a10121070c3e0b41a30121070c3d0b418d0121070c3c0b418b0121070c3b0b41fe0021070c3a0b410120036b2107200441026a2101410021054100210903402005411f4b0d66200720016a4102460da4012001450de40220032001490de502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dd40120046741686a41ff017141034b0dd401410d21010c660b41002101410021090340410d210b2001411f4b0dc00320032005460da5012005417f460de5022003200541016a2204490de602200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a210120042105200741187441187522044100480d000b200441c0007121052001411f4b0dd4012005450dd4012009417f2001411f7174722109412d21070cc3030b20032005470d3c200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41d60021070c360b41950121070c350b41d50021070c340b413821070c330b413421070c320b413b21070c310b413521070c300b41840121070c2f0b41980121070c2e0b41f20021070c2d0b41810121070c2c0b41f00021070c2b0b41940121070c2a0b418f0121070c290b418e0121070c280b413721070c270b41850121070c260b41910121070c250b20032005470d2b200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cae010b41f50021070c230b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbf0120046741686a41ff017141034b0dbf01410d21010c510b413c21070c210b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbe0120046741686a41ff017141034b0dbe01410d21010c510b41e30021070c1f0b41f40021070c1e0b200320056b41044f0d25200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120004281808080d000370300200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b41f70021070c1c0b41fd0021070c1b0b41e20021070c1a0b410120036b2107200441026a2101410021054100210903402005411f4b0d4c200720016a4102460d8b012001450dcc0220032001490dcd02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db80120046741686a41ff017141034b0db801410d21010c4c0b41d40021070c180b41e10021070c170b41c30021070c160b41f80021070c150b41c40021070c140b41dd0021070c130b41c60021070c120b41e70021070c110b410021014100210903402001411f4b0d4520032005460d84012005417f460dc5022003200541016a2207490dc602200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d85010b411121070c9b030b41cc0021070c0f0b41c70021070c0e0b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dad0120046741686a41ff017141034b0dad01410d21010c430b41d10021070c0c0b41d20021070c0b0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c420b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c430b41ca0021070c080b200241c8006a200110a80141042109200228024822064101470d10200041013602002000200241c8006a41047222012902003702042000410c6a200141086a290200370200200241e0006a24000f0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da90120046741686a41ff017141034b0da901410d21010c420b41c80021070c050b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da80120046741686a41ff017141034b0da801410d21010c420b410021014100210903402001411f4b0d4320032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410721070c8e030b410d21070c020b410021014100210903402001411f4b0d4220032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410821070c8c030b410621070b0c89030b2000410b3a000420004101360200200041056a20073a0000200241e0006a24000f0b200441096a2101200541784f0df00220032001490df102200620056a290000210a20082001360200413021070c87030b200441026a21092005417f460df10220032009490df202200620056a2c00002101200820093602004100210b20014100480d7f200141017441807f71200172220141ff0171220541847e6a220941034b0da101024020090e0400f301f101f201000b4103210b410421070c88030b200441026a21012005417f460df20220032001490df302200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21012005417f460df30220032001490df402200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21092005417f460df40220032009490df502200620056a2c00002101200820093602004100210b20014100480d8001200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f301f101f201000b4103210b410221070c85030b200441026a21092005417f460df50220032009490df602200620056a2c00002101200820093602004100210b20014100480d8101200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f501f301f401000b4103210b410321070c84030b200441056a21012005417c4f0df60220032001490df702200620056a280000210920082001360200412f21070c82030b200241d0006a280200210b200228024c2103200241d4006a2802002205450d81012005410274220c4102752207ad420286220a422088a70de802200aa722044100480de802200410262209450df70220054102742104200c417c6a210c410021050340200920056a200320056a2802003602002004200541046a2205470d000b200c41027641016a210d200b450dff020cfe020b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010c370b410f21010b0c370b410f21010c380b410f21010c390b410f21010c3a0b410f21010c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010c3c0b410f21010b0c3c0b410f21010b0c3d0b410f21010b0c3e0b410f21010b0c3e0b410f21010b0c3e0b410f21010c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010c400b410f21010c410b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241186a200241c8006a10a201200228022021012002290318210a410521070c410b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a2014105210b0c9a020b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b411821090b2002200229011e37010e200220022903183703080c81020b412c21074100210b0c86020b412b21074100210b0c85020b411821090b2002200229011e37010e200220022903183703080cfc010b411821090b2002200229011e37010e200220022903183703080cf9010b410021074100210d200b0dfc010cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3a2001417f460db8012003200141016a2207490db901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3b0b200bad210a412821070cfe010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3b2001417f460db9012003200141016a2207490dba01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3c0b200bad210a412721070cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3c2001417f460dba012003200141016a2207490dbb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3d0b200bad210a411621070cfc010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3d2001417f460dbb012003200141016a2207490dbc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3e0b200bad210a411821070cfb010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3e2001417f460dbc012003200141016a2207490dbd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3f0b200bad210a412121070cfa010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3f2001417f460dbd012003200141016a2207490dbe01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d400b200bad210a412221070cf9010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d402001417f460dbe012003200141016a2207490dbf01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d410b200bad210a411421070cf8010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d412001417f460dbf012003200141016a2207490dc001200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d420b200bad210a411c21070cf7010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d422001417f460dc0012003200141016a2207490dc101200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b41202107024020054120490d00410d210120046741686a41ff01714104490d430b200bad210a0cf6010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d432001417f460dc1012003200141016a2207490dc201200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d440b200bad210a411721070cf5010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d442001417f460dc2012003200141016a2207490dc301200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d450b200bad210a412421070cf4010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d452001417f460dc3012003200141016a2207490dc401200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d460b200bad210a412921070cf3010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d462001417f460dc4012003200141016a2207490dc501200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d470b200bad210a412a21070cf2010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411521070cf1010b200141c000490d0e2005450d0e200b41ff00470d0f0c110b2001417f6a2101410021054100210b03402005411f4b0d2220032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411b21070cef010b20014120490d102005450d102004417f7341ff00716741686a41ff01714105490dea010c110b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411a21070ced010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d482001417f460dc6012003200141016a2207490dc701200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d490b200bad210a412321070cec010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d492001417f460dc7012003200141016a2207490dc801200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4a0b200bad210a411d21070ceb010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4a2001417f460dc8012003200141016a2207490dc901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4b0b200bad210a412521070cea010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4b2001417f460dc9012003200141016a2207490dca01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4c0b200bad210a411e21070ce9010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4c2001417f460dca012003200141016a2207490dcb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4d0b200bad210a411921070ce8010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4d2001417f460dcb012003200141016a2207490dcc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4e0b200bad210a412621070ce7010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4e2001417f460dcc012003200141016a2207490dcd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4f0b200bad210a411f21070ce6010b41062109200541c001470de0014104210b410421070ce6010b41062109200541c001470dde014104210b410221070ce5010b41062109200541c001470ddc014104210b410321070ce4010b200441016a21012004417f460dd90120032001490dda01200620046a2d00002105200820013602002005450d54200041163a000420004101360200200041056a20053a0000200241e0006a24000f0b200141c000490d022009450d020b0b200020022f00083b0005200020073a000420004101360200200041106a2001360200200041086a200a370200200041076a2002410a6a2d00003a0000200241e0006a24000f0b412e21070cdd010b200441ff01716741686a41ff017141044b0d0020014120490d002005450dd9010b412d21070cdc010b410f21010c170b410f21010c180b410f21010c190b410f21010c1a0b410f21010c1b0b410f21010c1c0b410f21010c1d0b410f21010c1e0b410f21010c1f0b410f21010c200b410f21010c210b410f21010c220b410f21010c230b410f21010c240b410f21010c250b410f21010c260b410f21010c270b410f21010c280b410f21010c290b410f21010c2a0b410f21010c2b0b410f21010c2c0b410f21010c2d0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b4101210b0b410421070c96010b4102210b410421070c95010b4101210b0b410221070c93010b4102210b410221070c92010b4101210b0b410321070c90010b4102210b410321070c8f010b410c21074100210b0c8e010b417f20051048000b20052003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b101e000b200520011048000b20012003108c01000b417f20091048000b20092003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20091048000b20092003108c01000b417f20091048000b20092003108c01000b200520011048000b20012003108c01000b20044104102a000b417f20011048000b20012003108c01000b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b2000200b36020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200310230b024020022d004c4105470d002006450d00200241d4006a280200450d00200241d0006a28020010230b0240024002402007200d470d002007210d0c010b2007200d490d010240200d450d0020092007410274200d4102742205102722090d0120054104102a000b4100210d02402007450d00200910230b410421090b410021052001410c6a210b200141086a210c410021070240024002400240024003402005411f4b0d01200c2802002206200b2802002203460d02200341016a21042003417f460d0420062004490d05200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d210120036741686a41ff01714104490d030b2007ad422086200dad84210a410921070c070b410f21010c010b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200d41ffffffff0371450d0620091023200241e0006a24000f0b417f20041048000b20042006108c01000b418080c000104f000b0b0b20004100360200200041106a200a3703002000410c6a2009360200200041096a200b3a0000200041086a20073a00000b200241e0006a24000bbd07050c7f017e027f017e027f23004190026b2202240020024100360230200241306a20012802002203200128020422044104200441044922051b22061094041a2001200420066b22043602042001200320066a2206360200024020050d002002280230210720024200370214200241f098c400360210200241106a41086a21080240024002402007450d00200141046a2109200241c4006a210a200241c0006a210b200241306a410c6a210c4100210d034020024200370330200241306a200620044108200441084922051b22031094041a2009200420036b3602002001200620036a36020020050d022002290330210e200241086a200110452002280208450d020240024002400240200228020c2206417f4c0d00024002402006450d00200610ac01220f450d03200f200128020020092802002204200620042006491b22041094041a200928020022032004490d042009200320046b3602002001200128020020046a36020020042006470d010c050b4101210f41002006460d040b2006450d06200f10230c060b101d000b20064101102a000b200420031048000b200f450d022002200e370320024002402002280210220441f098c400460d00200228021421100c010b41e40110262204450d0441002110200441003b010620044100360200200441086a200241306a41dc011094041a20024100360214200220043602100b200d41016a210d2006ad22114220862011842111024002400340200441086a210520042f010622124103742103417f210602400240024003402003450d01200641016a2106417f4101200241206a2005410810960422134100481b410020131b2213450d05200341786a2103200541086a210520134101460d000b20100d010c020b201221062010450d010b2010417f6a2110200420064102746a41e4016a28020021040c010b0b200a200e370200200b2008360200200c2006360200200241306a41086a200241106a3602002002200436023420024100360230200220113702242002200f360220200241306a200241206a10ad01200d2007490d010c030b20042006410c6c6a220441e4006a2206280200210320062011370200200441e0006a220628020021042006200f36020002402004450d002003450d00200410230b200d20074f0d020b20092802002104200128020021060c000b0b20002002290310370200200041086a200828020036020020024190026a24000f0b2000410036020020022802102002280214200241186a28020010ae0120024190026a24000f0b41e4014104102a000b2000410036020020024190026a24000b0700200010fa030bea1105027f017e067f037e0b7f230041e0026b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241306a41086a2207200141086a28020036020020022001290200370330024020002f01062201410b4f0d00200020034103746a220841106a200841086a2208200120036b4103741095041a2008200437000020002003410c6c6a220141ec006a200141e0006a2209200041066a22082f010020036b410c6c1095041a200141e8006a200728020036020020092002290330370200200820082f010041016a3b01002002200036001720022006360013200241e0026a24000f0b02400240024041e4011026220a450d00200a41003b0106200a4100360200200a41086a200241d0006a41dc011094042107200241d0006a41086a2208200041b0016a280200360200200220002902a8013703502000413c6a330000210b2000413e6a310000210c20002d003f21092000350038210d2007200041c0006a200041066a220e2f010041796a22014103741094042107200a41e0006a200041b4016a2001410c6c109404210f200e41063b0100200a20013b0106200241c0006a41086a200828020036020020022002290350370340200d200b200c4210868442208684210b02400240200341064b0d00200041086a20034103746a220741086a2007200041066a22012f010020036b4103741095041a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c1095041a200741086a200241306a41086a280200360200200720022903303702000c010b200720034103746a41506a2007200341796a22084103746a2207200141ffff037120086b4103741095041a20072004370000200f2003410c6c6a220341b87f6a200341ac7f6a2207200a41066a22012f010020086b410c6c1095041a200341b47f6a200241306a41086a280200360200200720022903303702000b200120012f010041016a3b0100200241206a41086a2210200241c0006a41086a2211280200360200200220093a0017200220022903403703202002200b3e02102002200b4230883c00162002200b4220883d0114200241086a22122010280200360200200220022903203703002002290310210402400240024020002802002209450d0020002f0104211303402002200641016a220636021020022009360214200241306a41086a2214201228020036020020022002290300370330201341ffff0371210820092f01062200410a4d0d0241940210262207450d03200741003b010620074100360200200741086a200241d0006a418c021094042103200941386a290000210b200241d0006a41086a220f200941b0016a2802003602002002200941a8016a2902003703502003200941c0006a200941066a22152f0100220141796a22004103741094042116200741e0006a200941b4016a2000410c6c1094042117200741e4016a20094180026a2001417a6a220e4102741094042118201541063b0100200720003b01060240200e450d00410021002018210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b2011200f28020036020020022002290350370340200f20112802003602002002200229034037035002400240201341ffff0371220341064b0d00200941086a2200200841016a220e4103746a200020084103746a220020152f0100220120086b22134103741095041a20002004370000200941e0006a2008410c6c6a2200410c6a20002013410c6c1095041a200041086a2014280200360200200020022903303702002015200141016a22003b0100200941e4016a2201200841027422156a41086a2001200e4102746a2213200041ffff03712201200e6b4102741095041a2013200a360200200320014f0d01200920156a41e8016a2100034020002802002203200841016a22083b010420032009360200200041046a210020012008470d000c020b0b20162008417a6a22034103746a2016200841796a22004103746a220e200741066a22012f010020006b4103741095041a200e200437000020172008410c6c6a220e41b87f6a200e41ac7f6a221320012f0100221520006b410c6c1095041a200e41b47f6a2014280200360200201320022903303702002001201541016a220e3b01002018200841027422136a416c6a201820034102746a2201200e41ffff0371220820036b4102741095041a2001200a360200200320084b0d00200720136a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320082000470d000b0b2010200f280200360200200220022903503703202012201028020036020020022002290320370300024020092802002200450d0020092f0104211320002109200b21042007210a0c010b0b2007210a200b21040b41940210262200450d03200041003b010620004100360200200041086a200241d0006a418c0210940421012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f010622034103746a200437000020002003410c6c6a220141e8006a200241086a280200360200200141e0006a2002290300370200200041e4016a200341016a22034102746a200a360200200020033b0106200a20033b0104200a20003602000c040b200941086a2201200841016a22034103746a200120084103746a2201200020086b22074103741095041a2001200437000020092008410c6c6a220141ec006a200141e0006a220e2007410c6c1095041a200141e8006a200241306a41086a280200360200200e2002290330370200200941066a200041016a22003b0100200941e4016a220120084102746a41086a200120034102746a2201200041ffff0371220720036b4102741095041a2001200a360200201341ffff037120074f0d0320092003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b010420012009360200200341046a210320072000470d000c040b0b4194024104102a000b41e4014104102a000b4194024104102a000b200241e0026a24000be20303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200141016a2101200441e0006a2802002204450d030c010b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010232005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110232005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a2802002104024020064101460d00410120066b2101034020002802e4012100200141016a22010d000b0b410021012004450d020b2002417f6a210202402005a7450d00200410230b20020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002104200110232004450d00024020042802002201450d000340200410232001210420012802002200210120000d000b0b200410230b0bc10703097f047e017f230041e0006b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a41086a220720052003410c6c6a220a41f0026a280200360200200a41e8026a290200210b2001410c6a200341016a360200200141086a2004360200200141046a20053602002002200b370320200241306a41186a2006290300220b370300200241306a41106a2008290300220c370300200241306a41086a2009290300220d370300200241d8006a2007280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000f0b20004100360200200241e0006a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210b0c010b2004ad210b410021030b20051023200ba7210402400240200b422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210b0c010b2004ad210b410021050b20031023200ba7210420052103200b422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220a200341106a2900003703002002200341086a290000370300200241206a41086a220f20052006410c6c6a220341f0026a2802003602002002200341e8026a290200370320200520064102746a41f0036a2802002103024020074101460d00410120076b2105034020032802ec032103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241306a41186a2008290300220b370300200241306a41106a2009290300220c370300200241306a41086a200a290300220d370300200241d8006a200f280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000b970603087f017e017f23004180026b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341e0006c6a41e8026a41e0001094041a2001410c6a200341016a360200200141086a2004360200200141046a200536020020024180016a41186a200629030037030020024180016a41106a200829030037030020024180016a41086a2009290300370300200220022903003703800120024180016a41206a200241206a41e0001094041a200020024180016a4180011094041a20024180026a24000f0b2000420237032020024180026a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210a0c010b2004ad210a0b20051023200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210a0c010b2004ad210a0b20031023200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641e0006c6a41e8026a41e0001094041a200520064102746a418c0b6a2802002103024020074101460d00410120076b2105034020032802880b2103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a200336020020024180016a41186a200829030037030020024180016a41106a200929030037030020024180016a41086a200b290300370300200220022903003703800120024180016a41206a200241206a41e0001094041a200020024180016a4180011094041a20024180026a24000bc60401067f230041106b220224002002410036020820024201370300200120021041200141046a20021041200141086a20021041200228020421032002280208210402400240024002400240024002400240024002400240024002400240024020012d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22054100480d0c2004450d0320022802002004200510272203450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22054100480d0b2004450d0420022802002004200510272203450d050c060b200228020021030c080b200228020021030c050b2005102622030d050b20054101102a000b2005102622030d010b20054101102a000b20022005360204200220033602000b200241086a200441016a360200200320046a41003a00000c020b20022005360204200220033602000b200241086a200441016a360200200320046a41013a00000b200128020c21062002200141146a280200220136020c2002410c6a2002104102400240024020022802042205200241086a28020022036b20014f0d00200320016a22042003490d0320054101742207200420042007491b22074100480d032005450d0120022802002005200710272204450d020c040b200228020021040c040b2007102622040d020b20074101102a000b101e000b2002200736020420022004360200200721050b200420036a200620011094041a200041202004200320016a100402402005450d00200410230b200241106a24000b1600200120002802002200280200200028020810b3010b8408010b7f200028021021030240024002400240024002400240024002400240200028020822044101470d0020030d010c020b2003450d070b02402002450d00200120026a2105200041146a280200417f732106410021072001210320012108024002400340200341016a21090240024020032c0000220a4100480d00200a41ff0171210a20092103200641016a22060d010c030b02400240024020092005460d0020092d0000413f71210b200341026a22032109200a411f71210c200a41ff0171220a41e001490d010c020b4100210b20052103200a411f71210c200a41ff0171220a41e0014f0d010b200b200c41067472210a20092103200641016a22060d010c030b02400240024020032005460d00200341016a2209210d20032d0000413f71200b41067472210b200a41f001490d010c020b2005210d4100200b41067472210b200a41f0014f0d010b200b200c410c7472210a20092103200641016a22060d010c030b02400240200d2005460d00200d41016a2103200d2d0000413f71210a0c010b4100210a200921030b200b410674200c411274418080f0007172200a72220a418080c400460d03200641016a2206450d020b200720086b20036a21072003210820052003470d000c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b2004450d020c010b410021022004450d010b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200220096b2000410c6a28020022074f0d01410021064100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20076a2103410020002d0030220920094103461b2209410371450d0220094102460d0341002108200321060c040b2000280218200120022000411c6a28020028020c1102000f0b2000280218200120022000411c6a28020028020c1102000f0b200321080c010b20034101762106200341016a41017621080b417f2103200041046a2109200041186a210a2000411c6a210702400340200341016a220320064f0d01200a28020020092802002007280200280210110300450d000b41010f0b200041046a280200210941012103200041186a220a280200200120022000411c6a220628020028020c1102000d01200a280200210a417f2103200628020041106a210602400340200341016a220320084f0d01200a20092006280200110300450d000b41010f0b41000f0b2000280218200120022000411c6a28020028020c11020021030b20030bdb1801187f230041c00f6b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241206a41186a22062000412c6a290000370300200241206a41106a2207200041246a290000370300200241206a41086a22082000411c6a29000037030020022000290014370320200241a0026a200141e0001094041a024020032f01062201410b4f0d00200320044105746a220041286a200041086a2209200120046b4105741095041a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000200920022903203700002003200441e0006c6a220041c8036a200041e8026a2200200341066a22032f010020046b41e0006c1095041a2000200241a0026a41e0001094042100200320032f010041016a3b0100200241c00f6a240020000f0b02400240024041880b1026220a450d00200a41003b0106200a4100360200200a41086a20024190046a41800b10940421012002200341ca016a2d00003a00aa03200220032f00c8013b01a803200220032900db01370398032002200341e0016a29000037009d03200341cb016a280000210b200341cf016a280000210c200341d3016a280000210d200341d7016a280000210e20024190046a200341a8076a41e0001094041a2001200341e8016a200341066a22062f010041796a22004105741094042101200a41e8026a20034188086a200041e0006c1094042107200641063b0100200a20003b0106200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241b0036a20024190046a41e0001094041a02400240200441064b0d00200341086a20044105746a220141206a2001200341066a22002f010020046b4105741095041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200341e8026a200441e0006c6a220f41e0006a200f20002f010020046b41e0006c1095041a200f200241a0026a41e0001094041a0c010b200120044105746a41c07e6a2001200441796a22064105746a2201200041ffff037120066b4105741095041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a290300370000200120022903203700002007200441e0006c6a220041c07b6a200041e07a6a220f200a41066a22002f010020066b41e0006c1095041a200f200241a0026a41e0001094041a0b20024188026a41026a220420022d0096033a0000200020002f010041016a3b0100200220022f0194033b01880220022002290380033703800120022002290085033700850120024190016a200241b0036a41e0001094041a2002411c6a41026a221020042d00003a0000200220022f0188023b011c2002200229038001370308200220022900850137000d200241206a20024190016a41e0001094041a02400240024020032802002207450d0020032f0104211103402002419c026a41026a221620102d00003a0000200220022f011c3b019c0220022002290308370388022002200229000d37008d02200241a0026a200241206a41e0001094041a201141ffff0371210620072f01062203410a4d0d0241b80b10262201450d03200141003b010620014100360200200141086a20024190046a41b00b10940421002002200741ca016a2d00003a00aa03200220072f00c8013b01a803200220072900db01370398032002200741e0016a29000037009d03200741cb016a2800002112200741cf016a2800002115200741d3016a2800002114200741d7016a280000211320024190046a200741a8076a41e0001094041a2000200741e8016a200741066a22092f0100220441796a22034105741094042117200141e8026a20074188086a200341e0006c1094042118200141880b6a200741a40b6a2004417a6a22084102741094042119200941063b0100200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241b0036a20024190046a41e0001094041a200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241ac036a41026a220820022d0096033a0000200220022f0194033b01ac0320022002290380033703800120022002290085033700850120024190046a200241b0036a41e0001094041a02400240201141ffff0371220041064b0d00200741086a2203200641016a22044105746a200320064105746a220320092f0100221120066b22194105741095041a2003200e36000f2003200d36000b2003200c3600072003200b360003200341026a20162d00003a0000200320022f019c023b00002003200229038802370013200341186a200229008d02370000200741e8026a200641e0006c6a220341e0006a2003201941e0006c1095041a2003200241a0026a41e0001094041a2009201141016a22033b0100200741880b6a2211200641027422196a41086a201120044102746a2211200341ffff037120046b4102741095041a2011200a360200200020092f010022044f0d01200720196a418c0b6a2103034020032802002200200641016a22063b010420002007360200200341046a210320042006470d000c020b0b20172006417a6a22044105746a2017200641796a22034105746a2200200141066a22092f010020036b4105741095041a200041186a200229008d023700002000200e36000f2000200d36000b2000200c3600072000200b360003200041026a20162d00003a0000200020022f019c023b000020002002290388023700132018200641e0006c6a220041c07b6a200041e07a6a220020092f010020036b41e0006c1095041a2000200241a0026a41e0001094041a200920092f010041016a22003b01002019200641027422116a416c6a201920044102746a2209200041ffff0371220620046b4102741095041a2009200a360200200420064b0d00200120116a41f00a6a2100034020002802002204200341016a22033b010420042001360200200041046a210020062003470d000b0b20024184026a41026a220320082d00003a0000200220022f01ac033b01840220022002290380013703f00120022002290085013700f50120024190016a20024190046a41e0001094041a201020032d00003a0000200220022f0184023b011c200220022903f001370308200220022900f50137000d200241206a20024190016a41e0001094041a024020072802002203450d0020072f010421112012210b2013210e2014210d2015210c200321072001210a0c010b0b2012210b2013210e2014210d2015210c2001210a0b41b80b10262203450d03200341003b010620034100360200200341086a20024190046a41b00b10940421012003200528020022003602880b200520033602002005200528020441016a360204200041003b010420002003360200200120032f010622044105746a220020022f011c3b00002000200e36000f2000200d36000b2000200c3600072000200b36000320002002290308370013200041026a2002411c6a41026a2d00003a0000200041186a200229000d3700002003200441e0006c6a41e8026a200241206a41e0001094041a200341880b6a200441016a22004102746a200a360200200320003b0106200a20003b0104200a20033602000c040b200741086a2200200641016a22044105746a200020064105746a2200200320066b22014105741095041a2000200e36000f2000200d36000b2000200c3600072000200b360003200041026a2002419c026a41026a2d00003a0000200020022f019c023b00002000200229038802370013200041186a200229008d023700002007200641e0006c6a220041c8036a200041e8026a2200200141e0006c1095041a2000200241a0026a41e0001094041a200741066a2200200341016a22033b0100200741880b6a220120064102746a41086a200120044102746a2201200341ffff037120046b4102741095041a2001200a360200201141ffff037120002f010022034f0d03200a20043b0104200a200736020020042003460d032003417f6a210120072004417f6a22034102746a41900b6a2100034020002802002204200341026a3b010420042007360200200041046a21002001200341016a2203470d000c040b0b41b80b4108102a000b41880b4108102a000b41b80b4108102a000b200241c00f6a2400200f0bbe0101047f230041306b220124002001200010af01024020012802004101470d00200141286a2102200141246a21030340024020032802002204450d002002280200450d00200410230b2001200010af0120012802004101460d000b0b02402000280204220441f098c400460d0020042802002103200410232003450d0020032802002100200310232000450d00024020002802002204450d000340200010232004210020042802002203210420030d000b0b200010230b200141306a24000ba11f01407f23004190066b22042400200441e0006a41186a200241186a290000370300200441e0006a41106a200241106a290000370300200441e0006a41086a200241086a2900003703002004200229000037036002400240024002402001280200220541f098c400460d00200128020421060c010b41ec0310262205450d0141002106200541003b010620054100360200200541086a200441f8016a41e4031094041a20014100360204200120053602000b0c010b41ec034104102a000b41002102024003400240024002400240024002400240024020020e020001010b200541086a2107200541066a210820052f01062209410574210a417f2102024002400240024002400340200a450d01200241016a2102417f4101200441e0006a20074120109604220b4100481b4100200b1b220b450d04200a41606a210a200741206a2107200b4101460d000b20060d010c020b200921022006450d010b2006417f6a2106200520024102746a41ec036a2802002105410021020c0a0b200441086a41186a220b200441e0006a41186a220a290300370300200441086a41106a220c200441e0006a41106a2207290300370300200441086a41086a2209200441e0006a41086a220d290300370300200420042903603703082001200128020841016a360208200a200b2903003703002007200c290300370300200d200929030037030020042004290308370360200441e8016a41086a220c200341086a280200360200200420032902003703e80120082f01002209410b4f0d01200520024105746a220b41286a200b41086a220e200920026b4105741095041a200b41206a200a290300370000200b41186a2007290300370000200b41106a200d290300370000200e200429036037000020052002410c6c6a220a41f4026a200a41e8026a220d200541066a22072f010020026b410c6c1095041a200a41f0026a200c280200360200200d20042903e801370200200720072f010041016a3b01000c0a0b200441f8016a41086a220a20052002410c6c6a220241f0026a22072802003602002004200241e8026a22022902003703f8012007200341086a28020036020020022003290200370200200441e0006a41086a2202200a280200360200200420042903f801370360200041013602002000410c6a20022802003602002000200429036037020420044190066a24000f0b41ec031026220f450d04200f41003b0106200f4100360200200f41086a200441f8016a41e4031094042107200441f8016a41086a220d200541b8036a280200360200200420052902b0033703f8012004200541e0016a2900003700c501200420052900db013703c0012004200541ca016a2d00003a00d201200420052f00c8013b01d001200541cb016a2800002110200541cf016a2800002111200541d3016a2800002112200541d7016a28000021132007200541e8016a200541066a220b2f010041796a220a4105741094042107200f41e8026a200541bc036a200a410c6c109404210c200b41063b0100200f200a3b0106200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200441286a41086a200d280200360200200420042903f80137032802400240200241064b0d00200541086a20024105746a220a41206a200a20082f010020026b4105741095041a200a41186a200441e0006a41186a290300370000200a41106a200441e0006a41106a290300370000200a41086a200441e0006a41086a290300370000200a2004290360370000200541e8026a2002410c6c6a220a410c6a200a20082f010020026b410c6c1095041a200a41086a200441e8016a41086a280200360200200a20042903e8013702000c010b200720024105746a41c07e6a2007200241796a220d4105746a2207200a41ffff0371200d6b4105741095041a200741186a200441e0006a41186a290300370000200741106a200441e0006a41106a290300370000200741086a200441e0006a41086a29030037000020072004290360370000200c2002410c6c6a220241b87f6a200241ac7f6a220a200f41066a22082f0100200d6b410c6c1095041a200241b47f6a200441e8016a41086a280200360200200a20042903e8013702000b4101210d200820082f010041016a3b01004102211420044198016a41026a220220042d00be013a000041082115200441d8016a41086a2216200441286a41086a280200360200200420042f01bc013b019801200420042903a801370350200420042900ad01370055200420042903283703d801200441c0006a41086a221720162802003602002004413c6a41026a221820022d00003a0000200420042903d801370340200420042903503703282004200429005537002d200420042f0198013b013c2005280200220e450d0120052f0104211941ffff03211a410a211b419c04211c4100211d419404211e41ca01211f41db01212041e001212141cb01212241cf01212341d301212441d701212541b803212641b003212741e8012128410621294179212a4105212b41bc03212c41e802212d410c212e418804212f41ec032130417a21314118213241f00321334104210c41ac7f213441b87f213541b47f2136416c213741d40321380c060b20044194016a20146a223d20182d00003a0000200420042f013c3b019401200420042903283703602004200429002d37006520044198016a20156a223e201728020036020020042004290340370398012019201a712109200e2f01062202201b4d0d01201c1026220b450d02200b201d3b0106200b201d360200200b20156a200441f8016a201e109404210a2004200e201f6a2d00003a00d2012004200e2f00c8013b01d0012004200e20206a2900003703c0012004200e20216a2900003700c501200e20226a2800002139200e20236a280000213c200e20246a280000213b200e20256a280000213a200441f8016a20156a223f200e20266a2802003602002004200e20276a2902003703f801200a200e20286a200e20296a22402f01002207202a6a2202202b741094042141200b202d6a200e202c6a2002202e6c1094042142200b20306a200e202f6a200720316a22082014741094042143204020293b0100200b20023b010602402008450d00410021022043210a0340200a280200220720023b01042007200b360200200a200c6a210a20082002200d6a2202470d000b0b200441e8016a20156a2202203f280200360200200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200420042903f8013703e801200441d4016a20146a220820042d00be013a0000200420042f01bc013b01d401200420042903a8013703f801200420042900ad013700fd0120162002280200360200200420042903e8013703d801024002402019201a71220a20294b0d00200e20156a22022009200d6a2219202b746a20022009202b746a220220402f010020096b202b741095041a200220326a20042900653700002002201336000f2002201236000b2002201136000720022010360003200220146a203d2d00003a0000200220042f0194013b000020022004290360370013200e202d6a2009202e6c6a2202202e6a200220402f0100220720096b202e6c1095041a200220156a203e280200360200200220042903980137020020402007200d6a22023b0100200e20306a2207200920147422116a20156a200720192014746a22402002201a71220720196b2014741095041a2040200f360200200a20074f0d01200e20116a20336a210203402002280200220a2009200d6a22093b0104200a200e3602002002200c6a210220072009470d000c020b0b2041200920316a2207202b746a20412009202a6a2202202b746a220a200b20296a22192f010020026b202b741095041a200a20326a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a20146a203d2d00003a0000200a20042f0194013b0000200a200429036037001320422009202e6c6a220a20356a200a20346a224020192f0100221120026b202e6c1095041a200a20366a203e280200360200204020042903980137020020192011200d6a220a3b01002043200920147422406a20376a204320072014746a2219200a201a71220920076b2014741095041a2019200f360200200720094b0d00200b20406a20386a210a0340200a28020022072002200d6a22023b01042007200b360200200a200c6a210a20092002470d000b0b20044190016a20146a220220082d00003a000020044180016a20156a220a2016280200360200200420042f01d4013b019001200420042903f801370350200420042900fd01370055200420042903d801370380012017200a280200360200201820022d00003a00002004200429038001370340200420042903503703282004200429005537002d200420042f0190013b013c0240200e2802002202450d00200e2f0104211920392110203a2113203b2112203c21112002210e200b210f410121020c070b20392110203a2113203b2112203c2111200b210f0b419c0410262202450d03200241003b010620024100360200200241086a200441f8016a419404109404210d20022001280200220a3602ec03200120023602002001200128020441016a360204200a41003b0104200a2002360200200d20022f010622074105746a220a2004290328370013200a20042f013c3b0000200a201336000f200a201236000b200a2011360007200a2010360003200a41186a200429002d370000200a41026a2004413c6a41026a2d00003a000020022007410c6c6a220a41f0026a200441c0006a41086a280200360200200a41e8026a2004290340370200200241ec036a200741016a220a4102746a200f3602002002200a3b0106200f200a3b0104200f20023602000c060b200e41086a220a200941016a22074105746a200a20094105746a220a200220096b4105741095041a200a41186a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a41026a20044194016a41026a2d00003a0000200a20042f0194013b0000200a2004290360370013200e2009410c6c6a220241f4026a200241e8026a220a200e41066a220d2f0100220b20096b410c6c1095041a200241f0026a20044198016a41086a280200360200200a200429039801370200200d200b41016a22023b0100200e41ec036a220a20094102746a41086a200a20074102746a220a200241ffff0371220d20076b4102741095041a200a200f360200201941ffff0371200d4f0d05200e2007417f6a22024102746a41f0036a210a0340200a2802002207200241016a22023b01042007200e360200200a41046a210a200d2002470d000c060b0b419c044104102a000b41ec034104102a000b419c044104102a000b410121020c000b0b2000410036020020044190066a24000b9f3401087f23004190016b220824000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002410c6a280200200241106a28020010052209417f460d00410c1026220a450d01200a2009360208200a42818080801037020002404101450d00200a410141016a3602004101417e460d00200a410141027236020041041026220b450d03200b200a360200200a280208210c41031026220d450d04200d41026a41002d00cce2443a0000200d41002f00cae2443b000041061026220e450d05200e41046a41002f00cfbf443b0000200e41002800cbbf44360000412010262209450d062009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a41086a2802001006200a200a280204417f6a220d360204200d0d00200a10230b41031026220d450d07200d41026a41002d00cce2443a0000200d41002f00cae2443b000041031026220e450d08200e41026a41002d00cfe2443a0000200e41002f00cde2443b00002009412041c00010272209450d092009410836023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d36022041031026220d450d0a200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410f1026220e450d0b200e41076a41002900a6ce44370000200e410029009fce44370000200941c00041800110272209450d0c2009410936025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d36024041031026220d450d0d200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410f1026220e450d0e200e41076a41002900b5ce44370000200e41002900aece443700002009410a36027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d36026041031026220d450d0f200d41026a41002d00cce2443a0000200d41002f00cae2443b000041081026220e450d10200e42e5f0d1fbb5ac98b6ec00370000200941800141800210272209450d112009410b36029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d3602800141031026220d450d12200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d13200e41086a41002f00cdce443b0000200e41002900c5ce443700002009410c3602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a00141031026220d450d14200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d15200e41086a41002f00d7ce443b0000200e41002900cfce443700002009410d3602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c00141031026220d450d16200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d17200e41086a41002f00e1ce443b0000200e41002900d9ce443700002009410e3602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e00141031026220d450d18200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410b1026220e450d19200e41076a41002800eace44360000200e41002900e3ce44370000200941800241800410272209450d1a2009410f36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d3602800241031026220d450d1b200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410d1026220e450d1c200e41056a41002900f3ce44370000200e41002900eece44370000200941103602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a00241031026220d450d1d200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410c1026220e450d1e200e41086a4100280083cf44360000200e41002900fbce44370000200941113602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c00241031026220d450d1f200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410b1026220e450d20200e41076a410028008ecf44360000200e4100290087cf44370000200941123602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e00241031026220e450d21200e41026a41002d00cce2443a0000200e41002f00cae2443b000041151026220d450d22200d410d6a410029009fcf44370000200d41086a410029009acf44370000200d4100290092cf443700002009411336029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e3602800341031026220d450d23200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d24200e41086a41002f00afcf443b0000200e41002900a7cf44370000200941143602bc03200941003602b8032009428a808080a0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a00341031026220d450d25200d41026a41002d00cce2443a0000200d41002f00cae2443b000041071026220e450d26200e41036a41002800b4cf44360000200e41002800b1cf44360000200941153602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c00341031026220e450d27200e41026a41002d00cce2443a0000200e41002f00cae2443b000041111026220d450d28200d41106a41002d00c8cf443a0000200d41086a41002900c0cf44370000200d41002900b8cf44370000200941163602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e00341031026220d450d29200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410e1026220e450d2a200e41066a41002900cfcf44370000200e41002900c9cf4437000020094180044180081027220c450d2b200c411736029c04200c410036029804200c428e808080e00137029004200c200e36028c04200c42838080803037028404200c200d36028004410310262209450d2c200941026a41002d00cce2443a0000200941002f00cae2443b0000410e1026220d450d2d200d41066a41002900ddcf44370000200d41002900d7cf44370000200c41183602bc04200c41003602b804200c428e808080e0013702b004200c200d3602ac04200c4283808080303702a404200c20093602a004410310262209450d2e200941026a41002d00cce2443a0000200941002f00cae2443b000041101026220d450d2f200d41086a41002900edcf44370000200d41002900e5cf44370000200c41193602dc04200c41003602d804200c429080808080023702d004200c200d3602cc04200c4283808080303702c404200c20093602c004410310262209450d30200941026a41002d00cce2443a0000200941002f00cae2443b000041101026220d450d31200d41086a41002900fdcf44370000200d41002900f5cf44370000200c411a3602fc04200c41003602f804200c429080808080023702f004200c200d3602ec04200c4283808080303702e404200c20093602e00441031026220d450d32200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411110262209450d33200941106a41002d0095d0443a0000200941086a410029008dd04437000020094100290085d044370000200c411b36029c05200c410036029805200c4291808080900237029005200c200936028c05200c42838080803037028405200c200d3602800541031026220d450d34200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411610262209450d352009410e6a41002900a4d044370000200941086a410029009ed04437000020094100290096d044370000200c411c3602bc05200c41003602b805200c4296808080e0023702b005200c20093602ac05200c4283808080303702a405200c200d3602a00541031026220d450d36200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411210262209450d37200941106a41002f00bcd0443b0000200941086a41002900b4d044370000200941002900acd044370000200c411d3602dc05200c41003602d805200c4292808080a0023702d005200c20093602cc05200c4283808080303702c405200c200d3602c005410310262209450d38200941026a41002d00cce2443a0000200941002f00cae2443b0000410b1026220d450d39200d41076a41002800c5d044360000200d41002900bed044370000200c411e3602fc05200c41003602f805200c428b808080b0013702f005200c200d3602ec05200c4283808080303702e405200c20093602e005200841086a41086a2005360200200841086a41206a4100360200200841086a41146a200641086a2802003602002008200436020c2008200336020820084100360238200820073602342008200a36023020084201370320200820062902003702142008200128020036022c200241146a28020021072002411c6a280200210f2008410036025020084201370348200841183602880120084188016a200841c8006a10414100210402400240024002400240024002400340200c20046a220d28020021012008200d41086a28020022093602880120084188016a200841c8006a10410240024002400240200828024c2206200841c8006a41086a220e280200220a6b20094f0d00200a20096a2203200a490d0520064101742205200320032005491b22034100480d052006450d01200828024820062003102722060d020c060b200828024821060c020b200310262206450d040b2008200336024c200820063602480b200e200a20096a3602002006200a6a200120091094041a200d410c6a28020021052008200d41146a28020022013602880120084188016a200841c8006a10410240024002400240200828024c220a200e28020022036b20014f0d00200320016a22092003490d05200a4101742206200920092006491b22064100480d05200a450d012008280248200a2006102722090d020c070b200828024821090c020b200610262209450d050b2008200636024c200820093602482006210a0b200e200320016a2206360200200920036a200520011094041a0240024002400240024002400240024002400240024002400240024002400240200d41186a2802004101470d00200a2006470d01200a41016a2201200a490d11200a4101742203200120012003491b22014100480d11200a450d032009200a2001102722090d040c140b200a2006470d01200a41016a2201200a490d10200a4101742203200120012003491b22014100480d10200a450d052009200a2001102722090d060c140b200a21010c030b200a21010c050b200110262209450d100b2008200136024c200820093602480b200e200641016a220a360200200920066a41023a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0b20014101742205200320032005491b22034100480d0b2001450d03200920012003102722090d040c100b200110262209450d0e0b2008200136024c200820093602480b200e200641016a220a360200200920066a41013a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0820014101742205200320032005491b22034100480d082001450d03200920012003102722090d040c0e0b200310262209450d0c0b2008200336024c200820093602480b200e200641056a3602002009200a6a200d360000200441206a2204418006470d040c030b200310262209450d0a0b2008200336024c200820093602480b200e200641056a3602002009200a6a200d360000200441206a2204418006470d010b0b200828024c210902400240411f2007200f20082802482206200841d0006a280200200841086a1007220d417d460d00200d417f470d014100210a2009450d470c460b4102210a20090d450c460b41041026220e450d41200b280200220a28020041016a22014102490d07200a2001360200200e200a36020002402009450d00200610230b20022802042106200228020021012008410036025020084201370348200841003602880120084188016a200841c8006a104120082802502103200828024c21042008280248210a410a10ac012209450d4241012105024002400240200d20012006200a20032009410a200841086a10082206417d460d0020060d462008410936028c012008200941016a36028801024020092d00002206450d00024020064101470d00200841c8006a20084188016a10d0012008280248417e714104470d010b200910232004450d02200a10230c020b410021050b2009102302402004450d00200a10230b410321092005450d010b410221090b200841c8006a41386a200841086a41386a280200360200200841c8006a41306a200841086a41306a290300370300200841c8006a41286a200841086a41286a290300370300200841c8006a41206a200841086a41206a290300370300200841c8006a41186a200841086a41186a290300370300200841c8006a41106a200841086a41106a290300370300200841c8006a41086a200841086a41086a290300370300200820082903083703482000200841c8006a200910d101200d1009200e28020022092009280200417f6a3602000240200e28020022092802000d0020092802081006200e28020022092009280204417f6a360204200e28020022092802040d00200910230b200e102341012106410021010c460b101e000b20034101102a000b20064101102a000b20014101102a000b20014101102a000b20034101102a000b20034101102a000b00000b10d201000b410c4104102a000b41044104102a000b41034101102a000b41064101102a000b41204104102a000b41034101102a000b41034101102a000b41c0004104102a000b41034101102a000b410f4101102a000b4180014104102a000b41034101102a000b410f4101102a000b41034101102a000b41084101102a000b4180024104102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410b4101102a000b4180044104102a000b41034101102a000b410d4101102a000b41034101102a000b410c4101102a000b41034101102a000b410b4101102a000b41034101102a000b41154101102a000b41034101102a000b410a4101102a000b41034101102a000b41074101102a000b41034101102a000b41114101102a000b41034101102a000b410e4101102a000b4180084104102a000b41034101102a000b410e4101102a000b41034101102a000b41104101102a000b41034101102a000b41104101102a000b41034101102a000b41114101102a000b41034101102a000b41164101102a000b41034101102a000b41124101102a000b41034101102a000b410b4101102a000b41044104102a000b410a4101102a000b41e49cc300104f000b200610230b0240200a450d00200841c8006a41386a200841086a41386a280200360200200841c8006a41306a200841086a41306a290300370300200841c8006a41286a200841086a41286a290300370300200841c8006a41206a200841086a41206a290300370300200841c8006a41186a200841086a41186a290300370300200841c8006a41106a200841086a41106a290300370300200841c8006a41086a200841086a41086a290300370300200820082903083703482000200841c8006a200a10d10141002106410121010c010b20004187abc10036020420004102360200200041086a41103602000240200841146a2802002209450d00200841086a41106a280200450d00200910230b0240200841246a280200450d00200841206a28020010230b200841306a2209280200220a200a280200417f6a36020002402009280200220a2802000d00200a28020810062009280200220a200a280204417f6a360204200928020022092802040d00200910230b0240200841386a2802002209450d002008413c6a280200450d00200910230b4100210a03400240200c200a6a220941046a280200450d00200928020010230b0240200941106a280200450d002009410c6a28020010230b200a41206a220a418006470d000b200c1023200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081006200b28020022092009280204417f6a360204200b28020022092802040d00200910230b200b102320084190016a24000f0b4100210a03400240200c200a6a220941046a280200450d00200928020010230b0240200941106a280200450d002009410c6a28020010230b200a41206a220a418006470d000b200c1023200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081006200b28020022092009280204417f6a360204200b28020022092802040d00200910230b200b102341002109024020014100472006720d00200d100902400340200e20096a220a280200220d200d280200417f6a36020002400240200a280200220d2802000d00200d2802081006200a280200220d200d280204417f6a360204200a280200220a280204450d010b200941046a22094104470d010c020b200a1023200941046a22094104470d000b0b200e10230b20084190016a24000b5201027e02402003450d0020022802000d00200128022c220342002003290308220420023502047d220520052004562005507222021b37030820004105410420021b3602000f0b41c9b9c10041f4031021000bbb0e03047f037e047f230041900d6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042103200241146a2802002105200241246a2802002106200241346a2802002107200441106a2001280224290338420042204200109804200441386a4200370300200441306a4200370300200441286a4200370300200128022c2202420020022903082208427f200429031020042903184200521b7d220920092008562009507222021b370308200442003703200240024020020d0020012802282802082003200441206a4120100e2202417e460d0020020d06024002400240024002402005450d002004200141246a28020029033842002007ad220a42001098042001412c6a2802002202420020022903082208427f200429030020042903084200521b7d220920092008562009507222021b37030820020d052007450d0120074100480d0e20071026220b450d0f41012102200b2103024020074102490d00200b41002007417f6a220210930420026a2103200721020b200341003a00000c020b4100210b0c020b410021024101210b4200210a0b200141286a2802002802082006200b2002100e2203417e460d0120030d0a200b450d02200a2002ad4220868421090b20012802002102200441c0006a41186a2201200441206a41186a290300370300200441c0006a41106a2207200441206a41106a290300370300200441c0006a41086a2205200441206a41086a2903003703002004200429032037034020022802182103200441e0006a41186a2001290300370300200441e0006a41106a2007290300370300200441e0006a41086a200529030037030020042004290340370360200328020c0d082003410c6a417f360200200441d80c6a41186a200341e4006a290000370300200441d80c6a41106a200341dc006a290000370300200441d80c6a41086a200341d4006a2900003703002004200329004c3703d80c02400240200341106a220c280200220141f098c400460d00200341146a280200210d0c010b41880b10262201450d0d4100210d200141003b010620014100360200200141086a200441d8016a41800b1094041a200341146a4100360200200341106a20013602000b0240024002400240034020012f0106220e410574210641002102417f2107024002400240034020062002460d01200741016a2107417f4101200441d80c6a200120026a41086a412010960422054100481b410020051b2205450d05200241206a210220054101460d000b200d0d010c020b200e2107200d450d010b200d417f6a210d200120074102746a41880b6a28020021010c010b0b20044180016a41186a200441d80c6a41186a29030037030020044180016a41106a200441d80c6a41106a29030037030020044180016a41086a200441d80c6a41086a290300370300200420042903d80c37038001200341186a21024100210d41000d010c020b200341186a21024101450d010b200441f0016a4200370300200441ec016a41f098c400360200200441003602f801200441003602e801200442003703e001200441f098c4003602dc01200441003602d8012001200741e0006c6a41e8026a2102200441d8016a10b5010c010b200441f40c6a20044180016a41086a290300370200200441fc0c6a20044180016a41106a290300370200200441840d6a20044180016a41186a290300370200200420023602e80c200420073602e40c2004200c3602e00c200420013602dc0c2004200d3602d80c20042004290380013702ec0c2004418c026a4200370200200441f8016a20042903c80137030020044180026a200441c8016a41086a29030037030020044195026a20042900a0013700002004419d026a200441a0016a41086a290000370000200441a5026a200441a0016a41106a290000370000200441ad026a200441a0016a41186a290000370000200441b4026a200441bf016a280000360000200442003703f001200442003703d801200441f098c40036028802200441003a009402200441d80c6a200441d8016a10b40121020b200441d8016a41186a200441e0006a41186a290300370300200441d8016a41106a200441e0006a41106a290300370300200441d8016a41086a200441e0006a41086a290300370300200420042903603703d801200420093702a4012004200b3602a001200441d80c6a200241306a200441d8016a200441a0016a10b601024020042802d80c450d0020042802dc0c2202450d00200441e00c6a280200450d00200210230b2003410c6a2202200228020041016a360200410421020c020b200a500d00200b10230b410521020b20002002360200200441900d6a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b10e601000b41d8f6c400104f000b101e000b20074101102a000b41880b4108102a000b940302017f027e230041d0006b22042400024002402003450d0020022802000d002002280204210320042001280224290338420042204200109804200441286a4200370300200441206a4200370300200441186a4200370300200128022c2202420020022903082205427f200429030020042903084200521b7d220620062005562006507222021b3703082004420037031002400240024020020d0020012802282802082003200441106a4120100e2202417e460d0020020d04200441306a20012802002802182202410c6a200241cc006a2002410020022802001b200441106a10e5012004280230450d01200441c0006a41086a2203200441306a41086a28020036020020042004290330370340200141186a210202402001411c6a280200450d00200228020010230b20022004290340370200200241086a2003280200360200410021010c020b20004105360200200441d0006a24000f0b200141206a4100360200410121010b2000410036020020002001360204200441d0006a24000f0b41c9b9c10041f4031021000b41d8f6c400104f000bab0d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a20012802242903384200200241146a2802002202ad4200109804200128022c220342002003290308220b427f200429032020042903284200521b7d220c200c200b56200c507222031b37030820030d0e024002402002450d0020024100480d0a200210262203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e109304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e100e2205417e460d0020050d0a2003450d1120044180016a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1093041a20044180016a200320051094041a200d0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d00200310230b200441106a200141246a28020029033842002008ad42001098042001412c6a280200220242002002290308220b427f200429031020042903184200521b7d220c200c200b56200c507222021b37030820020d112008450d0120084100480d0b200810262202450d0e2002210541002103024020084102490d00200241002008417f6a220310930420036a21050b200541003a0000200341016a21030c020b2002450d10200310230c100b4100210841012102410021030b0240024002402001280228280208200720022003100e2205417e460d0020050d0d2002450d112004420037038801200442003703800120044180016a20022003411020034110491b1094041a2003410f4d0d0020044188016a290300210f200429038001211002402008450d00200210230b2004200141246a2802002903384200200aad42001098042001412c6a280200220242002002290308220b427f200429030020042903084200521b7d220c200c200b56200c507222021b37030820020d11200a450d01200a4100480d0b200a10262202450d1041012103200221050240200a4102490d0020024100200a417f6a220310930420036a2105200a21030b200541003a00000c020b2008450d10200210230c100b4100210a41012102410021030b024002400240024002402001280228280208200920022003100e2205417e460d0020050d112002450d13200141206a41003602002001411c6a280200210820012802182107200142013702182001412c6a2802002205290308220b210c2006500d012006210c200b20065a0d01410121032008450d0220071023200a0d030c040b200a450d12200210230c120b200541086a220e200b200c7d3703002005290310210b200441d0006a41186a200541186a2903003703002004200c3703582004200c3703502004200b370360200128020041186a280200210520044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a801200420083602a401200420073602a001200441f0006a200520044180016a2010200f200441d0006a20022003200441a0016a10e701200441f0006a41086a290300210c2004280274210520042802702108200e2004290358200e2903007c3703004101210320084101460d002005450d0002402001411c6a2203280200450d00200141186a28020010230b2003200c370200200141186a2005360200410021030b200a450d010b200210230b2000410036020020002003360204200441b0016a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d8f6c400104f000b20084101102a000b41d8f6c400104f000b200a4101102a000b20004105360200200441b0016a24000b8f1006027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a20012802242903384200200241146a2802002202ad4200109804200128022c220342002003290308220b427f200429032820042903304200521b7d220c200c200b56200c507222031b37030820030d13024002402002450d0020024100480d0a200210262203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e109304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e100e2205417e460d0020050d0a2003450d16200441f8006a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1093041a200441f8006a200320051094041a200d0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d00200310230b200441186a200141246a28020029033842002008ad42001098042001412c6a280200220242002002290308220b427f200429031820042903204200521b7d220c200c200b56200c507222021b37030820020d162008450d0120084100480d0b200810262202450d0e2002210541002103024020084102490d00200241002008417f6a220310930420036a21050b200541003a0000200341016a21030c020b2002450d15200310230c150b4100210841012102410021030b0240024002402001280228280208200720022003100e2205417e460d0020050d0d2002450d16200442003703c001200442003703b801200441b8016a20022003411020034110491b1094041a2003410f4d0d00200441c0016a290300210f20042903b801211002402008450d00200210230b200441086a200141246a2802002903384200200aad42001098042001412c6a280200220242002002290308220b427f200429030820042903104200521b7d220c200c200b56200c507222021b37030820020d16200a450d01200a4100480d0b200a10262202450d1041012103200221050240200a4102490d0020024100200a417f6a220310930420036a2105200a21030b200541003a00000c020b2008450d15200210230c150b4100210a41012102410021030b024002402001280228280208200920022003100e2205417e460d0020050d0e2002450d15200141206a41003602002001412c6a2802002205290308220b210c02402006500d004101210e2006210c200b2006540d130b200541086a2208200b200c7d3703002005290310210b20044198016a41186a200541186a2903003703002004200c3703a0012004200c370398012004200b3703a801200441b8016a200128020041186a2802002010200f20044198016a200441386a2002200310e2014101210e20042d00b8014101470d01200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200820044198016a41086a29030020082903007c37030020042004290378370358200a0d130c140b200a450d14200210230c140b200441f8006a41186a2203200441d1016a290000370300200441f8006a41106a2205200441c9016a290000370300200441f8006a41086a220e200441c1016a290000370300200420042900b901370378200441d8006a41086a2207200e290300370300200441d8006a41106a220e2005290300370300200441d8006a41186a22052003290300370300200820044198016a41086a29030020082903007c37030020042004290378370358200441b8016a41186a2005290300370300200441b8016a41106a200e290300370300200441b8016a41086a2007290300370300200420042903583703b8010240024002402001411c6a2802002205200141206a28020022036b41204f0d00200341206a220e2003490d0b20054101742203200e200e2003491b22034100480d0b2005450d01200141186a2802002005200310272205450d020c110b200141186a28020021050c110b2003102622050d0f0b20034101102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d8f6c400104f000b20084101102a000b41d8f6c400104f000b200a4101102a000b2001411c6a2003360200200141186a2005360200200141206a28020021030b200141206a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210e0b200a450d010b200210230b200041003602002000200e360204200441e0016a24000f0b20004105360200200441e0016a24000bd30403027f027e057f230041106b22042400024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903184200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b37030820030d09200128020c21032001410036020c2003450d02200141106a29020022074280808080105a0d03024002400240024020022007422088a722084d0d002007a7220920086b200220086b220a4f0d012008200a6a220b2008490d082009410174220c200b200b200c491b220b4100480d082009450d0220032009200b10272203450d030c090b2002200820022008491b21020c0b0b2003200822096a210b200a4102490d090c080b200b102622030d060b200b4101102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41bdbdc10041fd001021000b41ccabc400104f000b101e000b20074220882106200bad210720032006a722096a210b200a4102490d010b200b410020022008417f7322086a1093041a2003200920026a20086a22096a210b0b200b41003a0000200941016a21020b02402001280228280208200520032002100e2208417e460d0020080d022007a72108024020012802302205450d00200141346a280200450d00200510230b200141386a2002360200200141346a2008360200200141306a20033602000c010b2007a7450d00200310230b20004105360200200441106a24000f0b41d8f6c400104f000b900101027f200128020021040240412010262205450d002005200429001c370000200541186a200441346a290000370000200541106a2004412c6a290000370000200541086a200441246a29000037000002402001411c6a2204280200450d00200141186a28020010230b20004104360200200442a08080808004370200200141186a20053602000f0b41204101102a000b960101027f200128020028021821040240412010262205450d002005200429004c370000200541186a200441e4006a290000370000200541106a200441dc006a290000370000200541086a200441d4006a29000037000002402001411c6a2204280200450d00200141186a28020010230b20004104360200200442a08080808004370200200141186a20053602000f0b41204101102a000b7703017f027e017f200128022c220441186a2903002105200429031021060240411010262204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010230b20004104360200200742908080808002370200200141186a20043602000f0b41104101102a000b6202017e027f200128022c29030821040240410810262205450d002005200437000002402001411c6a2206280200450d00200141186a28020010230b20004104360200200642888080808001370200200141186a20053602000f0b41084101102a000bc103020b7f027e230041106b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120109604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d002006280200450d00200641106a290300210f200641086a29030021100c010b20042005411c6a2802002007200541206a28020028021c110400200441086a290300210f200528020c2108200429030021100b2005410c6a2008417f6a360200411010262206450d01200620103700002006200f37000802402001411c6a220d280200450d00200141186a28020010230b20004104360200200d42908080808002370200200141186a2006360200200441106a24000f0b10e401000b41104101102a000b7703017f027e017f2001280200220441086a2903002105200429030021060240411010262204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010230b20004104360200200742908080808002370200200141186a20043602000f0b41104101102a000bf80303047f027e017f230041306b220424000240024002400240024002402003450d0020022802000d0020034101460d0120022802100d01410521050240200241146a2802002203200128022422062802584b0d00200228020421072004200629033842002003ad4200109804200128022c2202420020022903082208427f200429030020042903084200521b7d220920092008562009507222021b37030820020d00024002402003450d0020034100480d06200310262202450d07410121062002210a024020034102490d00200241002003417f6a220610930420066a210a200321060b200a41003a00000c010b4100210341012102410021060b02402001280228280208200720022006100e2207417e460d0020070d042002450d01200441106a2002200610e301412010262205450d0720052004290310370000200541186a200441106a41186a290300370000200541106a200441106a41106a290300370000200541086a200441106a41086a29030037000002402001411c6a2206280200450d00200141186a28020010230b200642a08080808004370200200141186a2005360200410421050b2003450d00200210230b20002005360200200441306a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20034101102a000b41204101102a000b6202017e027f200128020029031021040240410810262205450d002005200437000002402001411c6a2206280200450d00200141186a28020010230b20004104360200200642888080808001370200200141186a20053602000f0b41084101102a000be70a04027f027e027f047e230041b0036b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429032820042903304200521b7d220720072006562007507222031b37030820030d0a024002402002450d0020024100480d05200210262203450d062003210841002109024020024102490d00200341002002417f6a220910930420096a21080b200841003a0000200941016a21090c010b4100210241012103410021090b024002402001280228280208200520032009100e2205417e460d0020050d042003450d0c200420093602ac01200420033602a801200441a0026a200441a8016a104420042802a0022205410e470d010b2002450d0b200310230c0b0b200441b0016a200441a0026a41047241ec001094041a20042005360238200441386a410472200441b0016a41ec001094041a02402002450d00200310230b200441003602a802200442013703a002200441386a200441a0026a103920042802a8022103024020042802a402450d0020042802a00210230b42002107200441a0026a41086a22024200370300200442003703a002418bcec200411b200441a0026a1000200441b0016a41086a22052002290300370300200420042903a0023703b00102400240200441b0016a411041a886c500410041001001417f460d00200442003703a802200442003703a002200441b0016a4110200441a0026a4110410010012209417f460d072009410f4d0d07200441a8026a290300210620042903a002210a0c010b4200210a420021060b20024200370300200442003703a00241a6cec200411b200441a0026a100020052002290300370300200420042903a0023703b00102400240200441b0016a411041a886c500410041001001417f460d00200442003703a802200442003703a002200441b0016a4110200441a0026a4110410010012202417f460d082002410f4d0d08200441a8026a290300210b20042903a00221070c010b4200210b0b2001412c6a2802002202290310220c200241186a290300220d844200510d07200441186a2007200b2003ad4200109804200441086a20042903182207200a7c220a200441186a41086a29030020067c200a200754ad7c200c200d10970420024200200229030822062004290308427f200441086a41086a290300501b7d220720072006562007507222031b37030802402003450d00200441386a10240c0b0b20012802002102200441b0016a200441386a41f0001094041a200441b8026a2002280218220241e4006a290000370300200441b0026a200241dc006a290000370300200441a0026a41086a200241d4006a2900003703002004200229004c3703a002200441c0026a200441b0016a41f0001094041a2002413c6a22032802002201200241386a280200470d09200141016a22052001490d0320014101742209200520052009491b2205ad4290017e2207422088a70d032007a722094100480d03024002402001450d00200241346a28020020014190016c200910272201450d010c0a0b2009102622010d090b20094108102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b41c8adc400104f000b200241386a2005360200200241346a20013602002002413c6a28020021010b200241346a28020020014190016c6a200441a0026a4190011094041a2003200328020041016a360200410421020c010b410521020b20002002360200200441b0036a24000b1600200041003602002000200141086a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141086a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128022429034042002005ad4200109804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510102202417e460d0020020d04410421030b20002003360200200441106a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41e8f7c400104f000b1600200041003602002000200141206a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141206a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021821082004200128022429034042002005ad4200109804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510102202417e460d0020020d04410421030b20002003360200200441106a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41e8f7c400104f000be50f04047f027e0d7f017e230041a0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d03200241246a2802002105200241346a2802002106024002400240200241146a2802002207450d0020022802042103200441c0006a200128022429033842002007ad4200109804200128022c2202420020022903082208427f200429034020042903484200521b7d220920092008562009507222021b3703084105210a20020d1920074100480d1220071026220b450d07200b210c41002102024020074102490d00200b41002007417f6a220210930420026a210c0b200c41003a000020012802282802082003200b200241016a220c100e2202417e460d0f20020d08200b450d192004200c3602542004200b360250200441386a200441d0006a10452004280238450d0f200428023c220dad2209421b88a70d092009420586a72202417f4c0d092002450d0120021026220e450d0a200d450d020c0b0b4101210e4100210c410021130c100b4101210e200d0d090b4100210c41002113200e450d0b0c090b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b20074101102a000b41d8f6c400104f000b101d000b20024101102a000b2004280250210f20042802542103410021104100211141002112200d21130340200441d8006a2003412020034120491b22026a41004100412020026b2002411f4b1b1093041a200441d8006a200f20021094041a2004200f20026a220f360250200320026b21142003411f4d0d02201241016a210c20044180016a41186a2203200441d8006a41186a29000037030020044180016a41106a2215200441d8006a41106a29000037030020044180016a41086a2216200441d8006a41086a2900003703002004200429005837038001024020122013470d002010200c200c2010491b2213ad4205862209422088a70d082009a722024100480d0802402012450d00200e201120021027220e0d010c070b20021026220e450d060b200e20116a2202200429038001370000200241186a2003290300370000200241106a2015290300370000200241086a2016290300370000201041026a2110201141206a211120142103200c2112200c200d490d000b20042014360254200e450d020b02402007450d00200b10230b200c200141246a28020028024c4d0d040c0a0b200420143602542013450d00200e10230b2007450d0a0b200b10230c090b20024101102a000b200e200c41004120200c676b108e010240200c4102490d00200e2102200c210303402002200241206a22074120109604450d07200721022003417f6a220341014b0d000b0b200441286a200128022429033842002006ad22174200109804200128022c2202420020022903082208427f200429032820042903304200521b7d220920092008562009507222021b37030820020d05024002402006450d0020064100480d02200610262202450d044101210720022103024020064102490d00200241002006417f6a220310930420036a2103200621070b200341003a00000c010b4100210641012102410021070b024002402001280228280208200520022007100e2203417e460d0020030d032002450d07200441086a200141246a28020022122903284200200cad4200109804200441186a20122903204200201742001098042001412c6a2802002103427f2109024020042903204200520d0020042903104200520d002004290318220820042903087c22172008540d00427f201720122903307c220920092017541b21090b200342002003290308220820097d220920092008562009507222121b3703082012450d010b2006450d06200210234105210a20130d070c080b20044180016a41186a22112001280200280218220341e4006a29000037030020044180016a41106a220a200341dc006a29000037030020044180016a41086a220f200341d4006a2900003703002004200329004c37038001200341306a221228020022012003412c6a280200470d04200141016a22102001490d002001410174220b20102010200b491b2210ad42e8007e2209422088a70d002009a7220b4100480d00024002402001450d00200341286a280200200141e8006c200b10272201450d010c050b200b102622010d040b200b4108102a000b101e000b41d8f6c400104f000b20064101102a000b2003412c6a2010360200200341286a2001360200200341306a28020021010b200341286a280200200141e8006c6a2203200429038001370001200341053a0000200341096a200f290300370000200341116a200a290300370000200341196a2011290300370000200341216a20042f00503b0000200341236a200441d2006a2d00003a00002003412c6a2007360000200341286a2006360000200341246a2002360000200341d0006a200441f8006a290300370300200341c8006a200441d8006a41186a290300370300200341c0006a200441d8006a41106a290300370300200341386a200441d8006a41086a290300370300200341306a2004290358370300200341e0006a200c360200200341dc006a20133602002003200e3602582012201228020041016a3602004104210a0c020b4105210a2013450d010b200e10230b2000200a360200200441a0016a24000bb80a03027f027e057f230041a00c6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b3703084105210820030d09024002402002450d0020024100480d05200210262203450d06410121092003210a024020024102490d00200341002002417f6a220910930420096a210a200221090b200a41003a00000c010b4100210241012103410021090b0240024002402001280228280208200520032009100e2205417e460d0020050d052003450d0c200442003703a801200442003703a001200441a0016a20032009411020094110491b1094041a2009410f4d0d00200441a8016a290300210720042903a001210602402002450d00200310230b2001280200280218220328020c0d082003410c6a417f36020020044180016a200341e4006a290000370300200441e8006a41106a200341dc006a290000370300200441f0006a200341d4006a2900003703002004200329004c370368200341106a220b280200220141f098c400460d01200341146a280200210a0c020b2002450d0b200310230c0b0b41880b10262201450d074100210a200141003b010620014100360200200141086a200441a0016a41800b1094041a200341146a4100360200200341106a20013602000b02400240034020012f0106220c410574210541002102417f2108024002400240034020052002460d01200841016a2108417f4101200441e8006a200120026a41086a412010960422094100481b410020091b2209450d05200241206a210220094101460d000b200a0d010c020b200c2108200a450d010b200a417f6a210a200120084102746a41880b6a28020021010c010b0b200441106a41186a200441e8006a41186a290300370300200441106a41106a200441e8006a41106a290300370300200441106a41086a200441e8006a41086a29030037030020042004290368370310200341186a21024100210a41000d010c090b200341186a21024101450d080b200441b8016a4200370300200441b4016a41f098c400360200200441003602c001200441003602b001200442003703a801200441f098c4003602a401200441003602a0012001200841e0006c6a41e8026a2102200441a0016a10b5010c080b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b10e601000b41880b4108102a000b20044184016a200441106a41086a2903003702002004418c016a200441106a41106a29030037020020044194016a200441106a41186a29030037020020042002360278200420083602742004200b3602702004200136026c2004200a3602682004200429031037027c200441d4016a4200370200200441c0016a2004290358370300200441c8016a200441d8006a41086a290300370300200441dd016a2004290035370000200441e5016a200441356a41086a290000370000200441ed016a200441356a41106a290000370000200441f5016a200441356a41186a290000370000200441fc016a200441d4006a280000360000200442003703b801200442003703a001200441f098c4003602d001200441003a00dc01200441e8006a200441a0016a10b40121020b200241286a2007370300200241206a2006370300200242013703182003410c6a2202200228020041016a360200410421080b20002008360200200441a00c6a24000bda03020b7f027e230041206b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120109604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d00200641186a280200220d450d00200641286a290300210f200641206a29030021100c010b200441086a2005411c6a2802002007200541206a280200280214110400200441186a290300210f200528020c2108200429031021102004280208210d0b2005410c6a2008417f6a360200411010262206450d0120062010427f200d1b3700002006200f427f200d1b37000802402001411c6a220d280200450d00200141186a28020010230b20004104360200200d42908080808002370200200141186a2006360200200441206a24000f0b10e401000b41104101102a000bff0203027f027e037f230041206b22042400024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222081b37030841052103024020080d00024002402002450d0020024100480d06200210262208450d07410121092008210a024020024102490d00200841002002417f6a220910930420096a210a200221090b200a41003a00000c010b4100210241012108410021090b02402001280228280208200520082009100e2201417e460d0020010d042008450d01200441106a2008200910a501024020042802100d002004280214200441186a280200100f0b410421030b2002450d00200810230b20002003360200200441206a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b870603027f017e087f230041c0006b220424002004200136020c2004200041a886c50020011b3602082004200441086a104502400240024002400240024002402004280200450d000240024002400240024020042802042205ad2206421c88a70d002006420486a72201417f4c0d00024002402001450d00200110262207450d032005450d010c040b4108210720050d030b410021014100210b2007450d050c030b101d000b20014108102a000b200441206a4104722108410021094100210a410021002005210b0340200441206a200441086a10d001200441306a41086a220c200841086a280200360200200420082902003703302004280220220d4104460d02200041016a2101200441106a41086a220e200c2802003602002004200429033037031002402000200b470d002009200120012009491b220bad4204862206422088a70d052006a7220c4100480d0502402000450d002007200a200c102722070d010c070b200c10262207450d060b2007200a6a2200200d3602002000410c6a200e280200360200200041046a2004290310370200200941026a2109200a41106a210a2001210020012005490d000b2007450d020b200441206a20022007200120031105002004410036023820044201370330200428022021004101102621010240024020004105470d002001450d06200141013a0000200442818080801037023420042001360230420121060c010b2001450d06200141003a000020044281808080103702342004200136023020014101410210272101024020004104470d002001450d08200141003a0001200442828080802037023420042001360230420221060c010b2001450d08200141013a0001200442828080802037023420042001360230200441206a200441306a10d302200441386a3502002106200428023021010b2001ad42208620068421060240200b450d00200710230b200441c0006a240020060f0b200b450d00200710230b41f19bc30041f0001021000b101e000b200c4108102a000b41014101102a000b41014101102a000b41024101102a000b41024101102a000bcb0401057f230041106b22022400200241003a0008200241086a200128020022032001280204220441004722051094041a024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002402004450d0020022d0008417f6a220441034b0d04024020040e0400030204000b20024100360208200241086a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d052000200228020836020420004100360200200241106a24000f0b20004104360200200241106a24000f0b20024100360208200241086a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d042000200228020836020420004102360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004101360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004103360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b200520041048000bb10201027f200128023021030240024002400240200241ff017122024103470d0020030d0320004100360200200128020c22000d010c020b200141346a2802002104024020024102470d002003450d00200141386a2802002102200041013602002000410c6a2002360200200041086a2004360200200041046a2003360200200128020c22000d010c020b20004102360200200041086a4110360200200041046a41c8b3c10036020002402003450d002004450d00200310230b200128020c2200450d010b200141106a280200450d00200010230b02402001411c6a280200450d00200128021810230b200128022822012001280200417f6a22003602000240024020000d002001280208100620012001280204417f6a22003602042000450d010b0f0b200110230f0b41d8b3c100104f000b0a004198abc100104f000bbf0303027f017e027f02402001450d000340200028026c21002001417f6a22010d000b0b4100210341002101024003402002450d010240200120002f01064f0d0020014103742104200141016a21012002417f6a2102200020046a41146a290200a74103470d010c020b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010232005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110232005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41f0006a2802002100200420074103746a41146a2902002105024020064101460d00410120066b21010340200028026c2100200141016a22010d000b0b410021012002417f6a21022005a74103470d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002104200110232004450d00024020042802002201450d000340200410232001210420012802002200210120000d000b0b200410230b0b9203010e7f230041b0016b22012400200141086a200010b001024020012903284202510d00200141e0006a2102200141dc006a2103200141d8006a2104200141a4016a2105200141a0016a21062001419c016a210720014198016a210820014190016a210903402002280200210a2004280200210b024002402003280200220c450d00200c210d200b210e0340200e2802ec03210e200d417f6a220d0d000b0340200b200b2f01064102746a41ec036a280200210b200c417f6a220c0d000c020b0b200b210e0b20014188016a41206a200a3602002005200b2f0106360200200641003602002007200b36020020084100360200200942003703002001200e36028c01200141003602880120014188016a10b501200141086a200010b001200141086a41206a2903004202520d000b0b02402000280204220b41f098c400460d00200b280200210c200b1023200c450d00200c280200210e200c1023200e450d000240200e280200220b450d000340200e1023200b210e200b280200220c210b200c0d000b0b200e10230b200141b0016a24000b9a0304027f017e027f017e230041c0006b2203240002400240411410262204450d00200441106a41002800f9b641360000200441086a41002900f1b641370000200441002900e9b64137000020044114413410272204450d01200420022900003700142004412c6a200241186a290000370000200441246a200241106a2900003700002004411c6a200241086a29000037000042002105200341206a41186a22024200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020044134200341206a1002200341186a2002290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012202417f460d022002410f4d0d02200341286a2903002108200329032021050c010b420021080b200410232000200837030820002005370300200341c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bfb0101057f230041c0006b22052400024002402003450d002003280208210620032802002103200541206a41186a22074200370300200541206a41106a22084200370300200541206a41086a220942003703002005420037032020044120200541206a1002200541186a2007290300370300200541106a2008290300370300200541086a200929030037030020052005290320370300200541003602202003200620054120200541206a100a210420052802202203417f460d012000200336020420002004360200200041086a2003360200200541c0006a24000f0b20004100360200200541c0006a24000f0b20004100360200200541c0006a24000b8b0201057f23004190016b22032400200341086a200210d801024020032d000822024102470d00200041003a000020034190016a24000f0b200341f0006a200341c8006a290300370300200341f8006a2204200341d0006a29030037030020034180016a2205200341d8006a29030037030020034188016a2206200341e0006a2903003703002003200341c0006a29030037036802402002450d00200041003a000020034190016a24000f0b2003413c6a2802002102200341386a280200210720002003290370370001200041013a0000200041196a2006290300370000200041116a2005290300370000200041096a200429030037000002402002450d00200710230b20034190016a24000bce0e06087f047e017f037e017f027e23004180016b220224000240024002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241386a41186a22014200370300200241386a41106a22044200370300200241386a41086a220542003703002002420037033820034137200241386a1002200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033837030802400240024002400240024002400240200241086a412041a886c500410041001001417f460d002002422037022c2002200241086a360228200241003a0038200241086a4120200241386a410141001001210120022002280230200141016a41014b22016a22043602302001450d0720022d003822014101460d0120010d072002200241286a104a2002280200450d0720022802042201417f4c0d0a2001450d02200110ac012206450d0b200241306a22072001410020022802282204200228022c2205200620012007280200100122082008417f461b2208200820014b1b220920072802006a220836020020092001460d030c060b200041023a00000c040b4200210a200241d0006a4200370300200241c8006a4200370300200241386a41086a42003703002002420037033841002105200241286a41086a22064100200241086a4120200241386a41202004100122012001417f461b2201412020014120491b20062802006a360200024002402001411f4d0d002002200228003b36007b20022002280238360278200241c7006a290000210b200229003f210c200229004f210d2002310057210a2002200228007b36007320022002280278360270410121050c010b0b2002200228007336003b200220022802703602382005450d052002200228003b36006b200220022802383602682002200228006b360063200220022802683602602002200228006336003b200220022802603602382002200241dc006a28000036007b20022002280059360278410121010c020b4101210620022802282204200228022c220541014100200241306a280200220810011a41002001470d030b20024100360238200241286a41086a2207410020042005200241386a41042008100122082008417f461b2208410420084104491b20072802006a2209360200200841034d0d0220022802382108200241d0006a4200370300200241c8006a4200370300200241386a41086a4200370300200242003703382007410020042005200241386a412020091001220e200e417f461b220e4120200e4120491b20096a220936020002400240200e411f4d0d002002200228003b36007b20022002280238360278200241c7006a290000210f200229003f2110200229004f211120022d005721072002200228007b360073200220022802783602704101210e0c010b4100210e0b2002200228007336003b20022002280270360238200e450d022002200228003b36006b200220022802383602682002420037034020024200370338200241286a41086a2212410020042005200241386a411020091001220e200e417f461b220e4110200e4110491b20096a2209360200200e410f4d0d02200241386a41086a290300210b2002290338210c200242003703382012410020042005200241386a410820091001220e200e417f461b220e4108200e4108491b20096a2209360200200e41074d0d022002290338210d200241003a0038200241306a200920042005200241386a41012009100141016a41014b220e6a2209360200200e450d020240024020022d0038220e450d00200e4101470d0420024200370338200241286a41086a410020042005200241386a41082009100122042004417f461b2204410820044108491b20096a360200200441074d0d04200229033821134201210a0c010b4200210a0b2001ad221442208620148421142002200228006b360063200220022802683602602002200228006336007b200220022802603602782002200241dc006a28000036003b20022002280059360238410021010b2002200228003b36007320022002280238360270200220022802783602682002200228007b36006b200041106a200b370000200041086a200c370000200041cf006a200f370000200041c7006a2010370000200020013a00002000413c6a2008360000200041346a2014370000200041306a2006360000200041286a2013370000200041206a200a370000200041186a200d370000200041df006a20073a0000200041d7006a201137000020002002280270360001200041046a2002280073360000200041c0006a2002280268360000200041c3006a200228006b3600000b2003102320024180016a24000f0b2001450d00200610230b41d4aac10041331021000b41174101102a000b41374101102a000b101d000b20014101102a000baf0201047f230041c0006b2202240002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002412041a886c500410041001001210120031023200241c0006a24002001417f470f0b41174101102a000b41374101102a000b840102017f037e230041e0006b220324002003200210d8010240024020032d000022024102470d00420021040c010b2002410173ad2104200341106a2903002105200341086a290300210620020d00200341346a280200450d00200341306a28020010230b2000200637030820002004370300200041106a2005370300200341e0006a24000bdb2710067f017e177f017e017f017e047f027e017f047e027f017e027f037e037f017e230041c0046b22022400200241106a4200370300200242003703082002420037030020012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b200241086a2107200241186a411c6a20042f0106360200200241186a41186a4100360200200241186a41146a20043602002002200336023820024100360228200242003703202002200136021c2002410036021820024180016a200241186a10b0010240024002400240024020022903a00122084202520d00200241186a10d4010c010b20024180016a41c0006a210920024180016a41386a210a20024180016a410472210b200241dd016a210c20024180016a41086a2103200241e0026a41386a210d20024180016a41306a210e20024180016a41286a210f200241c8016a2110200241d0016a211120024180016a41d8006a2112200241dc016a211320024180016a411c6a211420024180016a41146a211520024180016a41346a2116200241b8036a41206a2217410f41edccc2006b41f5ccc2006a200241b8036a6b6a2118200241e0026a412c6a2119200241a4016a211a200241bc016a211b0340200241e0006a41186a220420024180016a41186a2221290300370300200241e0006a41106a220120024180016a41106a2223290300370300200241e0006a41086a22052003290300370300200241c0006a41086a2206200c41086a290000370300200241c0006a41106a2231200c41106a290000370300200241c0006a41186a2232200c41186a29000037030020022002290380013703602002200c290000370340200e290300212c200f290300212d2010290300213320092903002134200a2903002130201129030021352012280200213620132d0000213720024180026a41186a2229200429030037030020024180026a41106a2238200129030037030020024180026a41086a220120052903003703002002200229036037038002200241a0026a41186a22042032290300370300200241a0026a41106a22322031290300370300200241a0026a41086a22312006290300370300200220022903403703a00202400240024002400240024020084201520d0020024180016a20024180026a202d202c10dc01202329030021392003290300212d20212d00002105200229038001212a200241106a22062903002108200241086a222e290300212c02400240024002400240024020022903004201520d00202a4200510d01427f200820397c202c202d7c222d202c542226ad7c222c2026202c200854202c2008511b22261b212a427f202d20261b212b0c040b202a4200510d01202c202d56200820395620082039511b450d02200820397d202c202d54ad7d212a202c202d7d212b420021080c040b203920087d202d202c54ad7d200820397d202c202d54ad7d202d202c562039200856203920085122261b22251b212a202d202c7d202c202d7d20251b212b202d202c58203920085820261bad21080c030b427f200820397c202c202d7c222d202c542226ad7c222c2026202c200854202c2008511b22261b212a427f202d20261b212b420021080c020b203920087d202d202c54ad7d212a202d202c7d212b0b420121080b2006202a370300202e202b37030020022008370300200541ff01710d010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020360d0020304201510d00203741ff01714101460d002035a721042035422088a72201450d01410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c030b0b20024180016a20024180026a10d80120022d00800122054103714102460d0220054101470d0320050d132016280200450d13200e28020010232035a721042035422088a722010d140c150b200421010b20024180016a41206a4100360200201420042f0106360200202141003602002015200436020020234100360200200342003703002002200136028401200241003602800120024180016a10b5010c150b024020050d002016280200450d00200e28020010230b42022108203741ff01710d010c100b200241c0026a41086a2205200941086a290300370300200241c0026a41106a2206200941106a290300370300200241c0026a41186a222e200941186a290300370300200220092903003703c0022023290300212820032903002127201b280200211c200a280200211d2016280200211e200e280200211f200f29030021202021290300212220024180016a41206a29030022084202520d01203741ff0171450d0f0b200241a0046a41186a22262004290300370300200241a0046a41106a22252032290300370300200241a0046a41086a22242031290300370300200220022903a0023703a004200241b8036a41086a22064200370300200242003703b80341d0c5c200411a200241b8036a100020032006290300370300200220022903b8033703800120024180016a411041a886c500410041001001417f460d01200241003602b80320024180016a4110200241b8036a41044100100141016a41044d0d0820022802b80321050c020b201d417f4c0d0b02400240201d0d00410121010c010b201d10262201450d0d2001201f201d1094041a0b200d20022903c002370300200241e0026a41346a201c360200200241e0026a41306a201d3602002019201d360200200241e0026a41286a2001360200200241e0026a41206a2020370300200241e0026a41106a2022370300200241e0026a41186a2008420151ad222d370300200d41086a2005290300370300200d41106a2006290300370300200d41186a202e290300370300200220273703e002200220283703e802201d212f201d21292022212c2027212a2028212b201c210520304201510d020c030b410021050b20064200370300200242003703b80341b9c5c2004117200241b8036a100020032006290300370300200220022903b803370380010240024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b80342017c212c0c010b4201212c0b20064200370300200242003703b80341b9c5c2004117200241b8036a100020032006290300370300200220022903b803370380012002202c3703b80320024180016a4110200241b8036a4108100441201026222e450d06202e200229038002370000202e41186a2029290300370000202e41106a2038290300370000202e41086a2001290300370000202e412041c00010272229450d072029202c37002020214200370300202342003703002003420037030020024200370380012029412820024180016a1002200241b8036a41186a2021290300370300200241b8036a41106a20232903003703002006200329030037030020022002290380013703b803413710262201450d08200142bac6a1cbc68dd9aff300370000200142f4dec98bf6ac999de400370008200141e5cc85ab07360010200141ece8013b00142001413a3a0016200120022903b803370017200120022903c00337001f200120022802c803360027200120022f01cc033b002b200120022d00ce033a002d200120022d00cf033a002e200120022d00d0033a002f200120022d00d1033a0030200120022d00d2033a0031200120022d00d3033a0032200120022d00d4033a0033200120022d00d5033a0034200120022d00d6033a0035200120022d00d7033a0036202910234200212d20064200370300200242003703b80341af98c300410d200241b8036a100020032006290300370300200220022903b803370380014200212c024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b803212c0b200241e0026a41346a2005360200200241e0026a41306a20183602004137212f20194137360200200241e0026a41286a2001360200200d20022903a004370000200241e0026a41186a4200370300200241e0026a41106a202c370300200d41086a2024290300370000200d41106a2025290300370000200d41186a2026290300370000427f212a2002427f3703e8022002427f3703e00220182129427f212b20304201520d010b200220343703e002200220333703e8022034212a2033212b0b0240203741ff0171450d00200d20022903a002370000200d41186a2004290300370000200d41106a2032290300370000200d41086a20312903003700000b02402036450d0042002139200241b8036a41086a22044200370300200242003703b80341af98c300410d200241b8036a100020032004290300370300200220022903b80337038001024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b80321390b4201212d200241e0026a41186a4201370300200241e0026a41206a20393703000b2035a72104024002402035422088a72206450d00410020066b2231213220042106034020062802ec032106203241016a22320d000b0340200420042f01064102746a41ec036a2802002104203141016a22310d000c020b0b200421060b20042f0106213120172036360200200241b8036a411c6a2031360200200241b8036a41186a22264100360200200241b8036a41146a2004360200200241b8036a41106a22254100360200200241b8036a41086a22244200370300200220063602bc03200241003602b80320024180016a200241b8036a10af0102402002280280014101470d000340200241e0036a41186a2231200b41186a290200370300200241e0036a41106a2232200b41106a290200370300200241e0036a41086a2236200b41086a2902003703002002200b2902003703e003201a2802002104200f280200213820024180016a412c6a280200210620024180046a41186a203129030037030020024180046a41106a203229030037030020024180046a41086a2036290300370300200220022903e00337038004202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a1002200241a0046a41186a22322021290300370300200241a0046a41106a22362023290300370300200241a0046a41086a2237200329030037030020022002290380013703a004200241003602800120012029200241a0046a412020024180016a100a212e02402002280280012231417f460d00200520316b21052031450d00202e10230b024002402004450d00202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a100220322021290300370300203620232903003703002037200329030037030020022002290380013703a00420012029200241a0046a412020042006100b200520066a21052038450d01200410230c010b202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a100220322021290300370300203620232903003703002037200329030037030020022002290380013703a00420012029200241a0046a4120100c0b20024180016a200241b8036a10af012002280280014101460d000b200241e0026a41346a20053602000b200241b8036a10b5012026200241c0026a41186a2903003703002025200241c0026a41106a2903003703002024200241c0026a41086a290300370300200220022903c0023703b803024020084202510d002016201c360200200e201d36020020024180016a412c6a201e360200200f201f36020020024180016a41206a20203703002021200837030020232022370300200a20022903b803370300200a41086a2024290300370300200a41106a2025290300370300200a41186a20262903003703002002202737038001200220283703880141012104024002400240201d2029470d0002400240201f2001460d00201f2001201d1096040d02201c2005470d020c010b201c2005470d010b200a200d41201096040d002027202a852028202b85844200520d002022202c520d002008a72205202da7470d0020054101462020200241e0026a41206a29030052712104201e0d010c020b201e450d010b201f10230b20044102460d0020040d00202f450d0e200110230c0e0b2003200241e0026a41d8001094041a200241003a00800120024180026a20024180016a10dd010c0d0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41204101102a000b41c0004101102a000b41374101102a000b101d000b201d4101102a000b2035a721042035422088a72201450d010b410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c020b0b200421010b20024180016a41206a2036360200201420042f0106360200202141003602002015200436020020234100360200200342003703002002200136028401200241003602800120024180016a10b5010b20024180016a200241186a10b00120024180016a41206a29030022084202520d000b20022903002135200241186a10d401203550450d010b200241086a290300200241106a2903008450450d0220022903004200510d010b200220073602800120024180016a10de01200241c0046a24000f0b200220073602800120024180016a107b200241c0046a24000f0b41b4b8c100104f000b970a03057f037e017f23004190016b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a20082903003703002004200429032037030002400240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012206417f460d022006410f4d0d02200441286a29030021092004290320210a0c010b4200210a420021090b20051023200441206a41086a22054200370300200442003703204182b6c100411b200441206a1000200441086a20052903003703002004200429032037030002402004411041a886c500410041001001417f460d00200442003703282004420037032020044110200441206a4110410010012205417f460d022005410f4d0d02200a2009844200520d002004290320200258200441286a290300220b200358200b2003511b0d0020004200370300200041013a0018200041106a4200370300200041086a420037030020044190016a24000f0b200441206a41086a22054200370300200442003703204182b6c100411b200441206a1000200441086a200529030037030020042004290320370300024002402004411041a886c500410041001001417f460d00200442003703282004420037032020044110200441206a4110410010012205417f460d062005410f4d0d062004290320200258200441286a290300220b200358200b2003511b0d0020012002200310df01410121050c010b411410262205450d06200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d07200520012900003700142005412c6a200141186a220c290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a2008290300370300200420042903203703002004412041a886c50041004100100121062005102302402006417f470d00200110e001200441d8006a2003370300200441d0006a2002370300200441206a41086a41003a0000200441296a2001290000370000200441316a200141086a290000370000200441396a200141106a290000370000200441c1006a200c290000370000200441023a002041a886c5004100200441206a102c0b20012002200310df01410021050b2000200a20027d2002200a7d200a200256200920035620092003511b22011b370308200020053a001820002001ad370300200041106a200920037d200a200254ad7d200320097d2002200a54ad7d20011b37030020044190016a24000f0b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41144101102a000b41344101102a000bd00201047f230041c0006b2202240002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320002900003700172003412f6a200041186a290000370000200341276a200041106a2900003700002003411f6a200041086a290000370000200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1002200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a10b30220031023024020012d00000d00200141346a280200450d00200141306a28020010230b200241c0006a24000f0b41174101102a000b41374101102a000bcd0202047f047e230041206b22012400200141106a41086a220242003703002001420037031041ecb5c1004116200141106a1000200141086a22032002290300370300200120012903103703000240024002402001411041a886c500410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b2000280200220041086a290300210720002903002108200242003703002001420037031041ecb5c1004116200141106a1000200320022903003703002001200129031037030020014200200520077d2006200854ad7d2207200620087d2208200656200720055620072005511b22021b37031820014200200820021b37031020014110200141106a41101004200141206a24000f0b41d4aac10041331021000ba01f05017f017e017f017e067f230041f0016b2203240042002104200341206a41086a22054200370300200342003703204182b6c100411b200341206a1000200341d0016a41086a2005290300370300200320032903203703d0010240024002400240200341d0016a411041a886c500410041001001417f460d002003420037032820034200370320200341d0016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441142107411410262205450d010c030b42002106411421074114102622050d020b20074101102a000b41d4aac10041331021000b200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b641370000024002400240024002400240024002400240024002400240024020052007413410272205450d00200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413420034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200320013703d001200320023703d801200341206a4120200341d0016a41101004200510232004200158200620025820062002511b0d0b411410262205450d02200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d03200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341086a2005413410e101200341086a41106a2903002102200329031021012003280208210a20051023410e10262205450d04200541066a41002900b0b741370000200541002900aab7413700002005410e412e10272205450d052005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a412010032005102302402001200284500d00200a450d0020032001370320200320023703282003200341206a3602d001200341d0016a10de010b410e10262205450d06200541066a4100290094c7403700002005410029008ec7403700002005410e412e10272205450d072005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a200929030037030020032003290390013703d00102400240200341d0016a412041a886c500410041001001417f460d00200341206a41186a4200370300200341206a41106a4200370300200341206a41086a420037030020034200370320200341d0016a4120200341206a4120410010012207417f460d032007411f4d0d03200341b0016a41186a2207200341206a41186a290300370300200341b0016a41106a2208200341206a41106a290300370300200341b0016a41086a2209200341206a41086a290300370300200320032903203703b001200341d0016a4120100320051023200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a2009290300370300200320032903b0013703d001410e10262205450d0a200541066a41002900c6c740370000200541002900c0c7403700002005410e412e10272205450d0b200520032903d00137000e200541266a200341d0016a41186a2903003700002005411e6a200341d0016a41106a290300370000200541166a200341d0016a41086a29030037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023410d2107410d10262205450d010c0c0b20051023410d2107410d102622050d0b0b20074101102a000b41344101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b200541056a41002900ee9c41370000200541002900e99c41370000024002400240024002400240024002400240024020052007412d10272205450d002005200029000037000d200541256a200041186a2900003700002005411d6a200041106a290000370000200541156a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412d20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411210262205450d01200541106a41002f00a6f5403b0000200541086a410029009ef54037000020054100290096f54037000020054112413210272205450d02200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a412010032005102320001085012000108601200341206a200010d801024002400240024020032d00202205410371450d0020054102470d0120050d02200341d4006a280200450d02200341d0006a2802001023411721074117102622050d030c070b200341d4006a2802002105200341d0006a2802002207200341d8006a280200100d2005450d0120071023411721074117102622050d020c060b20050d00200341d4006a280200450d00200341d0006a28020010230b41172107411710262205450d040b2005410f6a41002900abcd42370000200541086a41002900a4cd423700002005410029009ccd4237000020052007413710272205450d04200520002900003700172005412f6a200041186a290000370000200541276a200041106a2900003700002005411f6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413720034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411210262205450d05200541106a41002f00c4ad443b0000200541086a41002900bcad44370000200541002900b4ad4437000020054112413210272205450d06200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411810262205450d07200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0820052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413820034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a2009290300370300200320032903900137032002400240200341206a412041a886c500410041001001417f460d00200342003703d801200342003703d001200341206a4120200341d0016a4110410010012207417f460d012007410f4d0d01200341d8016a290300210220032903d001210141002107200510232001200284504101710d0d0c0b0b41012107200510234100410171450d0a0c0c0b41d4aac10041331021000b412d4101102a000b41124101102a000b41324101102a000b20074101102a000b41374101102a000b41124101102a000b41324101102a000b41184101102a000b41384101102a000b20070d010b200341f0016a24000f0b02400240411310262205450d002005410f6a41002800a99943360000200541086a41002900a299433700002005410029009a994337000020054113413310272205450d01200520002900003700132005412b6a200041186a2207290000370000200541236a200041106a22082900003700002005411b6a200041086a220929000037000020034190016a41186a220a420037030020034190016a41106a220b420037030020034190016a41086a220c420037030020034200370390012005413320034190016a1002200341206a41186a200a290300370300200341206a41106a200b290300370300200341206a41086a220a200c2903003703002003200329039001370320200341206a4120100320051023200a41013a0000200341296a2000290000370000200341316a2009290000370000200341396a2008290000370000200341c1006a2007290000370000200341023a002041a886c5004100200341206a102c200341f0016a24000f0b41134101102a000b41334101102a000b950803037f017e077f23004190016b22012400200141206a41086a220242003703002001420037032041f5a7c4004113200141206a1000200141106a41086a2002290300370300200120012903203703104100210202400240024002400240200141106a411041a886c500410041001001417f460d0020014100360220200141106a4110200141206a41044100100141016a41044d0d01200128022021020b412010262203450d01200320002900002204370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a29000037000020032d0001210520031023200141106a20054108742004a7220341c0017172410676220510870102400240024002402003413f71220320012802184f0d002001200128021020034105746a220310342001290300200141086a290300844200510d010b02402001280214450d00200128021010230b200141206a2002108701024020012802282203413f4d0d00200141286a21050340200241016a210202402001280224450d00200128022010230b200141206a20021087012005280200220341c0004f0d000b0b2001280220210620012802242107200141206a41186a2208200041186a290000370300200141206a41106a2209200041106a290000370300200141206a41086a220a200041086a29000037030020012000290000370320200341016a210520072003470d0620034101742207200520052007491b2207ad4205862204422088a70d052004a7220b4100480d052003450d0120062003410574200b10272206450d020c060b20032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a290000370000200141206a41086a200141106a41086a280200360200200120012903103703202005200141206a10b50320014190016a24000f0b200b102622060d040b200b4101102a000b41d4aac10041331021000b41204101102a000b101e000b200320024106746a210b200620034105746a22032001290320370000200341186a2008290300370000200341106a2009290300370000200341086a200a2903003700000240200541c000470d00200141206a41086a220342003703002001420037032041f5a7c4004113200141206a1000200141106a41086a2003290300370300200120012903203703102001200241016a360220200141106a4110200141206a410410040b2001200536022820012007360224200120063602202002200141206a10b503200141206a41086a2000290000370300200141206a41106a200041086a290000370300200141206a41186a200041106a290000370300200141c0006a200041186a2900003703002001200b360224200141013a002041a886c5004100200141206a102c20014190016a24000b980204017f017e037f027e230041c0006b2203240042002104200341206a41186a22054200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020012002200341206a1002200341186a2005290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012201417f460d022001410f4d0d02200341286a290300210820032903202109200341201003420121040c010b0b2000200437030020002009370308200041106a2008370300200341c0006a24000f0b41d4aac10041331021000b972403027f027e0a7f230041b00d6b2208240002402001280224200128024022092802b001470d00200041013a0000200041086a4124360200200041046a41ebbcc400360200200841b00d6a24000f0b200442002004290308220a200941a8016a2903007d220b200b200a56200b507222091b37030802402009450d00200041013a0000200041086a412a360200200041046a418fbdc400360200200841b00d6a24000f0b200841b0026a41186a22094200370300200841b0026a41106a220c4200370300200841b0026a41086a220d4200370300200842003703b00220062007200841b0026a1002200841c0016a41186a2009290300370300200841c0016a41106a200c290300370300200841c0016a41086a200d290300370300200820082903b0023703c0010240024002400240024002400240024002400240024002400240412010262209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c00010272209450d01200920082903c001370020200941386a200841c0016a41186a290300370000200941306a200841c0016a41106a290300370000200941286a200841c0016a41086a290300370000200941c00041800110272209450d022009200141cc006a220e290000370040200941d8006a200e41186a290000370000200941d0006a200e41106a290000370000200941c8006a200e41086a290000370000200841b0026a41186a220c4200370300200841b0026a41106a220d4200370300200841b0026a41086a220f4200370300200842003703b002200941e000200841b0026a1002200841086a41186a200c290300370300200841086a41106a200d290300370300200841086a41086a200f290300370300200820082903b00237030820091023200841cc006a41bcbbc400360200200841386a41086a420037030020082001410c6a2210360248200841f098c40036023c20084100360238200841a0016a41186a200541186a290000370300200841a0016a41106a200541106a290000370300200841a0016a41086a200541086a29000037030020084101360238200820052900003703a0012010200841086a10ea01210920082008280238417f6a220c360238024002400240024002402009450d00200841386a410c6a2802002109200841386a41086a2802002105200828023c2101200041086a412a360200200041046a419eb3c100360200200041013a00002005450d012005210420012100034020002802880b21002004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012005417f6a22050d000c030b0b200c0d082008417f360238200841c0016a41186a200841086a41186a290300370300200841c0016a41106a200841086a41106a290300370300200841c0016a41086a200841086a41086a290300370300200820082903083703c001200828023c220c41f098c400460d02200841386a41086a28020021110c030b200121000b200841cc026a20012f0106360200200841c8026a4100360200200841c4026a2001360200200820093602d002200841003602c002200842003703b802200820003602b402200841003602b002200841b0026a10d401200841b00d6a24000f0b41880b1026220c450d0641002111200c41003b0106200c4100360200200c41086a200841b0026a41800b1094041a200841386a41086a41003602002008200c36023c0b200841386a4104722112024002400340200c2f01062213410574211441002109417f210d024002400240034020142009460d01200d41016a210d417f4101200841c0016a200c20096a41086a4120109604220f4100481b4100200f1b220f450d05200941206a2109200f4101460d000b20110d010c020b2013210d2011450d010b2011417f6a2111200c200d4102746a41880b6a280200210c0c010b0b200841d0006a41186a2209200841c0016a41186a290300370300200841d0006a41106a220f200841c0016a41106a290300370300200841d0006a41086a2214200841c0016a41086a290300370300200820082903c001370350200841dc016a2014290300370200200841e4016a200f290300370200200841ec016a20092903003702002008200841c4006a3602d0012008200d3602cc01200820123602c8012008200c3602c401200841003602c001200820082903503702d401200841e4026a4200370200200841003a00ec02200842003703b002200841f098c4003602e002200842003703c802200841c0016a200841b0026a10b40121090c010b200c200d41e0006c6a41e8026a21090b200941013a003c200941286a427f370300200941206a427f3703002009413d6a20082903a001370000200941d5006a200841a0016a41186a290300370000200941cd006a200841a0016a41106a220c290300370000200941c5006a200841a0016a41086a220d290300370000200942013703182008200828023841016a360238200c200841386a41106a290300370300200d200841386a41086a290300370300200820082903383703a001200841d0006a41186a2214200841086a41186a290300370300200841d0006a41106a2211200841086a41106a290300370300200841d0006a41086a2213200841086a41086a29030037030020082008290308370350200841c0016a200841d0006a10d8014100210f0240024020082d00c00122124102470d000c010b200841f8016a280200210920120d002009417f4c0d07200841f4016a2802002115200841f0016a2802002112024002402009450d0020091026220f450d0b200f201220091094041a20150d010c020b4101210f2015450d010b201210230b200841b0026a41086a200936020020084184036a20132903003702002008418c036a201129030037020020084194036a2014290300370200200841c4026a200d290300370200200841cc026a200c290300370200200820093602b4022008200f3602b002200820082903503702fc02200820082903a0013702bc02200141246a2802002109200141c0006a290200210b2001280248210c200841e8026a4200370300200841e0026a428080808080013703002008200c3602f8022008200b3703f002200842083703d8022008200941016a3602d402200820044101200e200841086a20022003200841b0026a10bc03024020082802002209450d0020082802042101200041013a0000200041086a2001360200200041046a200936020020082802b00222010d0c0c0d0b200841c0016a2005200141c8006a28020028020010c402024020082802c0014101470d00200041046a20082902c401370200200041013a00000c0b0b200841a0016a41186a2205200841c0016a410472220941186a280200360200200841a0016a41106a220c200941106a290200370300200841a0016a41086a220d200941086a290200370300200820092902003703a001200841d0006a41106a200d290300370300200841d0006a41186a200c290300370300200841f0006a200528020036020020084106360254200841e5c4c400360250200820082903a001370358200141c4006a28020021092005200141e4006a290000370300200c200141dc006a290000370300200d200141d4006a2900003703002008200129004c3703a0014200210b20084188016a41086a220e4200370300200842003703880141a298c300410d20084188016a1000200841a0026a41086a200e29030037030020082008290388013703a0020240200841a0026a411041a886c500410041001001417f460d002008420037038801200841a0026a411020084188016a41084100100141016a41084d0d04200829038801210b0b200841e4016a200d290300370200200841ec016a200c290300370200200841f4016a2005290300370200200820023703c0012008200b3703d001200820033703c801200820082903a0013702dc012008200841b0026a3602d801200841003602a801200842013703a001200841f8006a2009200841d0006a200841c0016a20062007200841a0016a200410b70102400240200828027822054101460d0020054102470d01200041046a200829027c370200200041013a0000200841e8006a280200450d0c200841e4006a280200102320082802b00222010d0d0c0e0b20084180016a280200450d00200828027c10230b200841c0016a41186a200141cc006a220541186a290000370300200841c0016a41106a200541106a290000370300200841c0016a41086a200541086a290000370300200841a0016a41086a200841086a41086a290300370300200841a0016a41106a200841086a41106a290300370300200841a0016a41186a200841086a41186a290300370300200820052900003703c001200820082903083703a0010240024002400240200841e0026a2802002205200841dc026a280200470d00200541016a22042005490d0b20054101742209200420042009491b2209ad42e8007e220b422088a70d0b200ba7220c4100480d0b2005450d01200841d8026a280200200541e8006c200c102722040d020c0d0b200841d8026a28020021040c020b200c10262204450d0b0b200841dc026a2009360200200841d8026a2004360200200841e0026a28020021050b2004200541e8006c6a220520082903c001370001200541013a0000200541096a200841c0016a41086a2204290300370000200541116a200841c0016a41106a290300370000200541196a200841c0016a41186a290300370000200541216a20082903a001370000200541296a200841a0016a41086a290300370000200541316a200841a0016a41106a290300370000200541396a200841a0016a41186a290300370000200541c1006a200829008801370000200541c9006a20084188016a41086a290000370000200541d0006a20084197016a290000370000200541e0006a410036020020054201370358200841e0026a2205200528020041016a22093602002004200841bc026a220541086a290200370300200841286a41086a200841cc016a280200360200200820052902003703c001200820082902c401370328200841ec026a280200210c200841e8026a2802002106200841e4026a2802002105200841dc026a2802002107200841d8026a28020021040240200841d0006a41186a280200450d00200841e4006a28020010230b024020082802b002220d450d0020082802b402450d00200d10230b200841c0016a41086a220d200841286a41086a280200360200200820082903283703c001200841b0026a41086a200d280200360200200820082903c0013703b0022010200841b0026a10ec0120082004200941e8006c6a3602bc02200820043602b802200820073602b402200820043602b002200141286a200841b0026a10a20220082005200c4190016c6a3602bc02200820053602b802200820063602b402200820053602b002200141346a200841b0026a10a102200041003a0000200041196a200841206a290300370000200041116a200841186a290300370000200041096a200841086a41086a29030037000020002008290308370001200841b00d6a24000f0b41204101102a000b41c0004101102a000b4180014101102a000b41d4aac10041331021000b10e601000b41880b4108102a000b101d000b101e000b20094101102a000b200c4108102a000b20082802b0022201450d010b20082802b402450d00200110230b200841b0026a41186a2802002109200841c0026a280200210102400240200841b0026a41146a2802002200450d002000210420012105034020052802880b21052004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012000417f6a22000d000c020b0b200121050b200841dc016a20012f0106360200200841c0016a41186a4100360200200841c0016a41146a2001360200200820093602e001200841003602d001200842003703c801200820053602c401200841003602c001200841c0016a10d4010240200841e0026a2802002205450d00200841b0026a41286a2802002101200541e8006c210503400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200541987f6a22050d000b0b0240200841dc026a280200450d00200841d8026a28020010230b0240200841ec026a2802002201450d0020014190016c2105200841e4026a28020041206a210103402001102420014190016a2101200541f07e6a22050d000b0b0240200841e8026a280200450d00200841e4026a28020010230b200841b00d6a24000bc718012e7f230041b00d6b220324002003200236020420032001360200200341086a10d40202400240024002400240024002400240200328020c2204450d0020032802102105200341086a410c6a2802002202450d0120032c00082101200341086a410041e00c1093041a200441206a2106200420024105746a2107200341900d6a41086a2108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021234100212441002125410021264100212741002128200421294100212a41d100212b02400340202a212c024002400240024002402001450d0020072004460d012001417f7321022029210102400340024020012007460d002001212d200141206a22292101200241016a22020d010c020b20062129200621012004212d200241016a22020d000b0b202d0d040c060b20292007460d012029212d202941206a21290c030b20292007460d042001417f7321010340200141016a2201450d022007202941206a2229470d000c050b0b20072004460d03200621292004222d0d010c030b2029212d202941206a2129202d450d020b2003280204212e2003280200212f20084100360200200342013703900d410110262201450d072001202c3a000020034281808080103702940d200320013602900d2003202e36028c0d2003418c0d6a200341900d6a1041024002400240024020032802940d22022008280200222a6b202e4f0d00202a202e6a2201202a490d0a20024101742230200120012030491b22304100480d0a2002450d0120032802900d20022030102722010d020c0c0b20032802900d21010c020b203010262201450d0a0b200320303602940d200320013602900d203021020b2008202a202e6a22303602002001202a6a202f202e1094041a0240024002400240200220306b411f4b0d00203041206a222e2030490d0a2002410174222a202e202e202a491b222e4100480d0a2002450d0120012002202e102722010d020c0d0b2002212e0c020b202e10262201450d0b0b2003202e3602940d200320013602900d0b200120306a2202202d290000370000200241186a202d41186a290000370000200241106a202d41106a290000370000200241086a202d41086a290000370000200341900d6a41186a22024200370300200341900d6a41106a222d420037030020084200370300200342003703900d2001203041206a200341900d6a1002200341e80c6a41186a22302002290300370300200341e80c6a41106a2202202d290300370300200341e80c6a41086a222d2008290300370300200320032903900d3703e80c0240202e450d00200110230b202b417f6a212b202c41016a212a200341086a202c4103704105746a220120032903e80c370000200141186a2030290300370000200141106a2002290300370000200141086a202d290300370000410021024100212e02400340202c202c41036e222d417d6c6a4102470d01200341086a20026a220141df006a2d000022092001411f6a2d0000220a712009200a722001413f6a2d000071722126200141de006a2d000022092001411e6a2d0000220a712009200a722001413e6a2d000071722125200141dd006a2d000022092001411d6a2d0000220a712009200a722001413d6a2d000071722124200141dc006a2d000022092001411c6a2d0000220a712009200a722001413c6a2d000071722123200141db006a2d000022092001411b6a2d0000220a712009200a722001413b6a2d000071722122200141da006a2d000022092001411a6a2d0000220a712009200a722001413a6a2d000071722121200141d9006a2d00002209200141196a2d0000220a712009200a72200141396a2d000071722120200141d8006a2d00002209200141186a2d0000220a712009200a72200141386a2d00007172211f200141d7006a2d00002209200141176a2d0000220a712009200a72200141376a2d00007172211e200141d6006a2d00002209200141166a2d0000220a712009200a72200141366a2d00007172211d200141d5006a2d00002209200141156a2d0000220a712009200a72200141356a2d00007172211c200141d4006a2d00002209200141146a2d0000220a712009200a72200141346a2d00007172211b200141d3006a2d00002209200141136a2d0000220a712009200a72200141336a2d00007172211a200141d2006a2d00002209200141126a2d0000220a712009200a72200141326a2d000071722119200141d1006a2d00002209200141116a2d0000220a712009200a72200141316a2d000071722118200141d0006a2d00002209200141106a2d0000220a712009200a72200141306a2d000071722117200141cf006a2d000022092001410f6a2d0000220a712009200a722001412f6a2d000071722116200141ce006a2d000022092001410e6a2d0000220a712009200a722001412e6a2d000071722115200141cd006a2d000022092001410d6a2d0000220a712009200a722001412d6a2d000071722114200141cc006a2d000022092001410c6a2d0000220a712009200a722001412c6a2d000071722113200141cb006a2d000022092001410b6a2d0000220a712009200a722001412b6a2d000071722112200141ca006a2d000022092001410a6a2d0000220a712009200a722001412a6a2d000071722111200141c9006a2d00002209200141096a2d0000220a712009200a72200141296a2d000071722110200141c8006a2d00002209200141086a2d0000220a712009200a72200141286a2d00007172210f200141c7006a2d00002209200141076a2d0000220a712009200a72200141276a2d00007172210e200141c6006a2d00002209200141066a2d0000220a712009200a72200141266a2d00007172210d200141c5006a2d00002209200141056a2d0000220a712009200a72200141256a2d00007172210c200141c4006a2d00002209200141046a2d0000220a712009200a72200141246a2d00007172210b200141c3006a2d00002209200141036a2d0000220a712009200a72200141236a2d00007172210a200141c2006a2d00002209200141026a2d00002227712009202772200141226a2d000071722109200141c1006a2d00002227200141016a2d00002228712027202872200141216a2d000071722127200141c0006a2d0000222820012d00002230712028203072200141206a2d000071722128200241800c460d01200341086a2002202d410574202c41096e41e0006c6b6a6a220141ff006a20263a0000200141fe006a20253a0000200141fd006a20243a0000200141fc006a20233a0000200141fb006a20223a0000200141fa006a20213a0000200141f9006a20203a0000200141f8006a201f3a0000200141f7006a201e3a0000200141f6006a201d3a0000200141f5006a201c3a0000200141f4006a201b3a0000200141f3006a201a3a0000200141f2006a20193a0000200141f1006a20183a0000200141f0006a20173a0000200141ef006a20163a0000200141ee006a20153a0000200141ed006a20143a0000200141ec006a20133a0000200141eb006a20123a0000200141ea006a20113a0000200141e9006a20103a0000200141e8006a200f3a0000200141e7006a200e3a0000200141e6006a200d3a0000200141e5006a200c3a0000200141e4006a200b3a0000200141e3006a200a3a0000200141e2006a20093a0000200141e1006a20273a0000200141e0006a20283a0000200241e0006a2102202d212c202e41016a222e4111490d000b0b41002101202b0d000b0b200020263a001f200020253a001e200020243a001d200020233a001c200020223a001b200020213a001a200020203a00192000201f3a00182000201e3a00172000201d3a00162000201c3a00152000201b3a00142000201a3a0013200020193a0012200020183a0011200020173a0010200020163a000f200020153a000e200020143a000d200020133a000c200020123a000b200020113a000a200020103a00092000200f3a00082000200e3a00072000200d3a00062000200c3a00052000200b3a00042000200a3a0003200020093a0002200020273a0001200020283a000020050d020c030b41012104410021050b20004200370000200041186a4200370000200041106a4200370000200041086a42003700002005450d010b200410230b200341b00d6a24000f0b101e000b41014101102a000b20304101102a000b202e4101102a000b7601017f230041c0006b220024002000411836020c200041c8b7c100360208200041346a4120360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000bfd0401137f02400240200128020022054100480d00200541ffffffff07460d002001200541016a360200200141046a2106200141086a28020021070c010b10e401000b410021050340024002400240024002400240024002400240024020050e020001010b2006280200220841086a210920082f0106220a410574210b417f21050240024002400340200b450d01200541016a2105417f4101200220094120109604220c4100481b4100200c1b220c450d03200b41606a210b200941206a2109200c4101460d000b20070d010c040b200a21052007450d030b2007417f6a2107200820054102746a41880b6a2106410021050c0a0b200841e8026a200541e0006c6a2205450d01200541306a210d200541346a280200210e4108210f41052110417f21114102211241ec032113412021144100211541012116416021170c080b200d2802002208200f6a210920082f0106220d201074210b417f21050240024002400340200b450d01200520166a210520112016200420092014109604220c2015481b2015200c1b220c450d03200b20176a210b200920146a2109200c2016460d000b200e0d010c030b200d2105200e450d020b200e20116a210e200820052012746a20136a210d410121050c090b200841e8026a220b2005410c6c6a2216450d0020162802002209450d01200b2005410c6c6a2802082205417f4c0d052005450d02200510262216450d062016200920051094041a0c030b20002001280210200220032004200141146a28020028020c1106000c030b410021160c010b410121160b2000200536020420002016360200200041086a20053602000b20012001280200417f6a3602000f0b101d000b20054101102a000b410121050c000b0b7601017f230041c0006b220024002000411036020c200041b8b7c100360208200041346a4121360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000be41d03027f027e097f230041b0036b2209240002400240024020012802242001280240220a2802b001470d00200041eebac40036020420004101360200200041086a4129360200200841046a2802000d010c020b200542002005290308220b200a41a0016a2903007d220c200c200b56200c5072220a1b37030802400240200a450d0020004197bbc40036020420004101360200200041086a41233602000c010b20024200410110d1021a200941d8016a41186a220d200241186a290000370300200941d8016a41106a220e200241106a290000370300200941d8016a41086a220f200241086a290000370300200920022900003703d801200941c0026a200941d8016a10d8014100211002400240024020092d00c00222114102460d00200941f8026a280200210a02402011450d00410021100c010b200a417f4c0d01200941f4026a2802002112200941f0026a280200211102400240200a450d00200a10262210450d0420102011200a1094041a20120d010c020b410121102012450d010b201110230b200941d8006a4200370300200941d0006a42808080808001370300200941c0006a41bcbbc4003602002009413c6a2001410c6a2212360200200941346a4200370200200941206a41106a41f098c400360200200941206a41086a200a360200200941f4006a200f290300370200200941fc006a200e29030037020020094184016a200d290300370200200942083703482009410036022c2009200a36022420092010360220200920092903d80137026c200920012802483602682009200141c0006a2902003703602009200141246a28020041016a3602440240024002400240024002400240024002400240024002402003200484500d00200941086a20054100200141cc006a200220032004200941206a10bc032009280208220a450d00200928020c21012000200a36020420004101360200200041086a2001360200024020092802202201450d002009280224450d00200110230b200941206a41186a280200210a200941306a2802002101200941206a41146a2802002202450d012002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c030b0b201228020022134100480d0a201341ffffffff07460d0a2001410c6a201341016a360200200141106a210a200141146a28020021110240024002400340200a280200220e41086a210d200e2f010622144105742110417f210a02400240024003402010450d01200a41016a210a417f41012002200d4120109604220f4100481b4100200f1b220f450d03201041606a2110200d41206a210d200f4101460d000b20110d010c040b2014210a2011450d030b2011417f6a2111200e200a4102746a41880b6a210a0c010b0b200e200a41e0006c6a41e8026a220a450d00200941c8026a2210200a41c5006a290000370300200941d0026a220d200a41cd006a290000370300200941d8026a220e200a41d5006a2900003703002009200a413d6a2900003703c002200a2d003c4101470d0020094199016a2010290300370000200941a1016a200d290300370000200941a9016a200e290300370000200920092903c00237009101200941013a009001201220133602000c010b20094190016a2001411c6a2802002002200141206a28020028021011040020092d00900121022001200128020c417f6a36020c2002450d010b200941b8016a41186a200941a9016a290000370300200941b8016a41106a200941a1016a290000370300200941b8016a41086a20094199016a29000037030020092009290091013703b801200941c0026a200941b8016a200141c8006a28020028020010c402024020092802c0024101470d00200020092902c40237020420004101360200024020092802202201450d002009280224450d00200110230b200941206a41186a280200210a200941306a2802002101200941206a41146a2802002202450d042002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c060b0b20094190026a41186a220a200941c0026a410472220241186a28020036020020094190026a41106a2210200241106a29020037030020094190026a41086a220d200241086a2902003703002009200229020037039002200941d8016a41106a200d290300370300200941d8016a41186a2010290300370300200941f8016a200a280200360200200941043602dc01200941a7c4c4003602d80120092009290390023703e001200141c4006a2802002102200a200141e4006a2900003703002010200141dc006a290000370300200d200141d4006a2900003703002009200129004c370390024200210c200941a0036a41086a220a4200370300200942003703a00341a298c300410d200941a0036a1000200941b0026a41086a200a290300370300200920092903a0033703b002410021100240200941b0026a411041a886c500410041001001417f460d00200942003703a003200941b0026a4110200941a0036a41084100100141016a41084d0d0b20092903a003210c0b200941e4026a20094190026a41086a220a290300370200200941ec026a200941a0026a290300370200200941f4026a200941a8026a290300370200200920033703c0022009200c3703d002200920043703c80220092009290390023702dc022009200941206a3602d802200a200841086a280200360200200920082902003703900220094180026a2002200941d8016a200941c0026a2006200720094190026a200510b7014101210d20092802800222024101460d054100210620024102470d062000200929028402370204200041013602000240200941f0016a280200450d00200941ec016a28020010230b024020092802202201450d002009280224450d00200110230b200941206a41186a2802002108200941306a2802002101200941206a41146a2802002202450d082002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c0a0b0b4101210d4100211041002106410121070c060b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a20013602002009200a3602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d0b200941d4006a2802001023200841046a2802000d0c0c0d0b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a20013602002009200a3602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d09200941d4006a2802001023200841046a2802000d0a0c0b0b2009418c026a280200211020094180026a41086a2802002106200928028402210d0b0240200941f0016a280200450d00200941ec016a28020010230b410021070b200941c0026a41086a220a200941346a290200370300200941106a41086a220e200941c0026a410c6a2802003602002009200929022c3703c002200920092902c402370310200941dc006a280200210f200941d8006a2802002111200941206a41346a2802002102200941d0006a2802002113200941cc006a2802002114200941206a41286a2802002105024020092802202215450d002009280224450d00201510230b200a200e280200360200200920092903103703c002200941206a41086a200a280200360200200920092903c0023703202012200941206a10ec0120092005201341e8006c6a36022c200920053602282009201436022420092005360220200141286a200941206a10a20220092002200f4190016c6a36022c200920023602282009201136022420092002360220200141346a200941206a10a1022000410c6a2010360200200041086a20063602002000200d360204200041003602002007450d08200841046a280200450d0820082802001023200941b0036a24000f0b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a2001360200200920083602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d06200941d4006a2802001023200941b0036a24000f0b41d4aac10041331021000b10e401000b101d000b200a4101102a000b200841046a280200450d010b200828020010230b200941b0036a24000bde0202097f027e230041106b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d002004280200450d00200441106a290300210c200441086a290300210d0c010b200320012802102002200141146a28020028021c110400200341086a290300210c200128020021052003290300210d0b20012005417f6a3602002000200c3703082000200d370300200341106a24000f0b10e401000ba90301097f230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b2007200441e0006c6a41e8026a2204450d00200341086a220a200441c5006a290000370300200341106a2208200441cd006a290000370300200341186a2207200441d5006a29000037030020032004413d6a29000037030020042d003c4101470d0020002003290300370001200041013a0000200041096a200a290300370000200041116a2008290300370000200041196a20072903003700000c010b200020012802102002200141146a280200280210110400200128020021050b20012005417f6a360200200341206a24000f0b10e401000ba40201087f0240200028020022024100480d00200241ffffffff07460d002000200241016a2203360200200041046a2102200041086a2802002104024003402002280200220541086a210620052f010622074105742108417f210202400240024003402008450d01200241016a2102417f410120012006412010960422094100481b410020091b2209450d03200841606a2108200641206a210620094101460d000b20040d010c040b200721022004450d030b2004417f6a2104200520024102746a41880b6a21020c010b0b2005200241e0006c6a41e8026a2202450d002002413c6a2d0000210220002003417f6a36020020024101460f0b20002802102001200041146a280200280218110300210220002000280200417f6a36020020020f0b10e401000bf80202097f037e230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d00200441186a290300220ca7450d00200441286a290300210d200441206a290300210e0c010b200341086a20012802102002200141146a280200280214110400200341186a290300210d200128020021052003290310210e2003290308210c0b20012005417f6a360200200041106a200d3703002000200e3703082000200c370300200341206a24000f0b10e401000bff1207057f017e1a7f047e017f017e097f230041b00d6b22022400024020002802000d002000417f36020020012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b2002411c6a20042f0106360200200241186a4100360200200241146a20043602002002200336022020024100360210200242003703082002200136020420024100360200200241b0026a200210b0010240024020022903d00222074202510d002000410c6a2108200041046a210920024190016a41146a210a20024190016a41206a2105200241b0026a41047221042002418d036a210b200241b0026a413d6a210c200241ad036a210d200241f8026a210e200241f0026a210f200241b0026a41306a2110200241b0026a41286a21112002418c036a2112200241e8026a211320024180036a211420024184036a211520024188036a2116200241b0026a413c6a2117200241e4026a2118200241c8016a411c6a21190340200241c8006a41086a2203200241b0026a41086a221a290300370300200241c8006a41106a221b200241b0026a41106a221c290300370300200241c8006a41186a221d200241b0026a41186a221e290300370300200241286a41086a221f200b41086a290000370300200241286a41106a2220200b41106a290000370300200241286a41186a2221200b41186a290000370300200220022903b0023703482002200b290000370328200e2903002122200f2903002123201029030021242011290300212520122d0000212620132903002127201428020021012015280200210620162802002128200241246a41026a2229200d41026a2d00003a00002002200d2f00003b0124200241f0006a41186a222a2021290300370300200241f0006a41106a222b2020290300370300200241f0006a41086a222c201f290300370300200241ec006a41026a222d20292d00003a000020022002290328370370200220022f01243b016c20024190016a41186a2220201d29030037030020024190016a41106a221d201b29030037030020024190016a41086a221f20032903003703002002200229034837039001024002402009280200221b41f098c400460d00200041086a280200212e0c010b41880b1026221b450d034100212e201b41003b0106201b4100360200201b41086a200241b0026a41800b1094041a200041086a41003602002009201b3602000b024002400340201b2f0106222f4105742130417f212141002103024002400240034020302003460d01202141016a2121417f410120024190016a201b20036a41086a412010960422294100481b410020291b2229450d05200341206a210320294101460d000b202e0d010c020b202f2121202e450d010b202e417f6a212e201b20214102746a41880b6a280200211b0c010b0b200241c8016a41186a22032020290300370300200241c8016a41106a2220201d290300370300200241c8016a41086a2229201f29030037030020022002290390013703c801201d200836020020024190016a410c6a2021360200201f2009360200200a20022903c801370200200a41086a2029290300370200200a41106a2020290300370200200a41186a20032903003702002002201b36029401200241003602900120112022370300200241b0026a41206a2023370300201c2024370300201a2025370300201720263a0000201320283602002018200636020020102001360200201e2027370300200c2002290370370000200c41086a202c290300370000200c41106a202b290300370000200c41186a202a290300370000200b20022f016c3b0000200b41026a202d2d00003a0000200220073703b00220024190016a200241b0026a10b4011a0c010b201b41e8026a202141e0006c6a22212021290308202520075022031b37030820212021290300200720031b370300202141106a221b201b290300202420031b3703002020202a290300370300201d202b290300370300201f202c290300370300200220022903703703900120212d003c211b201e202141d5006a290000370300201c202141cd006a290000370300201a202141c5006a29000037030020022021413d6a22032900003703b00202400240202641ff01714101470d00200241c8016a41186a2020290300370300200241c8016a41106a201d290300370300200241c8016a41086a201f29030037030020022002290390013703c8014101211b0c010b200241c8016a41186a201e290300370300200241c8016a41106a201c290300370300200241c8016a41086a201a290300370300200220022903b0023703c8010b2021413c6a201b3a0000200341186a200241c8016a41186a2229290300370000200341106a200241c8016a41106a2230290300370000200341086a200241c8016a41086a222e290300370000200320022903c801370000202141286a2203202220032903002027a722031b37030020212023202129032020031b37032020212027202129031820031b370318024002402006450d002006211b20012103034020032802ec032103201b417f6a221b0d000b0340200120012f01064102746a41ec036a28020021012006417f6a22060d000c020b0b200121030b20012f01062106200241c8016a41206a20283602002019200636020020294100360200200241c8016a41146a200136020020304100360200202e4200370300200220033602cc01200241003602c801200241b0026a200241c8016a10af01024020022802b0024101470d00202141306a211b034020024190016a41286a200441286a2802003602002005200441206a2902003703002020200441186a2201290200370300201d200441106a2206290200370300201f200441086a2203290200370300200220042902003703900120024180026a41186a200129000037030020024180026a41106a200629000037030020024180026a41086a20032900003703002002200429000037038002200241a0026a41086a200541086a280200360200200220052902003703a002200241f0016a201b20024180026a200241a0026a10b601024020022802f001450d0020022802f4012201450d00200241f0016a41086a280200450d00200110230b200241b0026a200241c8016a10af0120022802b0024101460d000b0b200241c8016a10b5010b200241b0026a200210b001200241b0026a41206a29030022074202520d000b0b200210d4012000200028020041016a360200200241b00d6a24000f0b41880b4108102a000b10e601000bd30102027f027e200028022021020240024002400240410410262203450d00200320023600002000280224210220034104410810272203450d0120032002360004200041086a29030021042000290300210520034108411810272203450d0220032005370008200341106a2004370000200041186a29030021042000290310210520034118413010272200450d0320002005370018200041206a200437000020012802002001280204200041281004200010230f0b41044101102a000b41084101102a000b41184101102a000b41304101102a000b13002000410a360204200041bcbec1003602000ba70301047f230041c0006b2202240002400240411610262203450d002003410e6a41002900e1b641370000200341086a41002900dbb641370000200341002900d3b64137000020034116413610272203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034136200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d002002410036022020024120200241206a41044100100141016a4105490d02200228022021012002410036022020024120200241206a41044104100141016a4105490d02200041086a200228022036020020002001360204200041013602000c010b200041003602000b20031023200241c0006a24000f0b41d4aac10041331021000b41164101102a000b41364101102a000b130020004107360204200041e5e4c1003602000b130020004117360204200041ece4c1003602000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241003600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241183600000f0b41044101102a000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242053700000f0b41084101102a000b3301017f0240410810262202450d0020004288808080800137020420002002360200200242e8073700000f0b41084101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241013600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241023600000f0b41044101102a000b3901017f0240411010262202450d002002420037000820024201370000200042908080808002370204200020023602000f0b41104101102a000b3901017f0240411010262202450d002002420037000820024200370000200042908080808002370204200020023602000f0b41104101102a000b3901017f0240411010262202450d002002420037000820024209370000200042908080808002370204200020023602000f0b41104101102a000b130020004102360204200041b88ec2003602000bbe0904027f017e037f077e230041f0006b2202240002400240024002400240411010262203450d00200341086a41002900dd9d42370000200341002900d59d4237000020034110413010272203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220742003703002002420037035020034130200241d0006a1002200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a200729030037030020022002290350370330024002400240024002400240200241306a412041a886c500410041001001417f460d002002420037035820024200370350200241306a4120200241d0006a4110410010012205417f460d052005410f4d0d05200241d8006a2903002108200229035021092002420037035820024200370350200241306a4120200241d0006a4110411010012205417f460d052005410f4d0d05200241d0006a41086a290300210a2002290350210b20031023411410262203450d09200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d0a200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220142003703002002420037035020034134200241d0006a1002200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a2205200129030037030020022002290350370330200241306a412041a886c500410041001001417f460d012002420037035820024200370350200241306a4120200241d0006a4110410010012206417f460d082006410f4d0d08200241d8006a290300210c2002290350210d0c020b200310234200210c0c020b4200210d4200210c0b20031023200142003703002002420037035041af98c300410d200241d0006a100020052001290300370300200220022903503703300240200241306a411041a886c500410041001001417f460d0020024200370350200241306a4110200241d0006a41084100100141016a41084d0d02200229035021040b4200210e200242004200200b4200109804200241106a200a420020044200109804200241206a20044200200b42001098044200210402404200420052200a42005271200229030842005272200229031842005272200241286a290300220b200229030020022903107c7c220a200b54720d002008200a2002290320220e200954200a200854200a2008511b22011b200a7d2009200e20011b220a200e54ad7d2104200a200e7d210e0b2004200c200d200e56200c200456200c2004511b22011b210c200e200d20011b21040b200020043703002000200c370308200241f0006a24000f0b41d4aac10041331021000b41d4aac10041331021000b41104101102a000b41304101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b130020004108360204200041e59dc2003602000baf0c05017f017e017f017e067f230041b0016b2203240042002104200341206a41086a22054200370300200342003703204182b6c100411b200341206a100020034190016a41086a20052903003703002003200329032037039001024002400240024020034190016a411041a886c500410041001001417f460d00200342003703282003420037032020034190016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441182107411810262205450d010c030b42002106411821074118102622050d020b20074101102a000b41d4aac10041331021000b200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000002400240024002400240024002400240024020052007413810272205450d0020052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341206a41186a22074200370300200341206a41106a22084200370300200341206a41086a220942003703002003420037032020054138200341206a100220034190016a41186a200729030037030020034190016a41106a200829030037030020034190016a41086a20092903003703002003200329032037039001200320013703202003200237032820034190016a4120200341206a41101004200510232004200158200620025820062002511b0d07411810262205450d02200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0320052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341086a2005413810e101200341086a41106a290300210220032802082107200329031021012005102302402001200284500d002007450d0020032001370320200320023703282003200341206a3602900120034190016a10de010b411410262205450d04200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d05200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341206a41186a22074200370300200341206a41106a22084200370300200341206a41086a220942003703002003420037032020054134200341206a100220034190016a41186a200729030037030020034190016a41106a200829030037030020034190016a41086a20092903003703002003200329032037039001024020034190016a412041a886c500410041001001417f460d00200342003703282003420037032020034190016a4120200341206a4110410010012207417f460d022007410f4d0d02200341286a29030021022003290320210141002107200510232001200284504101710d090c070b41012107200510234100410171450d060c080b41384101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b41144101102a000b41344101102a000b20070d010b200341b0016a24000f0b02400240411310262205450d002005410f6a41002800a99943360000200541086a41002900a299433700002005410029009a994337000020054113413310272205450d01200520002900003700132005412b6a200041186a2208290000370000200541236a200041106a22092900003700002005411b6a200041086a220a290000370000200341206a41186a220b4200370300200341206a41106a220c4200370300200341206a41086a220742003703002003420037032020054133200341206a100220034190016a41186a200b29030037030020034190016a41106a200c29030037030020034190016a41086a2007290300370300200320032903203703900120034190016a4120100320051023200741013a0000200341296a2000290000370000200341316a200a290000370000200341396a2009290000370000200341c1006a2008290000370000200341023a002041a886c5004100200341206a102c200341b0016a24000f0b41134101102a000b41334101102a000b13002000410a360204200041f09dc2003602000bc60807057f017e087f047e017f017e017f230041f0006b220224000240024002400240024002400240024002400240410e10262203450d00200341066a41002900b0b741370000200341002900aab7413700002003410e412e10272204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241386a41186a22014200370300200241386a41106a22034200370300200241386a41086a22054200370300200242003703382004412e200241386a1002200241086a41186a2001290300370300200241086a41106a2003290300370300200241086a41086a2005290300370300200220022903383703080240024002400240200241086a412041a886c500410041001001417f460d002002422037022c2002200241086a3602282002200241286a104a2002280200450d0b20022802042206ad42287e2207422088a70d032007a72201417f4c0d032001450d01200110262208450d062006450d020c070b20004100360208200042083702000c080b4108210820060d050b4100210e420021072008450d080c050b101d000b410e4101102a000b412e4101102a000b20014108102a000b200241286a41086a22032802002109200228022c21052002280228210a200241ec006a210b420021074100210c4100210d410021012006210e03402002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382110200242003703402002420037033820034100200a2005200241386a411020091001220f200f417f461b220f4110200f4110491b20096a2209360200200f410f4d0d03200241386a41086a2903002111200229033821122002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382113200241003a003820032009200a2005200241386a41012009100141016a41014b220f6a2209360200200f450d03200141016a210f20022d003821142002200b280000360063200220022800693602602002200228006336005b2002200228026036025802402001200e470d00200c200f200f200c491b220ead42287e2215422088a70d062015a722164100480d0602402001450d002008200d2016102722080d010c080b201610262208450d070b2008200d6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141246a200228005b360000200141216a200228025836000020074280808080107c2107200c41026a210c200d41286a210d200f2101200f2006490d000b2008450d030b20002007200ead84370204200020083602000b20041023200241f0006a24000f0b200e450d00200810230b41d4aac10041331021000b101e000b20164108102a000b850701087f230041900c6b22042400024002400240024020002802000d002000417f360200200441d8006a41186a200141186a290000370300200441d8006a41106a200141106a290000370300200441d8006a41086a200141086a29000037030020042001290000370358024002402000280204220541f098c400460d00200041086a28020021060c010b41880b10262205450d0241002106200541003b010620054100360200200541086a20044190016a41800b1094041a200041086a4100360200200041046a20053602000b200041046a210702400240034020052f01062209410574210a41002101417f21080240024002400340200a2001460d01200841016a2108417f4101200441d8006a200520016a41086a4120109604220b4100481b4100200b1b220b450d05200141206a2101200b4101460d000b20060d010c020b200921082006450d010b2006417f6a2106200520084102746a41880b6a28020021050c010b0b200441186a200441d8006a41186a290300370300200441106a200441d8006a41106a290300370300200441086a200441d8006a41086a290300370300200420042903583703002000410c6a21014100210641000d010c040b2000410c6a21014101450d030b200441a8016a4200370300200441a4016a41f098c400360200200441003602b001200441003602a0012004420037039801200441f098c4003602940120044100360290012005200841e0006c6a41e8026a210120044190016a10b5010c030b10e601000b41880b4108102a000b200441f4006a200441086a290300370200200441fc006a200441106a29030037020020044184016a200441186a2903003702002004200136026820042008360264200420073602602004200536025c200420063602582004200429030037026c200441c4016a4200370200200441b0016a2004290348370300200441b8016a200441c8006a41086a290300370300200441cd016a2004290025370000200441d5016a200441256a41086a290000370000200441dd016a200441256a41106a290000370000200441e5016a200441256a41186a290000370000200441ec016a200441c4006a280000360000200442003703a8012004420037039001200441f098c4003602c001200441003a00cc01200441d8006a20044190016a10b40121010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441900c6a24000b840402057f027e230041c0006b2204240002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a2008290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012206417f460d022006410f4d0d02200441286a29030021092004290320210a0c010b4200210a420021090b20051023200441206a2001200a20027c2202200920037c2002200a54ad7c10dc01200441106a200441206a41106a290300220a370300200420042903282202370308200420042903202203370300024020034200510d002004200441086a360220200441206a10de01420021024200210a0b200020023703002000200a370308200441c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bff0304027f017e027f017e230041d0006b220524000240024002400240200241ff017122064102460d0020064104470d02200541106a200110fc012005290310200356200541186a290300220720045620072004511b0d010c020b2005200110fc012005290300200358200541086a290300220720045820072004511b0d010b41bcb4c1002101412621060c010b200541206a20011080020240024002400240024020052802282201450d0042002107200541c0006a41086a220642003703002005420037034041af98c300410d200541c0006a1000200541306a41086a2006290300370300200520052903403703300240200541306a411041a886c500410041001001417f460d0020054200370340200541306a4110200541c0006a41084100100141016a41084d0d03200529034021070b200141286c210620052802242108200528022022092101034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d030b200141286a2101200641586a22060d000b410021012008450d040c030b02402005280224450d00200528022010230b410021010c040b41e2b4c100210120080d010c020b41d4aac10041331021000b200910230b413121060b2000200636020420002001360200200541d0006a24000bd30704027f017e037f057e230041c0006b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054134200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a2004290320210b0c010b4200210b4200210a0b200510232001200b2002200b200b200256200a200356200a2003511b22051b220c7d200a2003200a20051b220d7d200b200c54ad7d10df0102400240024002402002200c7d220b2003200d7d2002200c54ad7d220e84500d00411810262205450d08200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0920052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002102200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703002004412041a886c500410041001001417f460d01200442003703282004420037032020044120200441206a4110410010012207417f460d072007410f4d0d07200441286a2903002103200429032021020c020b4200210e0c020b420021030b2005102320012002200b20022002200b562003200e562003200e511b22051b220a7d2003200e200320051b22067d2002200a54ad7d10fe01200e20067d200b200a54ad7d210e2006200d7c200a200c7c2202200a54ad7c2103200b200a7d21060b2000200637031020002002370300200041186a200e37030020002003370308200441c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b8b0604027f017e037f027e230041d0006b220524000240024002400240411410262206450d00200641106a41002800f9b641360000200641086a41002900f1b641370000200641002900e9b64137000020064114413410272206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002107200541306a41186a22084200370300200541306a41106a22094200370300200541306a41086a220a42003703002005420037033020064134200541306a1002200541106a41186a2008290300370300200541106a41106a2009290300370300200541106a41086a200a29030037030020052005290330370310024002400240200541106a412041a886c500410041001001417f460d002005420037033820054200370330200541106a4120200541306a4110410010012208417f460d022008410f4d0d02200541386a290300210b200529033021070c010b4200210b0b20061023024002400240200720027d220c200756200b20037d2007200254ad7d2207200b562007200b511b450d00200041b5b5c100360204200041086a411d3602000c010b200541306a41086a22064200370300200542003703304182b6c100411b200541306a1000200541106a41086a2006290300370300200520052903303703100240200541106a411041a886c500410041001001417f460d002005420037033820054200370330200541106a4110200541306a4110410010012206417f460d062006410f4d0d06200c20052903305a2007200541306a41086a290300220b5a2007200b511b0d00200041d2b5c100360204200041086a411a3602000c010b200541086a20012004200c200710830220052802082206450d01200528020c210120002006360204200041086a20013602000b410121060c050b2001200c200710df01200041106a2003370300200041086a2002370300410021060c040b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b20002006360200200541d0006a24000bfc0304017f017e037f037e230041c0006b2202240042002103200241186a41086a2204420037030020024200370318419db6c100411b200241186a1000200241306a41086a22052004290300370300200220022903183703300240024002400240200241306a411041a886c500410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012206417f460d022006410f4d0d02200241206a2903002107200229031821080c010b42002108420021070b200442003703002002420037031841b8b6c100411b200241186a1000200520042903003703002002200229031837033002400240200241306a411041a886c500410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012204417f460d032004410f4d0d03200241206a2903002109200229031821030c010b420021090b200241086a200320092001ad4200109804200241186a20002002290308220320087c2208200241106a29030020077c2008200354ad7c4101108502024020022802184101470d00200228021c2104200241c0006a240020040f0b200229032021032002200241286a290300370320200220033703182002200241186a360230200241306a10de01200241c0006a240041000f0b41d4aac10041331021000b41d4aac10041331021000ba10802097f027e230041d0006b2202240002400240410e10262203450d00200341066a41002900b0b741370000200341002900aab7413700002003410e412e10272204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241286a41186a22004200370300200241286a41106a22034200370300200241286a41086a22054200370300200242003703282004412e200241286a1002200241086a41186a2000290300370300200241086a41106a2003290300370300200241086a41086a20052903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a104102400240024002400240024002402000450d00200041286c210720052802002108200228022c210003400240024002400240200020086b41084f0d00200841086a22092008490d0720004101742203200920092003491b220a4100480d072000450d0120022802282000200a102722030d020c080b200841086a2109200228022821030c020b200a10262203450d060b2002200a36022c20022003360228200a21000b20052009360200200320086a200641186a290000370000200641086a290300210b2006290300210c0240024002400240200020096b41104f0d00200941106a22082009490d072000410174220a20082008200a491b220a4100480d072000450d0120032000200a102722030d020c090b200941106a21080c020b200a10262203450d070b2002200a36022c20022003360228200a21000b200320096a2209200b3700082009200c37000020052008360200200641106a290300210b0240200020086b41074b0d00200841086a22092008490d042000410174220a20092009200a491b22094100480d04024002402000450d00200320002009102722030d010c090b200910262203450d080b2002200936022c200220033602280b2005200841086a360200200320086a200b3700000240024002400240200228022c220020052802002203470d00200341016a22002003490d0720034101742208200020002008491b22004100480d072003450d01200228022820032000102722090d020c0b0b200228022821090c020b200010262209450d090b2002200036022c200220093602280b2005200341016a2208360200200920036a200641206a2d00003a0000200641286a2106200741586a22070d000c020b0b20052802002108200228022c2100200228022821090b200241086a412020092008100402402000450d00200910230b200410230240200141046a280200450d00200128020010230b200241d0006a24000f0b101e000b200a4101102a000b200a4101102a000b20094101102a000b20004101102a000b410e4101102a000b412e4101102a000b898b010d027f027e067f017e0c7f017e017f037e0f7f027e347f027e347f230041a0026b2201240020014180026a41086a2202420037030020014200370380024184b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037022034200510d044200210420002003824200520d130c010b42002104200042e807824200520d120b20014180026a41086a22022004370300200120043703800241b0b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d1120014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0120012802702202450d114108210520014180026a41086a2206420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200629030037030020012001290380023703e0014100210602400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a10890220012802702205450d07200141f8006a2802002106200128027421070c010b410021070b4200210320014180026a41086a22084200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a2209200829030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d002001200141e0016a3602800220014110360284022001420037037020014100200141e0016a4110200141f0006a41084100100122082008417f461b2208410820084108491b220936028802200841074d0d05200129037021032001410036027020014188026a4100200141e0016a4110200141f0006a41042009100122082008417f461b22084104200841044922081b20096a36020020080d0520012802702108200141f0006a20014180026a10282001280270220a450d0520082001290274220b422088a76b20066a21090240200ba7450d00200a10230b20092002490d080c070b20084200370300200142003703800241af98c300410d20014180026a10002009200829030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d04200129037021030b41002108200620024f0d060c070b41d4aac10041331021000b41d4aac10041331021000b4198b3c200104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b0240200820024f0d00200820026b220220066a220820024f0d052005200841286c6a29032021030c010b20014180026a41086a22024200370300200142003703800241d8b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037020037c21030c010b420520037c21030b20014180026a41086a2202420037030020014200370380024184b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240024002400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d022001290370220b4200520d0141fcb3c200104f000b42e807210b0b2003200b7c427f7c22032003200b827d210302402007450d00200510230b20032000520d0c4108210c20014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100210d02400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a1089022001280270220c450d07200141f8006a280200210d2001280274210e0c010b4100210e0b20014180026a41086a22024200370300200142003703800241b0b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100210f0240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d032001280270210f0b4200210320014180026a41086a22024200370300200142003703800241af98c300410d20014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037021030b02400240200d41286c2202450d00200c41206a2903002003580d010b4101211041002111410021120c090b200141e0016a41186a2206200c41186a290300370300200141e0016a41106a2208200c41106a290300370300200141e0016a41086a2205200c41086a2903003703002001200c2903003703e001412010262210450d07201020012903e001370000201041186a2006290300370000201041106a2008290300370000201041086a200529030037000002400240200c20026a200c41286a2202460d00200d41286c41586a21054120210841012106410121110340200241206a2903002003560d02200141e0016a41186a2207200241186a290300370300200141e0016a41106a2209200241106a290300370300200141e0016a41086a220a200241086a290300370300200120022903003703e00102400240024020112006470d00200641016a22132006490d2020064101742212201320132012491b2212ad420586220b422088a70d20200ba722134100480d202006450d01201020064105742013102722100d020c0a0b200621120c010b201310262210450d080b200241286a2102201020086a220620012903e001370000200641186a2007290300370000200641106a2009290300370000200641086a200a290300370000200841206a2108201141016a211120122106200541586a22050d000c0b0b0b4101211141012112200f200d41016b22064b0d0a0c0b0b20062112200f200d20116b22064b0d090c0a0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20134101102a000b41d4aac10041331021000b41ecb3c200200820061029000b41204101102a000b200f200d20116b22064d0d010b20014180026a41086a2202420037030020014200370380024194b4c200411c20014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d072001290370210b0c010b42e807210b0b20014180026a41086a22024200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0012001410036027820014201370370410810262202450d09200142888080808001370274200120023602702002200b20037c37000020024108411010272202450d0a20014290808080c0013702742002200f20066b221436000820012002360270200120113602800220014180026a200141f0006a1041024002402011450d00201141057421094100200141f0006a41086a28020022066b21052001280270210a200128027421072010210203400240200720056a411f4b0d00200641206a22082006490d1420074101742213200820082013491b22084100480d14024002402007450d00200a200720081027220a0d010c090b20081026220a450d080b200821070b200a20066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102200941606a22090d000b200141f8006a2006360200200120073602742001200a3602700c010b200141f8006a2802002106200128027421072001280270210a0b200141e0016a4110200a2006100402402007450d00200a10230b02402012450d00201010230b20014180026a41086a22024200370300200142003703800241b0b4c200411220014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0a200128027021060c010b410221060b20014198026a420037030020014190026a420037030020014188026a42003703002001420037038002200620146a2213ad42307e2203422088a70d0f2003a72202417f4c0d0f024002402002450d00200210262210450d0d201021020c010b41082110410821020b200141f0006a41186a220920014180026a41186a290300370300200141f0006a41106a220a20014180026a41106a290300370300200141f0006a41086a20014180026a41086a290300370300200120012903800237037002400240024020134102490d002011200f6a20066a417f6a200d6b21060340200141e0016a41186a22082009290300370300200141e0016a41106a2205200a290300370300200141e0016a41086a2207200141f0006a41086a290300370300200120012903703703e0012002420037030820024200370300200241286a2008290300370300200241206a2005290300370300200241186a2007290300370300200241106a20012903e001370300200241306a21022006417f6a22060d000b2013417f6a21060c010b410021062013450d010b200242003703082002420037030020022001290370370310200241186a200141f8006a290300370300200241206a20014180016a290300370300200241286a200141f0006a41186a290300370300200641016a21060b20012006360278200120133602742001201036027020014180026a41086a22024200370300200142003703800241c2b4c200411320014180026a1000200141e0016a41086a200229030037030020012001290380023703e00120014110360284022001200141e0016a36028002200141f0006a20014180026a108a0202402013450d00201010230b200141f0006a41086a2014360200200141023a0074200141063a007041a886c5004100200141f0006a102c200e0d010c020b02402012450d00201010230b200e450d010b200c10230b20014180026a41086a22022004370300200120043703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d0f2001200141e0016a3602800220014110360284022001420037037020014100200141e0016a4110200141f0006a41084100100122022002417f461b2202410820024108491b22063602880202400240024002400240200241074d0d00200129037021042001410036027020014188026a4100200141e0016a4110200141f0006a41042006100122022002417f461b22024104200241044922021b20066a36020020020d00200141f0006a20014180026a102820012802702215450d002001280274211620042000520d1320014180026a41086a22024200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001024002400240200141e0016a411041a886c500410041001001417f460d002001200141e0016a360240200141103602442001420037037020014100200141e0016a4110200141f0006a41084100100122022002417f461b2202410820024108491b2206360248200241074d0d062001290370210420014100360270200141c8006a4100200141e0016a4110200141f0006a41042006100122022002417f461b22024104200241044922021b20066a36020020020d0620012802702102200141f0006a200141c0006a102820012802702217450d0620012002360288022001200437038002200129027421182001280288022119200141e0016a41101003410821144200211a20014180026a41086a22024200370300200142003703800241c2b4c200411320014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a108b0220012802702214450d0c2001290274211a200141e0016a411010030b20014180026a41086a22024200370300200142003703800241af98c300410d20014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e0014200211b0240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d052001290370211b0b20024200370300200142003703800241d8b3c200411420014180026a10002006200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d0120014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d052001290370211c0c020b02402016450d00201510230b41c9b5c200410f100f41d8b5c2004135100f200141a0026a24000f0b4205211c0b4200210420014180026a41086a22024200370300200142003703800241a1b5c200411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d002001420037037820014200370370200141e0016a4110200141f0006a4110410010012202417f460d082002410f4d0d08200141f8006a2903002104200129037021000c010b420921000b2014201a422088a7221d41306c6a21020240024002402019450d002019417f6a211341002108024020142002460d002014201d41306c6a220641506a2202290300200641586a29030084500d0220014198026a200641786a29000037030020014190026a200641706a29000037030020014188026a200641686a2900003703002001200641606a29000037038002410121080b410021110c020b4100211141002113410021080c010b410121110b200141f9006a20014180026a41086a29030037000020014181016a20014180026a41106a29030037000020014189016a20014180026a41186a290300370000200120083a007020012001290380023700714101210d200141f0006a410172210602402008450d00200620002004102b200141e0016a41186a200641186a290000370300200141e0016a41106a200641106a290000370300200141e0016a41086a200641086a290000370300200120062900003703e00141201026220e450d0a200e20012903e001370000200e41186a200141e0016a41186a2208290300370000200e41106a200141e0016a41106a2205290300370000200e41086a200141e0016a41086a2207290300370000200141f0006a41017221064102210a412021094101211e4101211f0240410020136b220c41016a4101460d000340201141ff01710d0120142002460d01200241506a2213290300200241586a29030084500d012008200241786a2900003703002005200241706a2900003703002007200241686a2900003703002001200241606a2900003703e001200620012903e001370000200641086a22022007290300370000200641106a22112005290300370000200641186a22102008290300370000200141013a0070200620002004102b20014180026a41186a2212201029000037030020014180026a41106a2210201129000037030020014180026a41086a22112002290000370300200120062900003703800220082012290300370300200520102903003703002007201129030037030020012001290380023703e0010240201e201f470d00201e41016a2202201e490d16200a20022002200a491b221fad4205862203422088a70d162003a722024100480d160240201e450d00200e200920021027220e0d010c090b20021026220e450d080b200e20096a220220012903e001370000200241186a2008290300370000200241106a2005290300370000200241086a2007290300370000200a41026a210a200941206a21094100211120132102200c201e41016a221e6a4101470d000b0b200e20096a210d201e450d0f41082120200141f0006a41086a2121412021224101212341212124411f21254105212641072127417f2128411821294110212a4102212b4201212c4200212d4111212e4190b5c200212f4100213041a886c50021312001419c016a213241132133410f213441332135412b213641232137411b213841042139415f213a200e213b4100213c0c100b200141e0016a41186a200641186a290000370300200141e0016a41106a200641106a290000370300200141e0016a41086a200641086a290000370300200120062900003703e0014100211f4101210e4100211e410021020c100b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20024101102a000b20084101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41204101102a000b41d4aac10041331021000b41084101102a000b41104101102a000b20024108102a000b410021020c010b410121020b034002400240024002400240024002400240024002400240024002400240024002400240024020020e020001010b4108210f20014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100213d024002400240024002400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a1089022001280270220f450d02200141f8006a280200213e2001280274213d0c010b4100213e0b200141013602700240024002400240024002402018422088a72207450d004100213f4100214002402007200f203e41286c6a2205200f6b41286e2202200220074b1b2202450d00200241057422064100480d1e200610262208450d0920012008360270200221400b200f2102200721082001280270224121060340200520026b419f014d0d0220062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020084101460d0320062002290028370020200641386a200241c0006a290000370000200641306a200241386a290000370000200641286a200241306a29000037000020084102460d0420062002290050370040200641d8006a200241e8006a290000370000200641d0006a200241e0006a290000370000200641c8006a200241d8006a29000037000020084103460d0520062002290078370060200641f8006a20024190016a290000370000200641f0006a20024188016a290000370000200641e8006a20024180016a290000370000203f41046a213f20064180016a2106200241a0016a21022008417c6a22080d000c060b0b41002140200128027021414100213f0c040b20052002460d03200f203e41286c6a2109410121050240034020062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020082005223c460d01203c41016a2105200641206a21062009200241286a2202470d000b0b203f203c6a213f0c030b203f410172213f0c020b203f410272213f0c010b203f410372213f0b201c201b7c210b200f203e41286c6a210c02400240024002400240024002402007450d00200c200f460d012007417f732106203e41286c2108200f21020340200141e0016a41186a200241186a290300370300200141e0016a41106a200241106a290300370300200141e0016a41086a200241086a290300370300200120022903003703e001200641016a2206450d05200241286a2102200841586a22080d000b200c2106200e200d470d030c020b200c200f460d00200141f0006a41186a200f41186a290300370300200141f0006a41106a200f41106a290300370300200141f0006a41086a200f41086a2903003703002001200f290300370370200f41286a2106200f29032021040c040b200f2106200e200d470d010b41002142410821430240203d450d00200f10230b4100213e0c180b200141e0016a41186a200e41186a2202290000370300200141e0016a41106a200e41106a2208290000370300200141e0016a41086a200e41086a22052900003703002001200e2900003703e0012005290000210420082900002100200e290000210320014180026a41186a200229000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200e41206a210841022105200b21040c020b200241206a2903002104200141f0006a41186a200141e0016a41186a290300370300200141f0006a41106a200141e0016a41106a290300370300200141f0006a41086a200141e0016a41086a290300370300200120012903e001370370200241286a21060b20014180026a41186a200141f0006a41186a29030037030020014180026a41106a200141f0006a41106a29030037030020014180026a41086a200141f0006a41086a290300370300200120012903703703800241002105200e21080b417f417f200c20066b41286d2202200d20086b4105766a220720072002491b220241016a220720072002491b2242ad42287e2200422088a70d162000a72202417f4c0d16024002402002450d00200210262243450d03204321440c010b41082143410821440b2043200129038002370300204341186a20014180026a41186a290300370300204341106a20014180026a41106a290300370300204341086a20014180026a41086a2903003703002044200437032002400240024002400240024002402005450d002008200d460d03200841086a2900002104200841106a29000021002008290000210320014180026a41186a200841186a29000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200841206a21080c010b02402006200c460d00200141f0006a41186a200641186a2202290300370300200141f0006a41106a200641106a2205290300370300200141f0006a41086a200641086a22072903003703002001200629030037037020014180026a41086a200729030037030020014180026a41106a200529030037030020014180026a41186a20022903003703002001200629030037038002200641286a210220062903202104410021110c020b2008200d460d02200141e0016a41186a200841186a2202290000370300200141e0016a41106a200841106a2205290000370300200141e0016a41086a200841086a2207290000370300200120082900003703e00120072900002104200529000021002008290000210320014180026a41186a200229000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200841206a21080b41022111200b2104200621020b4102210741022106412821050340200141f0006a41186a223c20014180026a41186a2213290300370300200141f0006a41106a220920014180026a41106a2210290300370300200141f0006a41086a220a20014180026a41086a2212290300370300200120012903800237037002402006223e417f6a22062042470d002006417f417f200c20026b41286d2244200d20086b4105766a224220422044491b224441016a224220422044491b6a22442006490d1d2007204420442007491b2242ad42287e2200422088a70d1d2000a722064100480d1d02400240203e4101470d002006102622430d010c070b20432005200610272243450d060b204321440b204420056a22062001290370370300200641186a203c290300370300200641106a2009290300370300200641086a200a290300370300200641206a2004370300024002400240024002400240201141ff017122064101460d0020064102470d012008200d460d05200841086a2900002104200841106a2900002100200829000021032013200841186a29000037030020102000370300201220043703002001200337038002200841206a210842012100410221110c020b200c2002460d042013200241186a2903003703002010200241106a2903003703002012200241086a2903003703002001200229030037038002200229032021044201210041012111200241286a21020c030b200c2002470d014102211102402008200d460d00200141e0016a41186a200841186a2206290000370300200141e0016a41106a200841106a223c290000370300200141e0016a41086a200841086a2209290000370300200120082900003703e00120092900002104203c2900002100200829000021032013200629000037030020102000370300201220043703002001200337038002200841206a2108420121000c010b420021000c020b200b21040c010b203c200241186a22062903003703002009200241106a223c290300370300200a200241086a22092903003703002001200229030037037020092903002104203c2903002100200229030021032013200629030037030020102000370300201220043703002001200337038002200229032021044201210041002111200241286a21020b200741026a2107203e41016a2106200541286a210520004200520d010b0b203d450d020c010b4101213e203d450d010b200f10230b0240203e41144b0d0041022145203e4102490d16417f2146203e417f6a2147412821482044203e41286c6a21494120214a4118214b4110214c4108214d4103214e41f000214f41582150417821514170215241682153416021544101215541c80021564101213c0c070b203e4101762257ad42287e2204422088a70d172004a72202417f4c0d1741082158024002402002450d00200210262259450d062059215a0c010b410821594108215a0b4158215b204441586a215c204441a87f6a215d4100215e4104215f417f21604101216142032162422021634103216441022165417d21664128216741782168412021694118216a4110216b417e216c4174216d4164216e4150216f410521704109217141f000217241c800217341c00021744138217541302176410a217741042178410021794100217a203e217b4102213c0c080b20064108102a000b41d4aac10041331021000b20024108102a000b20064101102a000b20024108102a000b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240203c0e050001020304040b2001203b10ef01024020012802002023470d00200120206a2802002108200141206a108c022001280220213d0240200141206a20206a2802002202450d00200220246c2106203d20236a2102200820207621112023200820257174210c20082026762027712213202873210f03400240024002400240200220286a2d00002023470d00200141f0006a20296a200220296a2205290000370300200141f0006a202a6a2002202a6a22072900003703002021200220206a220929000037030020022900002104200141f0006a20226a20113602002001200437037020014180026a200141f0006a108d020240201320014180026a20206a220a28020022084f0d002008200f6a221020084f0d0d20012802800222122010202b746a280200200c7121080240200128028402450d00201210230b2008450d01200141f0006a2002108e022001290370202c520d02200a202d3703002001202d37038002202f202e20014180026a1000200141e0016a20206a2210200a29030037030020012001290380023703e001200141e0016a202a20312030203010012028460d032001203036028002200141e0016a202a20014180026a20392030100120236a20394d0d0e203220012802800220236a3602002033102622080d040c120b200128028402450d0020012802800210230b200220246a21022006203a6a22060d030c040b203310262208450d0d200820346a20302800c5b542360000200820206a20302900beb542370000200820302900b6b54237000020082033203510272208450d0e20082002290000370013200820366a2005290000370000200820376a2007290000370000200820386a2009290000370000200141e0016a20296a2205202d370300200141e0016a202a6a2207202d370300200141e0016a20206a2209202d3703002001202d3703e00120082035200141e0016a1002200141c0006a20296a2005290300370300200141c0006a202a6a2007290300370300200141c0006a20206a2009290300370300200120012903e001370340200141c0006a2022100320081023200220246a21022006203a6a22060d020c030b20324101360200203310262208450d0e0b200820346a20302800c5b542360000200820206a20302900beb542370000200820302900b6b54237000020082033203510272208450d0e20082002290000370013200820366a2005290000370000200820376a2007290000370000200820386a2009290000370000200141e0016a20296a2205202d370300200141e0016a202a6a2207202d3703002010202d3703002001202d3703e00120082035200141e0016a1002200141c0006a20296a2005290300370300200141c0006a202a6a2007290300370300200141c0006a20206a2010290300370300200120012903e00137034020012022360284022001200141c0006a36028002202120014180026a10ed0120081023200220246a21022006203a6a22060d000b0b2001280224450d00203d10230b200d203b20226a223b470d130c180b203e2047220220466a2247490d0d0240203e20476b22062045490d002044200220486c6a2202204a6a22052903002044204720486c6a2208204a6a220729030022045a0d00200141e0016a204b6a223c2008204b6a2209290300370300200141e0016a204c6a220a2008204c6a2211290300370300200141e0016a204d6a22132008204d6a2210290300370300200120082903003703e0012008200229030037030020102002204d6a29030037030020112002204c6a29030037030020092002204b6a2903003703002007200529030037030002402006204e490d002008204f6a29030020045a0d00410221082049210503402005220220506a2002290300370300200220516a2002204a6a290300370300200220526a2002204b6a290300370300200220536a2002204c6a290300370300200220546a2002204d6a290300370300200820556a220820064f0d01200220486a2105200220566a2903002004540d000b0b200220012903e001370300200220043703202002204b6a203c2903003703002002204c6a200a2903003703002002204d6a20132903003703000b204920506a214920470d130c280b207b217c4100217b4101217d207c20606a2209450d1f0240024002400240024002402044200920676c6a20696a2903002044207c20676c22026a206f6a29030022045a0d00205d207c20706c20647422056a2102034020092061460d02200920606a21092004200229030022005421062002205b6a21022000210420060d000c030b0b207c206c6a2105205d20026a21064100217b41002102034020052002460d05200220616a21022004200629030022005a21082006205b6a21062000210420080d000b200220616a217d207c20026b20606a2209450d030c020b410021090b207c2009490d11207c203e4b0d130240207c20096b227d2061762208450d00205c20056a21022044200920676c6a21060340200141f0006a20696a2205200620696a2207290300370300200141f0006a206a6a223c2006206a6a220a290300370300200141f0006a206b6a22112006206b6a2213290300370300200141f0006a20586a2210200620586a221229030037030020012006290300370370200220586a220c29030021042002206b6a220f29030021002002206a6a223d29030021032002290300210b2007200220696a228101290300370300200a200337030020132000370300201220043703002006200b3703002081012005290300370300203d203c290300370300200f2011290300370300200c2010290300370300200220012903703703002002205b6a2102200620676a2106200820606a22080d000b0b2009450d010b207d20714b0d00207c203e4b0d112044200920676c6a217e4100217f0c260b2009217b2079207a460d230c240b207c217d2079207a460d200c210b2087012014460d01208701208a016a2102208701208b016a228701290300200229030084500d012019209601460d1420960120196b210203402014208701460d02208701208a016a2106208701208b016a228701290300200629030084500d0220022096016a22020d000c140b0b2087012014460d0002400340208701208a016a2903002104208701208b016a22022903002100208e01208701208c016a290300370300209101208701208f016a2903003703002094012087012092016a29030037030020012087012095016a290300370380022000200484500d01200141f0006a208d016a2206208e01290300370300200141f0006a2090016a2208209101290300370300200141f0006a2093016a22052094012903003703002001200129038002370370200141e0006a200141f0006a10ef01200141c0006a208d016a2207208e01290300370300200141c0006a2090016a223c209101290300370300200141c0006a2093016a2209209401290300370300200120012903800237034002402001280260209601460d00200221870120142002470d010c030b0b200141e0016a2093016a220a2009290300370300200141e0016a2090016a2209203c290300370300200141e0016a208d016a223c2007290300370300200120012903403703e001200141e0006a2093016a2802002102200141206a208d016a2207203c290300370300200141206a2090016a223c2009290300370300200141206a2093016a2209200a290300370300200120012903e0013703202001208d016a220a200729030037030020012090016a2207203c29030037030020012093016a223c2009290300370300200120012903203703002006200a290300370300200820072903003703002005203c29030037030020012001290300370370024020860120024d0d00208701208b016a2187012085012002209701746a220220012903703700002002208d016a200629030037000020022090016a200829030037000020022093016a20052903003700002089012096016a2189014100211941000d134104213c0c1b0b41d8b4c20020022086011029000b200141206a41186a200141e0016a41186a290300370300200141206a41106a200141e0016a41106a290300370300200141206a41086a200141e0016a41086a290300370300200120012903e0013703200b0240208801450d00201410230b024020860120840141ffffff3f71220220022086014b1b2207450d0020830121022085012106410021050340024020022006460d00200220064120109604450d00411610262208450d0a2008410e6a41002900e1b641370000200841086a41002900dbb641370000200841002900d3b64137000020084116413610272208450d0b200820022900003700162008412e6a200241186a290000370000200841266a200241106a2900003700002008411e6a200241086a290000370000200141e0016a41186a223e4200370300200141e0016a41106a223c4200370300200141e0016a41086a22094200370300200142003703e00120084136200141e0016a1002200141c0006a41186a203e290300370300200141c0006a41106a203c290300370300200141c0006a41086a2009290300370300200120012903e001370340200141c0006a41201003200810230b200241206a2102200641206a2106200541016a22052007490d000b0b2085012086014105746a2102208601213e02400240024002400240024002402086014104490d00200141f0006a41206a213c200141b0016a2109200141d0016a210a200141f0016a21870120014188016a210820014180016a2105200141f8006a210720022106208601213e0340200842003703002005420037030020074200370300200142003703700240203c2006460d00200641606a200141f0006a41201096040d030b20084200370300200542003703002007420037030020014200370370024020092006460d00200641406a200141f0006a41201096040d040b200842003703002005420037030020074200370300200142003703700240200a2006460d00200641a07f6a200141f0006a41201096040d050b20084200370300200542003703002007420037030020014200370370200641807f6a210202402087012006460d002002200141f0006a41201096040d060b203e417c6a213e2002210620022085016b41ff004b0d000b0b2002208501460d05203e417f6a2106200141f0006a41206a210820014188016a210520014180016a2107200141f8006a213e03402005420037030020074200370300203e420037030020014200370370024020082002460d00200241606a200141f0006a41201096040d060b2006417f6a2106208501200241606a2202470d000c060b0b203e417f6a21060c030b203e417e6a21060c020b203e417d6a21060c010b203e417c6a21060b200641016a220220860120860120024b1b2186010b2001418c016a203f360200200141f0006a41186a204036020020014184016a2041360200200141f0006a41106a201e360200200141fc006a201f360200200141f0006a41086a2202200e360200200141033a0074200141063a007041a886c5004100200141f0006a102c20014180026a41086a22064200370300200142003703800241e8b4c200411220014180026a1000200141e0016a41086a200629030037030020012001290380023703e001200141003602782001420137037020012086013602800220014180026a200141f0006a104102400240208601450d00208601410574213e4100200228020022066b21052001280270213c20012802742107208501210203400240200720056a411f4b0d00200641206a22082006490d2b20074101742209200820082009491b22084100480d2b024002402007450d00203c200720081027223c0d010c080b20081026223c450d070b200821070b203c20066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102203e41606a223e0d000b200141f8006a2006360200200120073602742001203c3602700c010b20022802002106200128027421072001280270213c0b200141e0016a4110203c2006100402402007450d00203c10230b0240208401450d0020850110230b20014180026a41086a22024200370300200142003703800241fab4c200411620014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e0012001208901360270200141e0016a4110200141f0006a410410042002420037030020014200370380024190b5c200411120014180026a10002006200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0c200128027041016a21020c010b410121020b20014180026a41086a2206420037030020014200370380024190b5c200411120014180026a1000200141e0016a41086a200629030037030020012001290380023703e00120012002360270200141e0016a4110200141f0006a410410040240208201450d0020830110230b2018a7450d28201710230c280b41ecb3c200201020081029000b41d4aac10041331021000b20084101102a000b41134101102a000b41334101102a000b41134101102a000b41334101102a000b41164101102a000b41364101102a000b2047203e1048000b41d4aac10041331021000b2009207c1048000b207c2009417f6a227b490d160b207c203e108c01000b4100213c0c050b4101213c0c060b4103213c0c080b4104213c0c080b4104213c0c080b410021020c110b410121020c100b410121020c0f0b410121020c0e0b410121020c0d0b410121020c0c0b410121020c0b0b410121020c0a0b410121020c090b410021020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b2079207a470d12410121020c160b207920616a22022079490d1a20792061742206200220022006491b2202ad2062862204206388a70d1a2004a72206205e480d1a024002402079450d00207820792064742006102722780d010c030b200610262278450d020b20022179410221020c150b2078207a2064746a2202207d3602042002207b360200207a20616a228001217a2080012065490d024101217f0c130b20064104102a000b02400240207f0e020001010b207c200920606a227b490d140240207c207b6b227d2065490d002044200920676c6a220220696a22082903002044207b20676c6a220620696a220529030022045a0d00200141e0016a206a6a22072006206a6a223c290300370300200141e0016a206b6a220a2006206b6a2211290300370300200141e0016a20586a2213200620586a2210290300370300200120062903003703e001200620022903003703002010200220586a29030037030020112002206b6a290300370300203c2002206a6a290300370300200520082903003703000240207d2064490d00200620726a29030020045a0d0041022106207e2108024003402008220220696a200220736a2903003703002002206a6a200220746a2903003703002002206b6a200220756a290300370300200220586a200220766a2903003703002002200220676a2208290300370300200620616a2206207d4f0d01200220726a2903002004540d000b0b200220676a21020b200220012903e001370300200220043703202002206a6a20072903003703002002206b6a200a290300370300200220586a20132903003703000b207b450d0e207e205b6a217e207b2109207d2077490d0c410021020c130b02400240024002402078208001221320606a2280012064746a2202280200450d00207820132064746a2207206d6a2802002205200228020422064d0d004102217a201341024d0d042078201320666a22022064746a2802042208200620056a4d0d014103217a201341034d0d042007206e6a280200200820056a4d0d010c050b20132064490d01200228020421062078201320666a22022064746a28020421080b20082006490d010b2013206c6a21020b2013200220616a227a4d0d03201320024d0d04207820022064746a2212280204223d20122802006a22022078207a2064746a220c280200220f490d052002203e4b0d062012205f6a2181012044200f20676c6a2211200c280204221020676c22066a2107200220676c2108024002400240024002402002200f6b223c20106b220220104f0d0020592007200220676c22061094041a205a20066a210520102061480d0120022061480d01205c20086a210820072102034020082002205b6a223c2005205b6a220a200520686a290300200220686a2903005422071b2206290300370300200820696a200620696a2903003703002008206a6a2006206a6a2903003703002008206b6a2006206b6a290300370300200820586a200620586a2903003703002005200a20071b21052011203c200220071b22024f0d042008205b6a2108205a2106205a2005490d000c050b0b2059201120061094041a205a20066a210520102061480d01203c20104c0d01204420086a210a205a2106201121020340200220072006200720696a290300200620696a29030054223c1b2208290300370300200220696a200820696a2903003703002002206a6a2008206a6a2903003703002002206b6a2008206b6a290300370300200220586a200820586a2903003703002006200620676a203c1b2106200220676a2102200720676a2007203c1b2207200a4f0d04200520064b0d000c040b0b200721020c010b201121020b205a21060b20022006200520066b220820082067706b1094041a208101203d20106a3602002012200f360200200c200c20586a207a20607320136a2064741095041a208001217a20800120614b0d0c0b207b0d060c010b2013217a207b0d060b02402079450d00207810230b2057450d11205910230c110b41b0a8c100207a20131029000b41b0a8c100200220131029000b200f20021048000b2002203e108c01000b4102213c0c010b4102213c0c010b410121020c0b0b410121020c0a0b4100217f0c030b4101217f0c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b207b207c1048000b2001203e360278200120423602742001204336027020014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e00120014110360284022001200141e0016a36028002200141f0006a20014180026a108f0202402042450d00204310230b2041203f10900220024200370300200142003703800241e8b4c200411220014180026a10002006200229030037030020012001290380023703e001410021820102400240024002400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a10282001280270228301450d02200141f8006a28020021840120012802742182010c010b410121830141002184010b200141d8006a4200370300200141d0006a4200370300200141c8006a420037030020014200370340208401ad2204421b88a70d042004420586a72202417f4c0d04024002402002450d00200210262285010d0120024101102a000b41012185010b200141f0006a41186a2208200141c0006a41186a290300370300200141f0006a41106a2205200141c0006a41106a290300370300200141f0006a41086a2207200141c0006a41086a290300370300200120012903403703700240024002402084014102490d00208401417f6a21062085012102034020022001290370370000200241186a2008290300370000200241106a2005290300370000200241086a2007290300370000200241206a21022006417f6a22060d000b208401417f6a2186010c010b41002186012085012102208401450d010b20022001290370370000200241186a200141f0006a41186a290300370000200241106a200141f0006a41106a290300370000200241086a200141f0006a41086a29030037000020860141016a2186010b2014201d41306c6a218701201aa721880141002189014158218a014150218b014178218c014118218d0120014180026a41186a218e014170218f01411021900120014180026a41106a2191014168219201410821930120014180026a41086a2194014160219501410121960141052197012019450d014103213c0c020b41d4aac10041331021000b4104213c410121020c010b410121020c000b0b101d000b101e000b2016450d00201510230b200141a0026a24000bf90504027f017e0f7f017e230041f0006b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241f0006a24000f0b4108210620030d030b4100210f4100210d0c030b101d000b20054108102a000b200241d0006a41186a2107200241d0006a41106a2108200141046a21094100210a4100210b4100210c2003210d024003402007420037030020084200370300200241d0006a41086a220e420037030020024200370350200141086a2205410020012802002009280200200241d0006a412020052802001001220f200f417f461b220f4120200f412049220f1b20052802006a2210360200200f0d01200241306a41186a22112007290300370300200241306a41106a22122008290300370300200241306a41086a2213200e29030037030020022002290350370330200242003703502005410020012802002009280200200241d0006a410820101001220f200f417f461b220f4108200f4108491b20052802006a360200200f41074d0d01200c41016a210f20022903502104200241106a41186a220e2011290300370300200241106a41106a22102012290300370300200241106a41086a22112013290300370300200220022903303703100240200c200d470d00200a200f200f200a491b220dad42287e2214422088a70d042014a722054100480d040240200c450d002006200b2005102722060d010c060b200510262206450d050b2006200b6a22052002290310370300200541186a200e290300370300200541106a2010290300370300200541086a2011290300370300200541206a2004370300200a41026a210a200b41286a210b200f210c200f2003490d000c020b0b200041003602000240200d450d00200610230b200241f0006a24000f0b2000200d36020420002006360200200041086a200f360200200241f0006a24000f0b101e000b20054108102a000b9e0403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d002003200041306c6a2104200241086a280200210520022802002106200228020421000340200341086a2903002107200329030021080240024002400240200020056b41104f0d00200541106a22092005490d062000410174220a20092009200a491b220a4100480d062000450d0120062000200a102722060d020c070b200541106a21090c020b200a10262206450d050b200a21000b200620056a22052007370008200520083700000240024002400240200020096b41204f0d00200941206a22052009490d062000410174220a20052005200a491b220a4100480d062000450d0120062000200a102722060d020c080b200941206a21050c020b200a10262206450d060b200a21000b200620096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032004470d000b200241086a20053602002002200036020420022006360200200128020020012802042006200510042000450d050c040b200228020421032001280200200128020420022802002206200241086a280200100420030d030c040b101e000b200a4101102a000b200a4101102a000b200610230b200241106a24000bce0506027f017e0b7f017e027f017e230041d0006b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad42307e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210d4100210c0c030b101d000b20054108102a000b200141046a2107200141086a2108200241306a41186a21094100210a4100210b410021052003210c0240034020024200370338200242003703302008410020012802002007280200200241306a411020082802001001220d200d417f461b220d4110200d4110491b20082802006a220e360200200d410f4d0d01200241306a41086a220f29030021042002290330211020094200370300200241306a41106a22114200370300200f4200370300200242003703302008410020012802002007280200200241306a4120200e1001220d200d417f461b220d4120200d4120491b20082802006a360200200d411f4d0d01200541016a210d200241106a41186a220e2009290300370300200241106a41106a22122011290300370300200241106a41086a2211200f2903003703002002200229033037031002402005200c470d00200a200d200d200a491b220cad42307e2213422088a70d042013a7220f4100480d0402402005450d002006200b200f102722060d010c060b200f10262206450d050b2006200b6a2205200437030820052010370300200541286a200e290300370300200541206a2012290300370300200541186a2011290300370300200541106a2002290310370300200a41026a210a200b41306a210b200d2105200d2003490d000c020b0b200041003602000240200c450d00200610230b200241d0006a24000f0b2000200c36020420002006360200200041086a200d360200200241d0006a24000f0b101e000b200f4108102a000b8603020c7f017e230041206b2201240020014100109102200141106a410110910202400240024020012802182202450d00410221032001280204210420012802082105200141186a210603402001280214210b2001280210210a024002400240200420056b200241216c220241216d220c4f0d002005200c6a220c2005490d0520044101742208200c200c2008491b2209ad42217e220d422088a70d05200da722074100480d050240024020040d00200710262208450d080c010b2001280200200441216c200710272208450d070b20012008360200200921042008200541216c6a200a20021094041a200b0d010c020b2005200c6a210c2001280200200541216c6a200a20021094041a200b450d010b200a10230b200141106a2003109102200341016a2103200c2105200628020022020d000b200141086a200c360200200120043602040b02402001280214450d00200128021010230b20002001290300370200200041086a200141086a280200360200200141206a24000f0b101e000b20074101102a000bad0301047f230041d0006b220224000240024002400240411310262203450d002003410f6a410028009cb642360000200341086a4100290095b6423700002003410029008db64237000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200128022021042003413341e60010272201450d0220012004360033200241306a41186a22034200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020014137200241306a1002200241186a2003290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a10920220022802302203450d0520002002290234370204200020033602000c010b20004100360208200042043702000b20011023200241d0006a24000f0b41134101102a000b41334101102a000b41e6004101102a000b41d4aac10041331021000bf50402057f037e230041c0006b2202240002400240411310262203450d002003410f6a41002800c5b542360000200341086a41002900beb542370000200341002900b6b54237000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034133200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d0020024100360220410020024120200241206a41044100100122012001417f461b220141034d0d022002280220210420024100360220410020024120200241206a41042001410420014104491b2205100122012001417f461b220141034d0d0220022802202106200242003703282002420037032020024120200241206a41102001410420014104491b20056a220110012205417f460d022005410f4d0d02200241286a290300210720022903202108200242003703282002420037032020024120200241206a4110200141107210012201417f460d022001410f4d0d0220022903202109200041206a200241286a290300370300200041186a2009370300200041106a2007370300200020083703082000412c6a2006360200200041286a2004360200200042013703000c010b200042003703000b20031023200241c0006a24000f0b41d4aac10041331021000b41134101102a000b41334101102a000ba00402087f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d002003200041286c6a2104200241086a220528020021002002280204210603400240024002400240200620006b41204f0d00200041206a22072000490d0620064101742208200720072008491b22094100480d062006450d01200228020020062009102722080d020c070b200041206a2107200228020021080c020b200910262208450d050b2002200936020420022008360200200921060b20052007360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a290300210a0240024002400240200620076b41084f0d00200741086a22002007490d0620064101742209200020002009491b22094100480d062006450d01200820062009102722080d020c080b200741086a21000c020b200910262208450d060b2002200936020420022008360200200921060b20052000360200200820076a200a3700002004200341286a2203470d000b200128020020012802042008200010042006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100420030d030c040b101e000b20094101102a000b20094101102a000b200810230b200241106a24000b840e05027f017e0d7f067e047f230022022103200241e0016b416071220224000240024002402001ad2204421b88a70d002004420586a72205417f4c0d000240024002402005450d00200510262206450d0441002107410021084100210520010d010c020b410121064100210741002108410021052001450d010b20014105742109416020006b210a2006210520002108034020052008290000370000200541186a200841186a290000370000200541106a200841106a290000370000200541086a200841086a290000370000200541206a2105200841206a2108200941606a22090d000b200020014105746a200a6a41057641016a2105200121080b20022005360218200220083602142002200636021020062005200241d8016a200741202005676b108901200241a0016a41086a22054200370300200242003703a0014188a8c4004118200241a0016a100020024180016a41086a2005290300370300200220022903a00137038001024002400240024002400240024020024180016a411041a886c500200720071001417f460d0020024210370244200220024180016a360240200241a0016a200241c0006a102820022802a001220b450d0920022802a401210c4105210d200241a8016a28020041057422000d010c020b4101210b4100210c4105210d41004105742200450d010b200241a0016a411472210e200241a0016a410872210f200b21050340200241206a41186a220a200541186a290000370300200241206a41106a2210200541106a290000370300200241206a41086a2211200541086a29000037030020022005290000370320200241c0006a200241206a10b603200241003602a80120022903582112200220022903b801221337035820022903502114200220022903b001221537035020022903402116200220022903a00137034020022903482104200220022903a80122173703482015422088a721062017422088a721012013a721072017a7210902402004a72208450d00200220163703a001200220043703a801200220143703b001200220123703b8012002418c016a221820082014a7200d746a36020020024180016a41086a2219200836020020024180016a41106a221a200241106a36020020022004422088a7360284012002200836028001200241f0006a20024180016a10ab02200f41086a200241f0006a41086a221b280200360200200f200229037037020020182014422088a722082012422088a7200d746a36020020192008360200201a200241106a36020020022012a7360284012002200836028001200241f0006a20024180016a10ab02200e41086a201b280200360200200e200229037037020020022903b801211720022903b001211220022903a801210420022903a001211402402009450d0002402001450d00200910230b2007450d00200610230b20022014370340200220043703482004422088a72101200220123703502012422088a72106200220173703582004a721092017a721070b41151026210802402009450d002008450d032008410d6a41002900ada844370000200841086a41002900a8a844370000200841002900a0a84437000020084115413510272208450d04200820022903203700152008412d6a200a290300370000200841256a20102903003700002008411d6a2011290300370000200241a0016a41186a220a4200370300200241a0016a41106a22104200370300200241a0016a41086a22114200370300200242003703a00120084135200241a0016a100220024180016a41186a200a29030037030020024180016a41106a201029030037030020024180016a41086a2011290300370300200220022903a00137038001200241203602a401200220024180016a3602a001200241c0006a200241a0016a10ad032008102302402001450d00200910230b02402007450d00200610230b200541206a2105200041606a22000d010c020b2008450d042008410d6a41002900ada844370000200841086a41002900a8a844370000200841002900a0a84437000020084115413510272208450d05200820022903203700152008412d6a200a290300370000200841256a20102903003700002008411d6a2011290300370000200241a0016a41186a22094200370300200241a0016a41106a22014200370300200241a0016a41086a22074200370300200242003703a00120084135200241a0016a100220024180016a41186a200929030037030020024180016a41106a200129030037030020024180016a41086a2007290300370300200220022903a0013703800120024180016a4120100320081023200541206a2105200041606a22000d000b0b0240200c450d00200b10230b02402002280214450d00200228021010230b200324000f0b41154101102a000b41354101102a000b41154101102a000b41354101102a000b101d000b20054101102a000b41d4aac10041331021000b9a0805057f017e0b7f017e017f230041a0016b220224000240024002400240024002400240024002400240410e10262203450d00200341066a41002900a6b642370000200341002900a0b6423700002003410e411c10272204450d012004200136000e200241c0006a41186a22034200370300200241c0006a41106a22014200370300200241c0006a41086a220542003703002002420037034020044112200241c0006a1002200241106a41186a2003290300370300200241106a41106a2001290300370300200241106a41086a2005290300370300200220022903403703100240024002400240200241106a412041a886c500410041001001417f460d00200242203702342002200241106a360230200241086a200241306a104a2002280208450d0b200228020c2206ad42217e2207422088a70d032007a72203417f4c0d032003450d01200310262208450d062006450d020c070b20004100360208200042013702000c080b4101210820060d050b4100210e420021072008450d080c050b101d000b410e4101102a000b411c4101102a000b20034101102a000b200241306a41086a220928020021012002280234210a2002280230210b420021074100210c4100210d410021032006210e0340200241003a004020092001200b200a200241c0006a41012001100141016a41014b22056a22013602002005450d034100210f024020022d00402205450d0020054101470d04200241c0006a41186a220f4200370300200241c0006a41106a22104200370300200241c0006a41086a221142003703002002420037034020094100200b200a200241c0006a41202001100122052005417f461b2205412020054120491b20016a22013602002005411f4d0d0420024180016a41186a200f29030037030020024180016a41106a201029030037030020024180016a41086a201129030037030020022002290340370380014101210f0b200341016a2105200241e0006a41186a221020024180016a41186a290300370300200241e0006a41106a221120024180016a41106a290300370300200241e0006a41086a221220024180016a41086a290300370300200220022903800137036002402003200e470d00200c20052005200c491b220ead42217e2213422088a70d062013a722144100480d0602402003450d002008200d2014102722080d010c080b201410262208450d070b2008200d6a2203200f3a0000200341196a2010290300370000200341116a2011290300370000200341096a2012290300370000200341016a200229036037000020074280808080107c2107200c41026a210c200d41216a210d2005210320052006490d000b2008450d030b20002007200ead84370204200020083602000b20041023200241a0016a24000f0b200e450d00200810230b41d4aac10041331021000b101e000b20144101102a000bc50303027f017e097f230041106b2202240020022001104a02400240024002400240024002400240024002402002280200450d0020022802042203ad2204421e88a70d032004420286a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241106a24000f0b4104210620030d030b410021054100210b0c030b101d000b20054104102a000b200141086a210741002108410021094100210a2003210b0340200141046a28020021052007280200210c2002410036020c20074100200128020020052002410c6a4104200c100122052005417f461b2205410420054104491b20072802006a360200200541034d0d02200a41016a2105200228020c210c0240200a200b470d002008200520052008491b220bad4202862204422088a70d042004a7220d4100480d040240200a450d0020062009200d102722060d010c060b200d10262206450d050b200620096a200c360200200841026a2108200941046a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610230b200241106a24000f0b101e000b200d4104102a000bce0304027f017e037f017e230041c0006b2204240002400240411810262205450d00200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0120052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a200429032021060c010b4200210a0b2005102320012006200220062006200256200a200356200a2003511b22051b22027d200a2003200a20051b22037d2006200254ad7d10fe012000200337030820002002370300200441c0006a24000f0b41d4aac10041331021000b41184101102a000b41384101102a000bf01004047f017e087f037e230041d0046b22022400200241186a200110450240024002400240024002400240024002402002280218450d00200241003a00a002200241a0026a200128020022032001280204220441004722051094041a20042005490d04200141046a200420056b3602002001200320056a3602002004450d0120022d00a002220441ff00714101470d022004411874411875417f4c0d03420221060c080b20004203370370200241d0046a24000f0b20004203370370200241d0046a24000f0b20004203370370200241d0046a24000f0b200241a8046a200110950202400240024020022d00a8044102460d0020024180046a41206a200241a8046a41206a28020036020020024180046a41186a200241a8046a41186a29030037030020024180046a41106a200241a8046a41106a29030037030020024180046a41086a200241a8046a41086a290300370300200220022903a80437038004200241a0026a41386a22074200370300200241a0026a41306a22084200370300200241a0026a41286a22094200370300200241a0026a41206a220a4200370300200241a0026a41186a220b4200370300200241a0026a41106a220c4200370300200241a0026a41086a220d4200370300200242003703a002200241a0026a20012802002203200141046a220e280200220441c000200441c000491b22051094041a200e200420056b3602002001200320056a3602002004413f4d0d0020024190036a41386a200729030037030020024190036a41306a200829030037030020024190036a41286a200929030037030020024190036a41206a200a29030037030020024190036a41186a200b29030037030020024190036a41106a200c29030037030020024190036a41086a200d290300370300200220022903a00237039003200241086a200110462002280208450d002002290310210f200141046a220e2802002104200241003a00a002200241a0026a20012802002207200441004722051094041a20042005490d04200e200420056b22033602002001200720056a22053602002004450d0020023100a0022210500d01200241003a00a002200241a0026a2005200341004722041094041a20032004490d05200141046a200320046b3602002001200520046a3602002003450d0042022010420f838622114204540d004201210620023100a0024208862010844204882011420c882210420120104201561b7e22102011540d020b420221060c050b420021060b20024188016a41206a20024180046a41206a28020036020020024188016a41186a20024180046a41186a29030037030020024188016a41106a20024180046a41106a29030037030020024188016a41086a20024180046a41086a290300370300200241b0016a41086a20024190036a41086a290300370300200241b0016a41106a20024190036a41106a290300370300200241b0016a41186a20024190036a41186a290300370300200241b0016a41206a20024190036a41206a290300370300200241b0016a41286a20024190036a41286a290300370300200241b0016a41306a20024190036a41306a290300370300200241b0016a41386a20024190036a41386a29030037030020022002290380043703880120022002290390033703b0010c030b200520041048000b200520041048000b200420031048000b20024190036a41206a220420024188016a41206a28020036020020024190036a41186a220520024188016a41186a29030037030020024190036a41106a220320024188016a41106a29030037030020024190036a41086a220e20024188016a41086a290300370300200241a0026a41086a2207200241b0016a41086a290300370300200241a0026a41106a2208200241b0016a41106a290300370300200241a0026a41186a2209200241b0016a41186a290300370300200241a0026a41206a220a200241b0016a41206a290300370300200241a0026a41286a220b200241b0016a41286a290300370300200241a0026a41306a220c200241b0016a41306a290300370300200241a0026a41386a220d200241b0016a41386a290300370300200220022903880137039003200220022903b0013703a002024020064202520d0020004203370370200241d0046a24000f0b200241e0006a41206a2004280200360200200241e0006a41186a2005290300370300200241e0006a41106a2003290300370300200241e0006a41086a200e290300370300200241206a41086a2007290300370300200241206a41106a2008290300370300200241206a41186a2009290300370300200241206a41206a200a290300370300200241206a41286a200b290300370300200241206a41306a200c290300370300200241206a41386a200d2903003703002002200229039003370360200220022903a0023703200b200241a0026a2001104420022802a002210120024190036a200241a0026a41047241ec001094041a02402001410e470d0020004203370370200241d0046a24000f0b200241b0016a20024190036a41ec001094041a2000200f37030020002002290360370308200041106a200241e0006a41086a290300370300200041186a200241e0006a41106a290300370300200041206a200241e0006a41186a290300370300200041286a200241e0006a41206a2802003602002000200229032037022c200041346a200241206a41086a2903003702002000413c6a200241206a41106a290300370200200041c4006a200241206a41186a290300370200200041cc006a200241206a41206a290300370200200041d4006a200241206a41286a290300370200200041dc006a200241d0006a290300370200200041e4006a200241d8006a29030037020020004188016a200136020020004180016a201037030020002011370378200020063703702000418c016a200241b0016a41ec001094041a200241d0046a24000b8c0701067f230041f0006b22022400200241003a0050200241d0006a200128020022032001280204220441004722051094041a02400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002402004450d0020022d0050220441ef014d0d02200441847e6a220441034b0d00024002400240024020040e0400010203000b200241003b0150200241d0006a20052006410220064102491b22041094041a200141046a200620046b3602002001200520046a360200200641014d0d0320022f0150220441f0014f0d050c030b20024100360250200241d0006a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d024101210120022802502204418080044f0d050c020b200141046a20062006410420064104491b22046b3602002001200520046a3602000c010b41002103200241d0006a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a200241d0006a200520041094041a200141046a200620046b3602002001200520046a360200024002402006411f4d0d00200241c8006a41026a200241d0006a41026a2d00003a0000200241306a200241df006a290000370300200241386a200241e7006a290000370300200241c0006a200241d0006a411f6a2d00003a0000200220022f00503b01482002200229005737032820022800532104410121030c010b0b200241cc006a41026a2201200241c8006a41026a2d00003a0000200241d0006a41086a2205200241286a41086a290300370300200241d0006a41106a2206200241286a41106a290300370300200241d0006a41186a2207200241286a41186a2d00003a0000200220022f01483b014c200220022903283703502003450d00200241246a41026a20012d00003a0000200241086a41086a2005290300370300200241086a41106a2006290300370300200241086a41186a20072d00003a0000200220022f014c3b012420022002290350370308410021010c030b200041023a0000200241f0006a24000f0b200520041048000b410121010b200020022f01243b0001200020013a0000200041046a2004360200200041086a2002290308370200200041036a200241266a2d00003a0000200041106a200241086a41086a290300370200200041186a200241086a41106a290300370200200041206a200241086a41186a280200360200200241f0006a24000b9d1707017f027e037f017e017f017e047f230041e0046b2202240002400240200129037022034202520d00200241086a20014188016a41f0001094041a420021030c010b200241b6016a2001410b6a2d00003a000020024198016a41086a2001411c6a29020037030020024198016a410d6a200141216a290000370000200220012f00093b01b40120022001290214370398012001410c6a280200210520012d0008210620012802102107200241f0016a200141e4006a290000370300200241e8016a200141dc006a290000370300200241e0016a200141d4006a290000370300200241d8016a200141cc006a290000370300200241d0016a200141c4006a290000370300200241b8016a41106a2001413c6a290000370300200241b8016a41086a200141346a2900003703002002200129002c3703b80120012903002108200241f8016a41106a200141f0006a220941106a290300370300200241f8016a41086a200941086a290300370300200220092903003703f8014200210a200241d8026a41086a220b4200370300200242003703d80241af98c300410d200241d8026a1000200241c0046a41086a200b290300370300200220022903d8023703c00442002104024002400240024002400240024002400240024002400240200241c0046a411041a886c500410041001001417f460d00200242003703d802200241c0046a4110200241d8026a41084100100141016a41084d0d0120022903d8022104200929030021030b024020034201520d002001290378220a500d02200420014180016a290300220320032004541b2204200420037d200a827d210a0b200241d8026a200a109702200241ac026a41026a20022d00da023a0000200241c0046a41086a2209200241eb026a290000370300200241c0046a410d6a220b200241f0026a290000370000200220022f01d8023b01ac02200220022900e3023703c00420022800db02210c20022800df02210d20024190026a410d6a200b29000037000020024190026a41086a2009290300370300200220022903c004370390022002418c046a41026a2209200241b4016a41026a2d00003a0000200241d8026a41086a220b20024198016a41086a290300370300200241d8026a410d6a220e20024198016a410d6a290000370000200220022f01b4013b018c0420022002290398013703d8020240024002400240024002400240200641ff01714101470d0020024190046a200541067610870120022802900421092002280298042005413f7122054d0d0120024188046a41026a200920054105746a220541026a2d00003a0000200241a8046a200541136a290000370300200241ad046a200541186a290000370000200220052f00003b0188042002200529000b3703a0042005280007210720052800032105410121062002280294040d020c030b20024188046a41026a20092d00003a0000200241a0046a41086a200b290300370300200241a0046a410d6a200e290000370000200220022f018c043b018804200220022903d8023703a0040c030b41002106200228029404450d010b200910230b2006450d010b20024190046a41026a20024188046a41026a2d00003a0000200241d8026a41086a200241a0046a41086a290300370300200241d8026a410d6a200241a0046a410d6a290000370000200220022f0188043b019004200220022903a0043703d802410021090c010b410121094115210741d9cac40021050b200241d4026a41026a220620024190046a41026a2d00003a0000200241c0046a41086a220b200241d8026a41086a220e290300370300200241c0046a41106a200241d8026a41106a290300370300200220022f0190043b01d402200220022903d8023703c00402402009450d002000200536020420004101360200200041086a200736020020014188016a1024200241e0046a24000f0b200241c3026a200b290300370000200241c8026a200241c0046a410d6a290000370000200220022f01d4023b01b002200220073600b702200220053600b302200220022903c0043700bb02200220062d00003a00b202200220083703d802200e20014188016a41f000109404210b200241ef036a200d360000200241eb036a200c360000200241d8026a4188016a200241f8016a41106a290300370300200241d8036a2201200241f8016a41086a290300370300200241ea036a200241ac026a41026a2d00003a0000200241f3036a200229039002370000200241fb036a20024190026a41086a29030037000020024180046a20024190026a410d6a290000370000200220022903f8013703d003200220022f01ac023b01e803200241003602c804200242013703c004200241d8026a200241c0046a109802200b200241c0046a103902400240024002400240024020022903d0034201520d0020012903002203420c882204420120044201561b22044200510d08200241e0036a290300200480210420022802c4042205200241c8046a28020022016b41024f0d01200141026a22092001490d0e20054101742201200920092001491b22014100480d0e2005450d0420022802c0042005200110272205450d050c0b0b024020022802c404200241c8046a2802002201470d00200141016a22052001490d0e20014101742209200520052009491b22094100480d0e2001450d0220022802c0042001200910272205450d030c090b20022802c00421050c090b20022802c00421050c0a0b2009102622050d060b20094101102a000b2001102622050d060b20014101102a000b41d4aac10041331021000b41e0fec400104f000b41b099c300104f000b200220093602c404200220053602c004200241c8046a28020021010b200241c8046a200141016a360200200520016a41003a00000c020b200220013602c404200220053602c004200241c8046a28020021010b200241c8046a200141026a360200200520016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b02400240024020022802c4042206200241c8046a28020022016b41204f0d00200141206a22052001490d0320064101742201200520052001491b22094100480d032006450d0120022802c0042006200910272205450d020c040b20022802c00421050c040b2009102622050d020b20094101102a000b101e000b200220093602c404200220053602c004200241c8046a2802002101200921060b200520016a2209200241e8036a2207290000370000200941186a200741186a290000370000200941106a200741106a290000370000200941086a200741086a2900003700000240024002400240200141206a2201418102490d00200241c0046a41186a22094200370300200241c0046a41106a22074200370300200241c0046a41086a220c4200370300200242003703c00420052001200241c0046a1002200241a0046a41186a2009290300370300200241a0046a41106a2007290300370300200241a0046a41086a200c290300370300200220022903c0043703a004200241a0046a4120200241b8016a200241b0026a1011450d01200241a0046a4120200241b8016a200241b0026a101245210120060d020c030b20052001200241b8016a200241b0026a1011450d0020052001200241b8016a200241b0026a101245210120060d010c020b410121012006450d010b200510230b02402001450d00200241f8006a41186a200241b0026a41186a290300370300200241f8006a41106a200241b0026a41106a290300370300200241f8006a41086a200241b0026a41086a290300370300200220022903b00237037820022903d8022104200241086a200b41f0001094041a420121030c010b200041eecac40036020420004101360200200041086a411a360200200b1024200241e0046a24000f0b200041106a2002290378370300200041086a2003370300200041306a2004370300200041186a200241f8006a41086a290300370300200041206a200241f8006a41106a290300370300200041286a200241f8006a41186a290300370300200041386a200241086a41f0001094041a20004100360200200241e0046a24000ba40301057f230041c0006b2202240002400240411010262203450d00200341086a410029009299433700002003410029008a994337000020034110412010272203450d0120032001370010200241206a41186a22044200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034118200241206a1002200241186a2004290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d002004420037030020054200370300200241286a42003703002002420037032020024120200241206a4120410010012204417f460d022004411f4d0d0220002002290320370000200041186a200241206a41186a290300370000200041106a200241206a41106a290300370000200041086a200241206a41086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b20031023200241c0006a24000f0b41d4aac10041331021000b41104101102a000b41204101102a000bc00903017f017e057f230041e0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002903002203423f560d00200141046a280200200141086a2802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d0520012802002000200510272204450d060c190b2003428080015a0d01200141046a2802002204200141086a28020022006b41024f0d02200041026a22052000490d1020044101742200200520052000491b22004100480d102004450d0820012802002004200010272204450d090c160b200128020021040c180b20034280808080045a0d01200141046a2802002204200141086a28020022006b41044f0d04200041046a22052000490d0e20044101742200200520052000491b22004100480d0e2004450d08200128020020042000102722040d090c120b200128020021040c140b4108200379a74103766b22064104490d0e200141046a280200200141086a2802002205470d03200541016a22042005490d0c20054101742207200420042007491b22044100480d0c2005450d09200128020020052004102722070d0a0c110b2005102622040d130b20054101102a000b200128020021040c050b200128020021070c070b2000102622040d0d0b20004101102a000b200010262204450d090b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a7410274410272360000200241e0006a24000f0b200410262207450d070b20012007360200200141046a2004360200200141086a28020021050b200141086a2204200541016a360200200720056a200641027441736a3a0000200220002903002203370308200141046a210703400240024002400240200728020020042802002200470d00200041016a22052000490d0520004101742208200520052008491b22084100480d052000450d01200128020020002008102722050d020c060b200128020021050c020b200810262205450d040b2001200536020020072008360200200428020021000b2004200041016a360200200520006a2003a73a0000200342088821032006417f6a22060d000b20022003370308200350450d03200241e0006a24000f0b101e000b20084101102a000b41d498c400104f000b2002200241086a360240200241f098c400360244200241c8006a41146a4100360200200241286a41146a4103360200200241346a4122360200200241106a41146a4103360200200241a886c5003602582002420137024c200241f898c4003602482002412236022c20024203370214200241d480c5003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a418099c4001061000b20004101102a000b20044101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b0000200241e0006a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a0000200241e0006a24000bc92c06057f027e027f017e0d7f097e230041b0026b2203240041012104024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022054101460d0020054102470d1520034190016a41026a200141076a2d00003a0000200341286a41086a2204200141186a290200370300200341286a410d6a22062001411d6a290000370000200320012f00053b0190012003200141106a2902003703284128210720022d000120022d000072450d0141b394c30021050c200b200141306a2903002108200141286a2903002109200341246a41026a200141076a2d00003a0000200341086a41086a200141186a290200370300200341086a410d6a2001411d6a290000370000200320012f00053b01242003200141106a290200370308200141086a28020021062001410c6a280200210a20012d0004210b2002411a6a290100210c200241196a2d0000210d200241186a2d0000210e200241166a2f0100210f200241156a2d00002110200241146a2d00002111200241126a2f01002112200241116a2d00002113200241106a2d000021142002410e6a2f010021152002410d6a2d00002116200241046a2d00002117200241026a2f01002118412a21074100210141db94c300210520022d0000450d01410021190c020b200141c0006a2903002108200141386a290300210c200141306a2903002109200141286a290300211a2001410c6a2802002107200141086a280200210520012d000421012003418c016a41026a220220034190016a41026a2d00003a0000200341c0016a41086a2004290300370300200341c0016a410d6a2006290000370000200320032f0190013b018c01200320032903283703c001200141ff01714101470d02200341086a20054106761087012003280208210220032802102005413f7122014d0d0920034188016a41026a200220014105746a220141026a2d00003a0000200341f8006a200141136a290000370300200341fd006a200141186a290000370000200320012f00003b0188012003200129000b370370200128000721072001280003210541012101200328020c0d0a0c0b0b41012104410021014100211920022d00014101470d002002410c6a2d000021012002410a6a2f01002119200241096a2d00002107200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021040b201941ffff0371410874200141187472200741ff017172210720040d1c2003200c3703402003200d3a003f2003200e3a003e2003200f3b013c200320103a003b200320113a003a200320123b0138200320133a0037200320143a0036200320153b0134200320163a00332003200736002f2003200536002b200320173a002a200320183b01282003418c016a41026a2201200341246a41026a2d00003a0000200341c0016a41086a2202200341086a41086a290300370300200341c0016a410d6a2205200341086a410d6a290000370000200320032f01243b018c01200320032903083703c0010240200b41ff01714101470d0020034190016a200641067610870120032802900121022003280298012006413f7122014d0d0220034188016a41026a200220014105746a220141026a2d00003a0000200341f8006a200141136a290000370300200341fd006a200141186a290000370000200320012f00003b0188012003200129000b3703702001280007210a20012800032106410121012003280294010d030c040b20034188016a41026a20012d00003a0000200341f0006a41086a2002290300370300200341f0006a410d6a2005290000370000200320032f018c013b018801200320032903c0013703700c040b20034188016a41026a20022d00003a0000200341f0006a41086a200341c0016a41086a290300370300200341f0006a410d6a200341c0016a410d6a290000370000200320032f018c013b018801200320032903c0013703700c090b41002101200328029401450d010b200210230b2001450d010b20034190016a41026a20034188016a41026a2d00003a0000200341c0016a41086a200341f0006a41086a290300370300200341c0016a410d6a200341f0006a410d6a290000370000200320032f0188013b019001200320032903703703c001410021010c010b410121014115210a41d9cac40021060b200341cc006a41026a220220034190016a41026a2d00003a0000200341a0016a41086a2205200341c0016a41086a290300370300200341a0016a41106a200341c0016a41106a290300370300200320032f0190013b014c200320032903c0013703a00102402001450d00200a2107200621050c160b200341e3006a2005290300370000200341e8006a200341ad016a290000370000200320032f014c3b01502003200a36005720032006360053200320032903a00137005b200320022d00003a0052411410262201450d0c200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d0d200120032903283700142001412c6a200341286a41186a290300370000200141246a200341286a41106a2903003700002001411c6a200341286a41086a2903003700004200210c200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22074200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2007290300370300200320032903c0013703a001200341a0016a412041a886c500410041001001417f460d06200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d0b2002410f4d0d0b200341c8016a290300211a20032903c001210c2001102341142102411410262201450d070c140b41002101200328020c450d010b200210230b2001450d010b200341086a41026a20034188016a41026a2d00003a0000200341c0016a41086a200341f0006a41086a290300370300200341c0016a410d6a200341f0006a410d6a290000370000200320032f0188013b0108200320032903703703c001410021010c010b410121014115210741d9cac40021050b200341cc006a41026a2202200341086a41026a2d00003a0000200341a0016a41086a2204200341c0016a41086a290300370300200341a0016a41106a200341c0016a41106a290300370300200320032f01083b014c200320032903c0013703a00120010d0f200341e3006a2004290300370000200341e8006a200341ad016a290000370000200320032f014c3b01502003200736005720032005360053200320032903a00137005b200320022d00003a0052411410262201450d0a200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d0b200120032903503700142001412c6a200341d0006a41186a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a2903003700004200211d200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22044200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2004290300370300200320032903c0013703a001200341a0016a412041a886c500410041001001417f460d02200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d082002410f4d0d08200341c8016a290300211b20032903c001211d0c030b4200211a20011023411421024114102622010d0d0b20024101102a000b4200211b0b2001102302400240201d201a5a201b20095a201b20095122011b0d002003201a201d7d3703c00120032009201b7d201a201d54ad7d3703c8012003200341c0016a3602a001200341a0016a107b0c010b201d201a58201b20095820011b0d002003201d201a7d3703c0012003201b20097d201d201a54ad7d3703c8012003200341c0016a3602a001200341a0016a10de010b200341d0006a201a200910df01411810262201450d08200141106a410029008db741370000200141086a4100290085b741370000200141002900fdb64137000020014118413810272201450d0920012003290350370018200141306a200341d0006a41186a290300370000200141286a200341d0006a41106a290300370000200141206a200341d0006a41086a29030037000042002109200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22044200370300200342003703c00120014138200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2004290300370300200320032903c0013703a00102400240200341a0016a412041a886c500410041001001417f460d00200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d072002410f4d0d07200341c8016a290300211a20032903c00121090c010b4200211a0b20011023024002402009200c5a201a20085a201a20085122011b0d002003200c20097d3703c00120032008201a7d200c200954ad7d3703c8012003200341c0016a3602a001200341a0016a107b0c010b2009200c58201a20085820011b0d0020032009200c7d3703c0012003201a20087d2009200c54ad7d3703c8012003200341c0016a3602a001200341a0016a10de010b200341d0006a200c200810fe01410021050c0b0b200341d4016a4101360200200341013602a4012003418898c4003602a001200342013702c401200341d497c4003602c0012003200341a0016a3602d001200341c0016a41e0b7c1001061000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41184101102a000b41384101102a000b200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b6413700000240024002400240024020012002413410272201450d00200120032903503700142001412c6a200341d0006a41186a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22074200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2007290300370300200320032903c0013703a001024002400240200341a0016a412041a886c500410041001001417f460d00200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d022002410f4d0d02200341c8016a290300211b20032903c001211c0c010b4200211c4200211b0b20011023200341c0016a41086a22014200370300200342003703c0010240024002400240201c201b84221e4200510d0041d8b9c2004114200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d02200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d062001410f4d0d06200341c8016a290300211f0c010b41c4b9c2004114200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d01200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d062001410f4d0d06200341c8016a290300211f0b20032903c00121200c010b420021204200211f0b0240200920207c222120095422012008201f7c2001ad7c221d200854201d2008511b450d004128210741ecb9c20021050c070b0240200c20217d2222200c56201a201d7d200c202154ad7d220c201a56200c201a511b450d00411d21074182bcc40021050c070b201e4200520d05200341c0016a41086a22014200370300200342003703c0014182b6c100411b200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d05200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d042001410f4d0d0420032903c001200956200341c8016a290300221a200856201a2008511b450d05411f2107419fbcc40021050c060b41d4aac10041331021000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b2003200341286a41022022200c108302024020032802002205450d00200328020421070c010b0240201c20097c221d201c542201201b20087c2001ad7c221a201b54201a201b511b450d00412d210741bebcc40021050c010b024002400240200341286a200341d0006a4120109604450d00200341286a2022200c10df01411410262201450d01200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d02200120032903503700142001412c6a200341d0006a41186a2202290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341c0016a41186a22054200370300200341c0016a41106a22074200370300200341c0016a41086a22044200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2005290300370300200341a0016a41106a2007290300370300200341a0016a41086a2004290300370300200320032903c0013703a001200341a0016a412041a886c50041004100100121052001102302402005417f470d00200341d0006a10e001200341f8016a201a370300200341f0016a201d370300200341c0016a41086a41003a0000200341c9016a2003290350370000200341d1016a200341d0006a41086a290300370000200341d9016a200341e0006a290300370000200341e1016a2002290300370000200341023a00c00141a886c5004100200341c0016a102c0b200341d0006a201d201a10df012003201f3703c801200320203703c0012003200341c0016a3602a001200341a0016a10de01200341c0016a41086a41023a0000200341c9016a2003290328370000200341d1016a200341286a41086a290300370000200341d9016a200341286a41106a290300370000200341e1016a200341286a41186a290300370000200341e9016a2003290350370000200341f1016a200341d0006a41086a290300370000200341f9016a200341d0006a41106a29030037000020034181026a2002290300370000200341023a00c001200341a8026a201f370300200341a0026a202037030020034198026a200837030020034190026a200937030041a886c5004100200341c0016a102c0b410021050c020b41144101102a000b41344101102a000b2000200736020420002005360200200341b0026a24000bb2be0117197f027e107f017e107f017e037f027e107f017e0f7f027e017f027e0a7f027e117f0a7e2e7f017e087f017e197f230041d0036b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441094b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0a00060304010708050902000b200141086a28020021052001280204210620022d00000d0a4101210720022d00014101470d0a200241196a2d00002104200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241086a2d00002114200241066a2f01002115200241056a2d00002116200241046a2d00002117200241026a2f010021182001410c6a2802002119200141146a280200211a200141106a280200211b20032002411a6a29010037038002200320043a00ff01200320083a00fe01200320093b01fc012003200a3a00fb012003200b3a00fa012003200c3b01f8012003200d3a00f7012003200e3a00f6012003200f3b01f401200320103a00f301200320173a00ea01200320183b01e801200320132012410874201141187472723600ef01200320162015410874722014411874723600eb01200320193602b003200320053602ac03200320063602a803200341086a200341e8016a200341a8036a201b201a109b02200328020c21022003280208210441002108200128020022054101470d510c500b200128020421092002411a6a290100211c200241196a2d0000210a200241186a2d0000210b200241166a2f0100210c200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d00002113200241046a2d00002114200241026a2f0100211541db94c3002104412a210520022d0000450d0b4101210741002108410021060c0c0b20022d000120022d0000720d07200141086a290300211c200341a8036a41086a22024200370300200342003703a80341d8b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8012003201c3703e801200341d8016a4110200341e8016a410810040c4c0b200141216a290000211d200141206a2d0000211e2001411d6a2f0000211f2001411c6a2d00002120200141196a2f00002121200141186a2d00002122200141156a2f00002123200141146a2d00002124200141106a28020021252001410c6a2802002126200141086a2d00002127200141306a28020021282001412c6a280200210620012d001f212920012d001b212a20012d0017212b20012d000b212c20012f0009212d200128020421082002411a6a290100212e200241196a2d0000212f200241186a2d00002130200241166a2f01002131200241156a2d00002132200241146a2d00002133200241126a2f01002134200241116a2d00002135200241106a2d000021362002410e6a2f010021372002410d6a2d00002138200241046a2d00002139200241026a2f0100213a412a211141db94c300210420022d0000450d0b4101213b4100213c4100213d0c0c0b200128020421152002411a6a290100211c200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211441db94c3002104412a210520022d0000450d0c4101210741002108410021060c0d0b20022d000120022d0000720d04200141086a280200210420012d00044101470d11200341e8016a200441067610870120032802e801213e20032802f0012004413f7122024d0d14203e20024105746a2202290018213f20022d0017210720022d0016210a20022f0014210b20022d0013210c20022d0012211220022f0010211420022d000f211520022d000e211620022f000c211a20022d000b2140200228000721412002280003210420022d0002213c20022f000021424101210520032802ec01450d3d0c3c0b200141086a28020021052001280204210620022d00000d0520022d00014101470d052001410c6a2802002118200141146a2802002119200141106a280200211a200241196a2d00002104200241186a2d00002107200241166a2f01002108200241156a2d00002109200241146a2d0000210a200241126a2f0100210b200241116a2d0000210c200241106a2d0000210d2002410e6a2f0100210e2002410d6a2d0000210f2002410c6a2d000021102002410a6a2f01002111200241096a2d00002112200241086a2d00002113200241066a2f01002114200241056a2d00002115200241046a2d00002116200241026a2f0100211720032002411a6a2901003703c003200320043a00bf03200320073a00be03200320083b01bc03200320093a00bb032003200a3a00ba032003200b3b01b8032003200c3a00b7032003200d3a00b6032003200e3b01b4032003200f3a00b303200320163a00aa03200320173b01a803200320122011410874201041187472723600af03200320152014410874722013411874723600ab03200341e8016a200341a8036a104220032d00e8014101470d14200341f4016a2d00002102200341f5016a290000211c200341fd016a280000210420032f00e901210720032d00eb01210820032902ec012143200320034181026a29000037038002200320043602fc012003201c3702f401200320023a00f301200320433700eb01200320083a00ea01200320073b01e801200320183602b003200320053602ac03200320063602a803200341106a200341e8016a200341a8036a201a2019109b0220032802142102200328021021044101210841002107200128020022054101470d4b0c4a0b200141386a290300211c200141306a29030021432001411d6a29000021442001411c6a2d00002145200141196a2f00002146200141186a2d00002147200141156a2f00002148200141146a2d00002149200141116a2f0000214a200141106a2d0000214b2001410c6a280200214c200141086a280200214d200141286a280200214e20012d001b214f20012d0017215020012d0013215120012d0007215220012f0005215320012d000421542002411a6a2901002155200241196a2d00002156200241186a2d00002157200241166a2f01002158200241156a2d00002159200241146a2d0000215a200241126a2f0100215b200241116a2d0000215c200241106a2d0000215d2002410e6a2f0100215e2002410d6a2d0000215f200241046a2d00002160200241026a2f0100216141db94c3002104412a211820022d0000450d0b4101216241002163410021640c0c0b20022d000120022d0000720d0120012802042102200341a8036a41086a22044200370300200342003703a80341b0b3c2004114200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200320023602e801200341d8016a4110200341e8016a410410040c460b20022d000120022d000072450d0b0b41b394c3002104412821020c480b41db94c3002104412a210241002108410121072005450d4020061023200128020022054101470d460c450b41db94c3002104412a210241012108410021072005450d3f0c340b41012107410021084100210620022d00014101470d002002410c6a2d000021062002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021070b200841ffff0371410874200541ff017172200641187472210220070d3c2003201c370398032003200a3a0097032003200b3a0096032003200c3b0194032003200d3a0093032003200e3a0092032003200f3b019003200320103a008f03200320113a008e03200320123b018c03200320133a008b0320032002360087032003200436008303200320143a008203200320153b018003411610262202450d192002410e6a41002900e1b641370000200241086a41002900dbb641370000200241002900d3b64137000020024116413610272204450d1a20042003290380033700162004412e6a20034180036a41186a290300370000200441266a20034180036a41106a290300370000411e21022004411e6a20034180036a41086a290300370000200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120044136200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803200341a8036a412041a886c500410041001001210520041023419ebdc20021042005417f470d3c200341a8036a41086a22024200370300200342003703a80341fab4c2004116200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210b0240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d1920032802e801210b0b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210c200341d8016a411041a886c500410041001001417f460d12200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a102820032802e801220d450d1e200341f0016a280200210520032802ec01210c200b2009460d130c140b4101213b4100213c4100213d20022d00014101470d002002410c6a2d0000213c2002410a6a2f0100213d200241096a2d00002111200241066a2f0100410874200241056a2d000072200241086a2d00004118747221044100213b0b203d41ffff0371410874203c41187472201141ff0171722102203b0d3a2003202e3703a8012003202f3a00a701200320303a00a601200320313b01a401200320323a00a301200320333a00a201200320343b01a001200320353a009f01200320363a009e01200320373b019c01200320383a009b0120032002360097012003200436009301200320393a0092012003203a3b019001202741ff01714101470d2f200341e8016a202641067610870120032802e801210420032802f0012026413f7122024d0d08200420024105746a2202290018211d20022d0017211e20022d0016212920022f0014211f20022d0013212020022d0012212a20022f0010212120022d000f212220022d000e212b20022f000c212320022d000b21242002280007213b2002280003213c20022d0002212c20022f0000212d4101211120032802ec01450d2e0c2d0b41012107410021084100210620022d00014101470d002002410c6a2d000021062002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021070b200841ffff0371410874200541ff017172200641187472210220070d382003201c37039803200320093a0097032003200a3a0096032003200b3b0194032003200c3a0093032003200d3a0092032003200e3b0190032003200f3a008f03200320103a008e03200320113b018c03200320123a008b0320032002360087032003200436008303200320133a008203200320143b018003200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d0341e8bcc2002104411e21020c380b41012162410021634100216420022d00014101470d002002410c6a2d000021642002410a6a2f01002163200241096a2d00002118200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021620b206341ffff0371410874201841ff017172206441187472210220620d36200320553703f002200320563a00ef02200320573a00ee02200320583b01ec02200320593a00eb022003205a3a00ea022003205b3b01e8022003205c3a00e7022003205d3a00e6022003205e3b01e4022003205f3a00e302200320023600df02200320043600db02200320603a00da02200320613b01d8022043201c844200510d03205441ff01714101470d28200341e8016a204d41067610870120032802e801210420032802f001204d413f7122024d0d0a200420024105746a2202290018214420022d0017214520022d0016214f20022f0014214620022d0013214720022d0012215020022f0010214820022d000f214920022d000e215120022f000c214a20022d000b214b200228000721622002280003216320022d0002215220022f000021534101211820032802ec01450d270c260b200141086a290300211c200341a8036a41086a22024200370300200342003703a8034194b4c200411c200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8012003201c3703e801200341d8016a4110200341e8016a410810040c390b411310262202450d132002410f6a41002800c5b542360000200241086a41002900beb542370000200241002900b6b54237000020024113413310272204450d142004200329038003370013411821022004412b6a20034180036a41186a290300370000200441236a20034180036a41106a2903003700002004411b6a20034180036a41086a290300370000200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120044133200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803200341a8036a412041a886c5004100410010012105200410232005417f460d09200341a8036a2015410676109102410021052015413f71220420032802b0034f0d0520032802a803200441216c6a22042d00004101470d0520042f00012107200441196a290000211c200441186a2d00002108200441176a2d00002106200441156a2f00002109200441146a2d0000210a200441136a2d0000210b200441116a2f0000210c200441106a2d0000210d2004410f6a2d0000210e2004410d6a2f0000210f2004410c6a2d00002110200441086a2800002111200441046a2800002112200441036a2d000021044101210520032802ac030d060c070b2001410c6a2802002102200141106a2d00002140200141116a2f0000211a200141146a2d00002115200141156a2f00002114200141186a2d0000210c200141196a2f0000210b2001411c6a2d000021072001411d6a290000213f20012f0005214220012d0007213c20012d0013211620012d0017211220012d001b210a0c2c0b41f0bdc200210441d00021020c320b4100211120032802ec010d240c250b4100210520032802ec010d270c280b4194bac2002104410b2102410121084100210720050d250c300b20032802ac03450d010b20032802a80310230b2005450d052003201c37038002200320083a00ff01200320063a00fe01200320093b01fc012003200a3a00fb012003200b3a00fa012003200c3b01f8012003200d3a00f7012003200e3a00f6012003200f3b01f401200320103a00f301200320113600ef01200320123600eb01200320043a00ea01200320073b01e801200341e8016a20034180036a4120109604450d0641b7bcc2002104411921020c2c0b4100211820032802ec010d1b0c1c0b4186bdc20021040c2a0b4101210d41002105200b2009470d010b20052009460d0c0b41bcbdc200210441162102200520094d0d0c20034180026a4200370300200341f8016a4200370300200341f0016a4200370300200342003703e801200d20094105746a2207200341e8016a460d0b2007200341e8016a41201096040d0c0c0b0b41d0bcc20021040c260b20034180036a2015109c024200211c200341a8036a41086a22024200370300200342003703a80341a5bcc2004112200341a8036a1000200341d8016a41086a22042002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703b003200342003703a803200341d8016a4110200341a8036a4110410010012205417f460d0a2005410f4d0d0a200341b0036a290300214320032903a80321550c010b42002155420021430b20034180036a20552043102b200342e3ded5f3b6ac9ab6f3003703900120024200370300200342003703a80341af98c300410d200341a8036a100020042002290300370300200320032903a8033703d8010240200341d8016a411041a886c500410041001001417f460d00200342003703a803200341d8016a4110200341a8036a41084100100141016a41084d0d0720032903a803211c0b2003201c3703b801200341a8036a20034180036a10800220032802ac03210420032802a803210220032802b0032105200341bc036a20034190016a36020020032002200541286c6a3602b403200320023602b003200320043602ac03200320023602a8032003200341b8016a3602b803200341d8026a200341a8036a109d02200341a8036a41086a200341d8026a41086a280200360200200320032903d8023703a80320034180036a200341a8036a1087020c290b200341fc016a4101360200200341013602ac032003418898c4003602a803200342013702ec01200341d497c4003602e8012003200341a8036a3602f801200341e8016a41b4b9c2001061000b41d4aac10041331021000b41164101102a000b41364101102a000b41134101102a000b41334101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b4200211c200341a8036a41086a22024200370300200342003703a80341a1b5c2004115200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d042002410f4d0d04200341f0016a290300211c20032903e80121430c010b420921430b200341386a20034180036a2043201c105b2003280238450d0141d2bdc2002104411e21020b200c450d1a200d10230c1a0b200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021070240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0220032802e80121070b411610262202450d022002410e6a41002900e1b641370000200241086a41002900dbb641370000200241002900d3b64137000020024116413610272202450d0320022003290380033700162002412e6a20034180036a41186a290300370000200241266a20034180036a41106a2903003700002002411e6a20034180036a41086a290300370000200341e8016a41186a22044200370300200341e8016a41106a22084200370300200341e8016a41086a22064200370300200342003703e80120024136200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2008290300370300200341a8036a41086a2006290300370300200320032903e8013703a803410410262204450d042004200736000020044104410810272204450d0520042009360004200341a8036a4120200441081004200410232002102302400240024020052009470d00200341e8016a41186a220420034180036a41186a290300370300200341e8016a41106a220520034180036a41106a290300370300200341e8016a41086a220720034180036a41086a29030037030020032003290380033703e801200c2009470d0a200941016a22022009490d1720094101742208200220022008491b220cad420586221c422088a70d17201ca722024100480d172009450d01200d200941057420021027220d450d020c0a0b200341e8016a41186a220420034180036a41186a290300370300200341e8016a41106a220720034180036a41106a290300370300200341e8016a41086a220820034180036a41086a29030037030020032003290380033703e801200520094d0d08200d20094105746a220220032903e801370000200241186a2004290300370000200241106a2007290300370000200241086a20082903003700000c0a0b20021026220d0d080b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b41164101102a000b41364101102a000b41044101102a000b41084101102a000b41d8b4c200200920051029000b200d20094105746a220220032903e801370000200241186a2004290300370000200241106a2005290300370000200241086a2007290300370000200941016a21050b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341003602f001200342013703e801200320053602a803200341a8036a200341e8016a10410240024002402005450d00200541057421064100200341e8016a41086a28020022046b210720032802e801210920032802ec012108200d210203400240200820076a411f4b0d00200441206a22052004490d102008410174220a20052005200a491b22054100480d10024002402008450d00200920082005102722090d010c060b200510262209450d050b200521080b200920046a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a290000370000200741606a2107200441206a2104200241206a2102200641606a22060d000b200341f0016a2004360200200320083602ec01200320093602e8010c010b200341e8016a41086a280200210420032802ec01210820032802e80121090b200341d8016a411020092004100402402008450d00200910230b0240200c450d00200d10230b200341a8036a41086a22024200370300200342003703a80341fab4c2004116200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410121072003200b41016a3602e801200341d8016a4110200341e8016a41041004410021040c160b20054101102a000b200410230b206341d9cac40020181b21042062411520181b21022018450d0e2004214d2002214c0b2003204437039803200320453a0097032003204f3a009603200320463b019403200320473a009303200320503a009203200320483b019003200320493a008f03200320513a008e032003204a3b018c032003204b3a008b032003204c360087032003204d36008303200320523a008203200320533b018003200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d80141002102024002400240024002400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0120032802e80121020b02400240024002402002204e470d00200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d012003200341d8016a3602a803200341103602ac03200342003703e80120034100200341d8016a4110200341e8016a41084100100122022002417f461b22024108200241084922041b22023602b00320040d06200341003602e801200341b0036a4100200341d8016a4110200341e8016a41042002100122042004417f461b22044104200441044922041b20026a36020020040d06200341e8016a200341a8036a102820032802e8012262450d0620032902ec01214442002155200341a8036a41086a22024200370300200342003703a8034190c1c200411c200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d02200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d072002410f4d0d07200341f0016a290300215520032903e80121650c030b41edbec2002104411121020c1b0b41c0bec2002104412d21020c1a0b420121650b200341a8036a41086a22024200370300200342003703a80341acc1c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021020240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0220032802e80121020b20034180016a206520552002ad4200109804411410262202450d0520034180016a41086a29030021552003290380012165200241106a41002800f9b641360000200241086a41002900f1b641370000200241002900e9b64137000020024114413410272202450d06200220032903d8023700142002412c6a200341d8026a41186a290300370000200241246a200341d8026a41106a2903003700002002411c6a200341d8026a41086a29030037000042002168200341e8016a41186a22044200370300200341e8016a41106a22184200370300200341e8016a41086a22634200370300200342003703e80120024134200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2018290300370300200341a8036a41086a2063290300370300200320032903e8013703a80302400240200341a8036a412041a886c500410041001001417f460d00200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012204417f460d062004410f4d0d06200341f0016a290300216920032903e80121680c010b420021690b2002102302402068206554206920555420692055511b450d0041afbfc2002104412e21022044a70d180c190b200341a8036a41086a22024200370300200342003703a80341c2b4c2004113200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8010240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a108b0220032802e8012218450d0e200341e8016a41086a2802002263450d0f20032802ec0121644180c0c2002104412321022018290300204354201841086a2903002269201c542069201c511b450d0341082158200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d80141002159200341d8016a411041a886c500410041001001417f460d01200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a10890220032802e8012258450d10200341f0016a280200215a20032802ec0121590c020b41febec2002104413121022044a70d1d0c1e0b4100215a0b2058205a41286c6a2157205821044100214d024002400240024002400340205720046b419f014d0d01200420034180036a460d02204d200420034180036a412010960422564100476a214d2056450d02200441286a225620034180036a460d02204d205620034180036a412010960422564100476a214d2056450d02200441d0006a225620034180036a460d02204d205620034180036a412010960422564100476a214d2056450d02200441f8006a225620034180036a460d02200441a0016a2104204d205620034180036a412010960422564100476a214d20560d000c020b0b20572004460d012058205a41286c6a2157034020034180036a2004460d01204d200420034180036a412010960422564100476a214d2056450d012057200441286a2204470d000c020b0b204d2044422088a74f0d010b02402059450d00205810230b20034190016a108c02200341e8016a20034180036a10ef0120032802e8014101470d01200328029001214d2003280298012204450d0520032802ec01216a4121216b204d200441216c6a216c4108216d200341f0016a2802002204410876216e4101216f41012004411f71742170417f217120044105764107712272417f732173420021744201217520034190026a217641202177200341e8016a41206a217841182179200341e8016a41186a217a4110217b20034194026a217c4111217d4190b5c200217e4100217f41a886c500218001411221810141d9c0c200218201419701218301410221840141042185014200216842002169204d2186014101213c0c100b41a3c0c2002104413621022059450d012058102320640d020c030b0240200328029401450d0020032802900110230b41ddbfc20021040b2064450d010b201810230b2044a7450d190c180b4200216842002169410021040c120b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41ecb3c200410041001029000b41d4aac10041331021000b410121040c070b200410230b203c41d9cac40020111b2104203b411520111b21022011450d0b20042126200221250b2003201d3703d0012003201e3a00cf01200320293a00ce012003201f3b01cc01200320203a00cb012003202a3a00ca01200320213b01c801200320223a00c7012003202b3a00c601200320233b01c401200320243a00c301200320253600bf01200320263600bb012003202c3a00ba012003202d3b01b801200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8010240200341d8016a411041a886c500410041001001417f460d00419fbac2002104412621020c0b0b200341e8016a20034190016a108e02024002400240024002400240024020032903e8014201520d00200341e8016a200341b8016a108e0220032903e8014201520d0120034190026a2802002124200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021110240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0520032802e80121110b41f3bac20021044116210220112028470d11200341a8036a41086a22044200370300200342003703a80341d4bbc200411b200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d02200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0520032802e80120246a20284f0d030c060b41c5bac2002104411821020c100b41a8bbc2002104412c21020c0f0b410120246a2028490d030b4189bbc2002104411f21020c0d0b41d4aac10041331021000b41d4aac10041331021000b200341e8016a2008410676109102410021110240024002402008413f71220420032802f0014f0d0020032802e801200441216c6a22042d00004101470d0020042f0001213b200441196a290000211d200441186a2d0000213c200441176a2d0000213d200441156a2f00002126200441146a2d0000211e200441136a2d0000211f200441116a2f00002120200441106a2d000021212004410f6a2d000021222004410d6a2f000021232004410c6a2d00002129200441086a280000212a200441046a280000212b200441036a2d000021044101211120032802ec010d010c020b20032802ec01450d010b20032802e80110230b02400240024002402011450d002003201d3703f0022003203c3a00ef022003203d3a00ee02200320263b01ec022003201e3a00eb022003201f3a00ea02200320203b01e802200320213a00e702200320223a00e602200320233b01e402200320293a00e3022003202a3600df022003202b3600db02200320043a00da022003203b3b01d802200341e8016a2006410676109102410021112006413f71220420032802f0014f0d0120032802e801200441216c6a22042d00004101470d0120042f0001213b200441196a290000211d200441186a2d0000213c200441176a2d0000213d200441156a2f00002126200441146a2d0000211e200441136a2d0000211f200441116a2f00002120200441106a2d000021212004410f6a2d000021222004410d6a2f000021232004410c6a2d00002129200441086a280000212a200441046a280000212b200441036a2d000021044101211120032802ec010d020c030b41ddbac20021040c0d0b20032802ec01450d010b20032802e80110230b024002402011450d002003201d370398032003203c3a0097032003203d3a009603200320263b0194032003201e3a0093032003201f3a009203200320203b019003200320213a008f03200320223a008e03200320233b018c03200320293a008b032003202a360087032003202b36008303200320043a0082032003203b3b018003200341d8026a20034190016a4120109604450d014183bcc2002104411221020c0c0b41efbbc2002104411421020c0b0b024020034180036a200341b8016a4120109604450d004195bcc2002104411021020c0b0b4118212f200341e8016a41186a22a501200341b8016a41186a22a60129030037030041102127200341e8016a41106a22a701200341b8016a41106a22a8012903003703004108212c200341e8016a41086a22a901200341b8016a41086a22aa01290300370300410021042003410036028802200320032903b8013703e801200341a8036a200341e8016a108d020240024020032802b0032223450d0041012111410021ab01417f211e4102212a4120213b200341e8016a41206a21ac0141042129411f2126411e211f411d2120411c2121411b21ad01411a21ae01411921af01411721b001411621b101411521b201411421b301411321b401411221b50141112128410f213a410e2139410d2138410c2137410b2136410a21354109213441ff0121334107213241062131410521304103213d417c21224100212b4100212d41012125410021b6010c010b410121254100212d0c070b4103213c410121040c040b20061023200128020022054101470d100c0f0b203e10230b200441d9cac40020051b21042041411520051b21022005450d070b2003203f3703d001200320073a00cf012003200a3a00ce012003200b3b01cc012003200c3a00cb01200320123a00ca01200320143b01c801200320153a00c701200320163a00c6012003201a3b01c401200320403a00c301200320023600bf01200320043600bb012003203c3a00ba01200320423b01b80141082105200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d8014100210b024002400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a10890220032802e8012205450d0620032802ec01210b41282107200341f0016a280200221241286c220c0d010c020b4100211241282107410041286c220c450d010b4100210a0340200341e8016a41206a2005200a6a220441206a290300370300200341e8016a41186a200441186a290300370300200341e8016a41106a200441106a290300370300200341e8016a41086a200441086a290300370300200320042903003703e801200341e8016a200341b8016a41201096040d02200c200a20076a220a470d000b0b4108210741002112200b450d01200510234100210a0c0f0b200341a8036a41206a2207200341e8016a41206a290300370300200341a8036a41186a220c200341e8016a41186a290300370300200341a8036a41106a2214200341e8016a41106a290300370300200341a8036a41086a2215200341e8016a41086a290300370300200320032903e8013703a80320034180036a41206a2216200729030037030020034180036a41186a2207200c29030037030020034180036a41106a220c201429030037030020034180036a41086a22142015290300370300200320032903a80337038003200341d8026a41206a22152016290300370300200341d8026a41186a22162007290300370300200341d8026a41106a221a200c290300370300200341d8026a41086a220c201429030037030020032003290380033703d802412810262207450d03200720032903d802370300200741206a2015290300370300200741186a2016290300370300200741106a201a290300370300200741086a200c290300370300201241286c41586a200a460d01200441286a21424128211a2005201241286c6a224041586a21414101213e4120210c411821164110211541082114422821664220213f41002167410121124101210a4100213c0c040b4100210a0c0d0b410121124101210a0c0b0b41d4aac10041331021000b41284108102a000b410121040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e020001010b2018206341306c6a2157201821040240024002400340205720046b41bf014d0d0141012156200441106a223c20034180036a460d02203c20034180036a4120109604450d02200441c0006a223c20034180036a460d02203c20034180036a4120109604450d02200441f0006a223c20034180036a460d02203c20034180036a4120109604450d02200441a0016a223c20034180036a460d02200441c0016a2104203c20034180036a41201096040d000c020b0b024020042057460d00034041012156200441106a220420034180036a460d02200420034180036a4120109604450d02200441206a22042057470d000b0b4100215620682043852069201c85844200520d0020034180036a41086a290300211d20034180036a41106a290300212e20034180036a41186a290300219001200329038003218b012018201c37030820182043370300200341e8016a41186a209001370300200341e8016a41106a202e370300200341e8016a41086a201d3703002018208b01370310201841186a201d370300201841206a202e370300201841286a2090013703002003208b013703e801206341144b0d01410221910120634102490d1d417f2192012063417f6a21930141302194012018206341306c6a21950141082196014128219701411821980141202199014110219a014103219b0141e800219c014150219d014178219e014170219f01416821a001416021a101415821a201413821a301410121a4014102213c0c0f0b200341c0006a200341d8026a206520551084022003290340211c2003200341c8006a2903003703f0012003201c3703e80141ebc0c2004181c1c20020561b21044116410f20561b21022003200341e8016a3602a803200341a8036a10de0141012105200328029401450d220c210b206341017622be01ad42307e22bf01422088a70d0120bf01a72204417f4c0d01410821090240024002402004450d002004102622c001450d0220c00121c1010c010b410821c001410821c1010b41502113201841506a21c20141302117201841306a21c301201841f07e6a21c401410021c501410421c601417f21c70141012119420321c801422021bf01410321c901410221ca01417d21cb01415821cc01412821104120210f4118210d4110210e417e21cd01417421ce01416421cf0141a87f21d00141a07f21d101410921d20141e80021d301417821d401417021d501416821d601416021d701413821d801410a21d901410421da01410021db01410021dc01206321dd014104213c0c100b20044108102a000b024002400240024002400240024002400240203c0e050001020304040b2042210402400340200341e8016a200c6a223c2004200c6a290300370300200341e8016a20166a2256200420166a290300370300200341e8016a20156a2257200420156a290300370300200341e8016a20146a2258200420146a290300370300200320042903003703e801200341e8016a200341b8016a200c1096040d0120402004201a6a2204470d000c2e0b0b200341a8036a200c6a2242203c290300370300200341a8036a20166a22592056290300370300200341a8036a20156a225a2057290300370300200341a8036a20146a225b2058290300370300200320032903e8013703a80320034180036a200c6a225c204229030037030020034180036a20166a2242205929030037030020034180036a20156a2259205a29030037030020034180036a20146a225a205b290300370300200320032903a80337038003203c205c29030037030020562042290300370300205720592903003703002058205a29030037030020032003290380033703e8010240200a2012470d002012203e6a220a2012490d262012203e742242200a200a2042491b220aad20667e221d203f88a70d26201da722422067480d2602402012450d0020072012201a6c2042102722070d010c060b204210262207450d050b2004201a6a214220072012201a6c6a225920032903e8013703002059200c6a203c290300370300205920166a2056290300370300205920156a2057290300370300205920146a20582903003703002012203e6a211220412004470d0e0c2c0b02402086012d0000206f470d00200341e8016a208601206f6a2257108e0220032903e8012075520d002076280200206a490d002078290300218701207a290300218801200341e8016a207b6a290300218901200341e8016a206d6a290300218a01207c2802002104200341a8036a206d6a22582074370300200320743703a803207e207d200341a8036a1000200341d8016a206d6a22592058290300370300200320032903a8033703d80102400240200341d8016a207b208001207f207f10012071460d002003207f3602a803200341d8016a207b200341a8036a208501207f1001206f6a2085014d0d0720032802a80321560c010b410021560b20582074370300200320743703a803208201208101200341a8036a100020592058290300370300200320032903a8033703d8010240024002400240200341d8016a207b208001207f207f10012071460d002003207f3602a803200341d8016a207b200341a8036a208501207f1001206f6a2085014d0d0a20032802a8032159205620046b2204208301490d020c010b41182159205620046b2204208301490d010b200341e0006a2088012087012059ad2074109804200341e0006a206d6a290300218b012003290360218c010c010b02402004450d002059ad221d20757c228d01201d54ad218e014200218c01208801211d208701212e4200218b010340200341f0006a201d202e208d01208e011097042074202e200341f0006a206d6a2903007d201d2003290370228f0154ad7d229001201d208f017d228f01201d56209001202e56209001202e511b22561b222e208b017c2074208f0120561b221d208c017c228c01201d54ad7c218b01200420716a22040d000c020b0b4200218c014200218b010b200341a8036a20796a205720796a290000370300200341a8036a207b6a2057207b6a29000037030020582057206d6a2900003703002057290000211d200341a8036a20776a206e3602002003201d3703a803200341b8016a200341a8036a108d024200211d4200212e02402072200341b8016a206d6a28020022044f0d00200420736a225620044f0d082087012089017c208801208a017c221d20880154ad7c208b017c201d208c017c229001201d54ad7c207420032802b8012056208401746a28020020707122041b212e209001207420041b211d0b024020032802bc01450d0020032802b80110230b202e20697c201d20687c2268201d54ad7c21690b208601206b6a228601206c470d0e0c100b206320930122042092016a229301490d08024020632093016b2256209101490d00201820042094016c6a220429030020182093012094016c6a223c2903002290015a20042096016a2257290300222e203c2096016a2258290300221d5a202e201d511b0d00200341e8016a2098016a225a203c2097016a2259290300370300200341e8016a209a016a225b203c2099016a225c290300370300200341e8016a2096016a225d203c2098016a225e2903003703002003203c2903103703e801203c200429030037030020582057290300370300203c209a016a2004209a016a290300370300205e20042098016a290300370300205c20042099016a290300370300205920042097016a2903003703004101215702402056209b01490d00203c2903602090015a203c209c016a290300222e201d5a202e201d511b0d004103215720950121580240034020582204209d016a20042903003703002004209e016a20042097016a2903003703002004209f016a20042099016a290300370300200420a0016a20042098016a290300370300200420a1016a2004209a016a290300370300200420a2016a20042096016a2903003703002057225920564f0d01205920a4016a215720042094016a22582903002090015a200420a3016a290300222e201d5a202e201d511b450d000b0b20592092016a21570b20042090013703002004201d370308203c20572094016c6a22042097016a205a29030037030020042099016a205b29030037030020042098016a205d290300370300200420032903e8013703100b209501209d016a2195012093010d0e0c200b2023201e4c0d0520032802ac0321b90120032802a80321ba012023102622b801450d0602402023202a742204450d0020ba0120046a21bb01410021b70120ba0121bc01410021bd010c1c0b410021b7010c200b20dd0121de01410021dd01410121df0120de0120c7016a221b450d1302400240024002400240024002402018201b20176c6a2204290300201820de0120176c22576a223c20d1016a290300222e54200420096a290300229001203c20d0016a290300221d54209001201d511b450d0020c40120576a21040340201b2019460d02202e2004290300228b0154213c201d200420096a2903002290015121df01201d209001542156200420136a2104201b20c7016a211b208b01212e209001211d203c205620df011b0d000c030b0b20de0120cd016a215820c40120576a2104410021dd014100213c03402058203c460d05202e2004290300228b015a21df01201d200420096a290300229001512156201d2090015a2157200420136a2104203c20196a213c208b01212e209001211d20df01205720561b0d000b203c20196a21df0120de01203c6b20c7016a221b0d030c020b4100211b0b20de01201b490d0b20de0120634b0d0d024020de01201b6b22df012019762256450d0020c20120576a21042018201b20176c6a213c0340200341e8016a20106a2257203c20106a2258290300370300200341e8016a200f6a2259203c200f6a225a290300370300200341e8016a200d6a225b203c200d6a225c290300370300200341e8016a200e6a225d203c200e6a225e290300370300200341e8016a20096a225f203c20096a22602903003703002003203c2903003703e801200420096a2261290300211d2004200e6a2245290300212e2004200d6a22462903002190012004200f6a2247290300218b012004290300218c012058200420106a2248290300370300205a208b01370300205c209001370300205e202e3703002060201d370300203c208c0137030020482057290300370300204720592903003703002046205b2903003703002045205d2903003703002061205f290300370300200420032903e801370300203c20176a213c200420136a2104205620c7016a22560d000b0b201b0d010b201b21dd0120db0120dc01460d1b0c1c0b20df0120d2014b0d0120de0120634b0d0a20c301201b20176c6a21e001410121bd010c1d0b20de0121df0120db0120dc01460d150c160b201b21dd0120db0120dc01470d170c160b20424108102a000b41d4aac10041331021000b41d4aac10041331021000b41ecb3c200205620041029000b101d000b20234101102a000b20930120631048000b201b20de011048000b20de01201b417f6a22dd01490d140b20de012063108c01000b4100213c0c030b4101213c0c030b4102213c0c040b410021040c120b410121040c110b410121040c100b410121040c0f0b410121040c0e0b410121040c0d0b410021040c080b410121040c070b410221040c060b410121040c050b410221040c040b410121040c030b410221040c020b410321040c010b410321040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0400010204040b20db0120dc01470d15410121040c1a0b20db0120196a220420db01490d1e20db01201974223c20042004203c491b2204ad20c80186221d20bf0188a70d1e201da7223c20c501480d1e0240024020db01450d0020da0120db0120c90174203c102722da010d010c030b203c102622da01450d020b200421db01410221040c190b20da0120dc0120c901746a220420df01360204200420dd0136020020dc0120196a22e10121dc0120e10120ca01490d02410221bd010c170b203c4104102a000b02400240024020bd010e03000102020b20bc01280200213c203b10262204450d0520bc0120296a21bc012004203c2026763a001f2004203c2011713a00002004203c201f762011713a001e2004203c2020762011713a001d2004203c2021762011713a001c2004203c20ad01762011713a001b2004203c20ae01762011713a001a2004203c20af01762011713a00192004203c202f762011713a00182004203c20b001762011713a00172004203c20b101762011713a00162004203c20b201762011713a00152004203c20b301762011713a00142004203c20b401762011713a00132004203c20b501762011713a00122004203c2028762011713a00112004203c2027762011713a00102004203c203a762011713a000f2004203c2039762011713a000e2004203c2038762011713a000d2004203c2037762011713a000c2004203c2036762011713a000b2004203c2035762011713a000a2004203c2034762011713a00092004203c202c762011713a00082004203c203371223c2032763a00072004203c2031762011713a00062004203c2030762011713a00052004203c2029762011713a00042004203c203d762011713a00032004203c202a762011713a00022004203c2011762011713a00014100215602400240024002400240024002400340200420566a223c203b6a20046b203d4d0d01203c20266a2d00000d02203c201f6a2d00000d03203c20206a2d00000d04205620226a2156203c20216a2d0000450d000b2056203b6a20116a22560d050c060b2056203b6a213c0340203c450d062004203c6a2156203c201e6a2257213c2056201e6a2d0000450d000c040b0b205620266a20116a22560d030c040b2056201f6a20116a22560d020c030b205620206a21570b205720116a2256450d010b0240202320b7016b2056203b2056203b491b223c4f0d0020b701203c6a223c20b701490d1f20232011742257203c203c2057491b223c20ab01480d1f024002402023450d0020b8012023203c102722b8010d010c0a0b203c102622b801450d090b203c21230b20b80120b7016a21574100213c02400340203c203b460d012057203c6a2004203c6a2d00002011713a00002056203c20116a223c470d000b0b20b701203c6a21b7010b2004102320bc0120bb01470d0f0c1b0b20de01201b20c7016a22dd01490d18024020de0120dd016b22df0120ca01490d002018201b20176c6a2204290300201820dd0120176c6a223c2903002290015a200420096a2256290300222e203c20096a2257290300221d5a202e201d511b0d00200341e8016a200d6a2259203c20106a2258290300370300200341e8016a200e6a225a203c200f6a225b290300370300200341e8016a20096a225c203c200d6a225d2903003703002003203c2903103703e801203c200429030037030020572056290300370300203c200e6a2004200e6a290300370300205d2004200d6a290300370300205b2004200f6a2903003703002058200420106a29030037030041012156024020df0120c901490d00203c2903602090015a203c20d3016a290300222e201d5a202e201d511b0d004103215620e0012157024003402057220420136a2004290300370300200420d4016a200420106a290300370300200420d5016a2004200f6a290300370300200420d6016a2004200d6a290300370300200420d7016a2004200e6a290300370300200420cc016a200420096a2903003703002056225820df014f0d01205820196a2156200420176a22572903002090015a200420d8016a290300222e201d5a202e201d511b450d000b0b205820c7016a21560b20042090013703002004201d370308203c205620176c6a220420106a20592903003703002004200f6a205a2903003703002004200d6a205c290300370300200420032903e8013703100b20dd01450d1120e00120136a21e00120dd01211b20df0120d901490d0f410021040c170b024002400240024020da0120e101225b20c7016a22e10120c901746a2204280200450d0020da01205b20c901746a225820ce016a28020022572004280204223c4d0d00410221dc01205b41024d0d0420da01205b20cb016a220420c901746a2802042256203c20576a4d0d01410321dc01205b41034d0d04205820cf016a280200205620576a4d0d010c050b205b20c901490d012004280204213c20da01205b20cb016a220420c901746a28020421560b2056203c490d010b205b20cd016a21040b205b200420196a22604d0d05205b20044d0d0620da01200420c901746a225d2802042261205d2802006a220420da01206020c901746a225e280200225f490d07200420634b0d08205d20c6016a21452018205f20176c6a225a205e280204225c20176c223c6a2156200420176c21dc01024002400240024002402004205f6b2258205c6b2204205c4f0d0020c0012056200420176c223c1094041a20c101203c6a2157205c2019480d0120042019480d0120c20120dc016a21dc0120562104034020dc01200420136a2256205720136a22582058290300205629030054205720cc016a290300221d200420cc016a290300222e54201d202e511b22591b223c29030037030020dc0120106a203c20106a29030037030020dc01200f6a203c200f6a29030037030020dc01200d6a203c200d6a29030037030020dc01200e6a203c200e6a29030037030020dc0120096a203c20096a2903003703002057205820591b2157205a2056200420591b22044f0d0420dc0120136a21dc0120c101213c20c1012057490d000c050b0b20c001205a203c1094041a20c101203c6a2157205c2019480d012058205c4c0d01201820dc016a215920c101213c205a2104034020042056203c2056290300203c29030054205620096a290300221d203c20096a290300222e54201d202e511b22581b22dc01290300370300200420106a20dc0120106a2903003703002004200f6a20dc01200f6a2903003703002004200d6a20dc01200d6a2903003703002004200e6a20dc01200e6a290300370300200420096a20dc0120096a290300370300203c203c20176a20581b213c200420176a2104205620176a205620581b225620594f0d042057203c4b0d000c040b0b205621040c010b205a21040b20c101213c0b2004203c2057203c6b22dc0120dc012017706b1094041a20452061205c6a360200205d205f360200205e205e20096a206020c70173205b6a20c901741095041a20e10121dc0120e10120194b0d0f0b20dd010d080c010b205b21dc0120dd010d080b024020db01450d0020da0110230b20be01450d1520c00110230c150b41204101102a000b203c4101102a000b41b0a8c1002060205b1029000b41b0a8c1002004205b1029000b205f20041048000b20042063108c01000b4104213c0c010b4104213c0c010b410121040c0e0b410121040c0d0b410021bd010c040b410121bd010c040b410221bd010c040b410021040c050b410221040c040b410321040c030b410321040c020b410321040c010b410321040c000b0b20dd0120de011048000b200320633602f001200320643602ec01200320183602e801200341a8036a41086a22024200370300200342003703a80341c2b4c2004113200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341103602ac032003200341d8016a3602a803200341e8016a200341a8036a108a0202402064450d00201810230b41002105410021042003280294010d040c050b024020b901450d0020ba0110230b02400240024002400240202d202b6b20b7014f0d00202b20b7016a2204202b490d06202d201174223c20042004203c491b223c20ab01480d0602400240202d0d00203c10262225450d050c010b2025202d203c10272225450d040b203c212d2025202b6a20b80120b7011094041a20230d010c020b202b20b7016a21042025202b6a20b80120b7011094041a2023450d010b20b80110230b20ac0120b60120116a22b60136020020a50120a60129030037030020a70120a80129030037030020a90120aa01290300370300200320032903b8013703e801200341a8036a200341e8016a108d022004212b200341a8036a202c6a28020022230d010c040b203c4101102a000b4103213c410121040c000b0b101e000b024020032802ac03450d0020032802a80310230b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210202400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a102820032802e801220c450d02200341f0016a280200210220032802ec01210d0c010b4101210c4100210d0b02400240200241ffffff3f7122022004200420024b1b2205450d004100210420034180026a2107200341f8016a2109200341f0016a210a200c210203400240202520046a2d0000450d002007420037030020094200370300200a4200370300200342003703e801200341e8016a2002460d002002200341e8016a4120109604450d00200341e8016a200210ef014101210b20032802e8014101470d0020032802ec0120244d0d030b200241206a2102200441016a22042005490d000b0b4100210b0b0240200d450d00200c10230b0240202d450d00202510230b20034190016a200341b8016a200b1b220520082006200b1b109c02200342e3ded5f3b6ac9ab6f3003703b0014200211c200341a8036a41086a22024200370300200342003703a80341af98c300410d200341a8036a1000200341d8016a41086a22072002290300370300200320032903a8033703d80142002143024002400240200341d8016a411041a886c500410041001001417f460d00200342003703e801200341d8016a4110200341e8016a41084100100141016a41084d0d0120032903e80121430b200320433703d801200341e8016a200510800220032802ec01210820032802e801210420032802f0012106200341fc016a200341b0016a36020020032004200641286c6a3602f401200320043602f001200320083602ec01200320043602e8012003200341d8016a3602f801200341a8036a200341e8016a109d02200341e8016a41086a2002280200360200200320032903a8033703e8012005200341e8016a10870220024200370300200342003703a80341a5bcc2004112200341a8036a100020072002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d032002410f4d0d03200341f0016a290300214320032903e801211c200b450d010c090b42002143200b0d080b200341286a20034190016a10340240024002402003290328200341306a290300844200510d00411810262202450d07200241106a410029008db741370000200241086a4100290085b741370000200241002900fdb64137000020024118413810272202450d08200220032903b801370018200241306a200341b8016a41186a290300370000200241286a200341b8016a41106a290300370000200241206a200341b8016a41086a29030037000042002155200341e8016a41186a22044200370300200341e8016a41106a22054200370300200341e8016a41086a22074200370300200342003703e80120024138200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2005290300370300200341a8036a41086a2007290300370300200320032903e8013703a803200341a8036a412041a886c500410041001001417f460d01200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012204417f460d062004410f4d0d06200341f0016a290300214420032903e80121552002102341142104411410262202450d020c090b4193b5c1002104412221020c0d0b4200214420021023411421044114102622020d070b20044101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41184101102a000b41384101102a000b200241106a41002800f9b641360000200241086a41002900f1b641370000200241002900e9b641370000024020022004413410272202450d0020022003290390013700142002412c6a20034190016a41186a2204290300370000200241246a20034190016a41106a2903003700002002411c6a20034190016a41086a29030037000042002165200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120024134200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803024002400240200341a8036a412041a886c500410041001001417f460d00200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012205417f460d022005410f4d0d02200341f0016a290300217420032903e80121650c010b420021740b2002102320034190016a2065201c20552055201c56204420435620442043511b22021b221c7c223f20742043204420021b22437c203f206554ad7c10df01200341b8016a2055201c7d204420437d2055201c54ad7d10fe01200341f5016a200341b8016a41086a290300370000200341fd016a200341b8016a41106a29030037000020034185026a200341b8016a41186a2903003700002003418d026a20032903900137000020034195026a20034190016a41086a2903003700002003419d026a20034190016a41106a290300370000200341a5026a2004290300370000200341003a00ec01200341063a00e801200320032903b8013700ed0141a886c5004100200341e8016a102c0c0a0b41d4aac10041331021000b41344101102a000b200341186a20034190016a201c20431093022003290318211c2003200341186a41086a2903003703f0012003201c3703e8012003200341e8016a3602a803200341a8036a10de01200341f5016a20034190016a41086a290300370000200341fd016a200341a0016a29030037000020034185026a200341a8016a290300370000200341013a00ec01200341063a00e80120032003290390013700ed0141a886c5004100200341e8016a102c0c070b204d10230b02402005450d0002402064450d00201810230b2044a70d010c020b2044a7450d010b206210230b41012107410121080b200128020022054101460d040c050b200b450d00200510230b200320123602f0012003200a3602ec01200320073602e801200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200341103602ac032003200341d8016a3602a803200341e8016a200341a8036a108f020240200a450d00200710230b200341e8016a41186a200341b8016a41186a290300370300200341e8016a41106a200341b8016a41106a290300370300200341e8016a41086a200341b8016a41086a290300370300200320032903b8013703e80141012107200341e8016a41011090024100210441012108200128020022054101470d030c020b41002104410121070b41012108200128020022054101470d010b2008450d01200141086a280200450d01200128020410230c010b20054102470d002007450d00200141086a280200450d00200128020410230b2000200236020420002004360200200341d0036a24000bcc310b067f057e017f017e017f017e017f017e017f047e087f23004180026b22052400200541e8006a41086a220642003703002005420037036841e8b4c2004112200541e8006a100020054190016a41086a2006290300370300200520052903683703900141002107024002400240024002400240024020054190016a411041a886c500410041001001417f460d00200542103702e401200520054190016a3602e001200541386a200541e0016a102820052802382208450d02200541c0006a2802002107200528023c21090c010b41012108410021090b200541e8006a41086a220642003703002005420037036841c4b3c2004114200541e8006a100020054190016a41086a220a20062903003703002005200529036837039001024020054190016a411041a886c500410041001001417f460d0041bec1c2002106412e210720090d030c040b20064200370300200542003703684190b5c2004111200541e8006a1000200a2006290300370300200520052903683703900102400240024020054190016a411041a886c500410041001001417f460d002005410036023820054190016a4110200541386a41044100100141016a41044d0d0220052802382003470d010c040b41002003460d030b41ecc1c20021064114210720090d030c040b41d4aac10041331021000b41d4aac10041331021000b0240024002402007450d002007200241086a280200220a4f0d0141c1c2c2002106413c210720090d030c040b4180c2c200210641c10021070c010b200541286a20011034200541286a41086a290300210b2005290328210c200541386a2001108e02024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052903384201520d00200541d8006a290300210d200541d0006a290300210e200541c8006a290300210f200541e4006a280200211020052903402111200541c0016a2004410676109102410021122004413f71220620052802c8014f0d0120052802c001200641216c6a22062d00004101470d01200541aa016a200641036a2d00003a000020054190016a41086a200641146a2900003703002005419d016a200641196a290000370000200520062f00013b01a80120052006410c6a29000037039001200641086a2800002107200641046a28000021064101211220052802c4010d020c030b411410262206450d1d200641106a41002800f9b641360000200641086a41002900f1b641370000200641002900e9b64137000020064114413410272206450d1e200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002113200541e0016a41186a22074200370300200541e0016a41106a22124200370300200541e0016a41086a22144200370300200542003703e00120064134200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2012290300370300200541c0016a41086a2014290300370300200520052903e0013703c001200541c0016a412041a886c500410041001001417f460d03200542003703e801200542003703e001200541c0016a4120200541e0016a4110410010012207417f460d1b2007410f4d0d1b200541e8016a290300210e20052903e00121150c040b20052802c401450d010b20052802c00110230b024002402012450d0020054188016a41026a200541a8016a41026a2d00003a0000200541c0016a41086a20054190016a41086a290300370300200541c0016a410d6a20054190016a410d6a290000370000200520052f01a8013b01880120052005290390013703c001410021040c010b410121044113210741fdc2c20021060b20054184016a41026a221220054188016a41026a2d00003a0000200541e8006a41086a2214200541c0016a41086a290300370300200541e8006a41106a200541c0016a41106a290300370300200520052f0188013b018401200520052903c00137036820040d2a200541f3016a2014290300370000200541f8016a200541f5006a290000370000200520052f0184013b01e001200520073600e701200520063600e301200520052903683700eb01200520122d00003a00e201200541e0016a2001460d02200541e0016a20014120109604450d024190c3c20021064111210720090d2b0c2c0b420021154200210e0b20061023200541e8006a41086a220642003703002005420037036841a5bcc2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012206417f460d192006410f4d0d19200541e8016a290300210d20052903e00121130c010b4200210d0b02402015201358200e200d58200e200d511b0d00200541e0016a2004410676221210910241002106024020052802e8012004413f7122074d0d004101410220052802e001200741216c6a2d00001b21060b024020052802e401450d0020052802e00110230b200641024f0d02200541e8006a41086a220642003703002005420037036841d5c3c2004114200541e8006a100020054190016a41086a2006290300370300200520052903683703900141002107024020054190016a411041a886c500410041001001417f460d00200541003602e00120054190016a4110200541e0016a41044100100141016a41044d0d1d20052802e00121070b200541a8016a200710910220052802b0012206450d06200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200541c0016a2104200641c000470d0b0c0c0b41a1c3c20021064134210720090d290c2a0b200541e8006a41086a220642003703002005420037036841d9c0c2004112200541e8006a100020054190016a41086a2006290300370300200520052903683703900120054190016a411041a886c500410041001001417f460d01200541003602c00120054190016a4110200541c0016a41044100100141016a41044d0d1920052802c0012107200320106b22064197014f0d020c030b200541e8006a2012109102200541e0016a41186a2204200141186a290000370300200541e0016a41106a2214200141106a290000370300200541e0016a41086a2210200141086a290000370300200520012900003703e0012005280270220620074d0d1f20052802682216200741216c6a220620052903e001370001200641013a0000200641096a2010290300370000200641116a2014290300370000200641196a2004290300370000410e10262206450d20200641066a41002900a6b642370000200641002900a0b6423700002006410e411c10272206450d212006201236000e200541e0016a41186a22074200370300200541e0016a41106a22044200370300200541e0016a41086a22124200370300200542003703e00120064112200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2004290300370300200541c0016a41086a2012290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541e8006a200541e0016a109e0220061023200528026c450d0a201610230c0a0b41182107200320106b2206419701490d010b2005200e200d2007ad4200109804200541086a2903002117200529030021150c030b2006450d012007ad221342017c2218201354ad2119200541186a210442002115420021170340200541106a200e200d201820191097044200200d20042903007d200e2005290310221a54ad7d2213200e201a7d221a200e562013200d562013200d511b22071b220d20177c4200201a20071b220e20157c2215200e54ad7c21172006417f6a22060d000c030b0b4200210e200541e8006a41086a220442003703002005420037036841e9c3c2004111200541e8006a100020054190016a41086a2004290300370300200520052903683703900120054190016a411041a886c500410041001001417f460d02200542003703c801200542003703c00120054190016a4110200541c0016a4110410010012204417f460d1e2004410f4d0d1e200541c8016a290300210d20052903c001210e0c030b42002115420021170b2017200f7c201520117c220e201554ad7c210d0c050b4200210d0b200541e0016a2001200e200d4108108502024020052802e0014101470d0020052802e801210720052802e401210620052802ac01450d1f20052802a801102320090d200c210b20052903e801210e2005200541e0016a41106a2903003703e8012005200e3703e0012005200541e0016a3602c001200541c0016a10de014200210e200541e8006a41086a220442003703002005420037036841e9c3c2004111200541e8006a100020054190016a41086a200429030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012204417f460d1e2004410f4d0d1e200541e8016a290300210d20052903e001210e0c010b4200210d0b200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200b200d7d200c200e54ad7d210b200c200e7d210c200541c0016a21040b200541e0016a41186a200441186a290000370300200541e0016a41106a200441106a290000370300200541e0016a41086a200441086a290000370300200520042900003703e001024002400240024020052802ac012006470d00200641016a22042006490d0720064101742212200420042012491b2214ad42217e220e422088a70d07200ea722124100480d072006450d0120052802a801200641216c2012102722040d020c200b20052802a80121040c020b201210262204450d1e0b200520143602ac01200520043602a8010b200541a8016a41086a200641016a3602002004200641216c6a220420052903e001370001200441013a0000200441096a200541e0016a41086a290300370000200441116a200541e0016a41106a290300370000200441196a200541f8016a2903003700002006413f470d00200541e8006a41086a220642003703002005420037036841d5c3c2004114200541e8006a100020054190016a41086a200629030037030020052005290368370390012005200741016a3602e00120054190016a4110200541e0016a410410040b200541e0016a41086a200541a8016a41086a280200360200200520052903a8013703e0012007200541e0016a109f020b4200210e200541e8006a41086a220642003703002005420037036841a5bcc2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012206417f460d112006410f4d0d11200541e8016a290300210d20052903e001210e0c010b4200210d0b200541206a2001200e200d105b024020052802202206450d002005280224210720090d1d0c1e0b200541e8006a41086a220642003703002005420037036841acc1c2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200541003602e00120054190016a4110200541e0016a41044100100141016a41044d0d1220052802e00141016a21060c010b410121060b4200210e200541e8006a41086a220742003703002005420037036841acc1c2004112200541e8006a100020054190016a41086a20072903003703002005200529036837039001200520063602e00120054190016a4110200541e0016a410410044200210d0b200542e3ded5f3b6ac9ab6f3003703b801200541b8016a2001200c200b427f410f1062200541d0006a200b3703002005200c3703482005200d3703402005200e3703382005200336025c20052003360258411310262206450d102006410f6a41002800c5b542360000200641086a41002900beb542370000200641002900b6b54237000020064113413310272206450d11200620012900003700132006412b6a200141186a290000370000200641236a200141106a2900003700002006411b6a200141086a290000370000200541e0016a41186a22074200370300200541e0016a41106a22034200370300200541e0016a41086a22044200370300200542003703e00120064133200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2003290300370300200541c0016a41086a2004290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541386a200541e0016a10ed01200610232002280204211420022802002103024002400240024002400240200a410576221b450d00201b41027422061026221c450d18201c211d200a0d010c020b4104211c4104211d200a450d010b0240201b0d0041041026221c450d1c4101211b201c211d0b201d4100360200200a417f6a210441012116410021024100210602400340201620024d0d08201d20024102746a22072007280200200320066a2d00002006411f71746a360200200620044f0d0102400240200641016a2206411f71450d00200a20064b0d020c010b0240201b2016470d00201b41016a2207201b490d08201b4101742212200720072012491b2207ad420286220e422088a70d08200ea722124100480d0802400240201b450d00201c201b41027420121027221c0d010c110b20121026221c450d100b201c211d2007211b0b201d20164102746a4100360200200241016a2102201641016a2116200a20064b0d010b0b41ecb3c2002006200a1029000b02402014450d00200310230b4100211e0340200541386a41186a2203200141186a290000370300200541386a41106a220a200141106a290000370300200541386a41086a2204200141086a290000370300200520012900003703382016410820164108491b221f410274212002400240201f450d00202010262221450d0d2021201d20201094042102201f21074113102622060d010c0a0b410421214104210241002107411310262206450d090b2006410f6a410028009cb642360000200641086a4100290095b6423700002006410029008db64237000020064113413310272206450d09200620052903383700132006412b6a2003290300370000200641236a200a2903003700002006411b6a20042903003700002006413341e60010272222450d0a2022201e360033200541e0016a41186a22064200370300200541e0016a41106a22034200370300200541e0016a41086a22104200370300200542003703e00120224137200541e0016a1002200541c0016a41186a2006290300370300200541c0016a41106a2003290300370300200541c0016a41086a2010290300370300200520052903e0013703c00120104100360200200542013703e00120052007360268200541e8006a200541e0016a104102400240024020070d0020052802e4012106200541c0016a412020052802e001220a2010280200100420060d010c020b200741027421044100201028020022066b210720052802e40121030340200228020021140240024002400240200320076a41044f0d00200641046a220a2006490d0c20034101742212200a200a2012491b22124100480d0c2003450d0120052802e001200320121027220a0d020c0d0b20052802e001210a0c020b20121026220a450d0b0b200520123602e4012005200a3602e001201221030b200241046a21022010200641046a2212360200200a20066a20143600002007417c6a2107201221062004417c6a22040d000b200541c0016a4120200a201210042003450d010b200a10230b2016201f6b2116202210230240201f450d00202110230b201d20206a211d201e41016a211e20160d000b201b450d01201c10234100210620090d020c030b2014450d00200310230b410021062009450d010b200810230b0c1d0b101e000b20124101102a000b41d8b4c200200220161029000b41134101102a000b41334101102a000b41e6004101102a000b20204104102a000b20124104102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41134101102a000b41334101102a000b20064104102a000b41d8b4c200200720061029000b410e4101102a000b411c4101102a000b41d4aac10041331021000b41044104102a000b41d4aac10041331021000b20124101102a000b2009450d010b200810230b200241046a280200450d00200228020010230b200020073602042000200636020020054180026a24000bf909010c7f23004190016b22022400200241086a20014106762203109102024002400240200228021022042001413f7122014d0d002002280208200141216c6a22012002290028370001200141003a0000200141096a200241286a41086a2204290000370000200141116a200241286a41106a290000370000200141196a200241c0006a2900003700002004200241086a41086a280200360200200220022903083703282003200241286a109f02200442003703002002420037032841acc1c2004112200241286a1000200241f0006a41086a200429030037030020022002290328370370417f210102400240200241f0006a411041a886c500410041001001417f460d0020024100360228200241f0006a4110200241286a41044100100141016a41044d0d012002280228417f6a21010b200241286a41086a220342003703002002420037032841acc1c2004112200241286a1000200241f0006a41086a220520032903003703002002200229032837037020022001360228200241f0006a4110200241286a41041004200241286a41186a2206200041186a2207290000370300200241286a41106a2208200041106a22092900003703002003200041086a220a2900003703002002410036024820022000290000370328200241186a200241286a108d0202400240024002402002280220450d00410021040340200241d0006a41186a220b2007290000370300200241d0006a41106a220c2009290000370300200241d0006a41086a220d200a29000037030020022000290000370350411310262201450d042001410f6a410028009cb642360000200141086a4100290095b6423700002001410029008db64237000020014113413310272201450d02200120022903503700132001412b6a200b290300370000200141236a200c2903003700002001411b6a200d2903003700002001413341e60010272201450d03200120043600332006420037030020084200370300200342003703002002420037032820014137200241286a1002200241f0006a41186a2006290300370300200241f0006a41106a20082903003703002005200329030037030020022002290328370370200241f0006a4120100320011023200441016a21040240200228021c450d00200228021810230b200241286a41206a200436020020062007290000370300200820092900003703002003200a29000037030020022000290000370328200241186a200241286a108d02200241186a41086a2802000d000b0b0240200228021c450d00200228021810230b411310262201450d052001410f6a41002800c5b542360000200141086a41002900beb542370000200141002900b6b54237000020014113413310272201450d06200120002900003700132001412b6a200041186a290000370000200141236a200041106a2900003700002001411b6a200041086a290000370000200241286a41186a22044200370300200241286a41106a22034200370300200241286a41086a220642003703002002420037032820014133200241286a1002200241f0006a41186a2004290300370300200241f0006a41106a2003290300370300200241f0006a41086a200629030037030020022002290328370370200241f0006a412010032001102320024190016a24000f0b41334101102a000b41e6004101102a000b41134101102a000b41d4aac10041331021000b41d8b4c200200120041029000b41134101102a000b41334101102a000bdb0a03087f047e0b7f230041a0016b2202240002400240200141086a220328020022042001410c6a2802002205460d0020012802102106200241f8006a41186a2107200141146a2108034020032004220941286a2204360200200941086a290300210a200941106a290300210b200941186a290300210c2009290300210d200241f8006a41206a200941206a2903003703002007200c370300200241f8006a41106a220e200b370300200241f8006a41086a200a3703002002200d3703780240200e2903002006290300580d002008280200220e2007460d002007290000200e290000520d030b20052004470d000b200521040b2000410036020820004208370200024020042005460d00200141086a2004200541586a20046b41286e41286c6a41286a3602000b02402001280204450d00200128020010230b200241a0016a24000f0b200241d0006a41206a2204200241f8006a41206a290300370300200241d0006a41186a2207200241f8006a41186a290300370300200241d0006a41106a2203200241f8006a41106a290300370300200241d0006a41086a2208200241f8006a41086a29030037030020022002290378370350200241286a41206a220f2004290300370300200241286a41186a22042007290300370300200241286a41106a22072003290300370300200241286a41086a2203200829030037030020022002290350370328200241206a2208200f290300370300200241186a22102004290300370300200241106a22042007290300370300200241086a22072003290300370300200220022903283703000240024002400240024041281026220f450d00200f2002290300370300200f41206a2008290300370300200f41186a2010290300370300200f41106a2004290300370300200f41086a2007290300370300200128020421112001280200211241012101024002400240200541586a2009460d00200e200241f8006a41186a2204460d02200941286a2113200541586a2114410121014101211003402013210902400340200241f8006a41206a2207200941206a2903003703002004200941186a290300370300200241f8006a41106a2203200941106a290300220a370300200241f8006a41086a2208200941086a290300370300200220092903003703780240200a2006290300580d002004290000200e290000520d020b2005200941286a2209470d000c040b0b200241d0006a41206a22132007290300370300200241d0006a41186a22152004290300370300200241d0006a41106a22162003290300370300200241d0006a41086a2217200829030037030020022002290378370350200241286a41206a22182013290300370300200241286a41186a22132015290300370300200241286a41106a22152016290300370300200241286a41086a22162017290300370300200220022903503703282007201829030037030020042013290300370300200320152903003703002008201629030037030020022002290328370378024020102001470d00200141016a22102001490d0720014101742213201020102013491b2210ad42287e220a422088a70d07200aa722134100480d0702402001450d00200f200141286c20131027220f0d010c070b20131026220f450d060b200941286a2113200f200141286c6a22152002290378370300201541206a2007290300370300201541186a2004290300370300201541106a2003290300370300201541086a2008290300370300200141016a210120142009470d000c020b0b410121100b2011450d050c040b4101211020110d030c040b41284108102a000b20134108102a000b101e000b201210230b20002001360208200020103602042000200f360200200241a0016a24000bc60501087f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002104102400240024002400240024002402000450d00200041216c2104200241086a21050240034002400240024002400240024002400240024002400240024020032d00004101470d002002280204220020052802002206470d01200641016a22002006490d0f20064101742207200020002007491b22004100480d0f2006450d03200228020020062000102722070d040c100b2002280204220020052802002206470d01200641016a22002006490d0e20064101742207200020002007491b22004100480d0e2006450d05200228020020062000102722070d060c100b200228020021070c030b200228020021070c050b200010262207450d0c0b20022000360204200220073602000b2005200641016a2208360200200720066a41013a00000240200020086b41204f0d00200841206a22092008490d0a20004101742206200920092006491b22064100480d0a2000450d04200720002006102722070d050c0d0b200641216a21090c050b200010262207450d0a0b20022000360204200220073602000b2005200641016a2209360200200720066a41003a0000200341216a21032004415f6a22040d030c040b200610262207450d080b2002200636020420022007360200200621000b20052009360200200720086a220641086a200341016a220841086a290000370000200641106a200841106a290000370000200641186a200841186a29000037000020062008290000370000200341216a21032004415f6a22040d000b0b200128020020012802042007200910042000450d060c050b200228020421002001280200200128020420022802002207200241086a280200100420000d040c050b101e000b20004101102a000b20004101102a000b20064101102a000b200710230b200241106a24000b840201047f230041c0006b2202240002400240410e10262203450d00200341066a41002900a6b642370000200341002900a0b6423700002003410e411c10272203450d012003200036000e200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034112200241206a1002200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a109e02200310230240200141046a280200450d00200128020010230b200241c0006a24000f0b410e4101102a000b411c4101102a000ba20d010e7f230041e0006b220224000240024020012802042203200128020022046b418001490d00200141046a210503402001200441206a360200200141086a220628020022032802282107200341306a2802002108200241c0006a41186a22034200370300200241c0006a41106a22094200370300200241c0006a41086a220a42003703002002420037034020044120200241c0006a1002200241186a220b2003290300370300200241106a220c2009290300370300200241086a220d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d0020062802002206280230210b200628022821062003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a290300370300200220022903403703202006200b200241206a4120100c20040d030b20052802002203200128020022046b41ff004b0d000b0b024020042003460d00200141046a210c03402001200441206a360200200141086a220b28020022032802282106200341306a2802002107200241c0006a41186a22034200370300200241c0006a41106a22094200370300200241c0006a41086a220a42003703002002420037034020044120200241c0006a1002200241186a2003290300370300200241106a2009290300370300200241086a200a29030037030020022002290340370300200241003602402006200720024120200241c0006a100a2108024020022802402207417f460d00200b2802002206280230210b200628022821062003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a290300370300200220022903403703202006200b200241206a4120100c20040d030b20012802002204200c280200470d000b0b20004100360200200241e0006a24000f0b20002008360204200020043602002000410c6a2007360200200041086a2007360200200241e0006a24000b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b22064190016d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad4290017e2209422088a70d032009a722084100480d032002450d01200028020020024190016c200810272202450d020c040b200028020021020c040b2008102622020d020b20084108102a000b101e000b20002002360200200041046a2003360200200041086a28020021030b200220034190016c6a200520061094041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010230b0b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641e8006d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad42e8007e2209422088a70d032009a722084100480d032002450d012000280200200241e8006c200810272202450d020c040b200028020021020c040b2008102622020d020b20084108102a000b101e000b20002002360200200041046a2003360200200041086a28020021030b2002200341e8006c6a200520061094041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010230b0bcd0201077f230041106b220224002002410036020c2002410c6a20012802002203200128020422044104200441044922051b22061094041a2001200420066b3602042001200320066a3602000240024002400240024002400240024020050d00200228020c21052002200110452002280200450d0320022802042204417f4c0d042004450d01200410ac012203450d0520032001280200200141046a22072802002206200420062004491b22061094041a200728020022082006490d062007200820066b3602002001200128020020066a36020020062004470d020c070b20004100360204200241106a24000f0b4101210341002004460d050b2004450d00200310230b20004100360204200241106a24000f0b101d000b20044101102a000b200620081048000b2000200436020820002003360204200020053602002000410c6a2004360200200241106a24000bdb0201057f230041106b220224002002410036020c20014100200128020020012802042002410c6a41042001280208100122032003417f461b22034104200341044922031b20012802086a360208024002400240024002400240024020030d00200228020c210420022001104a2002280200450d0320022802042203417f4c0d042003450d01200310ac012205450d05200141086a2206200341002001280200200141046a280200200520032006280200100122012001417f461b2201200120034b1b220120062802006a36020020012003470d020c060b20004100360204200241106a24000f0b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d040b2003450d00200510230b20004100360204200241106a24000f0b101d000b20034101102a000b2000200336020820002005360204200020043602002000410c6a2003360200200241106a24000b8203010a7f230041106b220224002002200110450240024002400240024002400240024002402002280200450d0020022802042203417f4c0d072003450d01200310262204450d08200141046a2105410021064100210720032108034020052802002109200241003a000f2002410f6a2001280200220a2009410047220b1094041a2009200b490d0520052009200b6b3602002001200a200b6a3602002009450d04200741016a210920022d000f210b024020072008470d002006200920092006491b22084100480d0702402007450d00200420072008102722040d010c090b200810262204450d080b200420076a200b3a0000200641026a21062009210720092003490d000c030b0b20004100360200200241106a24000f0b4101210441002109410021080b2000200836020420002004360200200041086a2009360200200241106a24000f0b2000410036020002402008450d00200410230b200241106a24000f0b200b20091048000b101e000b20084101102a000b101d000b20034101102a000bf502010a7f230041106b2202240020022001104a024002400240024002400240024002402002280200450d0020022802042203417f4c0d062003450d01200310262204450d07200141046a2105200141086a21064100210741002108200321090340200241003a000f200128020020052802002002410f6a410120062802001001210a20062006280200200a41016a41014b220a6a360200200a450d04200841016a210a20022d000f210b024020082009470d002007200a200a2007491b22094100480d0602402008450d00200420082009102722040d010c080b200910262204450d070b200420086a200b3a0000200741026a2107200a2108200a2003490d000c030b0b20004100360200200241106a24000f0b410121044100210a410021090b2000200936020420002004360200200041086a200a360200200241106a24000f0b2000410036020002402009450d00200410230b200241106a24000f0b101e000b20094101102a000b101d000b20034101102a000bed0504027f017e0f7f017e230041f0006b22022400200241086a200110450240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241f0006a24000f0b4108210620030d030b410021114100210e0c030b101d000b20054108102a000b200241d0006a41186a2107200241d0006a41106a2108200241d0006a41086a2109200141046a210a4100210b4100210c4100210d2003210e0240034020074200370300200842003703002009420037030020024200370350200241d0006a2001280200220f200a28020022054120200541204922101b22111094041a200a200520116b22053602002001200f20116a221136020020100d01200241306a41186a22102007290300370300200241306a41106a22122008290300370300200241306a41086a221320092903003703002002200229035037033020024200370350200241d0006a20112005410820054108491b220f1094041a200a2005200f6b36020020012011200f6a360200200541074d0d01200d41016a211120022903502104200241106a41186a220f2010290300370300200241106a41106a22102012290300370300200241106a41086a22122013290300370300200220022903303703100240200d200e470d00200b20112011200b491b220ead42287e2214422088a70d042014a722054100480d040240200d450d002006200c2005102722060d010c060b200510262206450d050b2006200c6a22052002290310370300200541186a200f290300370300200541106a2010290300370300200541086a2012290300370300200541206a2004370300200b41026a210b200c41286a210c2011210d20112003490d000c020b0b200041003602000240200e450d00200610230b200241f0006a24000f0b2000200e36020420002006360200200041086a2011360200200241f0006a24000f0b101e000b20054108102a000be60403027f017e0b7f230041106b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad420c7e2204422088a70d082004a72205417f4c0d082005450d01200510262206450d032003450d020c040b20004100360200200241106a24000f0b4104210620030d020b4100210e4100210c0c020b20054104102a000b200141086a2107200141046a2108410021094100210a4100210b2003210c034020022001104a0240024002402002280200450d0020022802042205417f4c0d07024002402005450d00200510ac01220d450d0320072005410020012802002008280200200d200520072802001001220e200e417f461b220e200e20054b1b220e20072802006a360200200e2005470d010c040b4101210d2001280200200828020041014100200728020010011a41002005460d030b2005450d00200d10230b200041003602000240200b450d002006210503400240200541046a280200450d00200528020010230b2005410c6a2105200a41746a220a0d000b0b0240200c450d00200610230b200241106a24000f0b20054101102a000b200b41016a210e0240200b200c470d002009200e200e2009491b220cad420c7e2204422088a70d032004a7220f4100480d030240200b450d002006200a200f102722060d010c050b200f10262206450d040b2006200a6a220b200d360200200b41046a2005ad2204422086200484370200200941026a2109200a410c6a210a200e210b200e2003490d000b0b2000200c36020420002006360200200041086a200e360200200241106a24000f0b101e000b200f4104102a000b101d000bb00d03027f017e167f230041f0006b22022400200241106a2001104a02400240024002400240024002400240024002402002280210450d0020022802142203ad42247e2204422088a70d092004a72205417f4c0d092005450d01200510262206450d032003450d020c040b20004100360200200241f0006a24000f0b4104210620030d020b41002111410021100c020b20054104102a000b200241d0006a41046a21072002413d6a2108200241d7006a2109200141086a210a200241d0006a41186a210b200241d0006a41106a210c200241e3006a220d41056a210e4100210f20032110410021110340200241003a00502001280200200141046a2212280200200241d0006a4101200a28020010012105200a200a280200200541016a41014b22056a2213360200024002400240024002400240024002400240024002402005450d004105211420022d0050220541064b0d08024020050e07000b030b020405000b200241086a2001104a2002280208450d08200228020c2215417f4c0d102015450d05201510ac012205450d07200a201541002001280200201228020020052015200a280200100122122012417f461b2212201220154b1b2212200a2802006a36020020122015470d060c090b410521140c070b200241d0006a200110a40220022802542215450d0620022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410221140c080b200b4200370300200c4200370300200241d0006a41086a420037030020024200370350200a410020012802002012280200200241d0006a41202013100122052005417f461b2205412020054120491b200a2802006a3602002005411f4d0d05200241c0006a41086a200941086a280000360200200220092900003703402002200d2900003703302002200e29000037003520022f0150210520022d0052211420022800532117200841026a200241cd006a41026a2d00003a0000200820022f004d3b0000201741087621162005201441107472211a41002114200228024021150c070b200241d0006a200110a40220022802542215450d0420022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410321140c060b200241d0006a200110a40220022802542215450d0320022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410121140c050b410121052001280200201228020041014100200a28020010011a41002015460d030b2015450d01200510230c010b20154101102a000b0c010b200241c0006a41086a2002280250360200200241306a41086a200741086a2902003703002002200729020037033020022015ad22044220862004843703402005410876211641042114200521170b20072002290330370200200741086a200241306a41086a2903003702002002200241c0006a41086a28020036025020144105460d0220022802442112200241186a41106a2213200c280200360200200241186a41086a2218200241d0006a41086a29020037030020022002290250370318024020112010470d00201041016a22052010490d0420104101742219200520052019491b2205ad42247e2204422088a70d042004a722194100480d04024002402010450d002006201041246c2019102722060d010c070b201910262206450d060b200521100b2006200f6a220520143a00002005410c6a2012360200200541086a2015360200200541046a2016410874201741ff017172360200200541036a201a4110763a0000200541016a201a3b0000200541206a2013280200360200200541186a2018290300370200200541106a2002290318370200200f41246a210f201141016a22112003490d000b0b2000201036020420002006360200200041086a2011360200200241f0006a24000f0b2000410036020002402011450d002006210503400240024020052d0000220a41034b0d00024002400240200a0e0404000102040b2005410c6a280200450d03200541086a2802001023200541246a2105200f415c6a220f0d040c050b2005410c6a280200450d02200541086a2802001023200541246a2105200f415c6a220f0d030c040b2005410c6a280200450d01200541086a2802001023200541246a2105200f415c6a220f0d020c030b200541086a280200450d00200541046a28020010230b200541246a2105200f415c6a220f0d000b0b02402010450d00200610230b200241f0006a24000f0b101e000b20194104102a000b101d000bb30405027f017e077f017e017f230041e0056b2202240020022001104502400240024002400240024002400240024002402002280200450d0020022802042203ad42f8017e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241e0056a24000f0b4108210620030d030b4100210b4100210a0c030b101d000b20054108102a000b200241f8016a41f8006a21074100210841002105410021092003210a0340200241f8016a2001109402200241f0046a200241f8016a41f0001094041a200241f8016a41f0006a2903002104200241f0036a20074180011094041a20044203510d02200941016a210b20024188016a200241f0046a41f0001094041a200241086a200241f0036a4180011094041a02402009200a470d002008200b200b2008491b220aad42f8017e220c422088a70d04200ca7220d4100480d0402402009450d0020062005200d102722060d010c060b200d10262206450d050b200620056a20024188016a41f000109404220941f0006a2004370300200941f8006a200241086a4180011094041a200841026a2108200541f8016a2105200b2109200b2003490d000b0b2000200a36020420002006360200200041086a200b360200200241e0056a24000f0b2000410036020002402009450d0020064188016a210b0340200b1024200b41f8016a210b200541887e6a22050d000b0b0240200a450d00200610230b200241e0056a24000f0b101e000b200d4108102a000be30a04177f027e087f017e23004180016b220224000240200141086a220328020022042001410c6a2802002205460d002001280210220628020021072006280208220841014621094100210a0340024002400240024002400240024002400240200a0e020001010b2003200441206a220b360200200241e0006a41186a200441186a290000370300200241e0006a41106a200441106a290000370300200241e0006a41086a200441086a290000370300200220042900003703604100210a0240024020090d002008450d014100210a2008210c0340200c410176220d200a6a220e200a2007200e4105746a200241e0006a41201096044101481b210a200c200d6b220c41014b0d000b0b2007200a4105746a200241e0006a41201096040d00200b2104200b2005470d07200521040c0a0b200241206a41186a220a200241e0006a41186a290300370300200241206a41106a220f200241e0006a41106a290300370300200241206a41086a220c200241e0006a41086a29030037030020022002290360370320200241186a220d200a290300370300200241106a220a200f290300370300200241086a220f200c29030037030020022002290320370300200241c0006a41186a220c200d290300370300200241c0006a41106a220d200a290300370300200241c0006a41086a220a200f29030037030020022002290300370340412010262210450d0420102002290340370000201041186a200c290300370000201041106a200d290300370000201041086a200a2903003700002001280204211120012802002112200b2005460d014101210f41082113200641086a211441182115411021164120211741052118420521194220211a4100211b4101211c4101211d4101210a0c080b2014280200211e2006280200211f02400340200241e0006a20156a2220200b20156a290000370300200241e0006a20166a2221200b20166a290000370300200241e0006a20136a2222200b20136a2900003703002002200b290000370360200b20176a210b4100210a0240201e200f460d00201e450d024100210a201e210c0340200c200f76220d200a6a220e200a201f200e2018746a200241e0006a2017109604200f481b210a200c200d6b220c200f4b0d000b0b201f200a2018746a200241e0006a20171096040d01200b2005470d000c030b0b200241206a20156a220a2020290300370300200241206a20166a220c2021290300370300200241206a20136a220d202229030037030020022002290360370320200241c0006a20156a220e200a290300370300200241c0006a20166a220a200c290300370300200241c0006a20136a220c200d29030037030020022002290320370340200220156a220d200e290300370300200220166a220e200a290300370300200220136a221f200c290300370300200220022903403703000240201d201c470d00201c200f6a220a201c490d03201c200f74220c200a200a200c491b221dad2019862223201a88a70d032023a7220a201b480d030240201c450d002010201c201874200a102722100d010c060b200a10262210450d050b2010201c2018746a220a2002290300370000200a20156a200d290300370000200a20166a200e290300370000200a20136a201f290300370000201c200f6a211c200b2005470d060c010b4101211c4101211d0b02402011450d00201210230b2000201c3602082000201d3602042000201036020020024180016a24000f0b101e000b41204101102a000b200a4101102a000b4100210a0c010b4101210a0c000b0b2000410036020820004201370200024020042005460d00200141086a2004200520046b41606a4160716a41206a3602000b02402001280204450d00200128020010230b20024180016a24000b0c002000280200200110ad020bce7601027f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a220341aa014b0d00024020030eab010002030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b200128021841d3eac40041032001411c6a28020028020c11020021010cb1010b200128021841c8eac400410b2001411c6a28020028020c11020021010cb0010b2002200128021841d6eac40041052001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000caf010b2002200128021841eceac40041042001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000cae010b2002200128021841f0eac40041022001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000cad010b200128021841f2eac40041042001411c6a28020028020c11020021010cac010b200128021841f6eac40041032001411c6a28020028020c11020021010cab010b2002200128021841f9eac40041022001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450daa01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000caa010b20022001280218418cebc40041042001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca9010b200220012802184190ebc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a4198ebc40010de03210120022000410c6a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450da801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca8010b200128021841a8ebc40041062001411c6a28020028020c11020021010ca7010b2002200128021841aeebc40041042001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca6010b2002200128021841b2ebc400410c2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c4101210120022002410c6a41fceac40010de0321032002200041016a36020c20032002410c6a41c0ebc40010de031a20022d0008210020022802042203450da2010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca5010b200128021841d0ebc40041042001411c6a28020028020c11020021010ca4010b200128021841d4ebc40041062001411c6a28020028020c11020021010ca3010b2002200128021841daebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca2010b2002200128021841e2ebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca1010b2002200128021841eaebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca0010b2002200128021841f2ebc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d9f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9f010b2002200128021841fbebc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d9e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9e010b200220012802184184ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9d010b20022001280218418becc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9c010b200220012802184192ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9b010b200220012802184199ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9a010b2002200128021841a0ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c99010b2002200128021841a9ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c98010b2002200128021841b2ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c97010b2002200128021841bcecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c96010b2002200128021841c6ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9501200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c95010b2002200128021841cfecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c94010b2002200128021841d8ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c93010b2002200128021841e2ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c92010b2002200128021841ececc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c91010b2002200128021841f6ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c90010b200220012802184180edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8f010b200220012802184188edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8e010b200220012802184190edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8d010b200220012802184198edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8c010b2002200128021841a0edc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8b010b2002200128021841a9edc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8a010b2002200128021841b3edc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c89010b2002200128021841bcedc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c88010b2002200128021841c6edc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c87010b2002200128021841d0edc400410d2001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41c0ebc40010de031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c86010b2002200128021841ddedc400410a2001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41c0ebc40010de031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c85010b2002200128021841e7edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41f0edc40010de031a20022d0008210120022802042203450d8401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c84010b200220012802184180eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a4188eec40010de031a20022d0008210120022802042203450d8301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c83010b200220012802184198eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d8201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c82010b2002200128021841a0eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a41a8eec40010de031a20022d0008210120022802042203450d8101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c81010b200128021841b8eec40041062001411c6a28020028020c11020021010c80010b200128021841beeec40041052001411c6a28020028020c11020021010c7f0b200128021841c3eec40041052001411c6a28020028020c11020021010c7e0b200128021841c8eec40041062001411c6a28020028020c11020021010c7d0b200128021841ceeec40041062001411c6a28020028020c11020021010c7c0b200128021841d4eec40041062001411c6a28020028020c11020021010c7b0b200128021841daeec40041062001411c6a28020028020c11020021010c7a0b200128021841e0eec40041062001411c6a28020028020c11020021010c790b200128021841e6eec40041062001411c6a28020028020c11020021010c780b200128021841eceec40041062001411c6a28020028020c11020021010c770b200128021841f2eec40041062001411c6a28020028020c11020021010c760b200128021841f8eec40041062001411c6a28020028020c11020021010c750b200128021841feeec40041052001411c6a28020028020c11020021010c740b20012802184183efc40041052001411c6a28020028020c11020021010c730b20012802184188efc40041062001411c6a28020028020c11020021010c720b2001280218418eefc40041062001411c6a28020028020c11020021010c710b20012802184194efc40041062001411c6a28020028020c11020021010c700b2001280218419aefc40041062001411c6a28020028020c11020021010c6f0b200128021841a0efc40041062001411c6a28020028020c11020021010c6e0b200128021841a6efc40041062001411c6a28020028020c11020021010c6d0b200128021841acefc40041062001411c6a28020028020c11020021010c6c0b200128021841b2efc40041062001411c6a28020028020c11020021010c6b0b200128021841b8efc40041052001411c6a28020028020c11020021010c6a0b200128021841bdefc40041052001411c6a28020028020c11020021010c690b200128021841c2efc40041052001411c6a28020028020c11020021010c680b200128021841c7efc40041052001411c6a28020028020c11020021010c670b200128021841ccefc40041052001411c6a28020028020c11020021010c660b200128021841d1efc40041052001411c6a28020028020c11020021010c650b200128021841d6efc40041052001411c6a28020028020c11020021010c640b200128021841dbefc40041052001411c6a28020028020c11020021010c630b200128021841e0efc40041052001411c6a28020028020c11020021010c620b200128021841e5efc40041052001411c6a28020028020c11020021010c610b200128021841eaefc40041052001411c6a28020028020c11020021010c600b200128021841efefc40041052001411c6a28020028020c11020021010c5f0b200128021841f4efc40041062001411c6a28020028020c11020021010c5e0b200128021841faefc40041062001411c6a28020028020c11020021010c5d0b20012802184180f0c40041092001411c6a28020028020c11020021010c5c0b20012802184189f0c40041062001411c6a28020028020c11020021010c5b0b2001280218418ff0c40041062001411c6a28020028020c11020021010c5a0b20012802184195f0c40041062001411c6a28020028020c11020021010c590b2001280218419bf0c40041072001411c6a28020028020c11020021010c580b200128021841a2f0c40041072001411c6a28020028020c11020021010c570b200128021841a9f0c40041072001411c6a28020028020c11020021010c560b200128021841b0f0c40041072001411c6a28020028020c11020021010c550b200128021841b7f0c40041062001411c6a28020028020c11020021010c540b200128021841bdf0c40041052001411c6a28020028020c11020021010c530b200128021841c2f0c40041062001411c6a28020028020c11020021010c520b200128021841c8f0c40041062001411c6a28020028020c11020021010c510b200128021841cef0c40041072001411c6a28020028020c11020021010c500b200128021841d5f0c40041072001411c6a28020028020c11020021010c4f0b200128021841dcf0c40041072001411c6a28020028020c11020021010c4e0b200128021841e3f0c40041072001411c6a28020028020c11020021010c4d0b200128021841eaf0c40041062001411c6a28020028020c11020021010c4c0b200128021841f0f0c40041062001411c6a28020028020c11020021010c4b0b200128021841f6f0c40041092001411c6a28020028020c11020021010c4a0b200128021841fff0c40041062001411c6a28020028020c11020021010c490b20012802184185f1c40041062001411c6a28020028020c11020021010c480b2001280218418bf1c40041062001411c6a28020028020c11020021010c470b20012802184191f1c40041072001411c6a28020028020c11020021010c460b20012802184198f1c40041072001411c6a28020028020c11020021010c450b2001280218419ff1c40041072001411c6a28020028020c11020021010c440b200128021841a6f1c40041072001411c6a28020028020c11020021010c430b200128021841adf1c40041062001411c6a28020028020c11020021010c420b200128021841b3f1c40041052001411c6a28020028020c11020021010c410b200128021841b8f1c40041062001411c6a28020028020c11020021010c400b200128021841bef1c40041062001411c6a28020028020c11020021010c3f0b200128021841c4f1c40041072001411c6a28020028020c11020021010c3e0b200128021841cbf1c40041072001411c6a28020028020c11020021010c3d0b200128021841d2f1c40041072001411c6a28020028020c11020021010c3c0b200128021841d9f1c40041072001411c6a28020028020c11020021010c3b0b200128021841e0f1c40041062001411c6a28020028020c11020021010c3a0b200128021841e6f1c40041062001411c6a28020028020c11020021010c390b200128021841ecf1c40041072001411c6a28020028020c11020021010c380b200128021841f3f1c40041082001411c6a28020028020c11020021010c370b200128021841fbf1c40041082001411c6a28020028020c11020021010c360b20012802184183f2c400410a2001411c6a28020028020c11020021010c350b2001280218418df2c40041072001411c6a28020028020c11020021010c340b20012802184194f2c40041062001411c6a28020028020c11020021010c330b2001280218419af2c40041062001411c6a28020028020c11020021010c320b200128021841a0f2c40041062001411c6a28020028020c11020021010c310b200128021841a6f2c40041062001411c6a28020028020c11020021010c300b200128021841acf2c40041062001411c6a28020028020c11020021010c2f0b200128021841b2f2c40041062001411c6a28020028020c11020021010c2e0b200128021841b8f2c400410b2001411c6a28020028020c11020021010c2d0b200128021841c3f2c40041062001411c6a28020028020c11020021010c2c0b200128021841c9f2c40041062001411c6a28020028020c11020021010c2b0b200128021841cff2c40041072001411c6a28020028020c11020021010c2a0b200128021841d6f2c40041082001411c6a28020028020c11020021010c290b200128021841def2c40041082001411c6a28020028020c11020021010c280b200128021841e6f2c400410a2001411c6a28020028020c11020021010c270b200128021841f0f2c40041072001411c6a28020028020c11020021010c260b200128021841f7f2c40041062001411c6a28020028020c11020021010c250b200128021841fdf2c40041062001411c6a28020028020c11020021010c240b20012802184183f3c40041062001411c6a28020028020c11020021010c230b20012802184189f3c40041062001411c6a28020028020c11020021010c220b2001280218418ff3c40041062001411c6a28020028020c11020021010c210b20012802184195f3c40041062001411c6a28020028020c11020021010c200b2001280218419bf3c400410b2001411c6a28020028020c11020021010c1f0b200128021841a6f3c400410a2001411c6a28020028020c11020021010c1e0b200128021841b0f3c400410c2001411c6a28020028020c11020021010c1d0b200128021841bcf3c400410c2001411c6a28020028020c11020021010c1c0b200128021841c8f3c400410c2001411c6a28020028020c11020021010c1b0b200128021841d4f3c400410c2001411c6a28020028020c11020021010c1a0b200128021841e0f3c400410d2001411c6a28020028020c11020021010c190b200128021841edf3c400410d2001411c6a28020028020c11020021010c180b200128021841faf3c400410c2001411c6a28020028020c11020021010c170b20012802184186f4c400410c2001411c6a28020028020c11020021010c160b20012802184192f4c400410c2001411c6a28020028020c11020021010c150b2001280218419ef4c400410c2001411c6a28020028020c11020021010c140b200128021841aaf4c400410e2001411c6a28020028020c11020021010c130b200128021841b8f4c400410e2001411c6a28020028020c11020021010c120b200128021841c6f4c400410e2001411c6a28020028020c11020021010c110b200128021841d4f4c400410e2001411c6a28020028020c11020021010c100b200128021841e2f4c400410c2001411c6a28020028020c11020021010c0f0b200128021841eef4c400410e2001411c6a28020028020c11020021010c0e0b200128021841fcf4c400410e2001411c6a28020028020c11020021010c0d0b2001280218418af5c400410e2001411c6a28020028020c11020021010c0c0b20012802184198f5c400410e2001411c6a28020028020c11020021010c0b0b200128021841a6f5c400410d2001411c6a28020028020c11020021010c0a0b200128021841b3f5c40041112001411c6a28020028020c11020021010c090b200128021841c4f5c40041112001411c6a28020028020c11020021010c080b200128021841d5f5c40041112001411c6a28020028020c11020021010c070b200128021841e6f5c40041112001411c6a28020028020c11020021010c060b200021010c050b200021010c040b200021010c030b200021010c020b200021010c010b200021010b200241106a2400200141ff01714100470bd3ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610272205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610272205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810272209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810272206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610272205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810272209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810272209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810272209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610272205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810272209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610272205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910272206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610272205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510272208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610272205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810272209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910272206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610272205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610272205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610272205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610272208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510272208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610272205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610272205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610272205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610272205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610272205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510272208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910272206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610272205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510272208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610272205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610272205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610272205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610272205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610272205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610272205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810272209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610272205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810272209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610272205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610272205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610272205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610272205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610272205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610272205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610272205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610272205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610272205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610272205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610272205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610272205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610272205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810272209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810272209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610272205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610272205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610272205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810272209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810272209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610272205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610272205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610272205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610272205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610272205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610272205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610272205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610272205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810272209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610272205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610272205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610272205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610272205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610272205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610272205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610272205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910272206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610272205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610272205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610272205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610272205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610272205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610272205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610272205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510272208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810272209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610272205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610272205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610272205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610272205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610272205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610272205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610272205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610272205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610272205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610272205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610272205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610272205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610272205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610272205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610272205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610272205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610272205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610272205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610272205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610272205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610272205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610272205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610272205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610272205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610272205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610272205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610272205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610272205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610272205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810272209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810272205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910272206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610272205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610272205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610272205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610272205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610272205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610272205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610272205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610272205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610272205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610272205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610272205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610272205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610272205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610272205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610272205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610272205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610272205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610272205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610272205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810272209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810272209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610272205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610272205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610272205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910272206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610272205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610272205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610272205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810272209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610272205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610272205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610272205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610272205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610272205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610272205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610272205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610272205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510272208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610272205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610272205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810272209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610272205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610272205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810272209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810272209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610272205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110272206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810272209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610272205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810272209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510272208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610272205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510272208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610272205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102622050db4050b20064101102a000b2008102622090dad050b20084101102a000b2008102622060da9050b20084101102a000b2006102622050da5050b20064101102a000b2008102622090da1050b20084101102a000b2008102622090d9a050b20084101102a000b2008102622090d96050b20084101102a000b2006102622050d92050b20064101102a000b2008102622090d8e050b20084101102a000b2006102622050d8a050b20064101102a000b2009102622060d86050b20094101102a000b2006102622050d82050b20064101102a000b2005102622080dfe040b20054101102a000b2006102622050dfa040b20064101102a000b2008102622090df6040b20084101102a000b2009102622060df2040b20094101102a000b2006102622050dee040b20064101102a000b2006102622050dea040b20064101102a000b2006102622050de6040b20064101102a000b2006102622080de2040b20064101102a000b2005102622080dde040b20054101102a000b2006102622050dda040b20064101102a000b2006102622050dd6040b20064101102a000b2006102622050dd2040b20064101102a000b2006102622050dce040b20064101102a000b2006102622050dca040b20064101102a000b2005102622080dc6040b20054101102a000b2009102622060dc2040b20094101102a000b2006102622050dbe040b20064101102a000b2005102622080dba040b20054101102a000b2006102622050db6040b20064101102a000b2006102622050db2040b20064101102a000b2006102622050dae040b20064101102a000b2006102622050daa040b20064101102a000b2006102622050da6040b20064101102a000b2006102622050da2040b20064101102a000b2006102622050dee040b20064101102a000b2008102622090d9c040b20084101102a000b2006102622050d98040b20064101102a000b2008102622090d94040b20084101102a000b2006102622050d90040b20064101102a000b2006102622050d8c040b20064101102a000b2006102622050d88040b20064101102a000b2006102622050d84040b20064101102a000b2006102622050d80040b20064101102a000b2006102622050dfc030b20064101102a000b2006102622050df8030b20064101102a000b2006102622050df4030b20064101102a000b2006102622050df0030b20064101102a000b2006102622050dec030b20064101102a000b2006102622050de8030b20064101102a000b2006102622050de4030b20064101102a000b2006102622050de0030b20064101102a000b2008102622090ddc030b20084101102a000b2008102622090dd8030b20084101102a000b2006102622050dd4030b20064101102a000b2006102622050dd0030b20064101102a000b2006102622050dcc030b20064101102a000b2008102622090dc8030b20084101102a000b2008102622090dc4030b20084101102a000b2006102622050dc0030b20064101102a000b2006102622050dbc030b20064101102a000b2006102622050db8030b20064101102a000b2006102622050db4030b20064101102a000b2006102622050db0030b20064101102a000b2006102622050dac030b20064101102a000b2006102622050da8030b20064101102a000b2006102622050da4030b20064101102a000b2008102622090da0030b20084101102a000b2006102622050d9c030b20064101102a000b2006102622050d98030b20064101102a000b2006102622050d94030b20064101102a000b2006102622050d90030b20064101102a000b2006102622050d8c030b20064101102a000b2006102622050d88030b20064101102a000b2006102622050d84030b20064101102a000b2009102622060d80030b20094101102a000b2006102622050dfc020b20064101102a000b2006102622050df8020b20064101102a000b2006102622050df4020b20064101102a000b2006102622050df0020b20064101102a000b2006102622050dec020b20064101102a000b2006102622050de8020b20064101102a000b2006102622050de4020b20064101102a000b2005102622080de0020b20054101102a000b2008102622090ddc020b20084101102a000b2006102622050dd8020b20064101102a000b2006102622050dd3020b20064101102a000b2006102622050dcf020b20064101102a000b2006102622050dcb020b20064101102a000b2006102622050dc7020b20064101102a000b2006102622050dc3020b20064101102a000b2006102622050dbf020b20064101102a000b2006102622050dbb020b20064101102a000b2006102622050db7020b20064101102a000b2006102622050db3020b20064101102a000b2006102622050daf020b20064101102a000b2006102622050dab020b20064101102a000b2006102622050da7020b20064101102a000b2006102622050da3020b20064101102a000b2006102622050d9f020b20064101102a000b2006102622050d9b020b20064101102a000b2006102622050d97020b20064101102a000b2006102622050d93020b20064101102a000b2006102622050d8f020b20064101102a000b2006102622050d8b020b20064101102a000b2006102622050d87020b20064101102a000b2006102622050d83020b20064101102a000b2006102622050dff010b20064101102a000b2006102622050dfb010b20064101102a000b2006102622050df7010b20064101102a000b2006102622050df3010b20064101102a000b2006102622050def010b20064101102a000b2006102622050deb010b20064101102a000b2006102622050de7010b20064101102a000b2008102622090de3010b20084101102a000b2008102622050ddf010b20084101102a000b2009102622060ddb010b20094101102a000b2006102622050dd7010b20064101102a000b2006102622050dd3010b20064101102a000b2006102622050dcf010b20064101102a000b2006102622050dcb010b20064101102a000b2006102622050dc7010b20064101102a000b2006102622050dc3010b20064101102a000b2006102622050dbf010b20064101102a000b2006102622050dbb010b20064101102a000b2006102622050db7010b20064101102a000b2006102622050db3010b20064101102a000b2006102622050daf010b20064101102a000b2006102622050dab010b20064101102a000b2006102622050da7010b20064101102a000b2006102622050da3010b20064101102a000b2006102622050d9f010b20064101102a000b2006102622050d9b010b20064101102a000b2006102622050d97010b20064101102a000b2006102622050d93010b20064101102a000b2006102622050d8f010b20064101102a000b2008102622090d8b010b20084101102a000b2008102622090d87010b20084101102a000b2006102622050d83010b20064101102a000b2006102622050d7f0b20064101102a000b2006102622050d7b0b20064101102a000b2009102622060d770b20094101102a000b2006102622050d730b20064101102a000b2006102622050d6f0b20064101102a000b2006102622050d6b0b20064101102a000b2008102622090d670b20084101102a000b2006102622050d630b20064101102a000b2006102622050d5f0b20064101102a000b2006102622050d5b0b20064101102a000b2006102622050d570b20064101102a000b2006102622050d530b20064101102a000b2006102622050d4f0b20064101102a000b2006102622050d4b0b20064101102a000b2006102622050d470b20064101102a000b2005102622080d430b20054101102a000b2006102622050d3f0b20064101102a000b2006102622050d3b0b20064101102a000b2008102622090d370b20084101102a000b2006102622050d330b20064101102a000b2006102622050d2f0b20064101102a000b2008102622090d2b0b20084101102a000b2008102622090d270b20084101102a000b2006102622050d230b20064101102a000b2001102622060d1f0b20014101102a000b2008102622090d1b0b20084101102a000b2006102622050d170b20064101102a000b2008102622090d130b20084101102a000b2005102622080d0f0b20054101102a000b2006102622050d0b0b20064101102a000b2005102622080d070b20054101102a000b2006102622050d030b20064101102a000b101e000b101e000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d4101102a000b20094101102a000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210af020240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102722050d020c060b200928020021050c020b200810262205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10230b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1023200341106a24000f0b20084101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210b00220032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a200210b10220032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001023200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d4101102a000b20094101102a000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b20094101102a000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102722080d020c050b200b28020021080c020b200710262208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610272205450d020c040b200b28020021050c040b2006102622050d020b20064101102a000b20074101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102722060d020c070b200728020021060c020b200910262206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b101e000b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102722050d020c070b200728020021050c020b200910262205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b101e000b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200341106a24000bc60301067f2004410c6a2105200441086a2106200441046a210702400240024003400240024002400240200628020020052802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120072802002008200a102722090d020c070b200728020021090c020b200a10262209450d050b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b024020022003460d002004410c6a2105200441086a2106200441046a210703402002280200210103400240024002400240200628020020052802002208470d00200841016a22092008490d072008410174220a20092009200a491b220a4100480d072008450d0120072802002008200a102722090d020c080b200728020021090c020b200a10262209450d060b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b200241046a22022003470d000b0b2000411a3a00000f0b101e000b200a4101102a000b200a4101102a000bd40301077f200141c000712103200141ff00712104024002400240024002400240200141077522050d002003450d010b2002410c6a2106200241086a2107200241046a2108034002402005417f470d00200341ff01710d020b0240024002400240200728020020062802002209470d00200941016a22032009490d0620094101742204200320032004491b22044100480d062009450d01200828020020092004102722030d020c070b200828020021030c020b200410262203450d050b2007200436020020082003360200200628020021090b2006200941016a360200200320096a200141807f723a0000200541c000712103200541ff007121042005210120054107752209210520090d002009210520030d000b0b024002400240200241086a2802002002410c6a2802002205470d00200541016a22092005490d0320054101742206200920092006491b22064100480d032005450d01200241046a2802002005200610272209450d020c050b200241046a28020021090c050b2006102622090d030b20064101102a000b101e000b20044101102a000b200241086a2006360200200241046a20093602002002410c6a28020021050b2002410c6a200541016a360200200920056a20043a00002000411a3a00000bd40301077f2001a7220341c000712104200341ff00712105024002400240024002400240200142078722014200520d002004450d010b2002410c6a2106200241086a2107200241046a2108034002402001427f520d00200441ff01710d020b0240024002400240200728020020062802002204470d00200441016a22052004490d0620044101742209200520052009491b22094100480d062004450d01200828020020042009102722050d020c070b200828020021050c020b200910262205450d050b2007200936020020082005360200200628020021040b2006200441016a360200200520046a200341807f723a00002001a7220341c000712104200341ff00712105200142078722014200520d0020040d000b0b024002400240200241086a2802002002410c6a2802002204470d00200441016a22032004490d0320044101742206200320032006491b22064100480d032004450d01200241046a2802002004200610272203450d020c050b200241046a28020021030c050b2006102622030d030b20064101102a000b101e000b20094101102a000b200241086a2006360200200241046a20033602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000bf61402047f017e2000280248210202400240024002400240024002400240200141046a2802002203200141086a28020022046b41044f0d00200441046a22052004490d0520034101742204200520052004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200320046a20023600002000290300210602400240024002400240200141046a2802002203200528020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290308210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290310210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290318210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290320210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290328210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290330210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290338210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290340210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a2006370000200028024c210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280250210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280254210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a200536000002400240024002400240200141046a28020020022802002204470d00200441016a22032004490d0520044101742202200320032002491b22024100480d052004450d0120012802002004200210272203450d020c030b200128020021030c030b2002102622030d010b20024101102a000b20012003360200200141046a2002360200200141086a28020021040b200141086a2202200441016a360200200320046a200041dc006a2d00003a000020002802582103024002400240200141046a2802002204200228020022006b41044f0d00200041046a22022000490d0320044101742200200220022000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a20033600000bc00201037f230041106b22022400200241003602082002420137030020002d0000210341011026210402400240024002400240024020034101470d002004450d03200441013a000020024281808080103702042002200436020020044101412110272204450d0420042000290001370001200441096a200041096a290000370000200441116a200041116a290000370000200441196a200041196a290000370000200242a1808080900437020420022004360200200128020020012802042004412110044100450d010c020b2004450d04200441003a0000200242818080801037020420022004360200200041086a200210b402200228020421002001280200200128020420022802002204200241086a28020010042000450d010b200410230b200241106a24000f0b41014101102a000b41214101102a000b41014101102a000b8a0c02067f027e230041106b22022400200028022821032002200041306a280200220436020c2002410c6a2001104102400240024002400240024002400240200141046a2802002205200141086a28020022066b20044f0d00200620046a22072006490d0520054101742206200720072006491b22064100480d052005450d0120012802002005200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021060b200141086a2207200620046a360200200520066a200320041094041a2000280234210502400240024002400240200141046a2802002206200728020022046b41044f0d00200441046a22032004490d0520064101742204200320032004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2203200441046a360200200620046a200536000002400240024002400240200141046a2802002206200328020022046b41204f0d00200441206a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441206a360200200620046a220441186a200041d0006a290000370000200441106a200041c8006a290000370000200441086a200041c0006a29000037000020042000290038370000200041086a29030021082000290300210902400240024002400240200141046a2802002206200528020022046b41104f0d00200441106a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441106a360200200620046a22042008370008200420093700002000290310210802400240024002400240200141046a2802002206200528020022046b41084f0d00200441086a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441086a360200200620046a20083700000240024002400240024002400240024002400240024020002903184201520d00200141046a28020020052802002204470d01200441016a22062004490d0b20044101742205200620062005491b22054100480d0b2004450d0320012802002004200510272206450d040c090b200141046a28020020052802002200470d01200041016a22042000490d0a20004101742206200420042006491b22064100480d0a2000450d0420012802002000200610272204450d050c060b200128020021060c080b200128020021040c050b2005102622060d050b20054101102a000b2006102622040d010b20064101102a000b20012004360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200420006a41003a0000200241106a24000f0b20012006360200200141046a2005360200200141086a28020021040b200141086a2205200441016a360200200620046a41013a0000200041206a2903002108024002400240200141046a2802002204200528020022006b41084f0d00200041086a22062000490d0320044101742200200620062000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200420006a2008370000200241106a24000b13002000410636020420004198cfc2003602000b130020004108360204200041a0c9c2003602000b13002000411636020420004188e7c2003602000b7801047f230041106b2202240020024100360208200242013703000240410110262203450d00200220033602002002410136020420002002290300370200200241086a22042004280200220441016a2205360200200320046a41003a0000200041086a2005360200200241106a24000f0b41014101102a000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242003700000f0b41084101102a000bab0101017f230041f0006b22022400200241003a005c20024280808480800237035020024201370340200242013703382002420137033020024201370328200242013703202002420137031820024201370310200242013703082002420137030020024280808080c0003703482002412036025820024100360268200242013703602002200241e0006a10b202200041086a200228026836020020002002290360370200200241f0006a24000b3501017f0240410810262202450d002000428880808080013702042000200236020020024280ade2043700000f0b41084101102a000b3301017f0240410410262202450d0020004284808080c00037020420002002360200200241e4003600000f0b41044101102a000b3301017f0240410810262202450d0020004288808080800137020420002002360200200242af013700000f0b41084101102a000b3301017f0240410810262202450d002000428880808080013702042000200236020020024287013700000f0b41084101102a000b3901017f0240411010262202450d002002420037000820024215370000200042908080808002370204200020023602000f0b41104101102a000bc32b05087f037e037f017e047f23004190056b22022400200241003a00c80220012802002001280204200241c8026a410120012802081001210320012001280208200341016a41014b22036a220436020802400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00c802220341054b0d06024020030e06000503040206000b200241c8026a200110c102200241b0046a200241c8026a41dc001094041a20024190046a41026a2201200241a7036a2d00003a0000200220022f00a5033b01900420022d00a40322034102470d09200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200241b0046a41186a22054200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a2208280200200241b0046a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d05200241e8016a41186a22042005290300370300200241e8016a41106a22052006290300370300200241e8016a41086a22062007290300370300200220022903b0043703e801200241c8026a41186a22072004290300370300200241c8026a41106a22042005290300370300200241c8026a41086a22052006290300370300200220022903e8013703c802200241f0036a41186a2007290300370300200241f0036a41106a2004290300370300200241f0036a41086a2005290300370300200220022903c8023703f003200241003a00c80220012802002008280200200241c8026a410120091001210420032003280200200441016a41014b22046a22053602002004450d0920022d00c8022203450d1520034101470d09200241b0046a41186a22044200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a280200200241b0046a41202005100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d09200241e8016a41186a22012004290300370300200241e8016a41106a22032006290300370300200241e8016a41086a22042007290300370300200220022903b0043703e801200241c8026a41186a22052001290300370300200241c8026a41106a22012003290300370300200241c8026a41086a22032004290300370300200220022903e8013703c80220024190046a41186a200529030037030020024190046a41106a200129030037030020024190046a41086a2003290300370300200220022903c80237039004410121010c160b20024180016a200110c202200241c8026a41086a220320024189016a290000370300200241c8026a41106a220420024191016a290000370300200241c8026a41186a220520024199016a290000370300200241c8026a411f6a2206200241a0016a28000036000020022002290081013703c80220022d00800122074102470d05200041073a000020024190056a24000f0b200241e0006a2001104c2002290360a7450d08200241f0006a290300210a2002290368210b200241d0006a2001104b2002290350a7450d0b2002290358210c200241b0046a41186a22064200370300200241b0046a41106a22074200370300200241b0046a41086a22084200370300200242003703b00441002105200141086a220341002001280200200141046a280200200241b0046a41202003280200100122042004417f461b2204412020044120491b20032802006a36020002402004411f4d0d00200241e8016a41186a22032006290300370300200241e8016a41106a22042007290300370300200241e8016a41086a22052008290300370300200220022903b0043703e80120024180016a41186a200329030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903e80137038001410121050b200241c8026a41186a220320024180016a41186a290300370300200241c8026a41106a220420024180016a41106a290300370300200241c8026a41086a220620024180016a41086a29030037030020022002290380013703c8022005450d0c20024190046a41186a200329030037030020024190046a41106a200429030037030020024190046a41086a2006290300370300200220022903c80237039004200241c8006a2001104a2002280248450d1a200228024c2203417f4c0d1e2003450d18200310ac012204450d22200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d190c260b200241086a2001104b2002290308a7450d082002290310210a20022001104a2002280200450d0f20022802042203417f4c0d1d2003450d0d200310ac012204450d20200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d0e0c240b200241b0046a41186a22054200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a2208280200200241b0046a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d04200241e8016a41186a22042005290300370300200241e8016a41106a220d2006290300370300200241e8016a41086a220e2007290300370300200220022903b0043703e801200241c8026a41186a220f2004290300370300200241c8026a41106a2204200d290300370300200241c8026a41086a220d200e290300370300200220022903e8013703c802200241f0036a41186a200f290300370300200241f0036a41106a2004290300370300200241f0036a41086a200d290300370300200220022903c8023703f003200542003703002006420037030020074200370300200242003703b0042003410020012802002008280200200241b0046a41202009100122042004417f461b2204412020044120491b20032802006a22053602002004411f4d0d08200241e8016a41186a2203200241b0046a41186a290300370300200241e8016a41106a2204200241b0046a41106a290300370300200241e8016a41086a2206200241b0046a41086a290300370300200220022903b0043703e80120024190046a41186a200329030037030020024190046a41106a200429030037030020024190046a41086a2006290300370300200220022903e8013703900420024200370388012002420037038001200141086a220441002001280200200141046a28020020024180016a41102005100122032003417f461b2203411020034110491b20042802006a3602002003410f4d0d0f20024180016a41086a290300210c2002290380012110200241f8006a2001104a2002280278450d1b200228027c2211ad220a421b88a70d1c200a420586a72203417f4c0d1c2003450d1920031026220d0d1a20034101102a000b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200241b0046a411f6a2006280000360000200241b0046a41186a2005290300370300200241b0046a41106a2004290300370300200241b0046a41086a2003290300370300200220022903c8023703b004200241306a2001104c2002290330a7450d08200241306a41106a290300210a2002290338210b200241206a2001104b2002290320a7450d0d2002290328210c200241186a2001104a2002280218450d12200228021c2203417f4c0d192003450d10200310ac012204450d1e200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d110c1f0b200241e8016a200241b0046a41dc001094041a200241f0036a41026a220420012d00003a0000200220022f0190043b01f00320024187016a200241e8016a41dc001094041a200041013a0000200041016a20024180016a41e3001094041a200041e4006a20033a0000200041e5006a20022f01f0033b0000200041e7006a20042d00003a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d160b2003450d00200410230b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b410021010b200241b0036a41186a220320024190046a41186a290300370300200241b0036a41106a220420024190046a41106a290300370300200241b0036a41086a220520024190046a41086a29030037030020022002290390043703b003200241d0036a41186a2206200241f0036a41186a290300370300200241d0036a41106a2207200241f0036a41106a290300370300200241d0036a41086a2208200241f0036a41086a290300370300200220022903f0033703d003200041053a0000200041216a20013a0000200020022903d003370001200041096a2008290300370000200041116a2007290300370000200041196a2006290300370000200041226a20022903b0033700002000412a6a2005290300370000200041326a20042903003700002000413a6a2003290300370000200041e0006a2002419e016a290100370100200041da006a20024180016a41186a290100370100200041d2006a20024180016a41106a290100370100200041ca006a20024180016a41086a290100370100200041c2006a20022901800137010020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d0e0b2003450d00200410230b200041073a000020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d0d0b2003450d00200410230b200041073a000020024190056a24000f0b4101210d0b0240024002402011450d0020024180016a41186a210820024180016a41106a2109200141046a21124200210a410021074100210541002104201121130340200842003703002009420037030020024180016a41086a220e42003703002002420037038001200141086a220341002001280200201228020020024180016a41202003280200100122062006417f461b2206412020064120491b20032802006a3602002006411f4d0d03200441016a2103200241c8026a41186a22062008290300370300200241c8026a41106a220f2009290300370300200241c8026a41086a2214200e29030037030020022002290380013703c802024020042013470d002007200320032007491b2213ad420586220b422088a70d07200ba7220e4100480d0702402004450d00200d2005200e1027220d0d010c090b200e1026220d450d080b200d20056a220420022903c802370000200441186a2006290300370000200441106a200f290300370000200441086a2014290300370000200a4280808080107c210a200741026a2107200541206a21052003210420032011490d000c020b0b410021134200210a0b200d450d01200241d0036a41186a2201200241f0036a41186a290300370300200241d0036a41106a2203200241f0036a41106a290300370300200241d0036a41086a2204200241f0036a41086a290300370300200241b0036a41086a220520024190046a41086a290300370300200241b0036a41106a220620024190046a41106a290300370300200241b0036a41186a220720024190046a41186a290300370300200220022903f0033703d00320022002290390043703b003200041063a0000200020022903d003370001200041096a2004290300370000200041116a2003290300370000200041196a2001290300370000200041216a20022903b003370000200041296a2005290300370000200041316a2006290300370000200041396a2007290300370000200041c1006a20022f00ad033b0000200041c3006a200241af036a2d00003a0000200041d8006a200c370300200041d0006a2010370300200041c8006a200a2013ad84370000200041c4006a200d36000020024190056a24000f0b2013450d00200d10230b200041073a000020024190056a24000f0b101d000b101e000b200e4101102a000b20034101102a000b20034101102a000b20034101102a000b200241e8016a411f6a2201200241b0046a411f6a280000360000200241e8016a41186a2205200241b0046a41186a290300370300200241e8016a41106a2206200241b0046a41106a290300370300200241e8016a41086a2208200241b0046a41086a290300370300200220022903b0043703e801200041c0006a200a370300200041386a200b370300200041033a0000200041046a20073a0000200041c8006a200c3703002000412c6a2003ad220a422086200a84370200200041286a2004360200200020022f00f0033b0001200041036a200241f2036a2d00003a0000200041056a20022903e8013700002000410d6a2008290300370000200041156a20062903003700002000411d6a2005290300370000200041246a2001280000360000200041e0006a20024190046a41106a290300370300200041d8006a20024190046a41086a290300370300200041d0006a20022903900437030020024190056a24000f0b200020022f00c8023b0001200041023a0000200041106a200a370300200041046a2004360000200041036a200241c8026a41026a2d00003a0000200041086a2003ad220a422086200a84370000200041186a20024180016a41d0001094041a20024190056a24000f0b200241f0036a41186a220120024190046a41186a290300370300200241f0036a41106a220520024190046a41106a290300370300200241f0036a41086a220620024190046a41086a29030037030020022002290390043703f003200041386a200a370300200041306a200b370300200041043a0000200041c0006a200c370300200041286a2003ad220a422086200a84370000200041246a2004360000200020022903f003370001200041096a2006290300370000200041116a2005290300370000200041196a2001290300370000200041216a20022f00b0033b0000200041236a200241b2036a2d00003a0000200041c8006a20022903d003370300200041d0006a200241d0036a41086a290300370300200041d8006a200241d0036a41106a290300370300200041e0006a200241d0036a41186a29030037030020024190056a24000be10c05057f017e017f087e037f230041106b22022400200241003602082001410020012802002001280204200241086a41042001280208100122032003417f461b2203410420034104491b20012802086a2204360208024002400240024002400240024002400240024002400240024002400240200341034d0d002002280208210520024200370308200141086a220641002001280200200141046a280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d012002290308210720024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d022002290308210920024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d032002290308210a20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d042002290308210b20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d052002290308210c20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d062002290308210d20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d072002290308210e20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d082002290308210f20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d0920022903082110200141046a22082802002103200241003602082006410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0a200228020821112008280200210320024100360208200141086a2206410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0b20022802082112200141046a22082802002103200241003602082006410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0c20022802082113200241003a000820012802002008280200200241086a4101200410012104200141086a22032003280200200441016a41014b22046a22063602002004450d0d20022d00082108200141046a2802002104200241003602082003410020012802002004200241086a41042006100122012001417f461b2201410420014104491b20032802006a360200200141034d0d0e20022802082101200020083a005c2000200136025820002013360254200020123602502000201136024c20002005360248200020103703402000200f3703382000200e3703302000200d3703282000200c3703202000200b3703182000200a3703102000200937030820002007370300200020022f00053b005d200041df006a200241076a2d00003a0000200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000be10701067f230041f0006b22022400200241003a005020012802002001280204200241d0006a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002402003450d0020022d0050220341ef014d0d01200341847e6a220341034b0d00024002400240024020030e0400010203000b200141046a2802002103200241003b0150200141086a2205410020012802002003200241d0006a41022004100122012001417f461b2201410220014102491b20052802006a360200200141014d0d0320022f0150220341f0014f0d040c030b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d024101210120022802502203418080044f0d040c020b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a3602000c010b200241d0006a41186a4200370300200241d0006a41106a4200370300200241d0006a41086a42003703002002420037035041002105200141086a220341002001280200200141046a280200200241d0006a41202004100122012001417f461b2201412020014120491b20032802006a360200024002402001411f4d0d00200241ca006a20022d00523a0000200241286a41086a200241df006a290000370300200241286a41106a200241e7006a290000370300200241286a41186a200241d0006a411f6a2d00003a0000200220022f01503b01482002200229005737032820022800532103410121050c010b0b200241cc006a41026a2201200241c8006a41026a2d00003a0000200241d0006a41086a2204200241286a41086a290300370300200241d0006a41106a2206200241286a41106a290300370300200241d0006a41186a2207200241286a41186a2d00003a0000200220022f01483b014c200220022903283703502005450d00200241246a41026a20012d00003a0000200241086a41086a2004290300370300200241086a41106a2006290300370300200241086a41186a20072d00003a0000200220022f014c3b012420022002290350370308410021010c020b200041023a0000200241f0006a24000f0b410121010b200020022f01243b0001200020013a0000200041046a2003360200200041086a2002290308370200200041036a200241266a2d00003a0000200041106a200241086a41086a290300370200200041186a200241086a41106a290300370200200041206a200241086a41186a280200360200200241f0006a24000bca3303077f097e097f230041d0036b22022400200241003a00a803200241a8036a200128020022032001280204220441004722051094041a02400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d00a803220441054b0d06024020040e06000503040206000b200241003602880120024188016a20052006410420064104491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641034d0d072002280288012108200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d072002290388012109200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210a200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210b200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210c200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210d200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210e200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210f200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d072002290388012110200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d072002290388012111200241003602880120024188016a20052006410420064104491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641034d0d072002280288012112200241003602880120024188016a20052004410420044104491b22031094041a2007200420036b22063602002001200520036a2205360200200441034d0d072002280288012107200241003602880120024188016a20052006410420064104491b22031094041a200141046a200620036b22043602002001200520036a2205360200200641034d0d072002280288012113200241003a00880120024188016a2005200441004722061094041a20042006490d2e200141046a2214200420066b22033602002001200520066a22053602002004450d0720022d0088012106200241003602880120024188016a20052003410420034104491b22041094041a2014200320046b3602002001200520046a360200200341034d0d072002280288012101200241d8016a41026a220420024180026a41026a2d00003a0000200220022f0080023b01d801200041013a0000200041e4006a20063a0000200041e0006a2001360000200041dc006a2013360000200041d8006a2007360000200041d4006a2012360000200041d0006a2008360000200041c8006a2011370000200041c0006a2010370000200041386a200f370000200041306a200e370000200041286a200d370000200041206a200c370000200041186a200b370000200041106a200a370000200041086a2009370000200020022800a803360001200041046a200241a8036a41036a280000360000200041e7006a20042d00003a0000200041e5006a20022f01d8013b0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b20024180026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a200141046a200620046b22033602002001200520046a22043602002006411f4d0d06200241d8016a41186a220520024180026a41186a290000370300200241d8016a41106a220620024180026a41106a290000370300200241d8016a41086a220720024180026a41086a29000037030020022002290080023703d801200241a8036a41186a22082005290300370300200241a8036a41106a22052006290300370300200241a8036a41086a22062007290300370300200220022903d8013703a803200241e8026a41186a2008290300370300200241e8026a41106a2005290300370300200241e8026a41086a2006290300370300200220022903a8033703e802200241003a00a803200241a8036a2004200341004722051094041a20032005490d24200141046a200320056b22063602002001200420056a22043602002003450d0b20022d00a8032205450d1620054101470d0b20024180026a2006412020064120491b22056a41004100412020056b2005411f4b1b1093041a20024180026a200420051094041a200141046a200620056b3602002001200420056a3602002006411f4d0d0b200241d8016a41186a220120024180026a41186a290000370300200241d8016a41106a220420024180026a41106a290000370300200241d8016a41086a220520024180026a41086a29000037030020022002290080023703d801200241a8036a41186a22062001290300370300200241a8036a41106a22012004290300370300200241a8036a41086a22042005290300370300200220022903d8013703a80320024188036a41186a200629030037030020024188036a41106a200129030037030020024188036a41086a2004290300370300200220022903a80337038803410121010c170b20024188016a2001109502200241a8036a41086a220420024191016a290000370300200241a8036a41106a220520024199016a290000370300200241a8036a41186a2206200241a1016a290000370300200241a8036a411f6a2203200241a8016a28000036000020022002290089013703a80320022d00880122074102470d06200041073a0000200241d0036a24000f0b200241e8006a200110472002290368a7450d07200241f8006a29030021092002290370210a200241d8006a200110462002290358a7450d0b2002290360210b20024180026a41186a2207420037030020024180026a41106a2208420037030020024180026a41086a22124200370300200242003703800220024180026a20012802002206200141046a22032802002204412020044120491b22051094041a2003200420056b3602002001200620056a3602002004411f4d0d0c200241d8016a41186a22042007290300370300200241d8016a41106a22052008290300370300200241d8016a41086a2206201229030037030020022002290380023703d80120024188016a41186a200429030037030020024188016a41106a200529030037030020024188016a41086a2006290300370300200220022903d80137038801410121040c0d0b200241106a200110462002290310a7450d0720022903182109200241086a200110452002280208450d10200228020c2204417f4c0d1f2004450d0e200410ac012206450d2320062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d242003200720056b3602002001200128020020056a36020020052004470d0f0c2c0b20024180026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a200141046a2214200620046b22033602002001200520046a22053602002006411f4d0d04200241d8016a41186a220620024180026a41186a2215290000370300200241d8016a41106a220720024180026a41106a2216290000370300200241d8016a41086a220820024180026a41086a221729000037030020022002290080023703d801200241a8036a41186a22042006290300370300200241a8036a41106a22122007290300370300200241a8036a41086a22132008290300370300200220022903d8013703a803200241e8026a41186a2004290300370300200241e8026a41106a2012290300370300200241e8026a41086a2013290300370300200220022903a8033703e80220024180026a2003412020034120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a2014200320046b22123602002001200520046a22043602002003411f4d0d0820062015290000370300200720162900003703002008201729000037030020022002290080023703d80120024188036a41186a200629030037030020024188036a41106a200729030037030020024188036a41086a2008290300370300200220022903d801370388032002420037039001200242003703880120024188016a20042012411020124110491b22051094041a200141046a201220056b3602002001200420056a3602002012410f4d0d1020024190016a290300210b200229038801210c20024180016a20011045200228028001450d1c2002280284012218ad2209421b88a70d1e2009420586a72204417f4c0d1e2004450d1a2004102622160d1b20044101102a000b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b20024180026a411f6a200328000036000020024180026a41186a200629030037030020024180026a41106a200529030037030020024180026a41086a2004290300370300200220022903a80337038002200241386a200110472002290338a7450d08200241386a41106a29030021092002290340210a200241286a200110462002290328a7450d0d2002290330210b200241206a200110452002280220450d1220022802242204417f4c0d1a2004450d10200410ac012206450d2020062001280200200141046a22032802002205200420052004491b22051094041a200328020022082005490d212003200820056b3602002001200128020020056a36020020052004470d110c260b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b410021040b200241a8036a41186a220520024188016a41186a290300370300200241a8036a41106a220620024188016a41106a290300370300200241a8036a41086a220320024188016a41086a29030037030020022002290388013703a80302402004450d0020024188036a41186a200529030037030020024188036a41106a200629030037030020024188036a41086a2003290300370300200220022903a80337038803200241d0006a200110452002280250450d0e20022802542204417f4c0d132004450d0c200410ac012206450d1b20062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d1c2003200720056b3602002001200128020020056a36020020052004470d0d0c1e0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b4101210641002004460d1d0b2004450d00200610230b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b410021010b200241a8026a41186a220420024188036a41186a290300370300200241a8026a41106a220520024188036a41106a290300370300200241a8026a41086a220620024188036a41086a29030037030020022002290388033703a802200241c8026a41186a2203200241e8026a41186a290300370300200241c8026a41106a2207200241e8026a41106a290300370300200241c8026a41086a2208200241e8026a41086a290300370300200220022903e8023703c802200041053a0000200041216a20013a0000200020022903c802370001200041096a2008290300370000200041116a2007290300370000200041196a2003290300370000200041226a20022903a8023700002000412a6a2006290300370000200041326a20052903003700002000413a6a2004290300370000200041e0006a200241a6016a290100370100200041da006a20024188016a41186a290100370100200041d2006a20024188016a41106a290100370100200041ca006a20024188016a41086a290100370100200041c2006a200229018801370100200241d0036a24000f0b4101210641002004460d150b2004450d00200610230b200041073a0000200241d0036a24000f0b4101210641002004460d110b2004450d00200610230b200041073a0000200241d0036a24000f0b410121160b0240024002402018450d0020024188016a41186a211220024188016a41106a211420024188016a41086a2113200141046a210842002109410021074100210641002105201821190340201242003703002014420037030020134200370300200242003703880120024188016a2001280200221520082802002204412020044120491b22031094041a2008200420036b3602002001201520036a3602002004411f4d0d03200541016a2104200241a8036a41186a22032012290300370300200241a8036a41106a22152014290300370300200241a8036a41086a2217201329030037030020022002290388013703a803024020052019470d002007200420042007491b2219ad420586220a422088a70d08200aa7221a4100480d0802402005450d0020162006201a102722160d010c0b0b201a10262216450d0a0b201620066a220520022903a803370000200541186a2003290300370000200541106a2015290300370000200541086a201729030037000020094280808080107c2109200741026a2107200641206a21062004210520042018490d000c020b0b41002119420021090b2016450d01200241c8026a41186a2201200241e8026a41186a290300370300200241c8026a41106a2204200241e8026a41106a290300370300200241c8026a41086a2205200241e8026a41086a290300370300200241a8026a41086a220620024188036a41086a290300370300200241a8026a41106a220320024188036a41106a290300370300200241a8026a41186a220720024188036a41186a290300370300200220022903e8023703c80220022002290388033703a802200041063a0000200020022903c802370001200041096a2005290300370000200041116a2004290300370000200041196a2001290300370000200041216a20022903a802370000200041296a2006290300370000200041316a2003290300370000200041396a2007290300370000200041c1006a20022f00a5023b0000200041c3006a200241a7026a2d00003a0000200041d8006a200b370300200041d0006a200c370300200041c8006a20092019ad84370000200041c4006a2016360000200241d0036a24000f0b2019450d00201610230b200041073a0000200241d0036a24000f0b200520041048000b101d000b101e000b200520031048000b201a4101102a000b20044101102a000b200520071048000b20044101102a000b200520081048000b20044101102a000b200520071048000b200620041048000b200241e8026a41186a220120024188036a41186a290300370300200241e8026a41106a220520024188036a41106a290300370300200241e8026a41086a220320024188036a41086a29030037030020022002290388033703e802200041386a2009370300200041306a200a370300200041043a0000200041c0006a200b370300200041286a2004ad2209422086200984370000200041246a2006360000200020022903e802370001200041096a2003290300370000200041116a2005290300370000200041196a2001290300370000200041216a20022f00a8023b0000200041236a200241aa026a2d00003a0000200041c8006a20022903c802370300200041d0006a200241c8026a41086a290300370300200041d8006a200241c8026a41106a290300370300200041e0006a200241c8026a41186a290300370300200241d0036a24000f0b200241d8016a411f6a220120024180026a411f6a280000360000200241d8016a41186a220520024180026a41186a290300370300200241d8016a41106a220320024180026a41106a290300370300200241d8016a41086a220820024180026a41086a29030037030020022002290380023703d801200041c0006a2009370300200041386a200a370300200041033a0000200041046a20073a0000200041c8006a200b3703002000412c6a2004ad2209422086200984370200200041286a2006360200200020022f00e8023b0001200041036a200241ea026a2d00003a0000200041056a20022903d8013700002000410d6a2008290300370000200041156a20032903003700002000411d6a2005290300370000200041246a2001280000360000200041e0006a20024188036a41106a290300370300200041d8006a20024188036a41086a290300370300200041d0006a200229038803370300200241d0036a24000f0b200020022f00a8033b0001200041023a0000200041106a2009370300200041046a2006360000200041036a200241a8036a41026a2d00003a0000200041086a2004ad2209422086200984370000200041186a20024188016a41d0001094041a200241d0036a24000b8812010d7f230041a0016b22032400024002400240024002400240024002400240024002400240024002400240411410262204450d00200441106a41002800d28943360000200441086a41002900ca8943370000200441002900c2894337000020044114413410272204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341f8006a41186a22054200370300200341f8006a41106a22064200370300200341f8006a41086a220742003703002003420037037820044134200341f8006a1002200341d8006a41186a2005290300370300200341d8006a41106a2006290300370300200341d8006a41086a2007290300370300200320032903783703580240024002400240200341d8006a412041a886c500410041001001417f460d002003422037027c2003200341d8006a360278200341286a200341f8006a104a2003280228450d03200328022c2106200341206a200341f8006a104a2003280220450d0320032802242107200341186a200341f8006a104a2003280218450d03200328021c210841002109200341003a009f0120034180016a2205200528020022052003280278200328027c2003419f016a41012005100141016a41014b22056a3602002005450d03024020032d009f012205450d004101210920054101470d040b200341106a200341f8006a104a2003280210450d0320032802142205417f4c0d092005450d01200510ac01220a450d0620034180016a220b200b280200220b200541002003280278200328027c200a2005200b1001220b200b417f461b220b200b20054b1b220b6a360200200b2005470d020c070b200410234101210441d689c300210641112107410221090c070b4101210a2003280278200328027c4101410020034180016a28020010011a41002005460d050b2005450d00200a10230b41d4aac10041331021000b41144101102a000b41344101102a000b20054101102a000b200341d4006a41026a220b200341386a41026a2d00003a0000200320032f00383b0154200341f8006a41026a220c200b2d00003a0000200320032f01543b017820041023200341d8006a41026a200c2d00003a0000200320032f01783b0158410021040b200341346a41026a220b200341d8006a41026a2d00003a0000200320032f01583b013402402004450d002000200636020420004101360200200041086a2007360200200341a0016a24000f0b200341306a41026a200b2d00003a0000200320032f01343b01300240024002400240200228024820064d0d00411510262204450d05410021062004410d6a41002900f48943370000200441086a41002900ef8943370000200441002900e7894337000020044115413510272204450d06200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341f8006a41186a22074200370300200341f8006a41106a22094200370300200341f8006a41086a220b42003703002003420037037820044135200341f8006a1002200341d8006a41186a2007290300370300200341d8006a41106a2009290300370300200341d8006a41086a200b29030037030020032003290378370358200341d8006a412041a886c500410041001001417f460d012003422037027c2003200341d8006a360278200341086a200341f8006a104a2003280208450d08200328020c2207417f4c0d042007450d02200710ac012206450d0920034180016a220920092802002209200741002003280278200328027c200620072009100122092009417f461b2209200920074b1b22096a36020020092007460d030c070b200521042005210b200a21020c0c0b0c010b410121062003280278200328027c4101410020034180016a28020010011a41002007470d040b200410232007411a20061b210d200641fc89c30020061b210c024002400240024002402006450d00200341f8006a200c2007200210c502200341f8006a41086a2802002107200328027c210620032802784101470d042000200636020420004101360200200041086a2007360200200d450d01200c102320050d020c030b2000200c36020420004101360200200041086a200d3602000b2005450d010b200a10230b200341a0016a24000f0b200341d8006a41026a220e20034197016a2d00003a0000200320032f0095013b015820034194016a2d0000210920034190016a28020021042003418c016a280200210b20034188016a280200210220034184016a280200210802402005450d00200a10230b200341306a41026a200e2d00003a0000200320032f01583b01302004417f4c0d004101210a02402004450d0020041026220a450d09200a200220041094041a0b200341386a41146a2004360200200341386a41106a2004360200200320083602402003200736023c200320063602382003200a3602442003200941ff01714101463a0050411410262205450d06200541106a41002800d28943360000200541086a41002900ca8943370000200541002900c2894337000020054114413410272205450d07200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200341f8006a41186a22014200370300200341f8006a41106a220e4200370300200341f8006a41086a220f42003703002003420037037820054134200341f8006a1002200341d8006a41186a2001290300370300200341d8006a41106a200e290300370300200341d8006a41086a200f29030037030020032003290378370358200341d8006a200341386a10b1012005102302402004450d00200a10230b200d450d09200c10230c090b101d000b41154101102a000b41354101102a000b2007450d00200610230b41d4aac10041331021000b20074101102a000b41144101102a000b41344101102a000b20044101102a000b20002006360204200020032f01303b001d200041003602002000411c6a20093a0000200041186a2004360200200041146a200b360200200041106a20023602002000410c6a2008360200200041086a20073602002000411f6a200341326a2d00003a0000200341a0016a24000bc0dc0123227f037e017f017e107f017e067f017e027f017e037f017e017f017e087f017e017f017e027f017e047f017e177f017e017f017e6a7f017e1d7f017e147f017e067f027e0f7f230041e0056b22042400410021052004410036028802200420023602840220042001360280020240024002400240024002400240200241034b0d00200441013a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a20120042802a0022102200428029c0221062004280298022107410521080c010b20044188026a4104360200024002400240024020012800004180c2cdeb06470d002002417c714104470d01200441013a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a20120042802a0022102200428029c022106200428029802210741052108410021050c040b410121080c010b02400240024002400240024002400240024002400240200241074d0d0020044180026a41086a41083602000240024002400240200128000422074101470d00200441d0046a20044180026a10a00120042802d0044101470d014104210a4100210b4100210c20042d00d4040d020c050b410221080c0f0b200441d0046a410572210f4104210a200441d0046a412c6a2110200441f4046a2111200441f0046a2112200441ec046a2113200441e8046a2114200441e4046a2115200441e0046a2116200441dc046a2117200441d8046a211841002107412821054100210b4100210c410021090340200441a8036a41026a2219200f41026a2d00003a00002004200f2f00003b01a8032010280200211a200441f8046a280200211b2011280200211c2012280200211d2013280200211e2014280200211f20152802002120201628020021212017280200212220182802002106024020042d00d4042223417e6a220141ff0171410a4b0d0002400240024002400240024002400240024002400240024002400240024002402001410a4b22240d00024020010e0b00070405020809060b030a000b200941ff0171222541014d0d0c0c0b0b200941ff0171222541004b0d0a0c0b0b200941ff0171222541054d0d0a0c090b200941ff01712225410a4d0d090c080b200941ff0171222541034d0d080c070b200941ff0171222541044d0d070c060b200941ff0171222541084d0d060c050b200941ff0171222541024d0d050c040b200941ff0171222541064d0d040c030b200941ff0171222541074d0d030c020b200941ff01712225410b4d0d020c010b200941ff0171222541094d0d010b411321082023410d4b0d010c020b02400240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b20254101470d0e0c0b0b20254100460d0a0c0d0b20254105470d0c0c090b2025410a470d0b0c080b20254103470d0a0c070b20254104470d090c060b20254108470d080c050b20254102470d070c040b20254106470d060c030b20254107470d050c020b2025410b470d040c010b20254109470d030b411421082023410d4d0d010b02402022450d00200610230b0240201f450d00201e450d00201f10230b201b450d0d201c1023200b0d0e0c0f0b024002400240024002400240024002400240024002400240024002400240024020230e0e1b0405011b1b1b08031c070002061b0b2021450d1a4118218a012006202141186c6a218b014104218c014114218d014110218e01410c218f014109219001410821910141ffffffff03219201417021930120062194014100215d0c0a0b2021450d19202141286c21022006210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200241586a22020d000c1a0b0b2021450d18411c21950120062021411c6c6a219601410c219701410821980141142199014104219a014110219b014109219c0141ffffffff03219d014170219e012006219f014101215d0c090b2021450d17202141146c21022006210103400240200141046a280200450d00200128020010230b200141146a21012002416c6a22020d000c180b0b02402022450d00200610230b201f450d1720201023200b0d180c190b2021450d15202141047421022006210103400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000c160b0b200641ff017122014102460d0320014101460d022021450d1520221023200b0d160c170b2021450d13411c21a00120062021411c6c6a21a101410c21a201410821a301411421a401410421a501411021a601410921a70141ffffffff0321a801417021a901200621aa014102215d0c050b2021450d12410421ab01200620214104746a21ac01411021ad01410921ae01410821af0141ffffffff0321b001417021b101200621b2014103215d0c050b201f450d10201f410c6c2102202121010340024020012802002205450d00200141046a280200450d00200510230b2001410c6a2101200241746a22020d000c110b0b201f450d0f410421b3012021201f4104746a21b401411021b501410c21b601410821b701417421b801202121b9014106215d0c040b410821010c0b0b410821010c0a0b410821010c090b410821010c080b410821010c070b0240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b410121090c0b0b410021090c0a0b410521090c090b410a21090c080b410321090c070b410421090c060b410821090c050b410221090c040b410621090c030b410721090c020b410b21090c010b410921090b20044198026a41026a222420192d00003a0000200420042f01a8033b0198020240200b200c470d00200b41016a2201200b490d072007200120012007491b220cad422c7e2226422088a70d072026a722014100480d070240200b450d00200a200541586a20011027220a0d010c040b20011026220a450d030b200a20056a220141586a20233a00002001201a3602002001417c6a201b360200200141786a201c360200200141746a201d360200200141706a201e3602002001416c6a201f360200200141686a2020360200200141646a2021360200200141606a20223602002001415c6a20063602002001415b6a20242d00003a0000200141596a20042f0198023b0000200741026a21072005412c6a2105200b41016a210b200441d0046a20044180026a10a00120042802d0044101470d000b20042d00d404450d030b20042902d4042227a722084110762105200841087621092027422088a72107200441d0046a41106a2802002102200441dc046a2802002106200b0d090c0a0b20014104102a000b41082002108c01000b200b412c6c2101200a41606a21050240024003402001450d01200141546a2101200541206a21072005412c6a220d210520072d0000410b470d000b200d280200210e0c010b4100210e0b200b412c6c2101200a41586a21050240024003402001450d01200141546a2101200541286a21072005412c6a220d210520072d00004104470d000b200441b0016a200d10be03200e20042802b401460d010c0a0b200e4100470d090b024002400240024002400240024002400240024002400240024020044180026a41086a2802002002470d004280c2cdeb062128200441d4036a200b360200200441d0036a2201200c360200200441cc036a200a36020041002129200441003602c00320044280c2cdeb06428080808010843702c403200a2001290300222a422088a7220e412c6c6a2105200a2101034020052001460d0220012d000021022001412c6a2207210120024102470d000b200441a8016a200741586a10be034104212b20042802a8012102024020042802ac012223450d00202341047422014100480d0f20011026222b450d0b0b410021294100212402402023450d002023410474210741002124202b21010340200241086a2802002205417f4c0d052002410c6a2d0000210d2002280200212c024002402005450d0020051026220f0d010c080b4101210f0b200f202c2005109404212c2001410d6a2002410d6a2d00003a00002001410c6a200d3a0000200141086a2005360200200141046a20053602002001202c360200200141106a2101202441016a2124200241106a2102200741706a22070d000b0b202b450d01202321290c020b200441003a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a201200441db046a20044198026a41086a28020036000020042004290398023700d304200441cc036a200441d7046a290000370000200441053a00c403200441013602c003200420042900d0043700c5030240200b450d00200b412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b200441c0036a41047221010240200c450d00200a10230b4100450d190c1a0b4104212b410021240b200a200e412c6c6a2107200a210102400240024003404100210541a886c500210d20072001460d0120012d000021022001412c6a222c210120024103470d000b200441a0016a202c41586a10be034100210120042802a0012202450d012002210d4104211020042802a40122010d020c0b0b410021010b410421102001450d090b200141286c211e200d411c6a21014104211d410021054100211441042111410021074100211f410121124100210f410021194104211a41002102410021234100211c4100212c4101210d0340024002400240024002400240024002400240024002400240024002400240024002402001417c6a2d0000221b4101460d000240201b4102460d00201b4103470d022001417e6a22132d000021152001417d6a22162d000021172019200f470d04200f41016a221b200f490d1e200f4101742225201b201b2025491b221b201b6a2218201b490d1e20184100480d1e200f450d0b201220252018102722120d0c0c170b200441d0046a41086a221b200141086a280200360200200420012902003703d00420052014470d06200541016a22132005490d1d20054101742214201320132014491b2214ad420c7e2226422088a70d1d2026a722134100480d1d2005450d0520112005410c6c2013102722110d060c140b200441d0046a41086a221b200141086a280200360200200420012902003703d004201f2007470d01200741016a22132007490d1c20074101742215201320132015491b2215ad420c7e2226422088a70d1c2026a722134100480d1c2007450d06201d2007410c6c20131027221d0d070c140b2001280200211b20232002470d02200241016a22132002490d1b20024101742215201320132015491b2215ad4202862226422088a70d1b2026a722134100480d1b2002450d0a201a200241027420131027221a0d0b0c150b201f21130c060b200f211b2019210f0c070b202321130c090b201310262211450d0e0b20112005410c6c6a221320042903d004370200201341086a201b280200360200200541016a2105200141286a2101201e41586a221e0d0a0c140b20131026221d450d0d0b20072113201521070b201d2013410c6c6a221320042903d004370200201341086a201b280200360200201f41016a211f200141286a2101201e41586a221e0d070c110b201810262212450d0b0b2012200f4101746a220f20154101713a0001200f20173a000020132d0000210f20162d00002113202c201c470d04201c41016a222c201c490d11201c4101742216202c202c2016491b222c202c6a2215202c490d1120154100480d11201c450d03200d201620151027220d0d040c0c0b20131026221a450d0a0b20022113201521020b201a20134102746a201b360200202341016a2123200141286a2101201e41586a221e0d020c0c0b20151026220d450d080b201941016a2119200d201c4101746a2215200f4101713a0001201520133a0000201c41016a211c201b210f200141286a2101201e41586a221e0d000c0a0b0b101d000b20054101102a000b20134104102a000b20134104102a000b20184101102a000b20134104102a000b20154101102a000b20014104102a000b410121124104211d4100211441042111410021074100211f4100210f410021194104211a41002102410021234100211c4100212c4101210d0b200a200e412c6c6a211e200a21010240024002400240024002400240024002400240024002400340201e2001460d0120012d0000211b2001412c6a22132101201b2010470d000b20044198016a201341586a10be03200428029c01221b450d002004280298012101201b410274211b03402001280200211e024002400240024020232002470d00200241016a22102002490d1220024101742213201020102013491b2213ad4202862226422088a70d122026a722104100480d122002450d01201a200241027420101027221a0d020c070b20022113202321100c020b20101026221a450d050b20022110201321020b200141046a2101201a20104102746a201e360200202341016a2123201b417c6a221b0d000c020b0b200221130b200a200e412c6c6a211b200a2101024002400240024002400340201b2001460d0120012d000021022001412c6a221e210120024105470d000b20044190016a201e41586a10be03200428029401410c6c221b450d002004280290012101200441e4046a2115200441e0046a21160340200141086a21020240200141046a2802004101470d0020042002280200221e3602a80320012802002210201e4d0d0020044198026a410c6a41023602002015410236020020044198026a41086a20044180026a3602002004410236029c022004201036028002201620044198026a360200200442023702d4042004418cd6c4003602d0042004200441a8036a36029802200441c0036a200441d0046a10a20120042802c003222d0d040b20012902002126200441d0046a41086a221e2002280200360200200420263703d0040240024002400240201f2007470d00200741016a22022007490d1520074101742210200220022010491b2210ad420c7e2226422088a70d152026a722024100480d152007450d01201d2007410c6c20021027221d0d020c0b0b20072110201f21020c020b20021026221d450d090b20072102201021070b2001410c6a2101201d2002410c6c6a220220042903d004370200200241086a201e280200360200201f41016a211f201b41746a221b0d000c020b0b200721100b200a200e412c6c6a2107200a2101024002400240034020072001460d0120012d000021022001412c6a221b210120024106470d000b20044188016a201b41586a10be03200428028c012202450d0020042802880121012002410c6c211b200541017421072005410c6c21020340200441d0046a200110c00320042802d004222d0d0220012902002126200441d0046a41086a221e200141086a280200360200200420263703d004024020052014470d00200541016a22142005490d132007201420142007491b2214ad420c7e2226422088a70d132026a722154100480d1302402005450d00201120022015102722110d010c0b0b201510262211450d0a0b2001410c6a2101201120026a221520042903d004370200201541086a201e280200360200200741026a21072002410c6a2102200541016a2105201b41746a221b0d000b0b200a200e412c6c6a2107200a210102400240034020072001460d0120012d000021022001412c6a221b210120024107470d000b20044180016a201b41586a10be032004280284012202450d00200428028001220120024104746a2116200441d0046a41086a2117200441e4046a21180340200441d0046a2001200d201c10c10302400240024020042d00d0044101470d002017290300212720042802d404222d450d010c070b200420042d00d10422073a00a80320072001410c6a2d00002202460d0120044198026a410c6a41233602002018410236020020044198026a41086a200441a8036a3602002004412336029c02200420023a008002200441d0046a41106a20044198026a360200200442023702d404200441a0d7c4003602d004200420044180026a36029802200441c0036a200441d0046a10a20120042902c403212720042802c003222d0d060b2001410c6a2d000021070b2001410d6a2d0000211b0240024002402019200f470d00200f41016a2202200f490d16200f4101742215200220022015491b220220026a221e2002490d16201e4100480d16200f450d0120122015201e102722120d020c0e0b200f21022019210f0c010b201e10262212450d0c0b2012200f4101746a220f201b4101713a0001200f20073a0000201941016a21192002210f200141106a22012016470d000c020b0b200f21020b200441f8036a2023360200200441f4036a2013360200200441c0036a412c6a2024360200200441e8036a2029360200200441e0036a2019360200200441dc036a2002360200200441d4036a201f360200200441d0036a20103602002004201a3602f0032004202b3602e403200420123602d8032004201d3602cc03200420053602c803200420143602c403200420113602c003200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024104470d000b200441f8006a200741586a10be03200428027c210f0c010b4100210f0b2004200f3602cc01200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a220721012002410b470d000b2004200741606a28020022013602d001200f2001460d010c100b200441003602d001200f4100470d0f0b200f450d09200a200e412c6c6a2105200a2101034020052001460d0420012d000021022001412c6a2207210120024104470d000b200a200e412c6c6a210f200a21010340200f2001460d0520012d000021022001412c6a220521012002410b470d000b200441f0006a200741586a10be0320042802742201450d0a4102212e2004280270222f20014102746a2130200541606a2131200541586a213220044189056a21334100213441142135200441d0046a41146a2136410121374102213841102139200441d0046a41106a213a4201213b41908bc300213c4104213d4118213e412c213f200441c0036a412c6a2140200441e4036a214142ff01214241202143410821444228214520044188056a214620044184056a21474180800121484281808080102149200441f8046a214a4280808080808010214b410c214c200441d0046a410c6a214d4170214e20044180056a214f200441ec046a21504124215141032152412521534203215441a8cbc40021554220215641782157412621584202215941988bc300215a4198dac400215b4100215c4104215d0c0b0b20042902d404212720102107202c450d0c0c0b0b20102107202c0d0a0c0b0b20042902c4032127202c0d090c0a0b41a88ac300411e1021000b41c68ac30041c8001021000b20104104102a000b20024104102a000b20154104102a000b201e4101102a000b410021010c050b410021010c040b410821010c030b200d10230b02402014450d00201110230b02402007450d00201d10230b0240200f450d00201210230b02402024450d0020244104742102202b210103400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b02402029450d00202b10230b024002402013450d00201a1023202d0d050c010b410421010c020b410521010c010b200441a4026a4102360200200441e4046a41023602002004410236029c02200442023702d404200441988ac3003602d0042004200441d0016a3602a0022004200441cc016a36029802200420044198026a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d024020042802c4030d00410321010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0900010304050708090c0c0b200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024109470d000b2004200741586a28020022013602b801200441f8036a28020020014d0d012004200441f0036a28020020014102746a280200220136028002200441ec036a28020020014d0d03200441e4036a28020020014104746a22013502084200520d07200131000d4220864280808080f000834280808080c000520d070b200a200e412c6c6a2105200a2101034020052001460d5620012d000021022001412c6a2207210120024108470d000b200441e8006a200741586a220110be03200441d0046a200428026c10c6024110215f4114216020044198026a41106a2261200441d0046a41146a22622802003602004108216320044198026a41086a2264200441d0046a410c6a290200370300200420042902d40437039802200441e0006a200110be0320042802642201450d5420042802602265200141146c6a2166410421674105216841b9f3ddf1792169417c216a4103216b4101216c4102216d417e216e41ff01216f4119217041fffdfb772171417f217241808182847821734100217420044198026a410c6a217542202176410221774202217841b8d9c4002179200441e0036a217a200441d8036a217b200441f8036a217c200441f0036a217d200441ec036a217e4105215d0c220b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c590b200441e4046a410136020020042080013602ac0320042081013602a803200441013602bc01200442013702d404200441d88bc3003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d208801450d590c6b0b200441e4046a4101360200200441023602ac03200442023702d40420044198dac4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c570b20042802c0031023410321010c6a0b0240200441d0036a280200450d00200441cc036a28020010230b0240200441dc036a280200450d00200441d8036a28020010230b0240200441ec036a2802002202450d00200441e4036a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b0240200441e8036a280200450d00200441e4036a28020010230b0240200441f4036a280200450d00200441f0036a28020010230b202c450d13200d1023410421010c690b202d450d130c6a0b412d1026222d450d04202d41256a41002900cd8b43370000202d41206a41002900c88b43370000202d41186a41002900c08b43370000202d41106a41002900b88b43370000202d41086a41002900b08b43370000202d41002900a88b4337000042ad808080d005212720042802c4030d0a0c090b200a450d02202aa721c701200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024102470d000b200441386a200741586a10be0320042802382101200428023c21020c010b410021010b2002410020011b211e200141a886c50020011b211c200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024108470d000b200441306a200741586a10be0320042802302101200428023421020c010b410021010b2002410020011b215d200141a886c50020011b2107200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a220f210120024104470d000b200441286a200f41586a10be0320042802282101200428022c21020c010b410021010b2002410020011b211f200141a886c50020011b211b200a200e412c6c6a210f200a2101024002400240034041002102200f2001460d0120012d000021052001412c6a2223210120054103470d000b200441206a202341586a10be0320042802244100200428022022011b22050d010c020b410021014100410041001b2205450d010b200541286c2105200141a886c50020011b41186a2101410021020340200220012d0000456a2102200141286a2101200541586a22050d000b0b2007205d41146c6a215d4100211a4100211902400240024002400240024003402007205d460d012007280200210f4138210141e2bdc400210502400240200741086a28020022234106460d0020234104470d074101211a200f41a7c4c400460d01200f28000041e3c2b1e306460d010c070b41012119200f41e5c4c400460d00200f41e5c4c40041061096040d060b2007410c6a2802000d02200741106a280200220120026b220f20014b0d0341ebc4c400210541262101201f200f4d0d05201b200f4102746a220f450d054191c5c400210541202101201e200f280200220f4d0d05201c200f4104746a220f450d05411f210141d7bec4002105200f2802080d05200741146a2107200f2d000d4104460d000c050b0b201a201971410171450d02200a200e412c6c6a2105200a2101034020052001460d0520012d000021022001412c6a2207210120024106470d000b200441186a200741586a10be03200428021c450d04200041f6bec400360204411f21010c500b41132101419abec40021050c020b412a210141adbec40021050c010b411c411e201941017122081b210141abc4c40041c7c4c40020081b21050b200020053602040c4c0b200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024102470d000b200441106a200741586a10be0320042802102101200428021421020c010b410021010b2002410020011b21c801200141a886c50020011b21c901200a200e412c6c6a2105200a2101024002400340410021ca0120052001460d0120012d000021022001412c6a2207210120024103470d000b200441086a200741586a10be0320042802082101200428020c21020c010b410021010b412821cb01200141a886c50020011b22cc012002410020011b41286c6a21cd01410321ce0141cae2c40021cf01410121d001410221d101411c21d201410621d30141cbbfc40021d401410421d501200341dc006a21d601410b21d70141bed0c40021d80141e3cec40021d90141e00021da01410d21db014187cfc40021dc01417d21dd01411321de0141cde2c40021df0141b1cfc40021e001410721e10141bdcec40021e20142e5f0d1fbb5ac98b6ec0021e30141c5cec40021e401410a21e50141cfcec40021e60141d9cec40021e70141a7cfc40021e80141fbcec40021e901410c21ea0141eecec40021eb0141c9cfc40021ec01410e21ed0141d7cfc40021ee01419fcec40021ef01410f21f00141aecec40021f10141e5cfc40021f201411021f30141f5cfc40021f40141b8cfc40021f501411121f6014185d0c40021f70141acd0c40021f801411221f9014192cfc40021fa01411521fb014196d0c40021fc01411621fd01410021fe010c050b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c510b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d40420044198dac4003602d004200420044180026a3602a80320044198026a200441d0046a10a2010c500b4195bfc40041361021000b412d4101102a000b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240205d0e0a02030405000106080913130b2004205c3602d4012031280200210120322802002102203620373602002004203836028402203a20044180026a3602002004203b3702d4042004203c3602d0042004200441d4016a3602800220044198026a200441d0046a10a201200429029c022127200428029802212d2001205c4d0da70102402027a7450d00202d10230b2004202f280200220136028002024002400240024002400240204028020020014d0d002002205c203e6c6a2202280214221c450d0120412802002001203d746a22052d000d212320052802002119200228020c21012002280200211f2005280208221b210702402002280208221e450d00201e205274210f201b2102201f21050340200220052802006a22072002490d04200520446a210520072102200f20576a220f0d000b0b204410262202450d2a20022023ad20428320458637020020044180026a202e6a220520044198026a202e6a2d00003a0000200420042f0098023b018002204620233a000020472048360200200441d0046a203f6a220f2049370200204a2002360200200441d0046a20436a204b370300200441d0046a203e6a2223203b37030020362007360200203a201e360200204d201f360200200441d0046a20446a201b360200203320042f0180023b00002033202e6a20052d00003a0000200420193602d404201c203d7421052004200441c0036a3602d004410021020340200420023602e801200420013602ec01200441b8016a200441d0046a200110c403024020042802b801450d00200441a8036a20446a200441b8016a20446a280200360200200420042903b8013703a80320044198026a20356a205136020020044198026a204c6a203836020020044180026a20356a205236020020044198026a20396a200441a8036a36020020044198026a20446a200441e8016a3602002004205336029c0220044180026a20396a20044198026a360200200420543702840220042055360280022004200441ec016a36029802200441f0016a20044180026a10a201024020042802ac03450d0020042802a80310230b20042802f00122070d050b200120396a2101200220376a21022005204e6a22050d000b204f2802000d2b02402050280200450d00202328020010230b200f280200450d05204a2802001023205c20376a215c202f203d6a222f2030470d450c610b20362037360200200420383602ac03203a200441a8036a360200200420593702d4042004205b3602d004200420044180026a3602a80320044198026a200441d0046a10a201200429029c022226205688a721012026a7210220042802980222070d030c040b204310262207450d2b2007203e6a20342900a0cb44370000200720396a2034290098cb44370000200720446a2034290090cb4437000020072034290088cb44370000412021024120210120070d020c030b204310262207450d292007203e6a20342900e8dc44370000200720396a20342900e0dc44370000200720446a20342900d8dc44370000200720342900d0dc44370000412021024120210120070d010c020b20042902f401212602402050280200450d00202328020010230b2026205688215e0240200f280200450d00204a28020010230b205ea721012026a721020b200420073602800220042001ad2056862002ad8437028402200420044180026a3602a80320044198026a204c6a20583602002036202e36020020044198026a20446a200441a8036a3602002004203836029c02203a20044198026a360200200420593702d4042004205a3602d0042004200441d4016a36029802200441d8016a200441d0046a10a2010240200428028402450d0020042802800210230b20042802d801222d0d070b205c20376a215c202f203d6a222f2030470d3e410021010cba010b2065227f450d9f0141002102207f2802082280012101207f280200228101210502402080012067490d0041002102208101210120800121050340200128000020022068777320696c2102200120676a21012005206a6a2205206b4b0d000b208001206a6a22012001206a7122056b210120810120056a20676a21050b0240024002402001206c4d0d002005206d6a2107200220687720052f00007320696c21022001206e6a450d020c010b200521072001450d010b200220687720072d00007320696c21020b207f20606a21652002206877206f7320696c228201207076228301206374208301722201205f7420017221840120642802002185014100218601200428029802218701200428029c02218801208201218901410021010c8c010b0240209401208c016a280200450d0020940128020010230b0240209401208d016a2802002202450d0020940128020c21012002208c017421020340024020012d0000209001470d0020012091016a28020020920171450d002001208c016a28020010230b2001208e016a210120022093016a22020d000b0b209401208a016a21010240209401208e016a280200450d00209401208f016a28020010230b20012194012001208b01470d380cbc010b0240209f012097016a2802002202450d00209f0128020421012002209a017421020340024020012d0000209c01470d0020012098016a280200209d0171450d002001209a016a28020010230b2001209b016a21012002209e016a22020d000b0b0240209f012098016a280200450d00209f01209a016a28020010230b209f012095016a21010240209f012099016a280200450d00209f0128021010230b2001219f012001209601470d380cbb010b024020aa0120a2016a2802002202450d0020aa012802042101200220a5017421020340024020012d000020a701470d00200120a3016a28020020a80171450d00200120a5016a28020010230b200120a6016a2101200220a9016a22020d000b0b024020aa0120a3016a280200450d0020aa0120a5016a28020010230b20aa0120a0016a2101024020aa0120a4016a280200450d0020aa0128021010230b200121aa01200120a101470d380cba010b024020b2012802082202450d0020b2012802002101200220ab017421020340024020012d000020ae01470d00200120af016a28020020b00171450d00200120ab016a28020010230b200120ad016a2101200220b1016a22020d000b0b20b20120ad016a2101024020b20120ab016a280200450d0020b20128020010230b200121b201200120ac01470d380cb9010b20b901220720b5016a21b901024020072802042201450d000240200720b6016a2802002202450d00200220b6016c21020340024020012802002205450d00200120b3016a280200450d00200510230b200120b6016a2101200220b8016a22020d000b0b200720b7016a280200450d00200720b3016a28020010230b20b90120b401470d3a0cb7010b20042902dc01212720042802c4030d5c0c5b0b20bb01450d9a01200420bb0128020022013602800220bd0128020020014d0d01200441d0046a20bb0120be016a20c00128020020bf0128020010c10320042d00d00420c101460d0220042d00d1040d03200441c0006a20bb0110c503024020042802442201450d0020042802402102200120c20174210520c301280200210703402004200228020022013602b801200720014d0d60200420c401280200200120c201746a28020022013602800220c50128020020014d0d61200220be016a2102200520c6016a22050d000b0b20bb0120ba016a22bb0120bc01470d390c9a010b024020cc0120cd01460d00418ec1c4002102412d210120cc0128020820ce01470d0d024020cc01280200220520cf01460d00200520cf0120ce011096040d0e0b024020cc012d0018220120d001460d0020cc0120cb016a2105024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200120d101460d00200120ce01460d2641d1bfc40021024136210120c80120cc0128021c22074d0d3520c901200720d501746a220f450d3520cc01280214212320cc0128020c210720d6012d00000d01202320d701470d0141c2c0c400210241382101200720d801460d35200720d80120d701109604450d350c020b41bbc1c4002102412f210120cc0128021420d301470d34024020cc0128020c220720d401460d00200720d40120d3011096040d350b20fe010d2e20cc0120d2016a21fe01200521cc014108215d0ca7010b419cc0c400210241262101202320dd016a222320de014b0d3320230e14013333330c0e330d000b0a06050f070833330910010b200720d901460d0120d901200720d701109604450d01200720dc01460d0220dc01200720d701109604450d020240200720d801460d0020d801200720d7011096040d2b0b20d10110262223450d48202320ca013b0000200f2d000c20da01470d29200f28020820d101470d29200f280200215d410021010340200120d0014b0d04202320016a2102205d20016a2107200120d0016a210120072d000020022d0000460d000c2a0b0b200720df01460d31200720df0120ce01109604450d3120df01200720ce011096040d3120d0011026225d450d4a205d20ca013a0000200f2d000c20da01470d32200f28020820d001470d32200f280200211f41002102034020020d17205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c330b0b419cc0c400210241262101200f2d000c20da01470d30200f2802080d30200521cc01200f20db016a2d000020d501460d730c300b419cc0c400210241262101200f2d000c20da01470d2f200f2802080d2f200521cc01200f20db016a2d000020d501460d710c2f0b200f20db016a2d0000210120231023200521cc01200120d501460d6f0c260b200720ef01460d0b20ef01200720f001109604450d0b0240200720f101460d0020f101200720f0011096040d2e0b20d0011026221f450d4c201f20ca013a0000200f2d000c20da01470d36200f28020820d001470d36200f280200211b41002107034020070d18201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c370b0b200720ec01460d0b20ec01200720ed01109604450d0b0240200720ee01460d0020ee01200720ed011096040d2d0b20ce011026225d450d47205d20ca013a0002205d20ca013b0000200f2d000c20da01470d38200f28020820ce01470d38200f280200211f410021020340200220d1014b0d18205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c390b0b200720f501460d0b20f501200720f601109604450d0b0240200720f701460d0020f701200720f6011096040d2c0b20d5011026225d450d42205d20ca01360000200f2d000c20da01470d35200f28020820d501470d35200f280200211f410021020340200220ce014b0d18205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c360b0b0240200720f801460d0020f801200720f9011096040d2b0b419cc0c400210241262101200f2d000c20da01470d2a200f2802080d2a200521cc01200f20db016a2d000020d501460d570c2a0b0240200720fa01460d0020fa01200720fb011096040d2a0b419cc0c400210241262101200f2d000c20da01470d29200f2802080d29200521cc01200f20db016a2d000020d501460d5f0c290b0240200720eb01460d0020eb01200720db011096040d290b419cc0c400210241262101200f2d000c20da01470d28200f2802080d28200521cc01200f20db016a2d000020d501460d600c280b0240200720e901460d0020e901200720ea011096040d280b419cc0c400210241262101200f2d000c20da01470d27200f2802080d27200521cc01200f20db016a2d000020d501460d5e0c270b0240200720e001460d0020e001200720e1011096040d270b419cc0c400210241262101200f2d000c20da01470d26200f2802080d26200521cc01200f20db016a2d000020d501460d5b0c260b200720e401460d0620e401200720e501109604450d06200720e601460d0e20e601200720e501109604450d0e200720e701460d1420e701200720e501109604450d140240200720e801460d0020e801200720e5011096040d260b20d1011026225d450d41205d20ca013b0000200f2d000c20da01470d33200f28020820d101470d33200f280200211f410021020340200220d0014b0d16205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c340b0b0240200720e201460d00200729000020e301520d250b20e1011026221f450d42201f20ca01360003201f20d0013a0002201f20ca013b0000200f2d000c20da01470d22200f28020820e101470d22200f280200211b410021070340200720d3014b0d08201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c230b0b200720f201460d0520f201200720f301109604450d050240200720f401460d0020f401200720f3011096040d240b20ce011026225d450d37205d20ca013a0002205d20ca013b0000200f2d000c20da01470d2e200f28020820ce01470d2e200f280200211f410021020340200220d1014b0d11205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c2f0b0b0240200720fc01460d0020fc01200720fd011096040d230b20d1011026221f450d3c201f20ca013b0000200f2d000c20da01470d21200f28020820d101470d21200f280200211b410021070340200720d0014b0d07201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c220b0b20d5011026225d450d34205d20ca01360000200f2d000c20da01470d28200f28020820d501470d28200f280200211f410021020340200220ce014b0d08205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c290b0b419cc0c400210241262101200f2d000c20da01470d20200f2802080d20200f20db016a2d0000220720d501460d20200521cc01200720d5017220d501460d520c180b20d1011026225d450d3c205d20ca013b0000200f2d000c20da01470d27200f28020820d101470d27200f280200211f410021020340200220d0014b0d07205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c280b0b20e1011026221f450d36201f20ca01360003201f20d0013a0002201f20ca013b0000200f2d000c20da01470d24200f28020820e101470d24200f280200211b410021070340200720d3014b0d07201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c250b0b419cc0c400210241262101200f2d000c20da01470d1d200f2802080d1d200f20db016a2d0000220720d501460d1d200521cc01200720d5017220d501460d4d0c150b200f20db016a2d0000220720d501460d1a201f1023200521cc01200720d5017220d501460d590c1c0b200f20db016a2d00002101201f1023200521cc01200120d501460d490c130b200f20db016a2d00002101205d1023200521cc01200120d501460d5a0c120b200f20db016a2d00002101205d1023200521cc01200120d501460d580c110b200f20db016a2d00002101205d1023200521cc01200120d501460d4c0c100b200f20db016a2d0000220720d501460d1d201f1023200521cc01200720d5017220d501460d530c170b20d1011026225d450d2b205d20ca013b0000200f2d000c20da01470d23200f28020820d101470d23200f280200211f410021020340200220d0014b0d05205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c240b0b200f20db016a2d0000220720d501460d1e201f1023200521cc01200720d5017220d501460d530c150b200f20db016a2d00002101205d1023200521cc01200120d501460d450c0c0b200f20db016a2d00002101205d1023200521cc01200120d501460d460c0b0b200f20db016a2d00002101205d1023200521cc01200120d501460d410c0a0b200f20db016a2d00002101205d1023200521cc01200120d501460d4c0c090b419cc0c400210241262101200f2d000c20da01470d10200f2802080d10200521cc01200f20db016a2d000020d501460d4a0c100b200f20db016a2d00002101205d1023200521cc01200120d501460d480c070b4115210120004187c0c4003602040c98010b41142101200041fac0c4003602040c97010b024020fe01450d0020fe01280204450d0620fe0128020022ff0120fe0141086a2802002280024d0d0820004189c2c40036020441c90021010c97010b410021ff0141002180020c080b200441e4046a4101360200200441023602ac03200442023702d404200441e8d9c4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c9c010b200441d8046a290300212720042802d404212d20042802c4030d560c550b41201026222d450d2d202d41186a41002900908c43370000202d41106a41002900888c43370000202d41086a41002900808c43370000202d41002900f88b4337000042a08080808004212720042802c4030d530c520b202310230b412621012000419cc0c4003602040c91010b20004193c3c400360204413221010c90010b411f2101200041eac1c4003602040c8f010b20800220032802544d0d00200041d2c2c40036020441c10021010c8e010b200441d0046a41086a22024200370300200441f098c4003602d40420042003290308228102a7417f208102428080808010541b3602e00420042003290310228102a7417f208102428080808010541b3602d004200441d0046a4104722201410d10c6032001410c10c6032001410710c6032001410f10c603200441c8016a20042802e004360200200441b8016a41086a2002290300370300200420042903d0043703b801200a450d23200441d0046a410c6a202a3702002004200a3602d80420042028428080808010843703d00420044198026a200441d0046a10c703410110262201450d24200141003a0000200420042f01d0043b01c003200441e0046a41e0083b0100200441d8046a428180808010370300200420013602d404200441013602d004200420042f01c0033b01e20420044198026a200441d0046a10c8032123410310262202450d25200241026a41002d00cce2443a0000200241002f00cae2443b0000410310262205450d26200541026a41002d00cfe2443a0000200541002f00cde2443b0000200441c0036a41026a228202200441d0046a41026a2283022d00003a0000200420042f00d0043b01c003200441ac026a220f280200210720044198026a41106a28020021012083022082022d00003a0000200420042f01c0033b01d00420072001470d07200141016a22072001490da901200141017422820220072007208202491b228202ad42287e228102422088a70da901208102a722074100480da9012001450d05200441a4026a280200200141286c200710272201450d080c060b2084022d0000208b026a2201208c024b0d7b024002400240024020010e0400030102000b20840228020c2201450d7e2001208d026c2102208402280204208e026a2101034002402001208f026a2802000d0020012802002205208202490d00200120052083026a3602000b2001208d026a210120022090026a22020d000c7f0b0b20840228020c2201450d7d20840228020422a40220012091026c6a21a502410121010c7c0b20840228020c2201450d7c20840228020422a60220012093026c6a21a7020c7a0b2084022802042201208202490d7b2084022088026a20012083026a3602002084022086026a228402208702470d470c7c0b201f10232000419cc0c4003602040c8b010b201f10230b200020023602040c89010b205d10232000419cc0c4003602040c88010b200710262201450d020b200441a8026a208202360200200441a4026a2001360200200441ac026a28020021070b200441a4026a280200200741286c6a220141003a00182001200536020c200142838080803037020420012002360200200141106a4283808080303702002001411b6a200441d2046a2d00003a0000200141196a20042f01d0043b00002001411c6a2023360200200f200f28020041016a360200200441d0046a20044198026a418c011094041a200441a8036a200441d0046a10c903200441a8036a41106a2802002223412c6c210120042802b00322840241586a210202400340410021052001450d01200141546a2101200241286a21072002412c6a220f210220072d00004103470d000b200f41086a2802002201450d00200141286c2102200f28020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b2023412c6c210120840241586a21022005417f6a21820202400340410021052001450d01200141546a2101200241286a21072002412c6a220f210220072d00004103470d000b200f41086a2802002201450d00200141286c2102200f28020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b2023412c6c210120840241606a21020240024003402001450d01200141546a2101200241206a21072002412c6a220f210220072d00004104470d000b200f280200210120230d010c780b410021012023450d770b200120056a218502412c2186022084022023412c6c6a2187024104218802200441b8016a4104722189024100218a024178218b024103218c024114218d024110218e02417c218f024101218302416c219002411c21910241022192024118219302410c2194024108219502428080808010219602412d2197024220218102417f219802410b2199024170219a02417e219b0241ec00219c024203219d024202219e0241ff01219f02410521a002410621a102410021a202410021a3024109215d0c700b20074104102a000b201f10232000419cc0c4003602040c83010b205d10232000419cc0c4003602040c82010b205d10232000419cc0c4003602040c81010b201f10232000419cc0c4003602040c80010b205d10232000419cc0c4003602040c7f0b205d10232000419cc0c4003602040c7e0b205d10232000419cc0c4003602040c7d0b205d10232000419cc0c4003602040c7c0b205d10232000419cc0c4003602040c7b0b41084104102a000b41c0cbc400104f000b41204101102a000b41204101102a000b41044101102a000b41034101102a000b41024101102a000b41024101102a000b41044101102a000b41074101102a000b41014101102a000b41024101102a000b41034101102a000b41024101102a000b41024101102a000b41074101102a000b41014101102a000b4195bfc40041361021000b41014101102a000b41034101102a000b41034101102a000b41204101102a000b4100215d0c2d0b4101215d0c2d0b4102215d0c2d0b4103215d0c2d0b4104215d0c2d0b4104215d0c2d0b4106215d0c2e0b4107215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2f0b4109215d0c300b410021010c5e0b410321010c5d0b410221010c5c0b410321010c5b0b410221010c5a0b410321010c590b410221010c580b410321010c570b410221010c560b410421010c550b410521010c540b410621010c530b410721010c520b410821010c510b410821010c500b410821010c4f0b410821010c4e0b410821010c4d0b410821010c4c0b410821010c4b0b410821010c4a0b410821010c490b410821010c480b410821010c470b410821010c460b410821010c450b410821010c440b410821010c430b410821010c420b410821010c410b410821010c400b410821010c3f0b410821010c3e0b410821010c3d0b410821010c3c0b410821010c3b0b410821010c3a0b410821010c390b410821010c380b410821010c370b410821010c360b410821010c350b410821010c340b410821010c330b410821010c320b410821010c310b410821010c300b410821010c2f0b410821010c2e0b410221010b034002400240024002400240024002400240024002400240024002400240024020010e03000102020b02402087012089012088017122016a2800002205208401732202207273200220716a712073712202450d0003400240208001208501200268206b7620016a20880171206b746a220720676a280200470d0020810120072802002207460d082081012007208001109604450d070b200220726a20027122020d000b0b20860120676a22860120016a21890120052005206c7471207371450d03024020612802000d0020044198026a10c702200428029802218701200428029c022188010b410021010340200120676a22012082012088017122026a21820120870120026a2800002073712205450d000b0240208701200568206b7620026a2088017122016a2c000022022074480d0020870120870128020020737168206b7622016a2d000021020b20870120016a2083013a00002087012001206a6a208801716a20676a2083013a0000206120612802002002206c716b36020020752075280200206c6a36020020642802002001206b746a208001ad207686208101ad8437020002400240024002400240024002400240207f28020c2201206c460d0002402001206d460d002001206b470d022004207f28021022013602f001207a28020020014d0d06207b2802002001206c746a2d0001450d030c070b2004207f28021022013602b801200441c0036a20636a28020020014b0d022062206c360200200420773602ac03200441d0046a205f6a200441a8036a360200200420783702d404200420793602d0042004200441b8016a3602a80320044180026a200441d0046a10a201200428028002222d450d020c110b2004207f28021022013602b801200441c0036a20606a28020020014b0d010c030b2004207f28021022013602f001207c28020020014d0d012004207d2802002001206d746a28020022013602b801207e28020020014d0d050b20652066470d0b0c260b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3e0c2c0b200441e4046a4101360200200441023602ac03200442023702d404200441e8d9c4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3d0c2b0b200441e4046a4101360200200441023602ac03200442023702d404200441b8dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3c0c2a0b200441e4046a4101360200200441023602ac03200442023702d404200441d8dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3b0c290b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d40420044198dac4003602d0042004200441b8016a3602a80320044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3a0c280b20a40222012091026a21a402024020012802182202450d002001280210210120022092027421020340024020012802002205208202490d00200120052083026a3602000b20012088026a21012002208f026a22020d000b0b20a40220a502470d010c0e0b20a3022111024020a602280214208802742202450d0020a60228020c21010340024020012d0000209902470d0020012088026a22052802002207208202490d00200520072083026a3602000b2001208e026a21012002209a026a22020d000b0b20950210262201450d0620012096023702002088021026221c450d0520a6022094026a2105201c208a0236020020a602208d026a22102802002224450d0841002102410121234101210f4101211b41012107024002400240024041002024221f4f0d000240034020022083026a211f0240024002400240024002400240024020052802002002208802746a2d00002202209b026a208c024f0d00200210ca0321a802200441b8016a2095026a28020021a90220890221aa020c010b0240024002400240024002400240200220a002460d00200220a102470d012007450d0f20072098026a21070c0a0b2007450d0e2023200f470d0120232083026a22022023490d4d202320830274221e20022002201e491b221ead209d0286222620810288a70d4d2026a72202208a02480d4d2023450d0220012023208c02742002102722010d030c040b200210ca0321ab02200441b8016a2095026a28020021ac0220890221ad020c060b2023211e0c010b200210262201450d010b2001200f208c02746a22022083023602042002201f360200024002400240201b20072098026a2223470d00201b208302742202200720072002491b2219ad209e0286222620810288a70d4c2026a72202208a02480d4c201b450d01201c201b2092027420021027221c0d020c040b201b21190c010b20021026221c450d020b200f2083026a2102201c2023209202746a200f360200201f20244f0d180c080b20024104102a000b20024104102a000b410021020c010b410121020b0240024003400240024020020e020001010b20aa0228020022192095026a21a30220192f0106211e410021020240024002400340201e2002460d01208a0220980220830220a30220026a2d0000221a20a802209f0271221d4b1b201a201d461b221a450d0220022083026a2102201a208302460d000b20022098026a211e0b024020a902450d0020a9022098026a21a9022019201e209202746a209c026a21aa02410021020c040b200441b8016a211e20072098026a22022007490d010c0b0b200441b8016a211e024020192002208c02746a208d026a2202450d0020022802002219208302460d0b2019209202470d0020022088026a211e0b20072098026a220220074f0d0a0b200220074b0d09200f201c2002209202746a28020022024d0d0920012002208c02746a22192802042202201e2802006a221e2002490d0920192088026a201e36020002402023200f470d0020232083026a22022023490d49202320830274221e20022002201e491b221ead209d0286222620810288a70d492026a72202208a02480d492023450d0620012023208c02742002102722010d070c0c0b2023211e0c060b20ad0228020022192095026a21a30220192f0106211e4100210202400340201e2002460d01208a0220980220830220a30220026a2d0000221a20ab02209f0271221d4b1b201a201d461b221a450d0320022083026a2102201a208302460d000b20022098026a211e0b024020ac02450d0020ac022098026a21ac022019201e209202746a209c026a21ad02410121020c010b0b200441b8016a211e20072098026a22022007490d010c070b200441b8016a211e024020192002208c02746a208d026a2202450d0020022802002219208302460d072019209202470d0020022088026a211e0b20072098026a220220074f0d060b200220074b0d05200f201c2002209202746a28020022024d0d0520012002208c02746a22192802042202201e2802006a221e2002490d0520192088026a201e3602000b2023211e200f2102201b2119201f2024490d020c120b200210262201450d050b2001200f208c02746a22022083023602042002201f360200024002400240201b2007470d00201b2083026a2202201b490d44201b208302742223200220022023491b2219ad209e0286222620810288a70d442026a72202208a02480d44201b450d01201c201b2092027420021027221c0d020c080b201b21190c010b20021026221c450d060b200f2083026a2102201c2007209202746a200f36020020072083026a2107201f20244f0d100b201e21232002210f2019211b201f22022010280200221f490d000c020b0b02402023450d00200110230b410121a2020240201b450d00201c1023201121a3022084022086026a228402208702470d040c130b201121a3020c110b41d0e2c4002002201f1029000b20024104102a000b20024104102a000b4109215d410821010c390b410121010c0b0b410021010c0a0b410121010c360b410121010c350b4105215d410821010c340b41044104102a000b41084104102a000b20042902840221272088010d300c1e0b20012095026a210f410121194101211e0c010b2002450d0120012002208c02746a210f0b200121234101210203402001290200212620042097023a00d00420042026208102883e02d404200520022026a76a22072098026a200441d0046a10cb0320042099023a00d00420042082023602d40420052007200441d0046a10cb0320022092026a2102200f20012095026a2201470d000b202321010b0240201e450d00200110230b02402019450d00201c10230b20a6022093026a21a60202400240200441b8016a208e026a280200450d0020102802002202450d00200528020021012002208802742102410021050340024020012d0000208602470d0020012099023a000020012088026a20850236020020052083026a21050b2001208e026a21012002209a026a22020d000b410121a30220050d010b201121a3020b20a60220a702460d01410221010c000b0b2084022086026a228402208702470d0d0b024020a202410171450d0020042802b0032109200441b4036a2902002227a7210202402027422088a72201450d002001412c6c21082009210103402001109f012001412c6a2101200841546a22080d000b0b02402002450d00200910230b20042802bc01200441c0016a280200200441c4016a28020010d301200041c5c3c400360204411a21010c030b024020a302410171450d00200441d0046a41106a200441a8036a41106a280200360200200441d0046a41086a200441a8036a41086a290300370300200420042903a8033703d004200441c0036a200441d0046a10c703411010262208450d08200841063a0000410110262201450d09200141003a0000410110262202450d0a200220012d00003a000020011023411010262209450d0b200941063a000041f00010262201450d0c200141063a00602001412c3b015020012082023602442001410b3a0040200141d8003a00302001412d3a0020200141003602142001410f3a0010200141003602042001410f3a00002001200441c8016a280200360224024020092d00004109470d00200928020841ffffffff0371450d00200928020410230b20091023024020082d00004109470d00200828020841ffffffff0371450d00200828020410230b20081023200441f4046a4287808080f000370200200441f0046a2001360200200441ec046a4100360200200441d0046a410c6a4281808080800c370200200441d8046a4101360200200441003602fc04200442043702e404200420023602d404200441013602d004200441c0036a200441d0046a10cc03200441d0046a200441c0036a418c011094041a20044180026a200441d0046a10c90320044180026a410c6a2902002127200428028802218402200428028402210120042802800221080c020b20042802b0032184020b200441b4036a290200212720042802ac03210120042802a80321080b20042802bc01200441c0016a280200200441b8016a410c6a28020010d301208402450d02200441c0036a410c6a202737020020042084023602c80320042001ad4220862008ad843703c003200441d0046a200441c0036a200328025010cd0320042802d0044101470d010240200441d8046a280200450d0020042802d40410230b200041dfc3c400360204412321010b20004101360200200041086a2001360200200441e0056a24000f0b200441dc046a280200222c450d01200441e0046a2903002127200441d8046a280200210220042802d40421092003280248212320044100360288022004420137038002410410262201450d02200441043602840220044188026a22082008280200220541046a3602002004200136028002200120056a20093600000240024002402004280284022209200828020022016b41044f0d00200141046a22082001490d2a20094101742201200820082001491b22014100480d2a2009450d012004280280022009200110272208450d020c0c0b20042802800221080c0c0b2001102622080d0a0b20014101102a000b4195bfc40041361021000b4195bfc40041361021000b41044101102a000b41104108102a000b41014101102a000b41014101102a000b41104108102a000b41f0004108102a000b4109215d410821010c1d0b2004200136028402200420083602800220044188026a28020021010b20044180026a41086a200141046a360200200820016a2002360000202c2027422088a72201412c6c22086a21022027a7210f024002400240024002402001450d00200841546a2122200441d0046a4101722108200441d0046a41276a2105200441d0046a41206a210b200441d0046a41186a2107200441d0046a41106a2106200441d0046a41086a2121202c2101034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703d0042009410f460d02200441c0036a41276a22202005280000360000200441c0036a41206a220a200b290300370300200441c0036a41186a222d2007290300370300200441c0036a41106a220d2006290300370300200441c0036a41086a220e2021290300370300200420042903d0043703c003200820042903c003370000200841086a200e290300370000200841106a200d290300370000200841186a202d290300370000200841206a200a290300370000200841276a2020280000360000200420093a00d00420044198026a200441d0046a20044180026a109a0120042d0098022209411a470d05202241546a21222001412c6a22012002470d000b200222012002470d020c030b202c22012002470d010c020b2001412c6a22012002460d010b200441d0046a4101722108200441d0046a41276a2105200441d0046a41206a210b200441d0046a41186a2107200441d0046a41106a2106200441d0046a41086a2121034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703d0042009410f460d01200441c0036a41276a22222005280000360000200441c0036a41206a2220200b290300370300200441c0036a41186a220a2007290300370300200441c0036a41106a222d2006290300370300200441c0036a41086a220d2021290300370300200420042903d0043703c003200820042903c003370000200841086a200d290300370000200841106a202d290300370000200841186a200a290300370000200841206a2020290300370000200841276a2022280000360000200420093a00d004200441d0046a109f012001412c6a22012002470d000b0b0240200f450d00202c10230b20044180026a41086a280200210120042903800221272000411c6a41003a0000200041186a2001360200200041106a20273702002000410c6a208002360200200041086a20ff0136020020002023360204200041003602002000411d6a20042f00a8033b00002000411f6a200441aa036a2d00003a0000200441e0056a24000f0b20044198026a41086a2802002123200428029c0221820202402022450d002001412c6a2101200441d0046a4101722108200441d0046a41276a210b200441d0046a41206a2107200441d0046a41186a2106200441d0046a41106a2121200441d0046a41086a2122034020012d00002105200b200141286a2800003600002007200141216a2900003703002006200141196a2900003703002021200141116a2900003703002022200141096a2900003703002004200141016a2900003703d0042005410f460d01200441c0036a41276a2220200b280000360000200441c0036a41206a220a2007290300370300200441c0036a41186a222d2006290300370300200441c0036a41106a220d2021290300370300200441c0036a41086a220e2022290300370300200420042903d0043703c003200820042903c003370000200841086a200e290300370000200841106a200d290300370000200841186a202d290300370000200841206a200a290300370000200841276a2020280000360000200420053a00d004200441d0046a109f012001412c6a22012002470d000b0b0240200f450d00202c10230b0240200428028402450d0020042802800210230b024020094105470d002023450d0020820210230b20004182c4c40036020420004101360200200041086a4125360200200441e0056a24000f0b20004101360200200041086a2001360200200a450d2a0240200e450d00200e412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b20c701450d2a200a1023200441e0056a24000f0b200428029c02450d0020042802980210230b200a200e412c6c6a2105200a21010240034020052001460d0120012d000021022001412c6a2207210120024103470d000b200441d8006a200741586a10be03200428025c2201450d0020042802582107200141286c210f41002101200441a4026a211f200441e4046a211b200441a0026a211e200441e0046a211c200441ec036a21230340024002400240200720016a220241186a2d000022054101460d00024020054102460d0020054103470d022002411a6a2d0000450d030c090b200441d0046a2002411c6a10c00320042802d004222d450d020c060b200241206a2802004101470d012002411c6a28020021052004200241246a28020022023602b801200520024d0d01201f4102360200201b4102360200201e200441a8036a3602002004410236029c02200420053602a803201c20044198026a360200200442023702d4042004418cd6c4003602d0042004200441b8016a3602980220044180026a200441d0046a10a201200428028002222d450d010c0c0b20042002411c6a280200220236028002202328020020024d0d050b200f200141286a2201470d000b0b0240200441c0036a41146a28020022014102490d00200441d0046a41146a41013602002004410236028402200420013602a803200442013702d404200441e88bc3003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a10a2010c050b0240200441c8036a280200220141014d0d00200441e4046a41013602002004410236028402200420013602a803200442013702d404200441f08bc3003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a10a2010c050b200a200e412c6c6a2105200a21010240034020052001460d0120012d000021022001412c6a220721012002410c470d000b200441d0006a200741586a10be03200428025022012004280254411c6c6a2105200441c8036a2107200441e0036a210f200441c0036a41186a2123200441e4046a211f200441e0046a211b034020012005460d01200420012802002202360280020240200728020020024b0d00201f4101360200200441023602ac03201b200441a8036a360200200442023702d404200441b8d9c4003602d004200420044180026a3602a80320044198026a200441d0046a10a201200428029802222d0d0a0b200441d0046a200141046a22012023280200200f28020010c10320042d00d0044101460d08200141186a210120042d00d104450d000b41201026222d450d0a202d41186a41002900908c43370000202d41106a41002900888c43370000202d41086a41002900808c43370000202d41002900f88b4337000042a08080808004212720042802c4030d0f0c0e0b200a200e412c6c6a2105200a2101034020052001460d0120012d000021022001412c6a220721012002410a470d000b200441c8006a200741586a10be03200428024c2201450d00411c21ba01200428024822bb012001411c6c6a21bc01200441d4036a21bd01410421be01200441e0036a21bf01200441d8036a21c001410121c101410221c201200441f8036a21c301200441f0036a21c401200441ec036a21c501417c21c6014107215d0c160b024020042802c403450d0020042802c00310230b0240200441d0036a280200450d00200441cc036a28020010230b0240200441dc036a280200450d00200441d8036a28020010230b0240200441ec036a2802002202450d00200441e4036a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b0240200441e8036a280200450d00200441e4036a28020010230b0240200441f4036a280200450d00200441f0036a28020010230b202c450d14200d1023410521010c170b20042902d404212720042802c4030d0a0c090b200441e4046a4101360200200441023602ac03200442023702d40420044198dac4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c010b2002410c6a2802002101200241146a2802002102200441d0046a41146a410136020020042002360284022004200136028002200441013602ac03200442013702d404200441e08bc3003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010b200429029c022127200428029802212d0b20042802c403450d04410221010c120b200441d8046a290300212720042802d404212d20042802c4030d090c080b200429029c02212720042802c4030d0c0c0b0b200429028402212720042802c4030d090c080b41204101102a000b410321010c0d0b410321010c0c0b410221010c0b0b410321010c0a0b410221010c090b410321010c080b410221010c070b410321010c060b410221010c050b410321010c040b410221010c030b410521010c020b410821010c010b2087011023024020042802c4030d00410321010c010b410221010c000b0b101e000b02402027a7450d00202d10230b0240200e450d00200e412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b41b9bdc400210141132108202aa7450d0c200a10230c0c0b2020450d0120211023200b0d020c030b2022450d00200610230b200b450d010b200b412c6c210b200a210103402001109f012001412c6a2101200b41546a220b0d000b0b200c450d04200a10230c040b0240200b450d00200b412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b41192108200c450d00200a10230b0b0c010b410021090b200441d0036a2002360200200441cc036a2006360200200441013602c00320042007ad4220862005ad42ffff03834210862009ad42ff0183420886842008ad42ff018384843702c403200441c0036a4104722101200841ff01714105470d010b2001280208450d002001280204102320042802c0030d0041002108200441cc036a2802002209210103402001109f012001412c6a2101200841546a22080d000b200441d0036a280200450d00200910230b41ccbdc4002101411621080b2000200136020420004101360200200041086a20083602000b200441e0056a24000bed0202017e067f024002400240024002400240024002402001450d00200141074b0d01200141016a21010c020b200041086a4280808080c000370200200041046a41a48ec300360200410021010c030b2001ad4203862202422088a70d052002a7220341076e210142808080801021022003410e490d010b417f2001417f6a677641016aad42208621020b2002423d88a70d012002422088a7220141076a417c712203200141046a2204490d0120032002421d88a76a22052003490d012005417d4f0d01200510262206450d022001417f6a220541084921072002422388a741076c2108200641ff012004109304220420036a21030240200141034b0d00200420016a418001410420016b1093041a0b2005200820071b21012000410c6a2003360200200041086a2005360200200041046a20043602000b200041003a0000200041146a2001360200200041106a41003602000f0b41948dc300104f000b20054104102a000b41948dc300104f000be00e03397f017e027f230041206b220124000240024002400240024002400240200028020c220241016a22032002490d00200041046a28020022022104024020024108490d00200241016a41037641076c21040b0240200320044101764f0d00200241016a210541002106410421074103210841fffefdfb0721094107210a417f210b4181828408210c41004101710d020c030b200141086a200310c60220012d00084101460d062001411c6a280200210d200141086a410c6a280200210e200141106a280200210f200128020c2110417f21114180818284782112410421134101211420002802002215200041046a2802006a41016a21162000410c6a28020021172000280208211841202119417c211a4138211b4105211c41b9f3ddf179211d4103211e4102211f417e212041ff01212141002122411921232015280200417f734180818284787122240d040c030b41948dc300104f000b410121020c030b410021020c020b410321020c010b410421020b0240024002400340024002400240024002400240024002400240024002400240024020020e050100090304040b200620086a220220064922030d04200220054f0d042005200620076a20031b200520022005491b21060c010b200620054f0d0320062102200641016a21060b200028020020026a220220022802002202200a76200b73200c7120022009726a3602004101410171450d09410121020c0a0b201520136a21020340200220164f0d03201820196a211820022802002103200220136a22042102200320127122032012460d000b200320127321242004201a6a2115410421020c090b2018202468201b716a22262802002127410021030240202628020422282013490d00410021032027210220282104034020022800002003201c7773201d6c2103200220136a21022004201a6a2204201e4b0d000b2028201a6a22022002201a7122026b2128202720026a20136a21270b024002400240202820144d0d002027201f6a21022003201c7720272f000073201d6c2103202820206a0d010c020b202721022028450d010b2003201c7720022d000073201d6c21030b202420116a2127410021022003201c77202173201d6c222521030340200220136a22022003200f7122046a2103201020046a2800002012712228450d000b02402010202868201e7620046a200f7122026a2c00002022480d00201028020020127168201e7621020b201020026a202520237622033a000020102002201a6a200f716a20136a20033a0000200e2002201e746a2026290200370200202720247122240d05410321020c080b20002802002102200041046a220428020041016a220341034b0d01200241046a200220031095041a2000280200200428020022026a41016a418001410320026b1093041a0c020b2000200d20176b3602102000410c6a2017360200200041086a200e3602002000280200210320002010360200200041046a221328020021022013200f3602002002450d0a200310230c0a0b200220036a20022800003600000b410421294101212a200041046a222b28020041016a222c450d054100212d418001212e4103212f200041086a21304105213141b9f3ddf1792132417c213341022134417e213541ff01213641808182847821374119213841002139410221020c040b20392225202a6a21390240024002400240202520002802006a2d0000202e460d002039202c470d050c010b0240034020302802002025202f746a223b2802002127410021030240203b28020422282029490d004100210320272102202821040340200228000020032031777320326c2103200220296a2102200420336a2204202f4b0d000b202820336a2202200220337122026b2128202720026a20296a21270b0240024002402028202a4d0d00202720346a2102200320317720272f00007320326c2103202820356a0d010c020b202721022028450d010b200320317720022d00007320326c21030b202b28020021282000280200212741002102200320317720367320326c223c21030340200220296a2202200320287122046a2103202720046a2800002037712226450d000b02402027202668202f7620046a20287122026a2c0000202d480d00202728020020377168202f7621020b02402002203c20287122036b202520036b73202871202f4d0d00202720026a22032d000021042003203c20387622263a00002027200220336a2028716a20296a20263a000020042036460d0220302802002002202f746a2202290200213a2002203b290200370200203b203a3702000c010b0b202720256a203c20387622023a000020272028202520336a716a20296a20023a00002039202c470d030c010b2000280200220320256a20363a00002003202b280200202520336a716a20296a20363a000020302802002002202f746a203b2902003702002039202c470d010b200041046a280200221341084f0d070c080b410221020c040b410221020c030b410421020c020b410221020c010b410021020c000b0b417f21130b2013202a6a41037641076c21130b200020132000410c6a2802006b360210200141206a24000f0b200141206a24000b1c00200128021841bbb0c500410e2001411c6a28020028020c1102000b810101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004413c6a41273602002004412c6a4102360200200441013602342004420237021c2004419083c5003602182004200441106a3602382004200441086a3602302004200441306a360228200441186a41a083c5001061000b1c00200128021841b0b0c500410b2001411c6a28020028020c1102000bc10201037f23004180016b220224000240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110cc02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000bd40203037f017e027f230041306b220324004127210402400240024020004290ce00540d00412721040340200341096a20046a2205417c6a200020004290ce0080220642f0b17f7e7ca7220741e4006e220841017441ea86c5006a2f00003b00002005417e6a2008419c7f6c20076a41017441ea86c5006a2f00003b00002004417c6a2104200042ffc1d72f5621052006210020050d000b2006a7220541e3004c0d020c010b20002206a7220541e3004c0d010b200341096a2004417e6a22046a2006a7220741ffff037141e4006e2205419c7f6c20076a41ffff037141017441ea86c5006a2f00003b00000b02400240200541094a0d00200341096a2004417f6a22046a200541306a3a00000c010b200341096a2004417e6a22046a200541017441ea86c5006a2f00003b00000b2002200141a886c5004100200341096a20046a412720046b1097012104200341306a240020040be80102037f017e230041206b22012400200141106a41086a220242003703002001420037031041f5ccc2004111200141106a1000200141086a220320022903003703002001200129031037030042002104024002402001411041a886c500410041001001417f460d002001420037031020014110200141106a41084100100141016a41084d0d01200129031021040b200242003703002001420037031041f5ccc2004111200141106a100020032002290300370300200120012903103703002001200420007c37031020014110200141106a41081004200141206a24000f0b41d4aac10041331021000b9a820108067f027e037f017e0f7f027e0c7f027e230041d0076b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441054b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000402030105000b200341c8056a200141086a41c8001094041a200341d8046a41086a2204200141dc006a290200370300200341d8046a41106a2205200141e4006a2802003602002003200141d4006a2902003703d80420022d000120022d000072450d0a41b394c3002104412821020c5f0b200341c0036a41186a200141196a290000370300200341c0036a41106a200141116a290000370300200341c0036a41086a200141096a290000370300200320012900013703c003200341c8056a41206a200141c1006a2d00003a0000200341c8056a41186a200141396a290000370300200341c8056a41106a200141316a290000370300200341c8056a41086a200141296a2900003703002003200141216a2900003703c805200341b8066a41086a2204200241096a290000370300200341b8066a41106a2205200241116a290000370300200341b8066a41186a2206200241196a290000370300200341b8066a41206a2207200241216a2d00003a0000200341dc046a2208200241266a2f01003b0100200320022900013703b8062003200241226a2801003602d80420022d00002202450d0420034180026a41266a20032802d8043601002003418d026a200429030037000020034195026a20052903003700002003419d026a2006290300370000200341a5026a20072d00003a0000200341aa026a20082f01003b0100200320032903b80637008502200320023a008402200341013a0080020c580b200141c0006a2903002109200141386a290300210a200141306a280200210b2001412c6a280200210c200141286a280200210d2001411d6a290000210e2001411c6a2d0000210f2001411b6a2d00002110200141196a2f00002111200141186a2d00002112200141176a2d00002113200141156a2f00002114200141146a2d00002115200141136a2d00002116200141116a2f00002117200141106a2d000021182001410c6a2802002119200141086a280200211a200141076a2d0000211b200141056a2f0000211c200141046a2d0000211d200141c8006a290300211e2002411a6a290100211f200241196a2d00002120200241186a2d00002121200241166a2f01002122200241156a2d00002123200241146a2d00002124200241126a2f01002125200241116a2d00002126200241106a2d000021272002410e6a2f010021282002410d6a2d00002129200241046a2d0000212a200241026a2f0100212b41db94c3002104412a210520022d0000450d044101210641002107410021080c050b200141386a290300211e200141306a2903002109200141c0006a290300211f200341a0016a41186a200141196a290000370300200341a0016a41106a200141116a290000370300200341a0016a41086a200141096a290000370300200320012900013703a001200141246a280200210d200141286a28020021212001412c6a280200212a2002411a6a290100210e200241196a2d0000211a200241186a2d0000211d200241166a2f0100210c200241156a2d00002120200241146a2d00002122200241126a2f01002123200241116a2d00002124200241106a2d000021252002410e6a2f010021262002410d6a2d00002127200241046a2d00002128200241026a2f0100212941db94c3002104412a210520022d0000450d054101210641002107410021080c060b2001410c6a280200210c200141086a280200211a200141046a280200211d200141106a290300211f2002411a6a290100210e200241196a2d00002120200241186a2d00002121200241166a2f0100210d200241156a2d00002122200241146a2d00002123200241126a2f01002124200241116a2d00002125200241106a2d000021262002410e6a2f010021272002410d6a2d00002128200241046a2d00002129200241026a2f0100212a412a210541db94c300210420022d0000450d074101210641002107410021080c080b200141d8006a290300210e200141d0006a290300211e200341c0016a41186a200141196a290000370300200341c0016a41106a200141116a290000370300200341c0016a41086a200141096a290000370300200320012900013703c001200341e0016a41186a200141396a290000370300200341e0016a41106a200141316a290000370300200341e0016a41086a200141296a2900003703002003200141216a2900003703e001200141c4006a280200211d200141c8006a280200211a200141cc006a280200212a2002411a6a290100211f200241196a2d0000210c200241186a2d00002120200241166a2f01002121200241156a2d0000210d200241146a2d00002122200241126a2f01002123200241116a2d00002124200241106a2d000021252002410e6a2f010021262002410d6a2d00002127200241046a2d00002128200241026a2f0100212941db94c3002104412a210520022d0000450d084101210641002107410021080c090b20034180026a41216a20072d00003a000020034180026a41196a200629030037000020034180026a41116a200529030037000020034180026a41096a2004290300370000200320032903b80637008102200341003a00800220032d00810222024101460d0f20024102470d5320032d00c8054101470d53200341c8056a41017221024200211f0c100b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d4e2003201f3703f801200320203a00f701200320213a00f601200320223b01f401200320233a00f301200320243a00f201200320253b01f001200320263a00ef01200320273a00ee01200320283b01ec01200320293a00eb01200320023600e701200320043600e3012003202a3a00e2012003202b3b01e001201d41ff01714101470d4920034180026a201a4106761087012003280280022104200328028802201a413f7122024d0d0f200420024105746a2202290018210e20022d0017210f20022d0016211020022f0014211120022d0013211220022d0012211320022f0010211420022d000f211520022d000e211620022f000c211720022d000b2118200228000721062002280003210720022d0002211b20022f0000211c41012105200328028402450d480c470b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d412003200e3703d8012003201a3a00d7012003201d3a00d6012003200c3b01d401200320203a00d301200320223a00d201200320233b01d001200320243a00cf01200320253a00ce01200320263b01cc01200320273a00cb01200320023600c701200320043600c301200320283a00c201200320293b01c00120034180026a200341c0016a201f10cf022003280280024101470d052003280288022102200328028402210420210d420c430b200141d0006a2802002102200341b8066a200341c8056a41c8001094041a200341c0036a41106a2005280200360200200341c0036a41086a2004290300370300200320032903d8043703c003200341a8056a41086a22044200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2004290300370300200320032903a8053703a001410021050240200341a0016a411041a886c500410041001001417f460d00200342103702b4042003200341a0016a3602b00420034180026a200341b0046a10c10220032d00dc024102460d2520032802c80221050b41d48fc30021040240200520024f0d002003418c026a200236020020034180026a41086a41033a00002003410a3a0080024100210441a886c500410020034180026a102c20034180026a200341b8066a41c8001094041a200341d4026a200341c0036a41086a290300370200200341dc026a200341c0036a41106a280200360200200320023602c802200320032903c0033702cc02200341a8056a41086a22024200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a001200341003602b804200342013703b00420034180026a200341b0046a10b20220032802b4042102200341a0016a411020032802b004220520032802b80410042002450d00200510230b413521020c4f0b41012106410021074100210820022d00014101470d002002410c6a2d000021072002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200841ffff0371410874200741187472200541ff017172210220060d062003200e3703e005200320203a00df05200320213a00de052003200d3b01dc05200320223a00db05200320233a00da05200320243b01d805200320253a00d705200320263a00d605200320273b01d405200320283a00d305200320023600cf05200320043600cb05200320293a00ca052003202a3b01c805200341a8056a41086a22024200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a001200341a0016a411041a886c500410041001001417f460d04200342103702c4032003200341a0016a3602c00320034180026a200341c0036a10c10220032d00dc0222024102460d20200341b8066a20034180026a41dc001094041a20032f00dd022104200341b8066a41df006a20034180026a41df006a2d00003a0000200320043b009507200320023a0094070c050b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d392003201f3703c8042003200c3a00c704200320203a00c604200320213b01c4042003200d3a00c304200320223a00c204200320233b01c004200320243a00bf04200320253a00be04200320263b01bc04200320273a00bb04200320023600b704200320043600b304200320283a00b204200320293b01b00420034180026a200341b0046a10d80120032d00800222044102470d0141012104413421024202211f0c0c0b20034180026a41306a290300210e200341a8026a290300211f200341e0016a41186a20034180026a41206a290300370300200341e0016a41106a20034180026a41186a290300370300200341e0016a41086a20034180026a41106a29030037030020032003290388023703e00120034180026a10d002200320034180026a3602bc03200320034180026a36029005200341c8056a41186a2205200341c0016a41186a290300370300200341c8056a41106a2206200341c0016a41106a290300370300200341c8056a41086a2207200341c0016a41086a290300370300200320032903c0013703c805200341b8066a200341c8056a10d8014100210420032d00b80622084102460d31200341f0066a28020021022008450d0e410021040c310b200341a8056a41086a220520034194026a290200370300200341a8056a41106a22062003419c026a280200360200200341c8056a41086a220720034180026a41306a290300370300200341c8056a41106a2208200341b8026a290300370300200341c8056a41186a220c200341c0026a290300370300200341c8056a41206a2220200341c8026a290300370300200341c8056a41286a2221200341d0026a290300370300200341c8056a41306a220d200341d8026a29030037030020032003418c026a2902003703a805200320034180026a41286a2903003703c80520034180026a41086a28020021024202211f42022109024020040d0020034180026a41206a2903002109200341a0016a41106a2006280200360200200341a0016a41086a2005290300370300200341c0036a41086a2007290300370300200341c0036a41106a2008290300370300200341c0036a41186a200c290300370300200341c0036a41206a2020290300370300200341c0036a41286a2021290300370300200341c0036a41306a200d290300370300200320032903a8053703a001200320032903c8053703c0030b20094202520d0941012104413421020c0a0b200341003a00940720034280808480800237038807200342013703f806200342013703f006200342013703e806200342013703e006200342013703d806200342013703d006200342013703c806200342013703c006200342013703b80620034280808080c0003703800720034120360290070b20034180026a200341c8056a201f10cf022003280280024101470d01200328028802210220032802840221040b4100210841012107201a450d31201d10230c310b200341b0026a290300210e200341a8026a290300211f200341a0026a290300210a20034198026a290300212c20034190026a290300211e200329038802212d200341206a20032903b8064200200cad4200109804201e427f200329032020032903284200521b7d2209201e56200950722206450d03412c2102418990c300210541012104201a0d040c2f0b20032d00c8054101460d434200211f200341a8056a41086a22024200370300200342003703a80541b590c300411c200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a0010240200341a0016a411041a886c500410041001001417f460d00200342003703b806200341a0016a4110200341b8066a41084100100141016a41084d0d1720032903b806211f0b20034180026a41027221020b4100210441012107200341c0036a201f410010d10241ff01714101470d0b4200211f200341a8056a41086a22054200370300200342003703a80541d190c3004118200341a8056a1000200341a0016a41086a2005290300370300200320032903a8053703a001200341a0016a411041a886c500410041001001417f460d09200342003703e004200342003703d804200341a0016a4110200341d8046a4110410010012205417f460d192005410f4d0d19200341e0046a290300210e20032903d804211f0c0a0b410021052003280284020d370c380b20034180026a201d200c200341b8066a10c5022003280280024101470d0320034188026a2802002102200328028402210541012104201a450d2b0b201d10230c2a0b200341c8056a41106a200341a0016a41106a280200360200200341c8056a41086a200341a0016a41086a29030037030020034180026a41086a200341c0036a41086a29030037030020034180026a41106a200341c0036a41106a29030037030020034180026a41186a200341c0036a41186a29030037030020034180026a41206a200341c0036a41206a29030037030020034180026a41286a200341c0036a41286a29030037030020034180026a41306a200341c0036a41306a290300370300200320032903a0013703c805200320032903c00337038002410021042009211f0b20034190056a41106a2205200341c8056a41106a28020036020020034190056a41086a2206200341c8056a41086a290300370300200341d8046a41086a220720034180026a41086a290300370300200341d8046a41106a220820034180026a41106a290300370300200341d8046a41186a220c20034180026a41186a290300370300200341d8046a41206a222020034180026a41206a290300370300200341d8046a41286a222120034180026a41286a290300370300200341d8046a41306a220d20034180026a41306a290300370300200320032903c8053703900520032003290380023703d80402402004450d0041d291c3002104201a0d2e0c2f0b200341b8066a41206a20032903d804370300200341c4066a2006290300370200200341cc066a2005280200360200200341b8066a41286a2007290300370300200341b8066a41306a2008290300370300200341f0066a200c290300370300200341f8066a202029030037030020034180076a202129030037030020034188076a200d29030037030020032003290390053702bc06200320023602b8062003201f3703d00642002109200341a8056a41086a22024200370300200342003703a80541af98c300410d200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a0010240200341a0016a411041a886c500410041001001417f460d002003420037038002200341a0016a411020034180026a41084100100141016a41084d0d1020032903800221090b0240201fa74101470d00200341d8066a2903002009520d00418692c3002104412a2102200341e4066a280200450d2d0c2c0b20034180026a200341c0016a10d80120032d00800222024102470d010c2a0b200341d8046a41186a220420034180026a410472220241186a280200360200200341d8046a41106a2207200241106a290200370300200341d8046a41086a222a200241086a290200370300200320022902003703d80420034180026a41186a2202420037030020034180026a41106a2205420037030020034180026a41086a42003703002003420037038002201d200c20034180026a10022002290300211e20052f0100210820032d009702212020032d009602212120032f019402210d20032d009302212220032d009202212320032d008f02212420032d008e02212520032f018c02212620032d008b0221272003280087022102200328008302210520032d008202212820032f0180022129200341c0036a41186a2004280200360200200341c0036a41106a2007290300370300200341c0036a41086a202a290300370300200320032903d8043703c003411410262204450d14200441106a41002800d28943360000200441086a41002900ca8943370000200441002900c2894337000020044114413410272204450d152004201e37002c200420203a002b200420213a002a2004200d3b0028200420223a0027200420233a0026200420083b0024200420243a0023200420253a0022200420263b0020200420273a001f2004200236001b20042005360017200420283a0016200420293b001420034180026a41186a2207420037030020034180026a41106a222a420037030020034180026a41086a222b420037030020034200370380022004413420034180026a1002200341a8056a41186a2007290300370300200341a8056a41106a202a290300370300200341a8056a41086a202b29030037030020032003290380023703a805200341a8056a200341c0036a10b101200410230240200341c0036a41106a280200450d0020032802cc0310230b411510262204450d162004410d6a41002900f48943370000200441086a41002900ef8943370000200441002900e7894337000020044115413510272204450d172004201e37002d200420203a002c200420213a002b2004200d3b0029200420223a0028200420233a0027200420083b0025200420243a0024200420253a0023200420263b0021200420273a00202004200236001c20042005360018200420283a0017200420293b001520034180026a41186a2207420037030020034180026a41106a222a420037030020034180026a41086a222b420037030020034200370380022004413520034180026a1002200341a8056a41186a2007290300370300200341a8056a41106a202a290300370300200341a8056a41086a202b29030037030020032003290380023703a805200341003602880220034201370380022003200c3602c003200341c0036a20034180026a1041200328028402222b200328028802222a6b200c4f0d02202a200c6a2207202a490d20202b410174220f20072007200f491b220f4100480d20202b450d09200328028002202b200f10272207450d0a0c250b2002450d052003418c026a2d000021022003418d026a290000211f20034195026a280000210420032f008102210520032d0083022106200329028402210a200320034199026a2900003703f004200320043602ec042003201f3702e404200320023a00e3042003200a3700db04200320063a00da04200320053b01d804200341d0066a290300210a200341d8066a290300212c2003201d3602a8052003201d202a4105746a3602ac052003200341b8066a3602b005200341c8056a200341a8056a10a00220032802c805450d0720034180026a41086a2202200341c8056a41086a290300370300200320032903c80537038002411010262205450d192005200329038002370200200541086a2002290300370200200341c0036a41086a200341a8056a41086a280200360200200320032903a8053703c003200341c8056a200341c0036a10a00220032802c805450d0a4101210241012107034020034180026a41086a2206200341c8056a41086a290300370300200320032903c8053703800202400240024020072002470d00200241016a22042002490d2320024101742207200420042007491b2207ad420486221f422088a70d23201fa722084100480d232002450d01200520024104742008102722050d020c140b200241016a21040c010b200810262205450d120b200520024104746a2202200329038002370200200241086a2006290300370200200341c8056a200341c0036a10a0022004210220032802c8050d000c0c0b0b2002417f4c0d33200341ec066a280200211a200341b8066a41306a28020021082002450d05200210262204450d172004200820021094041a201a450d220c210b20032802800221070c230b4200210e0b200341b8066a2002201f200e107e41012106024020032802b8064101470d0020032802c006210220032802bc0621040c2d0b200320032903c0063703b0042003200341c8066a2903003703b8042003200341b0046a3602d804200341d8046a107b0b410121064101211a4101210820012d0000220541064d0d3a0c3b0b200341b4026a280200450d22200341b0026a28020010230c220b41012104201a0d1b0c1c0b4100210741042105410021040c030b200f102622070d1b0b200f4101102a000b41012104410121070b200341e8066a280200210220032802e006210620034100360280022006200220034180026a101321202003280280022206417f460d0b200341c8056a41186a200341e0016a41186a290300370300200341c8056a41106a200341e0016a41106a290300370300200341c8056a41086a200341e0016a41086a290300370300200320032903e0013703c80520034100360288022003420137038002200320063602a805200341a8056a20034180026a1041024002400240200328028402220820032802880222026b20064f0d00200220066a220c2002490d1620084101742221200c200c2021491b22214100480d162008450d01200328028002200820211027220c450d020c110b200328028002220c20026a202020061094041a200220066a2202450d110c120b20211026220c0d0f0b20214101102a000b20034194026a4101360200200341013602bc062003418898c4003602b8062003420137028402200341d497c400360280022003200341b8066a3602900220034180026a41c4cec2001061000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20084104102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41154101102a000b41354101102a000b41f8ffc40041381021000b20024101102a000b41104104102a000b20032021360284022003200c3602800220212108200c20026a202020061094041a200220066a22020d010b4101212120080d010c020b20024100480d02200210262221450d032021200c20021094041a2008450d010b200c10230b20024101742208200241206a220c200c2008491b220d4100480d00024002402002450d0020212002200d10272208450d010c040b200d102622080d030b200d4101102a000b101e000b20024101102a000b200820026a220220032903c805370000200241186a200341c8056a41186a290300370000200241106a200341c8056a41106a290300370000200241086a200341c8056a41086a29030037000020034180026a41186a2202420037030020034180026a41106a2221420037030020034180026a41086a220d420037030020034200370380022008200c20034180026a1002200341c0036a41186a2002290300370300200341c0036a41106a2021290300370300200341c0036a41086a200d29030037030020032003290380023703c0032008102302402006450d00202010230b0240024002400240024002400240200341c0036a200341d8046a4120109604450d00200520044104746a21242004450d01200341e8066a2125200341e0066a212620052102034020022802002206450d03200241046a2802002104200241086a28020021082002410c6a280200210c202528020021202026280200212120034180026a41186a220d420037030020034180026a41106a2222420037030020034180026a41086a2223420037030020034200370380022006412020034180026a1002200341a8056a41186a200d290300370300200341a8056a41106a2022290300370300200341a8056a41086a202329030037030020032003290380023703a80520212020200341a8056a41202004200c100b02402008450d00200410230b200241106a22022024470d000c050b0b2004450d04200441047421082005410c6a2102410021060340200228020020066a2106200241106a2102200841706a22080d000c060b0b200522022024470d010c020b200241106a22022024460d010b03402002280200450d010240200241086a280200450d00200241046a28020010230b200241106a22022024470d000b0b02402007450d00200510230b41b092c300210441162102200341e4066a2802000d090c0a0b410021060b200320032802ec0620066b3602ec0602400240411710262202450d002002410f6a41002900abcd42370000200241086a41002900a4cd423700002002410029009ccd4237000020024117413710272202450d01200220032903b0043700172002412f6a200341b0046a41186a290300370000200241276a200341b0046a41106a2903003700002002411f6a200341b0046a41086a29030037000020034180026a41186a2206420037030020034180026a41106a2208420037030020034180026a41086a220c420037030020034200370380022002413720034180026a1002200341a8056a41186a2006290300370300200341a8056a41106a2008290300370300200341a8056a41086a200c29030037030020032003290380023703a805200341a8056a41201003200210232008200e370300200341a8026a2009202c202a1b37030020034180026a41206a4201200a202a1b37030020062009370300200341b0026a200341e0066a2202290300370300200341b8026a200241086a280200360200200341bc026a200341ec066a280200360200200341c0026a20032903e001370300200341c8026a200341e0016a41086a290300370300200341d0026a200341e0016a41106a290300370300200341d8026a200341e0016a41186a2903003703002003201e37038802200341003a008002200341c0016a20034180026a10dd0120034190016a200341b0046a10840120034190016a41086a290300211f200329039001210e20034180026a200341b0046a4200420010dc01024002402003290380024200510d002003200c3602c805200341c8056a10de010c010b2003200c3602c805200341c8056a107b0b20034180016a200341c0016a200e201f108202200320034188016a2903003703d00520032003290380013703c8052003200341c8056a3602a805200341a8056a107b02402004450d0020044104742104200541046a210203400240200241046a280200450d00200228020010230b200241106a2102200441706a22040d000b0b02402007450d00200510230b410021040240201a450d00201d10230b0c0c0b41174101102a000b41374101102a000b200810230b200341fc036a4100360200200341ec036a221d4200370200200341c0036a41206a41dcacc400360200200341dc036a41a886c500360200200341d4036a22084200370200200341c0036a41106a41f098c400360200200341c0036a41086a2002360200200341a4046a20052903003702002003419c046a200629030037020020034194046a2007290300370200200342083702f4032003428080808080013702e403200341003602cc03200320023602c403200320043602c003200320032903c80537028c04200320034190056a360288042003200341bc036a36028404200320034180026a36028004200341b0046a200341c0036a2009201e200341e0016a200341a0016a200d202a10e2014101210c41012123024020032d00b00422240d00200341b8066a41086a221a2008290200370300200341c8056a41086a200341c4066a280200360200200320032902cc033703b806200320032902bc063703c805200341c8076a200341c8056a10db01200341e8036a2802002220200341f0036a280200220441e8006c6a2108201d280200212220202102024002402004450d00200341c1066a211d202021020240034020022d00002104200341c8056a200241016a41d7001094041a20044106460d01200241d8006a2800002105200241dc006a2800002106200241e0006a2800002107201a20043a00002003410a3a00b806201d200341c8056a41d7001094041a20052007200341b8066a102c02402006450d00200510230b200241e8006a22022008470d000c030b0b200241e8006a21020b20022008460d00034020022d000022044106460d01200241286a2800002105200241246a28000021060240200241dc006a280000450d00200241d8006a28000010230b024020044105490d002005450d00200610230b200241e8006a22022008470d000b0b410021232022450d00202010230b200341e0006a20032903f001200341f8016a29030020032903e801221e420010980420032903e001201e7d10cd02200341f0006a200341c0016a2003290360200341e0006a41086a290300108202200341c8066a200e200341f0006a41086a29030022097d201f2003290370221e54ad7d2009200e7d201e201f54ad7d201e201f582009200e582009200e5122021b22041b220a3703002003201f201e7d201e201f7d20041b222c3703c0062003201e201f562009200e5620021b2202ad221f3703b806024020020d002003202c3703c8052003200a3703d0052003200341c8056a3602d804200341d8046a10de014100210c20032903b806211f0b200341b8066a41086a210202400240201f4200510d00200320023602c805200341c8056a107b0c010b200c450d00200320023602c805200341c8056a10de010b200341f4036a2802002222200341fc036a28020022044190016c6a211d200341f8036a2802002125202221020240024002402004450d00200341c1066a2104200341d8046a4102722105200341b8066a410472210c200341e1066a21202022210202400340200341a8056a41186a2207200241186a290300370300200341a8056a41106a2208200241106a290300370300200341a8056a41086a221a200241086a290300370300200320022903003703a805200241206a2802002106200341c8056a200241246a41ec001094041a2006410e460d01200320063602b806200c200341c8056a41ec001094041a200520032903a805370000200541086a201a290300370000200541106a2008290300370000200541186a200729030037000020034180023b01d804200341d8006a200341b8066a200341d8046a10d20220032802582106200341b8066a41086a41043a000020202006453a0000200420032903a805370000200441086a201a290300370000200441106a2008290300370000200441186a20072903003700002003410a3a00b80641a886c5004100200341b8066a102c20024190016a2202201d470d000b201d2202201d470d020c030b20024190016a21020b2002201d460d010b200341b8066a41206a2105200341b8066a41246a210c0340200341a8056a41186a2206200241186a290300370300200341a8056a41106a2207200241106a290300370300200341a8056a41086a2208200241086a290300370300200320022903003703a805200241206a2802002104200341b8066a200241246a41ec001094041a2004410e460d01200341d8046a41186a221a2006290300370300200341d8046a41106a22062007290300370300200341d8046a41086a22072008290300370300200320032903a8053703d804200341c8056a200341b8066a41ec001094041a20052004360200200341b8066a41186a201a290300370300200341b8066a41106a2006290300370300200341b8066a41086a2007290300370300200320032903d8043703b806200c200341c8056a41ec001094041a2005102420024190016a2202201d470d000b0b02402025450d00202210230b200341b8046a280200210241002104024020244101470d0020032802b40421040b024020032802c0032205450d0020032802c403450d00200510230b2023450d09200341c0036a41186a280200211a200341d0036a280200210502400240200341c0036a41146a2802002207450d002007210820052106034020062802880b21062008417f6a22080d000b0340200520052f01064102746a41880b6a28020021052007417f6a22070d000c020b0b200521060b200341d4066a20052f0106360200200341b8066a41186a4100360200200341b8066a41146a20053602002003201a3602d806200341003602c806200342003703c006200320063602bc06200341003602b806200341b8066a10d4010240200341f0036a2802002206450d00200341c0036a41286a2802002105200641e8006c210603400240200541dc006a280200450d00200541d8006a28020010230b024020052d00004105490d00200541286a280200450d00200541246a28020010230b200541e8006a2105200641987f6a22060d000b0b200341ec036a280200450d09200341e8036a280200102320210d0a0c0b0b2003200f360284022003200736028002200f212b0b2007202a6a201d200c1094041a200341a8056a41202007202a200c6a10040240202b450d00200710230b200410230240201a450d00201d10230b200341a1026a201e370000200341a0026a20203a00002003419f026a20213a00002003419d026a200d3b00002003419c026a20223a00002003419b026a20233a000020034199026a20083b000020034198026a20243a000020034197026a20253a000020034195026a20263b000020034194026a20273a000020034190026a20023602002003418c026a20053602002003418b026a20283a000020034189026a20293b000020034188026a41023a00002003410a3a0080024100210441a886c500410020034180026a102c0b2003202c200a4200200920061b221e4200109804202d201e7d10cd02200341106a200341c8056a2003290300200341086a29030010820220034190026a200e200341106a41086a29030022097d201f2003290310221e54ad7d2009200e7d201e201f54ad7d201e201f582009200e582009200e5122061b22071b220a3703002003201f201e7d201e201f7d20071b222c370388022003201e201f562009200e5620061b2206ad221f3703800241012107024020060d002003202c3703c0032003200a3703c8032003200341c0036a3602d804200341d8046a10de0141002107200329038002211f0b20034180026a41086a210602400240201f4200510d00200320063602c003200341c0036a107b0c010b2007450d00200320063602c003200341c0036a10de010b410021082005410020041b2104410121070b410121064101211a20012d0000220541064d0d170c180b41c692c3002104412e2102200341e4066a280200450d010b20032802e00610230b201a450d010b201d10230b4100211a41012107410121060c110b2021450d010b200d10230b410021060b410121070c0c0b200410230b200741d9cac40020051b21042006411520051b21022005450d052004211a200221190b20034180026a200341e0016a201e10cf0202402003280280024101470d0020032802880221022003280284022104200c0d060c070b20034180026a41306a290300211e200341a8026a290300211f200341b0046a41186a20034180026a41206a290300370300200341b0046a41106a20034180026a41186a290300370300200341b0046a41086a20034180026a41106a29030037030020032003290388023703b00420034180026a10d002200320034180026a36029005200320034180026a3602a001200341c8056a41186a2205200341e0016a41186a290300370300200341c8056a41106a2206200341e0016a41106a290300370300200341c8056a41086a2207200341e0016a41086a290300370300200320032903e0013703c805200341b8066a200341c8056a10d8014100210420032d00b80622084102460d03200341f0066a280200210202402008450d00410021040c040b2002417f4c0d00200341ec066a280200211d200341b8066a41306a280200210802402002450d00200210262204450d022004200820021094041a201d450d040c030b41012104201d0d020c030b101d000b20024101102a000b200810230b200341fc036a4100360200200341ec036a221d4200370200200341c0036a41206a41dcacc400360200200341dc036a41a886c500360200200341d4036a22084200370200200341c0036a41106a41f098c400360200200341c0036a41086a2002360200200341a4046a20052903003702002003419c046a200629030037020020034194046a2007290300370200200342083702f4032003428080808080013702e403200341003602cc03200320023602c403200320043602c003200320032903c80537028c042003200341a0016a36028804200320034190056a36028404200320034180026a360280042003200e3703d0062003200f3a00cf06200320103a00ce06200320113b01cc06200320123a00cb06200320133a00ca06200320143b01c806200320153a00c706200320163a00c606200320173b01c406200320183a00c306200320193600bf062003201a3600bb062003201b3a00ba062003201c3b01b806200341003602d005200342013703c805200341c0016a200341c0036a200341b8066a200a2009200341b0046a200d200b200341c8056a10e7014101212041012123024020032802c00122240d00200341b8066a41086a221a2008290200370300200341c8056a41086a200341c4066a280200360200200320032902cc033703b806200320032902bc063703c805200341c8076a200341c8056a10db01200341e8036a2802002221200341f0036a280200220441e8006c6a2108201d280200212220212102024002402004450d00200341c1066a211d202121020240034020022d00002104200341c8056a200241016a41d7001094041a20044106460d01200241d8006a2800002105200241dc006a2800002106200241e0006a2800002107201a20043a00002003410a3a00b806201d200341c8056a41d7001094041a20052007200341b8066a102c02402006450d00200510230b200241e8006a22022008470d000c030b0b200241e8006a21020b20022008460d00034020022d000022044106460d01200241286a2800002105200241246a28000021060240200241dc006a280000450d00200241d8006a28000010230b024020044105490d002005450d00200610230b200241e8006a22022008470d000b0b410021232022450d00202110230b200341386a20032903c004200341c8046a29030020032903b804220e420010980420032903b004200e7d10cd02200341c8006a200341e0016a2003290338200341386a41086a290300108202200341c8066a201e200341c8006a41086a29030022097d201f2003290348220e54ad7d2009201e7d200e201f54ad7d200e201f582009201e582009201e5122021b22041b220a3703002003201f200e7d200e201f7d20041b222c3703c0062003200e201f562009201e5620021b2202ad221f3703b806024020020d002003202c3703c8052003200a3703d0052003200341c8056a3602d804200341d8046a10de014100212020032903b806211f0b200341b8066a41086a210202400240201f4200510d00200320023602c805200341c8056a107b0c010b2020450d00200320023602c805200341c8056a10de010b200341f4036a2802002222200341fc036a28020022044190016c6a211d200341f8036a2802002125202221020240024002402004450d00200341c1066a2104200341d8046a4102722105200341b8066a4104722120200341e1066a21212022210202400340200341a8056a41186a2207200241186a290300370300200341a8056a41106a2208200241106a290300370300200341a8056a41086a221a200241086a290300370300200320022903003703a805200241206a2802002106200341c8056a200241246a41ec001094041a2006410e460d01200320063602b8062020200341c8056a41ec001094041a200520032903a805370000200541086a201a290300370000200541106a2008290300370000200541186a200729030037000020034180023b01d804200341306a200341b8066a200341d8046a10d20220032802302106200341b8066a41086a41043a000020212006453a0000200420032903a805370000200441086a201a290300370000200441106a2008290300370000200441186a20072903003700002003410a3a00b80641a886c5004100200341b8066a102c20024190016a2202201d470d000b201d2202201d470d020c030b20024190016a21020b2002201d460d010b200341b8066a41206a2105200341b8066a41246a21200340200341a8056a41186a2206200241186a290300370300200341a8056a41106a2207200241106a290300370300200341a8056a41086a2208200241086a290300370300200320022903003703a805200241206a2802002104200341b8066a200241246a41ec001094041a2004410e460d01200341d8046a41186a221a2006290300370300200341d8046a41106a22062007290300370300200341d8046a41086a22072008290300370300200320032903a8053703d804200341c8056a200341b8066a41ec001094041a20052004360200200341b8066a41186a201a290300370300200341b8066a41106a2006290300370300200341b8066a41086a2007290300370300200320032903d8043703b8062020200341c8056a41ec001094041a2005102420024190016a2202201d470d000b0b02402025450d00202210230b200341c8016a280200210220032802c40121050240024002402024450d002005210420032802c00322050d010c020b4100210402402002450d00200510230b20032802c0032205450d010b20032802c403450d00200510230b2023450d00200341c0036a41186a280200211a200341d0036a280200210502400240200341c0036a41146a2802002207450d002007210820052106034020062802880b21062008417f6a22080d000b0340200520052f01064102746a41880b6a28020021052007417f6a22070d000c020b0b200521060b200341d4066a20052f0106360200200341b8066a41186a4100360200200341b8066a41146a20053602002003201a3602d806200341003602c806200342003703c006200320063602bc06200341003602b806200341b8066a10d4010240200341f0036a2802002206450d00200341c0036a41286a2802002105200641e8006c210603400240200541dc006a280200450d00200541d8006a28020010230b024020052d00004105490d00200541286a280200450d00200541246a28020010230b200541e8006a2105200641987f6a22060d000b0b200341ec036a280200450d00200341e8036a2802001023200c0d010c020b200c450d010b200d10230b41012106410021070c020b41e990c300210441e90021020b41012107410121060b4101211a0b4101210820012d0000220541064b0d010b024002400240024020050e0705050003010502050b2008450d04200141086a280200450d04200141046a28020010230c040b2006450d03200141286a280200450d03200141246a28020010230c030b201a450d02200141c8006a280200450d02200141c4006a28020010230c020b2007450d012001412c6a280200450d01200141286a28020010230c010b200141c8006a280200450d00200141c4006a28020010230b2000200236020420002004360200200341d0076a24000bc50602027f047e230041e0006b22032400200341386a41086a22044200370300200342003703384186cdc2004116200341386a1000200341d0006a41086a20042903003703002003200329033837035002400240024002400240200341d0006a411041a886c500410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821050c010b4280ade20421050b42002106200341386a41086a220442003703002003420037033841f5ccc2004111200341386a1000200341d0006a41086a2004290300370300200320032903383703500240200341d0006a411041a886c500410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821060b0240200520067d20025a0d0020004188abc40036020420004101360200200041086a411b360200200341e0006a24000f0b42002105200341386a41086a220442003703002003420037033841b3cdc2004111200341386a1000200341d0006a41086a20042903003703002003200329033837035002400240200341d0006a411041a886c500410041001001417f460d002003420037034020034200370338200341d0006a4110200341386a4110410010012204417f460d042004410f4d0d04200341c0006a2903002105200329033821060c010b420121060b200341186a2005420020024200109804200341286a2002420020064200109804200341086a420042002006420010980402402003290310200329032084420052200341286a41086a2903002207200329030820032903187c7c2208200754724101470d00200041a3abc40036020420004101360200200041086a4127360200200341e0006a24000f0b200341386a2001200329032820084108108502024020032802384101470d002000200329023c37020420004101360200200341e0006a24000f0b20032903402107200041306a200341386a41106a290300370300200041286a2007370300200041206a2005370300200041186a2006370300200041106a2002370300200041086a200237030020004100360200200341e0006a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000bcf0d06087f097e027f057e017f057e23004190016b22012400200141306a41086a220242003703002001420037033041bc8fc3004118200141306a1000200141106a41086a2002290300370300200120012903303703104100210341102104024002400240200141106a411041a886c500410041001001417f460d00200142103702242001200141106a360220200141306a200141206a10c10220012d008c0122034102460d022001410c6a41026a2001418f016a2d00003a0000200120012f008d013b010c200128028801210520012802840121042001280280012106200128027c210720012802782108200129037021092001290368210a2001290360210b2001290358210c2001290350210d2001290348210e2001290340210f20012903382110200129033021110c010b420121094104210741808004210641202105410021084201210a4201210b4201210c4201210d4201210e4201210f42012110420121110b200141306a41086a22024200370300200142003703304182b6c100411b200141306a1000200141106a41086a2212200229030037030020012001290330370310024002400240024002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012213417f460d022013410f4d0d02200141386a2903002114200129033021150c010b42002115420021140b200242003703002001420037033041f492c3004111200141306a10002012200229030037030020012001290330370310024002400240200141106a411041a886c500410041001001417f460d0020014100360230200141106a4110200141306a41044100100141016a41044d0d02200128023021120c010b41e40021120b42002116200141306a41086a2202420037030020014200370330418593c3004114200141306a1000200141106a41086a20022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d042002410f4d0d04200141386a2903002116200129033021170c010b421521170b42002118200141306a41086a2202420037030020014200370330419993c3004114200141306a1000200141106a41086a221320022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012219417f460d052019410f4d0d05200141386a290300211a2001290330211b0c010b4200211b4200211a0b200242003703002001420037033041ad93c3004114200141306a1000201320022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d062002410f4d0d06200141386a290300211c200129033021180c010b4200211c0b200141306a41086a220242003703002001420037033041c193c3004114200141306a1000200141106a41086a2002290300370300200120012903303703100240024002400240200141106a411041a886c500410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d022001290330211d0c010b428701211d0b200141306a41086a220242003703002001420037033041d593c3004116200141306a1000200141106a41086a20022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d032001290330211e0c010b42af01211e0b200020033a005c2000200536025820002004360254200020063602502000200736024c20002008360248200020093703402000200a3703382000200b3703302000200c3703282000200d3703202000200e3703182000200f3703102000201037030820002011370300200020012f010c3b005d200041df006a2001410e6a2d00003a0000200041e8006a201437030020002015370360200020123602b0012000201e3703a8012000201d3703a00120004198016a201c370300200020183703900120004188016a201a3703002000201b37038001200041f8006a20163703002000201737037020014190016a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000ba01b09017f017e017f017e047f087e017f027e037f230041b0036b2203240020034190026a200010d801024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020032d009002417f6a41ff017141014d0d0020034190016a41086a200341d8026a29030037030020034190016a41106a200341e0026a29030037030020034190016a41186a200341e8026a2903003703002003200341d0026a2903003703900120034190026a41106a290300210420034190026a41086a22052903002106200341cc026a2802002107200341c8026a2802002108200341c4026a2802002109200341c0026a280200210a20034190026a41186a290300210b20054200370300200342003703900241af98c300410d20034190026a100020034190036a41086a20052903003703002003200329039002370390034200210c024020034190036a411041a886c500410041001001417f460d00200342003703900220034190036a411020034190026a41084100100141016a41084d0d04200329039002210c0b024042004200200c20017d22012001200c561b2201200b7d220b200b2001561b220d500d0020034180016a200010840120034180016a41086a2903002101200329038001210e4200210b20034190026a41086a22054200370300200342003703900241f1cdc200411a20034190026a100020034190036a41086a20052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d072005410f4d0d070240200329039002220b20034190026a41086a290300220f84500d00200341f0006a200e2001200b200f109704200341f0006a41086a29030021102003290370210b0c020b4200210b0b420021100b20034190026a41086a22054200370300200342003703900241c4cdc200411420034190026a100020034190036a41086a20052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d082005410f4d0d0820034198026a290300210f20032903900221110c010b420021114200210f0b200341c0006a4200420020107d2007ad2210200b54ad7d22122010200b7d220b20105620124200522012501b22051b2210420020114200109804200341d0006a200f42004200200b20051b220b4200109804200341e0006a200b420020114200109804427f20032903602010420052200f42005271200329034842005272200329035842005272200341e0006a41086a290300220b200329034020032903507c7c2211200b547222051b220f427f201120051b221184500d004200210b20034190026a41086a2205420037030020034200370390024182b6c100411b20034190026a100020034190036a41086a2207200529030037030020032003290390023703900320034190036a411041a886c500410041001001417f460d022003420037039802200342003703900220034190036a411020034190026a4110410010012213417f460d072013410f4d0d0720034198026a290300211220032903900221140c030b2009450d00200a10230b410021050c170b42002114420021120b20054200370300200342003703900241d8cdc200411920034190026a1000200720052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d062005410f4d0d0620034198026a2903002115200329039002210b0c010b420021150b200341186a20114200200d42ffffffff0f8342ffffffff0f200d428080808010541b22104200109804200341286a200f420020104200109804200341086a42004200200f4200109804200341386a200041084200200e2006427f20032903282003290320200329031084420052200341286a41086a290300220f200329031820032903087c7c2211200f547222051b22102010200656427f201120051b220f200456200f2004511b22051b22117d22062006200e5620012004200f20051b7d200e201154ad7d220420015620042001511b22071b22064200200420071b22041083022003280238210702402006200b20147c2211542004201520127c2011200b54ad7c220b542004200b511b22130d0020070d0020050d00410221052002450d1420034190026a20002010200f41081085022003280290024101460d072003200341a0026a290300220b3703b801200320034190026a41086a29030022013703b00120034190026a200010d80120032d009002220241024622050d06410020034190026a20051b22052d00000d062005200c37031820052005290308220c20017d370308200541106a22052005290300200b7d200c200154ad7d370300411710262205450d082005410f6a41002900abcd42370000200541086a41002900a4cd423700002005410029009ccd4237000020054117413710272205450d09200520002900003700172005412f6a200041186a290000370000200541276a200041106a2900003700002005411f6a200041086a29000037000020034190036a41186a2200420037030020034190036a41106a2207420037030020034190036a41086a2208420037030020034200370390032005413720034190036a1002200341f0026a41186a2000290300370300200341f0026a41106a2007290300370300200341f0026a41086a200829030037030020032003290390033703f00220034120360294032003200341f0026a3602900320034190026a20034190036a10b30220051023024020020d00200341c4026a280200450d00200341c0026a28020010230b2003200341b0016a3602900220034190026a10de014102210520090d150c160b0240024020130d0020070d0020034190026a20002010200f4108108502410121052003280290024101460d0b2003200341a0026a2903003703c801200320034190026a41086a2903003703c0012003200341c0016a3602900320034190036a10de01200e2011542001200b542001200b511b450d010c150b024002400240200e2011542001200b542001200b511b450d00200341f0016a20004200420010dc01200341f8016a210020032903f0014200510d01200320003602900220034190026a10de014101210520090d180c190b200341d0016a20002011200b10dc01200341d8016a210520032903d0014200510d01200320053602900220034190026a10de010c020b200320003602900220034190026a107b4101210520090d160c170b200320053602900220034190026a107b0b2003410036029002200a200820034190026a101321162003280290022202417f460d0a20034190026a41186a20034190016a41186a29030037030020034190026a41106a20034190016a41106a29030037030020034190026a41086a20034190016a41086a29030037030020032003290390013703900220034100360298032003420137039003200320023602f002200341f0026a20034190036a1041024002400240200328029403220720032802980322056b20024f0d00200520026a22132005490d1320074101742217201320132017491b22174100480d132007450d012003280290032007201710272213450d020c0e0b200328029003221320056a201620021094041a200520026a2205450d0e0c0f0b2017102622130d0c0b20174101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41b8ccc20041351021000b41a2cac30041f10020032802940220034190026a41086a28020010c902000b41174101102a000b41374101102a000b4193cbc300412b20032802940220034190026a41086a28020010c902000b41f8ffc40041381021000b2003201736029403200320133602900320172107201320056a201620021094041a200520026a22050d010b4101211720070d010c020b20054100480d02200510262217450d032017201320051094041a2007450d010b201310230b20054101742207200541206a221320132007491b22184100480d00024002402005450d0020172005201810272207450d010c040b2018102622070d030b20184101102a000b101e000b20054101102a000b200720056a2205200329039002370000200541186a20034190026a41186a290300370000200541106a20034190026a41106a290300370000200541086a20034190026a41086a29030037000020034190036a41186a2205420037030020034190036a41106a2217420037030020034190036a41086a2218420037030020034200370390032007201320034190036a1002200341f0026a41186a22132005290300370300200341f0026a41106a22052017290300370300200341f0026a41086a2217201829030037030020032003290390033703f00220071023200341a9026a2013290300370000200341a1026a200529030037000020034199026a201729030037000041012105200341013a009002200320032903f00237009102200020034190026a10dd01200a2008100d2002450d00201610230b2009450d010b200a1023200341b0036a240020050f0b200341b0036a240020050bc46309077f017e147f017e0d7f037e047f027e047f23004190046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2204410c4b0d000240024020040e0d002a05080c0b0607040a030901000b200141086a29030020022d000020022d000110ea0221044124210541012106410121070c460b200141086a280200210820012802042104200341e0026a41086a2001411c6a290200370300200341e0026a410d6a200141216a2900003700002003200141146a2902003703e002410121092002411a6a290100210a200241196a2d0000210b200241186a2d0000210c200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002106200241116a2d00002107200241106a2d000021102002410e6a2f010021112002410d6a2d000021122002410c6a2d000021132002410a6a2f01002114200241096a2d00002115200241086a2d00002116200241066a2f01002117200241056a2d00002118200241046a2d00002119200241026a2f0100211a20022d0001210520022d0000210220044101460d0b20044102470d2a200141106a280200211b2001410c6a280200211c200341c0036a410d6a200341e0026a410d6a290000370000200341c0036a41086a200341e0026a41086a290300370300200320032903e0023703c0034101210941db94c30021044100211d412a211e200241ff01710d1541002102200541ff01714101470d1620174108742018722016411874722104410021092015211e2014211d201321020c160b200141086a2802002208417f6a220441044b0d2a200141106a290300210a2001410c6a280200211020022d0001210520022d00002102024020040e050014121311000b200aa72108200241ff01710d1841012107200541ff01714101470d18412a210520080d330c340b200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341306a200341c8006a20034198026a10fc02200328023421052003280230210441012106410121070c430b418f94c3002104412421054101210620022d00000d0920022d000141ff01714102470d09200141086a290300210a4200211f20034180046a41086a2202420037030020034200370380044188a4c100411020034180046a100020034180036a41086a2204200229030037030020032003290380043703800320034180036a411041a886c500410041001001417f470d2920024200370300200342003703800441af98c300410d20034180046a100020042002290300370300200320032903800437038003024020034180036a411041a886c500410041001001417f460d002003420037034820034180036a4110200341c8006a41084100100141016a41084d0d272003290348211f0b201f200a540d2a20034180046a41086a2202420037030020034200370380044188a4c100411020034180046a100020034180036a41086a20022903003703002003200329038004370380032003200a37034820034180036a4110200341c8006a4108100441002104410121070c420b200341c8006a200141086a41c8001094041a20034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341086a200341c8006a20034198026a109902200328020c21052003280208210441012106410121070c410b200341c8006a41386a200141c0006a290300370300200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341206a200341c8006a20034198026a109a0220032802242105200328022021044100210941012106410121074101210b4101210c0c430b20034198026a41206a200141246a29020037030020034198026a41186a2001411c6a29020037030020034198026a41106a200141146a29020037030020034198026a41086a2001410c6a2902003703002003200129020437039802200341c8006a41206a200241206a290200370300200341c8006a41186a200241186a290200370300200341c8006a41106a200241106a290200370300200341c8006a41086a200241086a29020037030020032002290200370348200341286a20034198026a200341c8006a10fd02200328022c2105200328022821044100210d41012106410121074101210b4101210c410121090c430b200141086a280200212020012802042121200341c8006a2001410c6a41c4001094041a2002411a6a290100211f200241196a2d0000210d200241186a2d0000210e200241166a2f0100210f200241156a2d00002114200241146a2d00002117200241126a2f01002118200241116a2d0000211e200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d00002127200241086a2d00002128200241066a2f01002129200241056a2d0000212a200241046a2d0000212b200241026a2f0100212c20022d0001210c20022d00002109200341f0016a20034184016a290200370300200341e8016a200341fc006a290200370300200341e0016a200341f4006a290200370300200341d8016a200341ec006a290200370300200341b8016a41186a200341e4006a290200370300200341b8016a41106a200341c8006a41146a290200370300200341b8016a41086a200341c8006a410c6a2902003703002003200329024c3703b80141012102412a21054100210841db94c300210420090d0841002109200c41ff01714101470d092029410874202a722028411874722104410021022025210820262109202721050c090b200341c8006a200141086a41e8001094041a20034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341386a200341c8006a20034198026a10ce02200328023c2105200328023821044100210841012106410121074101210b4101210c410121094101210d4101210e0c430b200141086a280200210c2001280204210d412a210541db94c300210420022d0000450d0441012108410021094100210b0c050b20034198026a41206a200141286a29030037030020034198026a41186a200141206a29030037030020034198026a41106a200141186a29030037030020034198026a41086a200141106a2903003703002003200141086a29030037039802200341c8006a41206a200241206a290200370300200341c8006a41186a200241186a290200370300200341c8006a41106a200241106a290200370300200341c8006a41086a200241086a29020037030020032002290200370348200341186a20034198026a200341c8006a1057200328021c2105200328021821044100210c41012106410121074101210b0c3d0b200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341106a200341c8006a20034198026a10830120032802142105200328021021044100210b41012106410121070c3b0b41db94c30021044100211d412a211e200241ff01710d0b41002102200541ff01714101470d0c20174108742018722016411874722104410021092015211e2014211d201321020c0c0b410121070c380b41012108410021094100210b20022d00014101470d002002410c6a2d000021092002410a6a2f0100210b200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021080b200b41ffff0371410874200941187472200541ff017172210502402008450d004100210e410121060240200c450d00200d10230b410121074101210b4101210c410121094101210d0c3c0b410121060240200c450d00200d10230b4100210e410121074101210b4101210c410121094101210d0c280b410021090b200941ffff0371410874200841187472200541ff017172210502402002450d002020450d340c330b2003201f370390022003200d3a008f022003200e3a008e022003200f3b018c02200320143a008b02200320173a008a02200320183b0188022003201e3a008702200320223a008602200320233b018402200320243a008302200320053600ff01200320043600fb012003202b3a00fa012003202c3b01f80120034198026a200341f8016a10fe02200341b8016a41206a2125200341b9026a212620034198026a4101722127410421244100211e41002117410021020c200b200a422088a72109200aa7210b200220057241ff0171450d0e02402009450d002009410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b4101211141002112200b450d2f0c2e0b200aa72108200220057241ff0171450d0e41b394c300210441282105410121074100210620080d2f0c320b200a422088a72109200aa7210b200220057241ff0171450d0e02402009450d00200941186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b4100211141012112200b0d2c0c2d0b41012107200220057241ff0171450d0e41b394c300210441282105410021060c300b410021020b201d41ffff0371410874201e41ff017172200241187472210520090d262003200a370398032003200b3a0097032003200c3a0096032003200d3b0194032003200e3a0093032003200f3a009203200320063b019003200320073a008f03200320103a008e03200320113b018c03200320123a008b0320032005360087032003200436008303200320193a0082032003201a3b01800320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801200341b8016a411041a886c500410041001001417f460d03200341e0006a4200370300200341c8006a41106a4200370300200341c8006a41086a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d172002411f4d0d1720034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2205200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092005290300370300200c200b29030037030020032003290398023703480c040b410021020b201d41ffff0371410874201e41ff017172200241187472210520090d05200320193a0082032003201a3b0180032003200a370398032003200b3a0097032003200c3a0096032003200d3b0194032003200e3a0093032003200f3a009203200320063b019003200320073a008f03200320103a008e03200320113b018c03200320123a008b032003200536008703200320043600830320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801200341b8016a411041a886c500410041001001417f460d03200341e0006a4200370300200341c8006a41106a4200370300200341d0006a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d162002411f4d0d1620034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2205200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092005290300370300200c200b29030037030020032003290398023703480c040b41db94c3002104412a2105410121074100210620080d280c2b0b200341e0006a4200370300200341c8006a41106a4200370300200341c8006a41086a4200370300200342003703480b024020034180036a200341c8006a4120109604450d0041e8cec3002104413121050c220b200341c8006a410d6a2202200341c0036a410d6a290000370000200341c8006a41086a2204200341c0036a41086a290300370300200320032903c003370348200841ff01714101470d08200341f8016a201c41067610870120032802f8012104200328028002201c413f7122024d0d0b200341c0016a200420024105746a220241136a290000370300200341c5016a200241186a2900003700002003200229000b3703b80120022f0000200241026a2d00004110747221052002280007211b2002280003211c4101210220032802fc01450d1d0c1c0b200341e0006a4200370300200341c8006a41106a4200370300200341d0006a4200370300200342003703480b20034180036a200341c8006a4120109604450d014199cfc3002104412221050b20081024200810230c1e0b200341c8006a200841f0001094041a41002104200341003b019802200341c0006a200341c8006a20034198026a10d20220032802402202450d0520022003280244100f410021020c060b02402009410c6c2202450d00201020026a21042010210203402002280200200241086a28020010032002410c6a22022004470d000b0b02402009450d002009410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b4101211141002112200b450d120c110b41f9c7c30041052010200a422088a71004412a21054101210720080d120c130b0240200941186c2202450d00201020026a21042010210203402002280200200241086a2802002002410c6a280200200241146a2802001004200241186a22022004470d000b0b02402009450d00200941186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b4100211141012112200b0d0f0c100b410810262202450d0c2002200a37000041efc7c300410a2002410810042002102341002106412a21050c120b200341b8016a410d6a2002290000370000200341b8016a41086a2004290300370300200320032903483703b801200841087621050c150b410121020b200320023a004a2003410b3b014841a886c5004100200341c8006a102c200810230c150b4100210220032802fc010d100c110b10ff02000b41d4aac10041331021000b200341dc006a41013602002003410136029c022003418898c400360298022003420137024c200341d497c400360248200320034198026a360258200341c8006a41d0cec3001061000b200341dc006a41013602002003410136029c022003418898c400360298022003420137024c200341d497c400360248200320034198026a360258200341c8006a41949bc3001061000b41b0a4c100104f000b41c4a5c100104f000b41d4aac10041331021000b41d4aac10041331021000b41084101102a000b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000104040b02400240201741014622020d0041a886c50021144100210420170d0141202104200341b8016a21140c010b41202104202521140b41012122410021180240024002400240024020032d0098024101470d0002400240024020020d0020170d014120210e202721184100212241202004470d030c020b4120210e202621184100212241202004460d010c020b4100210e41a886c50021184100212241002004470d010b024020182014460d002004210e2018201420041096040d010b201e2017470d03201e4101742202201e41016a220420042002491b2202ad420486221f422088a70d0a201fa722044100480d0a201e450d012024201e4104742004102722240d020c160b410e10262202450d0b200241066a41002900edcd44370000200241002900e7cd443700002002410e411c10272202450d0c2002201736000e200341e0036a41186a22054200370300200341e0036a41106a22084200370300200341e0036a41086a22094200370300200342003703e00320024112200341e0036a1002200341c0036a41186a2005290300370300200341c0036a41106a2008290300370300200341c0036a41086a2009290300370300200320032903e0033703c00302400240200341c0036a412041a886c500410041001001417f460d00200342203702e4032003200341c0036a3602e00320034180036a200341e0036a10a802200328028003220d450d11200329028403211f0c010b4200211f4104210d0b20021023410021020240201f422088222da72223450d00024020234101460d004100210220232105034002400240200d2005410176220920026a220c410c6c6a22082802002014200420082802082208200820044b1b109604220f450d00417f4101200f4100481b21080c010b4100417f410120082004491b20082004461b21080b2002200c20084101461b2102200520096b220541014b0d000b0b02400240200d2002410c6c6a22052802002014200420052802082205200520044b1b1096042208450d00417f410120084100481b21050c010b20052004460d08417f410120052004491b21050b20022005417f466a21020b024002402004450d00200410262209450d102009201420041094041a2002202da722054b0d0f0c010b410121092002202da722054b0d0e0b0240024002402005201fa7470d00200541016a22082005490d0c2005410174220c20082008200c491bad222e420c7e222f422088a70d0c202fa722084100480d0c2005450d01200d2005410c6c20081027220d0d020c130b201f212e0c010b20081026220d450d110b200d2002410c6c6a2208410c6a2008200520026b410c6c1095041a200820043602082008200436020420082009360200202e42ffffffff0f83222f202d42017c222e42208684212d0240024002400240024020220d00202ea7220f450d02410021020240200f4101460d0041002102200f2104034002400240200d2004410176220820026a2209410c6c6a22052802002018200e200528020822052005200e4b1b109604220c450d00417f4101200c4100481b21050c010b4100417f41012005200e491b2005200e461b21050b2002200920054101461b2102200420086b220441014b0d000b0b200d2002410c6c6a220428020022092018200e200428020822052005200e4b1b10960421082005200e470d0220080d022002200f4f0d192004280204210520042004410c6a200f2002417f736a410c6c1095041a202f201f4280808080708384212d20050d010b201e2017460d020c030b20091023201e2017460d010c020b41f5cdc400412a100f201e2017470d010b201e4101742202201e41016a220420042002491b2202ad420486221f422088a70d0a201fa722044100480d0a02400240201e450d002024201e4104742004102722240d010c140b200410262224450d130b2002211e0b202420174104746a2202200d36020420022017360200200241086a202d370200201741016a22174102490d1b0c030b200410262224450d140b2002211e0b202420174104746a4100360204201741016a22174102490d170b4104211120174104742202450d01202420026a21304110211d410e211b4106213141002115411c21324118211c4200210a41082106411221334201213442202135410c210b412021364174211241012116202421190c180b2019201d6a21180240201928020422220d002018211920182030470d1a0c010b201928020021042019290208211f201b10262202450d0d200220316a20152900edcd44370000200220152900e7cd443700002002201b203210272219450d0e2019200436000e200341e0036a201c6a2202200a370300200341e0036a201d6a2204200a370300200341e0036a20066a2205200a3703002003200a3703e00320192033200341e0036a1002200341c0036a201c6a2002290300370300200341c0036a201d6a2004290300370300200341c0036a20066a2005290300370300200320032903e0033703c00320034180036a20066a220d201536020020032034370380032003201f203588a722233602e0032023200b6c210c200341e0036a20034180036a104102400240024020230d002003280284032102200341c0036a20362003280280032209200d280200100420020d010c020b2022200c6a21142022210403402004280200210e2003200420066a28020022023602e003200341e0036a20034180036a104102400240024002402003280284032208200d28020022056b20024f0d00200520026a22092005490d0b2008201674220f20092009200f491b220f2015480d0b2008450d012003280280032008200f102722090d020c0c0b20032802800321090c020b200f10262209450d0a0b2003200f360284032003200936028003200f21080b200d200520026a220f360200200920056a200e20021094041a2004200b6a22042014470d000b200341c0036a20362009200f10042008450d010b200910230b2019102302402023450d002022210203400240200220116a280200450d00200228020010230b2002200b6a2102200c20126a220c0d000b0b0240201fa7450d00202210230b2018211920182030470d180b0240201e450d00202410230b200341e0026a41186a200341f8016a41186a290300370300200341e0026a41106a200341f8016a41106a290300370300200341e0026a41086a200341f8016a41086a290300370300200320032903f8013703e00220034180036a41386a200341b8016a41386a29030037030020034180036a41306a200341b8016a41306a29030037030020034180036a41286a200341b8016a41286a29030037030020034180036a41206a200341b8016a41206a29030037030020034180036a41186a200341b8016a41186a29030037030020034180036a41106a200341b8016a41106a29030037030020034180036a41086a200341b8016a41086a290300370300200320032903b80137038003411210262202450d10200241106a41002f00c4ad443b0000200241086a41002900bcad44370000200241002900b4ad4437000020024112413210272202450d11200220032903e0023700122002412a6a200341e0026a41186a290300370000200241226a200341e0026a41106a2903003700002002411a6a200341e0026a41086a290300370000200341e0036a41186a22044200370300200341e0036a41106a22054200370300200341e0036a41086a22084200370300200342003703e00320024132200341e0036a1002200341c0036a41186a2004290300370300200341c0036a41106a2005290300370300200341c0036a41086a2008290300370300200320032903e0033703c003412010262204450d122004200329038003370000200441186a20034180036a41186a290300370000200441106a20034180036a41106a290300370000200441086a20034180036a41086a2903003700002004412041c00010272204450d13200420032903a003370020200441386a20034180036a41386a290300370000200441306a20034180036a41306a290300370000200441286a20034180036a41286a290300370000200341c0036a4120200441c00010042004102320021023200341013a00e00320034180046a41086a22024200370300200342003703800441dfbac400410f20034180046a100020034180036a41086a200229030037030020032003290380043703800320034180036a4110200341e0036a410110044100210402402020450d00202110230b0c2d0b02402023450d00201f422088a7410c6c2104200d210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b0240201fa7450d00200d10230b2017450d0141042110202420174104746a213741102138410c210741082139417421132024211a410221020c190b201a220520386a211a024020052802042202450d000240200520076a2802002204450d00200420076c210403400240200220106a280200450d00200228020010230b200220076a2102200420136a22040d000b0b200520396a280200450d00200520106a28020010230b201a2037470d170b0240201e450d00202410230b41d1cdc40021044116210520200d290c2a0b101e000b200f4101102a000b410e4101102a000b411c4101102a000b4180e4c400104f000b20044101102a000b41d4aac10041331021000b20084104102a000b20044104102a000b410e4101102a000b411c4101102a000b41fcc3c200104f000b20044104102a000b41124101102a000b41324101102a000b41204101102a000b41c0004101102a000b410021020c050b410021020c040b410121020c030b410121020c020b410121020c010b410221020c000b0b201010230b412a21054101210702402008417f6a220241044b0d00410021064101210b4101210c410121094101210d4101210e410121084101210f41002104024002400240024020020e05001d020301000b4100210641000d06200aa70d040c060b410021062012450d050240200a422088a72202450d002002410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b200aa70d030c040b4100210641000d04200aa70d020c040b410021062011450d030240200a422088a72202450d00200241186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b200aa70d010c020b0240200a422088a72202450d002002410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b200aa7450d010b201010230b410021060b4101210b4101210c410121094101210d4101210e0b410121084101210f4100210420012802002202410c4d0d150c160b200410230b20020d00410121024115211b41d9cac400211c0c010b200341c8006a410d6a200341b8016a410d6a290000370000200341c8006a41086a200341b8016a41086a290300370300200320032903b801370348410021020b20034198026a41106a200341c8006a41106a29030037030020034198026a41086a2204200341c8006a41086a290300370300200320032903483703980202402002450d00201b2105201c21040c020b200341e0036a410d6a20034198026a410d6a290000370000200341e0036a41086a200429030037030020032003290398023703e00320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b80102400240200341b8016a411041a886c500410041001001417f460d00200341e0006a4200370300200341c8006a41106a4200370300200341d0006a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d042002411f4d0d0420034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2208200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092008290300370300200c200b29030037030020032003290398023703480c010b200341e0006a4200370300200341d8006a4200370300200341d0006a4200370300200342003703480b20034198026a41186a2202200341c8006a41186a29030037030020034198026a41106a2204200341c8006a41106a29030037030020034198026a41086a2209200341c8006a41086a22082903003703002003200329034837039802200341d2006a2009290300370100200341da006a2004290300370100200341e2006a20022903003701002003418b023b0148200320032903980237014a4100210441a886c5004100200341c8006a102c200341c8006a410d6a2209200341e0036a410d6a2900003700002008200341e0036a41086a290300370300200320032903e00337034820034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801412010262202450d03200220053b00002002201b3600072002201c3600032002200329034837000b200241026a20054110763a0000200241136a2008290300370000200241186a2009290000370000200341b8016a4110200241201004200210230b0b4100210f41012106410121074101210b4101210c410121094101210d4101210e4101210820012802002202410c4d0d0f0c100b41d4aac10041331021000b41204101102a000b201010230b41b394c300210441282105410121074100210602402008417f6a220241044b0d004101210b4101210c410121094101210d4101210e410121084101210f024002400240024020020e05000f020301000b200aa70d040c070b2012450d060240200a422088a72202450d002002410c6c21082010210203400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200aa70d030c060b4100210641000d05200aa70d020c050b2011450d040240200a422088a72202450d00200241186c21082010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200841686a22080d000b0b200aa70d010c040b0240200a422088a72202450d002002410c6c21082010210203400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200aa7450d030b201010230c020b202110230b41002107410121060b4101210b0b4101210c0b410121090b4101210d0b4101210e0b410121080b4101210f0b20012802002202410c4b0d010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0d02151515000507040615011503020b2007450d14200141086a280200450d14200128020410230c140b200e450d13200141086a280200450d13200128020410230c130b2006450d12200141086a280200220241044b0d0c024020020e051300130c0b130b200141106a280200450d122001410c6a28020010230c120b2008450d11200141086a2d0000220241054b0d0d024020020e061212000f0d12120b200141106a280200450d112001410c6a28020010230c110b2009450d10200141086a28020022024102460d0320024101470d10200141106a280200450d102001410c6a28020010230c100b200b450d0f200141086a2d00002202410c4b0d0d20024106470d0f200141106a280200450d0f2001410c6a28020010230c0f0b200d450d0e20012d000422024102460d0220024101470d0e200141086a22022802001024200228020010230c0e0b200c450d0d200141086a2d0000417f6a220241074b0d0d024020020e08000e0e0e040e0305000b2001410c6a22022802001024200228020010230c0d0b200141106a280200450d0c2001410c6a28020010230c0c0b2001410c6a22022802001024200228020010230c0b0b2001410c6a22022802001024200228020010230c0a0b2001410c6a22022802001024200228020010230c090b2001410c6a22022802001024200228020010230c080b0240200141146a2802002208450d002001410c6a2802002102200841186c210803400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200841686a22080d000b0b200141106a280200450d072001410c6a28020010230c070b200141106a280200450d062001410c6a28020010230c060b0240200141146a2802002208450d002001410c6a28020021022008410c6c210803400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200141106a280200450d052001410c6a28020010230c050b200141306a280200450d042001412c6a28020010230c040b200141d0006a280200450d03200141cc006a28020010230c030b200141346a280200450d02200141306a28020010230c020b200141106a280200450d012001410c6a28020010230c010b200f450d0020012802044101470d00200141086a22022802001024200228020010230b200020053602042000200436020020034190046a24000ba20b02037f017e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022024101460d00024020024102460d0020024103470d02200141046a280200200141086a2802002202470d05200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0b20012802002002200410272203450d0c0c150b200141046a280200200141086a2802002202470d02200241016a22032002490d1620024101742204200320032004491b22044100480d162002450d0620012802002002200410272203450d070c120b200141046a280200200141086a2802002202470d02200241016a22032002490d1520024101742204200320032004491b22044100480d152002450d0720012802002002200410272203450d080c0f0b200141046a280200200141086a2802002202470d03200241016a22032002490d1420024101742204200320032004491b22044100480d142002450d0a20012802002002200410272203450d0b0c0c0b200128020021030c100b200128020021030c0d0b200128020021030c100b200128020021030c090b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d090b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0b20024101742200200420042000491b22004100480d0b2002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000200041086a290300210502400240024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0920024101742200200320032000491b22004100480d092002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0720024101742200200420042000491b22004100480d072002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a0000200041086a2903002105024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0320024101742200200320032000491b22004100480d032002450d0120012802002002200010272202450d020c040b200128020021020c040b2000102622020d020b20004101102a000b101e000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000bbe0202047f017e230041c0006b22012400200141306a41086a2202420037030020014200370330418d9dc3004115200141306a1000200141086a41086a20022903003703002001200129033037030802400240200141086a411041a886c500410041001001417f460d002001200141086a3602182001411036021c200141003a00302001200141086a4110200141306a41014100100141016a220241014b36022020024102490d0120012d00302102200141306a200141186a102820012802302203450d012001412a6a41026a22042001412d6a41026a2d00003a0000200120012f002d3b012a20012902342105200020023a00002000200537020820002003360204200020012f012a3b0001200041036a20042d00003a0000200141c0006a24000f0b20004100360204200141c0006a24000f0b41d4aac10041331021000bf70605017f017e037f027e017f230041d0006b2201240042002102200141286a41086a220342003703002001420037032841fd98c300410d200141286a1000200141086a41086a20032903003703002001200129032837030841002103024002400240024002400240200141086a411041a886c500410041001001417f460d002001421037021c2001200141086a360218200141286a200141186a10a90220012802282204450d02200129022c2202422088a721032002a721050c010b41042104410021050b200141286a41206a200041206a280200360200200141286a41186a200041186a290200370300200141286a41106a200041106a290200370300200141286a41086a200041086a2902003703002001200029020037032820032005470d0320032002a7470d020240200341016a22002003490d0020034101742205200020002005491bad220642247e2207422088a70d002007a722004100480d00024002402003450d002004200341246c200010272204450d010c040b2000102622040d030b20004104102a000b101e000b41d4aac10041331021000b20024280808080708320068421020b2002422088a721030b2004200341246c22056a22002001290328370200200041206a200141286a41206a280200360200200041186a200141286a41186a290300370200200041106a200141286a41106a290300370200200041086a200141286a41086a22002903003702002001200242ffffffff0f83200341016a2203ad4220868437021c20012004360218200042003703002001420037032841fd98c300410d200141286a1000200141086a41086a2000290300370300200120012903283703082001411036022c2001200141086a360228200141186a200141286a10d6022002a7210802402003450d00200541246a21002004210303400240024020032d0000220541034b0d0002400240024020050e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a21032000415c6a22000d040c050b2003410c6a280200450d02200341086a2802001023200341246a21032000415c6a22000d030c040b2003410c6a280200450d01200341086a2802001023200341246a21032000415c6a22000d020c030b200341086a280200450d00200341046a28020010230b200341246a21032000415c6a22000d000b0b02402008450d00200410230b200141d0006a24000b8803010a7f230041206b22022400200241003602082002420137030020002802002103200220002802082200360210200241106a20021041024002400240024002402000450d00200041246c2104200241086a22052802002100200228020421060340200241106a2003108f03200228021021070240024002400240200620006b200241106a41086a28020022084f0d00200020086a22092000490d062006410174220a20092009200a491b220b4100480d062006450d0120022802002006200b1027220a0d020c070b200020086a21092002280200210a0c020b200b1026220a450d050b2002200b3602042002200a360200200b21060b20052009360200200a20006a200720081094041a02402002280214450d00200710230b200341246a2103200921002004415c6a22040d000b20012802002001280204200a200910042006450d040c030b20022802042100200128020020012802042002280200220a200241086a280200100420000d020c030b101e000b200b4101102a000b200a10230b200241206a24000bec0203027f017e027f230041c0006b2201240002400240411310262202450d002002410f6a41002800a99943360000200241086a41002900a299433700002002410029009a994337000020024113413310272202450d01200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a29000037000042002103200141206a41186a22004200370300200141206a41106a22044200370300200141206a41086a220542003703002001420037032020024133200141206a1002200141186a2000290300370300200141106a2004290300370300200141086a200529030037030020012001290320370300024002402001412041a886c500410041001001417f460d002001420037032020014120200141206a41084100100141016a41084d0d01200129032021030b20021023200141c0006a240020030f0b41d4aac10041331021000b41134101102a000b41334101102a000b800201017f02400240024020002d0000417b6a220141054b0d00024002400240024020010e06000104020403000b200041086a2d00004101470d03200041146a280200450d03200041106a2802001023200041fc006a2802000d040c050b200041046a2d00004103470d0202402000410c6a280200450d00200041086a28020010230b200041186a280200450d02200041146a2802001023200041fc006a2802000d030c040b200041086a280200450d01200041046a2802001023200041fc006a2802000d020c030b200041086a2d00004105490d00200041306a280200450d002000412c6a28020010230b200041fc006a280200450d010b200028027810230b0bec0301027f230041e0006b22032400200341003a0005024002402000413f4b0d00200320004102743a0000410121040c010b02402000418080014f0d00200320004106763a000141022104200341013a0005200320004102744101723a00000c010b024020004180808080044f0d00200341033a0005200320004106763a000120032000410e763a0002200320004116763a0003200320004102744102723a0000410421040c010b200341043a0005200341033a0000200320003a0001200320004108763a0002200320004110763a0003200320004118763a0004410521040b200320043a0005024002402001280200220028020822012002490d0020002802002100200320023602082003200436020c20042002470d012000200320021094041a200341003a0005200341e0006a24000f0b20022001108c01000b2003200341086a36024020032003410c6a360244200341c8006a41146a4100360200200341286a41146a4103360200200341346a4104360200200341106a41146a4103360200200341a886c5003602582003420137024c200341a881c5003602482003410436022c20034203370214200341d480c5003602102003200341c8006a3602382003200341c4006a3602302003200341c0006a3602282003200341286a360220200341106a41e481c5001061000bda0601077f230041106b220224000240024002400240024002400240024002400240024002400240024020002802704101470d00200141046a280200200141086a2802002203470d01200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d0320012802002003200510272204450d040c090b200141046a280200200141086a2802002203470d01200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041f4006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0820044101742203200520052003491b22034100480d082004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a20063600000c020b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00000b2000200110dd0220002802782103200220004180016a280200220036020c2002410c6a2001104102402000450d0020004105742106200141086a2104200141046a21070340024002400240024020072802002205200428020022006b41204f0d00200041206a22082000490d0620054101742200200820082000491b22004100480d062005450d01200128020020052000102722050d020c070b200128020021050c020b200010262205450d050b2001200536020020072000360200200428020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000b0b200241106a24000f0b101e000b20004101102a000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10e2032100200241206a240020000bc80201037f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110cc02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000bfecb0103077f027e027f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a2203410a4b0d00024020030e0b00070405020809060b030a000b200141046a280200200141086a2802002203470d11200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d2320012802002003200510272204450d240c4a0b200141046a280200200141086a2802002203470d0a200341016a22042003490d4b20034101742205200420042005491b22054100480d4b2003450d1620012802002003200510272204450d170c470b200141046a2205280200200141086a22042802002203470d0a200341016a22062003490d4a20034101742207200620062007491b22074100480d4a2003450d1720012802002003200710272206450d180c420b200141046a280200200141086a2802002203470d0a200341016a22042003490d3e20034101742205200420042005491b22054100480d3e2003450d1820012802002003200510272204450d190c3c0b200141046a280200200141086a2802002203470d0a200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d1920012802002003200510272204450d1a0c390b200141046a280200200141086a2802002203470d0a200341016a22042003490d4720034101742205200420042005491b22054100480d472003450d1a20012802002003200510272204450d1b0c360b200141046a280200200141086a2802002203470d0a200341016a22042003490d3b20034101742205200420042005491b22054100480d3b2003450d1b20012802002003200510272204450d1c0c330b200141046a280200200141086a2802002203470d0b200341016a22042003490d4520034101742205200420042005491b22054100480d452003450d1e20012802002003200510272204450d1f0c300b200141046a280200200141086a2802002203470d0b200341016a22042003490d4420034101742205200420042005491b22054100480d442003450d1f20012802002003200510272204450d200c2d0b200141046a2205280200200141086a22032802002204470d0b200441016a22062004490d4320044101742207200620062007491b22074100480d432004450d2020012802002004200710272206450d210c2a0b200141046a280200200141086a2802002203470d0b200341016a22042003490d3720034101742205200420042005491b22054100480d372003450d2120012802002003200510272204450d220c270b200141046a280200200141086a2802002203470d0b200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d2220012802002003200510272204450d230c240b200128020021040c3d0b200128020021060c380b200128020021040c320b200128020021040c2f0b200128020021040c2c0b200128020021040c290b200128020021040c390b200128020021040c250b200128020021040c220b200128020021060c1f0b200128020021040c1c0b200128020021040c190b2005102622040d300b20054101102a000b2007102622060d2a0b20074101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d170b20054101102a000b2005102622040d260b20054101102a000b2005102622040d110b20054101102a000b2005102622040d0d0b20054101102a000b2007102622060d090b20074101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2d20034101742205200420042005491b22054100480d2d2003450d0f20012802002003200510272204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0a20012802002003200510272204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000412c6a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320093700082003200a37000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1b20044101742203200020002003491b22034100480d1b2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1920044101742203200020002003491b22034100480d192004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1720044101742203200520052003491b22034100480d172004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1520044101742203200020002003491b22034100480d152004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a0000200041026a2104200141046a2802002106200528020021030240024002400240024002400240024002400240024020002d00014101470d0020062003470d01200341016a22002003490d1920034101742205200020002005491b22054100480d192003450d0320012802002003200510272200450d040c090b20062003470d01200341016a22002003490d1820034101742205200020002005491b22054100480d182003450d0420012802002003200510272200450d050c060b200128020021000c080b200128020021000c050b2005102622000d050b20054101102a000b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22002003490d1520034101742205200020002005491b22054100480d152003450d0120012802002003200510272200450d020c030b200128020021000c030b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a20042d00003a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a000002400240024002400240200141046a2802002200200528020022036b41204f0d00200341206a22052003490d1320004101742203200520052003491b22034100480d132000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200020036a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a29000037000020012004290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41073a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d0000417f6a220441044b0d000240024002400240024020040e050004020301000b200528020020032802002204470d08200441016a22062004490d2f20044101742207200620062007491b22074100480d2f2004450d1120012802002004200710272206450d120c210b200528020020032802002204470d04200441016a22062004490d2e20044101742207200620062007491b22074100480d2e2004450d0a20012802002004200710272206450d0b0c1e0b200528020020032802002204470d04200441016a22062004490d2d20044101742207200620062007491b22074100480d2d2004450d0b20012802002004200710272206450d0c0c1b0b200528020020032802002204470d04200441016a22062004490d2c20044101742207200620062007491b22074100480d2c2004450d0c20012802002004200710272206450d0d0c180b200528020020032802002204470d05200441016a22062004490d2b20044101742207200620062007491b22074100480d2b2004450d0f20012802002004200710272206450d100c150b200528020020032802002204470d05200441016a22062004490d3520044101742207200620062007491b22074100480d352004450d1020012802002004200710272206450d110c120b200128020021060c1a0b200128020021060c170b200128020021060c140b200128020021060c190b200128020021060c100b200128020021060c0d0b2007102622060d130b20074101102a000b2007102622060d0f0b20074101102a000b2007102622060d0b0b20074101102a000b2007102622060d0f0b20074101102a000b2007102622060d050b20074101102a000b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41003a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1b20064101742204200720072004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a29000037000020042006290000370000200041c8006a28020021070240024002400240024020052802002206200328020022046b41044f0d00200441046a22082004490d1b20064101742204200820082004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441046a360200200620046a20073600000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1b20064101742204200720072004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041256a220641186a290000370000200441106a200641106a290000370000200441086a200641086a29000037000020042006290000370000200041cc006a28020021060240024002400240024020052802002200200328020022046b41044f0d00200441046a22052004490d1b20004101742204200520052004491b22044100480d1b2000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b2003200441046a360200200020046a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41023a00000240024002400240024020052802002205200328020022046b41204f0d00200441206a22062004490d1920054101742204200620062004491b22044100480d192005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b2003200441206a360200200520046a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41043a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1720064101742204200720072004491b22044100480d172006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22052004490d1720044101742206200520052006491b22064100480d172004450d0120012802002004200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a200041256a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41033a00000240024002400240024020052802002205200328020022046b41204f0d00200441206a22062004490d1520054101742204200620062004491b22044100480d152005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b2003200441206a360200200520046a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41053a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1320064101742204200720072004491b22044100480d132006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22052004490d1320044101742206200520052006491b22064100480d132004450d0120012802002004200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a200041256a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41013a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1120064101742204200720072004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a290000370000200420062900003700000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1120064101742204200720072004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041256a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22062004490d1120044101742207200620062007491b22074100480d112004450d0120012802002004200710272206450d020c030b200128020021060c030b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a200041c5006a2d00003a0000200041c8006a28020021070240024002400240024020052802002206200328020022046b41044f0d00200441046a22082004490d1120064101742204200820082004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441046a360200200620046a2007360000200041cc006a28020021060240024002400240024020052802002200200328020022046b41044f0d00200441046a22052004490d1120004101742204200520052004491b22044100480d112000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b2003200441046a360200200020046a2006360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d0b20012802002003200510272204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0620012802002003200510272204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0720012802002003200510272204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0a20012802002003200510272204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d090b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041086a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041086a28020021032002200041106a280200220436020c2002410c6a200110410240024002402004450d0020044105742107200141046a21080340024002400240024020082802002206200528020022046b41204f0d00200441206a220b2004490d1d20064101742204200b200b2004491b22044100480d1d2006450d01200128020020062004102722060d020c060b200128020021060c020b200410262206450d040b2001200636020020082004360200200528020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200041146a280200210320022000411c6a280200220436020c2002410c6a200110412004450d1120044105742106200141086a2100200141046a21070340024002400240024020072802002205200028020022046b41204f0d00200441206a22082004490d1c20054101742204200820082004491b22044100480d1c2005450d01200128020020052004102722050d020c060b200128020021050c020b200410262205450d040b2001200536020020072004360200200028020021040b2000200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200641606a22060d000c120b0b20044101102a000b20044101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00000240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034102460d00024020034101460d0020030d1e200141046a280200200141086a2802002203470d04200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0920012802002003200510272204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0420012802002003200510272204450d050c0c0b200141046a28020020052802002203470d01200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0520012802002003200510272204450d060c090b200128020021040c0b0b200128020021040c080b200128020021040c0b0b2005102622040d070b20054101102a000b2005102622040d030b20054101102a000b2005102622040d050b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002109200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320093700082003200a370000200041e8006a2903002109200041e0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1c20044101742203200020002003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1a20044101742203200520052003491b22034100480d1a2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1820044101742203200520052003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1820044101742203200020002003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22044100480d0b2003450d0120012802002003200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200041046a280200210320022000410c6a280200220036020c2002410c6a200110412000450d0b2003200041286c6a2108200141046a2105024002400340024002400240024020052802002206200428020022006b41204f0d00200041206a22072000490d0d20064101742200200720072000491b22004100480d0d2006450d01200128020020062000102722060d020c050b200128020021060c020b200010262206450d030b2001200636020020052000360200200428020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2903002109024002400240024020052802002206200428020022006b41084f0d00200041086a22072000490d0d20064101742200200720072000491b22004100480d0d2006450d01200128020020062000102722060d020c060b200128020021060c020b200010262206450d040b2001200636020020052000360200200428020021000b2004200041086a360200200620006a20093700002008200341286a2203470d000c0e0b0b20004101102a000b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d0020034102470d01200141046a280200200141086a2802002203470d03200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0720012802002003200510272204450d080c0f0b200141046a28020020052802002203470d01200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0420012802002003200510272204450d050c0c0b200141046a280200200141086a2802002203470d02200341016a22042003490d1e20034101742205200420042005491b22054100480d1e2003450d0720012802002003200510272204450d080c090b200128020021040c0b0b200128020021040c0c0b200128020021040c070b2005102622040d070b20054101102a000b2005102622040d070b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1820044101742203200020002003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1620044101742203200520052003491b22034100480d162004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1420044101742203200520052003491b22034100480d142004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1420044101742203200020002003491b22034100480d142004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041046a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1220044101742203200520052003491b22034100480d122004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341044b0d000240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d08200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d1120012802002003200510272204450d120c210b200141046a280200200141086a2802002203470d04200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0a20012802002003200510272204450d0b0c1e0b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0b20012802002003200510272204450d0c0c1b0b200141046a280200200141086a2802002203470d04200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0c20012802002003200510272204450d0d0c180b200141046a280200200141086a2802002203470d05200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0f20012802002003200510272204450d100c150b200141046a28020020052802002203470d05200341016a22042003490d1e20034101742205200420042005491b22054100480d1e2003450d1020012802002003200510272204450d110c120b200128020021040c1a0b200128020021040c170b200128020021040c140b200128020021040c190b200128020021040c100b200128020021040c0d0b2005102622040d130b20054101102a000b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d0f0b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002109200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d0f20044101742203200020002003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0d20044101742203200520052003491b22034100480d0d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0b20044101742203200520052003491b22034100480d0b2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041296a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0920044101742203200520052003491b22034100480d092004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0720044101742203200520052003491b22034100480d072004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a28020021062002200041346a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002200200528020022046b20034f0d00200420036a22052004490d0720004101742204200520052004491b22044100480d072000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200020046a200620031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310272204450d020c040b200128020021040c040b2003102622040d020b20034101102a000b101e000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341094b0d0002400240024002400240024002400240024020030e0a00060304010708050a02000b200528020020042802002203470d0f200341016a22062003490d4720034101742207200620062007491b22074100480d472003450d1f20012802002003200710272206450d200c3f0b200528020020042802002203470d09200341016a22062003490d4620034101742207200620062007491b22074100480d462003450d1420012802002003200710272206450d150c3c0b200528020020042802002203470d09200341016a22062003490d4520034101742207200620062007491b22074100480d452003450d1520012802002003200710272206450d160c390b200528020020042802002203470d09200341016a22062003490d4420034101742207200620062007491b22074100480d442003450d1620012802002003200710272206450d170c360b200528020020042802002203470d09200341016a22062003490d4320034101742207200620062007491b22074100480d432003450d1720012802002003200710272206450d180c330b200528020020042802002203470d09200341016a22062003490d4220034101742207200620062007491b22074100480d422003450d1820012802002003200710272206450d190c300b200528020020042802002203470d0a200341016a22002003490d4120034101742205200020002005491b22054100480d412003450d1b20012802002003200510272200450d1c0c2d0b200528020020042802002203470d0a200341016a22062003490d4020034101742207200620062007491b22074100480d402003450d1c20012802002003200710272206450d1d0c2a0b200528020020042802002203470d0a200341016a22062003490d3f20034101742207200620062007491b22074100480d3f2003450d1d20012802002003200710272206450d1e0c270b200528020020042802002203470d0a200341016a22062003490d3e20034101742207200620062007491b22074100480d3e2003450d1e20012802002003200710272206450d1f0c240b200528020020042802002203470d0a200341016a22062003490d3d20034101742207200620062007491b22074100480d3d2003450d1f20012802002003200710272206450d200c210b200128020021060c330b200128020021060c300b200128020021060c2d0b200128020021060c2a0b200128020021060c270b200128020021060c300b200128020021000c230b200128020021060c200b200128020021060c1d0b200128020021060c1a0b200128020021060c170b2007102622060d270b20074101102a000b2007102622060d230b20074101102a000b2007102622060d1f0b20074101102a000b2007102622060d1b0b20074101102a000b2007102622060d170b20074101102a000b2007102622060d1f0b20074101102a000b2005102622000d110b20054101102a000b2007102622060d0d0b20074101102a000b2007102622060d090b20074101102a000b2007102622060d050b20074101102a000b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41093a00000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1f20054101742203200620062003491b22034100480d1f2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41003a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1d20064101742203200820082003491b22034100480d1d2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041186a2903002109200041106a290300210a0240024002400240024020052802002200200428020022036b41104f0d00200341106a22052003490d1d20004101742203200520052003491b22034100480d1d2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341106a360200200020036a220120093700082001200a370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1b20064101742203200820082003491b22034100480d1b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240200528020020042802002203470d00200341016a22052003490d1b20034101742206200520052006491b22064100480d1b2003450d0120012802002003200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41063a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1920004101742203200520052003491b22034100480d192000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41083a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d1520064101742203200720072003491b22034100480d152006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1520054101742203200620062003491b22034100480d152005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41043a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1320004101742203200520052003491b22034100480d132000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41033a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1120064101742203200820082003491b22034100480d112006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200528020020042802002203470d03200341016a22002003490d1d20034101742205200020002005491b22054100480d1d2003450d0720012802002003200510272200450d080c0f0b200528020020042802002203470d01200341016a22002003490d1c20034101742205200020002005491b22054100480d1c2003450d0420012802002003200510272200450d050c0c0b200528020020042802002203470d02200341016a22002003490d1b20034101742205200020002005491b22054100480d1b2003450d0720012802002003200510272200450d080c090b200128020021000c0b0b200128020021000c0c0b200128020021000c070b2005102622000d070b20054101102a000b2005102622000d070b20054101102a000b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41003a00000c0a0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41013a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a410a3a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d0f20064101742203200720072003491b22034100480d0f2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d0f20064101742203200720072003491b22034100480d0f2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041296a220641186a290000370000200341106a200641106a290000370000200341086a200641086a29000037000020032006290000370000200041d0006a29030021090240024002400240024020052802002200200428020022036b41084f0d00200341086a22052003490d0f20004101742203200520052003491b22034100480d0f2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341086a360200200020036a2009370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d0d20004101742203200520052003491b22034100480d0d2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41013a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d0b20064101742203200820082003491b22034100480d0b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041286a2903002109200041206a290300210a0240024002400240024020052802002206200428020022036b41104f0d00200341106a22072003490d0b20064101742203200720072003491b22034100480d0b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200620036a220320093700082003200a370000200041106a28020021032002200041186a280200220036020c2002410c6a200110412000450d0020004105742107200141046a210c0340024002400240024020052802002206200428020022006b41204f0d00200041206a22082000490d0b20064101742200200820082000491b22004100480d0b2006450d01200128020020062000102722060d020c060b200128020021060c020b200010262206450d040b20012006360200200c2000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000b0b200241106a24000f0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a28020021042005280200210302400240024002400240024002400240024002400240200041016a2d00004101470d0020042003470d01200341016a22042003490d0d20034101742200200420042000491b22004100480d0d2003450d0320012802002003200010272204450d040c090b20042003470d01200341016a22042003490d0c20034101742200200420042000491b22004100480d0c2003450d0420012802002003200010272204450d050c060b200128020021040c080b200128020021040c050b2000102622040d050b20004101102a000b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a2802002100024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310272204450d020c040b200128020021040c040b2003102622040d020b20034101102a000b101e000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000b130020004105360204200041b89ec3003602000b130020004106360204200041baa3c3003602000bce0101047f230041206b22002400024002400240418595c300411041a886c500410041001001417f460d002000410036021041012101418595c3004110200041106a41044100100141016a41044d0d0220002802102102418595c300411010030c010b410021010b200041106a41086a220342003703002000420037031041a895c3004115200041106a1000200041086a20032903003703002000200029031037030020002002410020011b36021020004110200041106a41041004200041206a24000f0b41d4aac10041331021000b13002000410d360204200041c0a3c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010262206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b41204101102a000b7901027f230041106b2202240020024100360208200242013703000240410110262203450d00200341003a00002002428180808010370204200220033602002002410036020c2002410c6a20021041200041086a200241086a28020036020020002002290300370200200241106a24000f0b41014101102a000b8e1206037f017e057f017e047f027e230041d0016b22012400200141b0016a41086a22024200370300200142003703b00141a895c3004115200141b0016a1000200141f0006a41086a22032002290300370300200120012903b001370370200141f0006a4110100320024200370300200142003703b00141bd95c300411a200141b0016a100020032002290300370300200120012903b001370370200141f0006a41101003200141af98c300410d109201200129030821042001280200210520024200370300200142003703b00141fc9cc3004111200141b0016a100020032002290300370300200120012903b001370370024002400240024002400240024002400240200141f0006a411041a886c500410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d022002411f4d0d0220014190016a41186a2206200141b0016a41186a220229030037030020014190016a41106a2207200141b0016a41106a220329030037030020014190016a41086a2208200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100320022006290300370300200320072903003703002009200829030037030020012001290390013703b001200141106a41186a2002290300370300200141106a41106a2003290300370300200141106a41086a2009290300370300200120012903b0013703100c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141106a41186a4200370300200141106a41106a4200370300200141106a41086a4200370300200142003703100b4200210a200141b0016a41086a22024200370300200142003703b00141fd98c300410d200141b0016a1000200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041a886c500410041001001417f460d0020014210370294012001200141f0006a36029001200141b0016a20014190016a10a90220012802b0012206450d0520012902b401210a200141f0006a411010030c010b410421060b200141b0016a41086a22024200370300200142003703b00141bc98c3004115200141b0016a1000200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041a886c500410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d032002411f4d0d0320014190016a41186a2207200141b0016a41186a220229030037030020014190016a41106a2208200141b0016a41106a220329030037030020014190016a41086a220b200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100320022007290300370300200320082903003703002009200b29030037030020012001290390013703b001200141306a41186a2002290300370300200141306a41106a2003290300370300200141306a41086a2009290300370300200120012903b0013703300c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141306a41186a4200370300200141306a41106a4200370300200141306a41086a4200370300200142003703300b200141f0006a41186a22024200370300200141f0006a41106a22034200370300200141f0006a41086a2209420037030020014200370370200141f0006a1015200141d0006a41186a2002290300370300200141d0006a41106a2003290300370300200141d0006a41086a200929030037030020012001290370370350200141b0016a41186a2207200141106a41186a290300370300200141b0016a41106a2208200141106a41106a290300370300200141b0016a41086a220b200141106a41086a290300370300200120012903103703b00120024200370300200342003703002009420037030020014200370370200141b0016a4120200141f0006a1016450d0620014190016a41186a220c200229030037030020014190016a41106a220d200329030037030020014190016a41086a220e200929030037030020012001290370370390012002200c2903003703002003200d2903003703002009200e29030037030020012001290390013703702007200229030037030020082003290300370300200b2009290300370300200120012903703703b001024002400240200a422088220fa72202200aa7470d00200241016a22032002490d05200fa74101742209200320032009491bad221042247e220f422088a70d05200fa722034100480d052002450d012006200241246c200310272206450d020c070b200a21100c070b2003102622060d050b20034104102a000b41d4aac10041331021000b41d4aac10041331021000b101e000b41d4aac10041331021000b200a422088220fa721020b2006200241246c6a220241003a0000200241196a200141c8016a290300370000200241116a200141c0016a290300370000200241096a200141b8016a290300370000200220012903b001370001200220012f0090013b0021200241236a20014192016a2d00003a0000201042ffffffff0f83200f4220864280808080107c84210a0b2000200129031037001420002004420020051b370300200020012903503700342000412c6a200141106a41186a290300370000200041246a200141106a41106a2903003700002000411c6a200141106a41086a2903003700002000413c6a200141d0006a41086a290300370000200041c4006a200141d0006a41106a290300370000200041cc006a200141d0006a41186a290300370000200041ec006a200141306a41186a290300370000200041e4006a200141306a41106a290300370000200041dc006a200141306a41086a290300370000200020012903303700542000410c6a200a37020020002006360208200141d0016a24000bac0101027f230041206b22002400200041106a41086a2201420037030020004200370310419595c3004113200041106a1000200041086a200129030037030020002000290310370300024002402000411041a886c500410041001001417f460d00200041003a001020004110200041106a41014100100141016a41014d0d0120002d001021012000411010032001450d00200041206a24000f0b41d895c300104f000b41d4aac10041331021000b130020004101360204200041b4bcc3003602000b1300200041093602042000418cc0c3003602000b13002000410436020420004198c0c3003602000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242033700000f0b41084101102a000bb23b07027f027e017f017e2a7f0a7e027f23004190056b22032400418f94c30021040240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710d00200241ff01714102470d00200341f0046a41086a22044200370300200342003703f004419595c3004113200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f470d0020044200370300200342003703f00441a298c300410d200341f0046a100020012004290300370300200320032903f0043703d003200341d0036a411041a886c500410041001001417f460d01200342003703e801024002400240200341d0036a4110200341e8016a41084100100141016a41084d0d0020032903e801500d04200341f0046a41086a22044200370300200342003703f00441a298c300410d200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d003420021050240200341d0036a411041a886c500410041001001417f460d00200342003703e801200341d0036a4110200341e8016a41084100100141016a41084d0d0220032903e80121050b20044200370300200342003703f00441e698c3004117200341f0046a100020012004290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f460d00200342003703e801200341d0036a4110200341e8016a41084100100141016a41084d0d0420032903e80120057c2000560d010c060b420320057c2000580d050b41bc97c300104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41f496c300104f000b200341f0046a41086a22044200370300200342003703f00441a298c300410d200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d003200320003703e801200341d0036a4110200341e8016a41081004200341013a00e80120044200370300200342003703f004419595c3004113200341f0046a100020012004290300370300200320032903f0043703d003200341d0036a4110200341e8016a4101100420014200370300200342003703d00341e698c3004117200341d0036a1000200341e8016a41086a2001290300370300200320032903d0033703e80102400240200341e8016a411041a886c500410041001001417f460d00200342003703d003200341e8016a4110200341d0036a41084100100141016a41084d0d0920032903d00321050c010b420321050b200341d0036a41086a22014200370300200342003703d0034180adc4004112200341d0036a1000200341e8016a41086a22022001290300370300200320032903d0033703e8014100210402400240200341e8016a411041a886c500410041001001417f460d00200342003703d003200341e8016a4110200341d0036a41084100100141016a41084d0d0a20032903d0032106410021070c010b410121070b20014200370300200342003703d0034180adc4004112200341d0036a100020022001290300370300200320032903d0033703e801200320003703d003200341e8016a4110200341d0036a410810042006500d0020070d00427f200520057c220820082005541b22054200510d172000200580220020062005802205580d182000200542017c2206510d00200341d0036a41086a22044200370300200342003703d00341a2adc4004112200341d0036a1000200341e8016a41086a2004290300370300200320032903d0033703e80141002104200341e8016a411041a886c500410041001001417f460d00200342103702bc022003200341e8016a3602b802200341d0036a200341b8026a102820032802d0032209450d1e20032802d403210a024020002005427f857c2200a7417f2000428080808010541b220b450d00200341d8036a280200220c200b4d0d002006a7417f2006428080808010541b210d200341f9036a210e200341d0036a41096a210f200341b8026a4104722110200341e8016a41286a2111200341e8016a41206a2112200341e8016a41246a211320034188046a2114200341d0036a412c6a2115410021160340200341c8016a41186a20092016200d6a200c704105746a220441186a290000370300200341c8016a41106a200441106a290000370300200341c8016a41086a200441086a290000370300200320042900003703c801200341e8016a200341c8016a106b02402012280200223e450d00200341b8026a41086a201141086a290300370300200341b8026a41106a201141106a290300370300200341b8026a41186a201141186a290300370300200341b8026a41206a201141206a280200360200200320112903003703b8022013280200213d200341e0026a41186a2217201041186a290000370300200341e0026a41106a2218201041106a290000370300200341e0026a41086a2219201041086a290000370300200320102900003703e002200341f0046a41086a22224200370300200342003703f0044181f5c0004115200341f0046a1000200341c0036a41086a22232022290300370300200320032903f0043703c0030240024002400240200341c0036a411041a886c500410041001001417f470d0041014100200341e0026a10eb020d020c010b200342103702f4042003200341c0036a3602f004200341d0036a200341f0046a102820032802d0032204450d1620032802d40321012004200341d0036a41086a280200200341e0026a10eb02210202402001450d00200410230b20020d010b411210262204450d16200441106a41002f00a6f54022013b0000200441086a410029009ef540220037000020044100290096f540220537000020044112413210272204450d17200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000200341d0046a41186a221a4200370300200341d0046a41106a221b4200370300200341d0046a41086a221c4200370300200342003703d00420044132200341d0046a1002200341d0036a41186a221d201a290300370300200341d0036a41106a221e201b290300370300200341d0036a41086a221f201c290300370300200320032903d0043703d00302400240200341d0036a412041a886c500410041001001417f460d00200341003602f004200341d0036a4120200341f0046a41044100100141016a41044d0d1220032802f0042120200410234112102622040d010c1a0b4100212020041023411210262204450d190b200441106a20013b0000200441086a20003700002004200537000020044112413210272204450d19200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300201b4200370300201c4200370300200342003703d00420044132200341d0046a1002201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d0032003202041016a22213602f004200341d0036a4120200341f0046a410410042004102320224200370300200342003703f00441a8f5c0004119200341f0046a100020232022290300370300200320032903f0043703c00302400240200341c0036a411041a886c500410041001001417f460d00200341003602d003200341c0036a4110200341d0036a41044100100141016a41044d0d1320032802d00321240c010b410021240b20034180036a41186a2204201729030037030020034180036a41106a2201201829030037030020034180036a41086a22022019290300370300200320032903e002370380034200210820224200370300200342003703f00441af98c300410d200341f0046a100020232022290300370300200320032903f0043703c0030240200341c0036a411041a886c500410041001001417f460d00200342003703d003200341c0036a4110200341d0036a41084100100141016a41084d0d1020032903d00321080b200341a0036a41186a22252004290300370300200341a0036a41106a22262001290300370300200341a0036a41086a2227200229030037030020032003290380033703a00320224200370300200342003703f00441c1f5c0004117200341f0046a100020232022290300370300200320032903f0043703c00302400240024002400240024002400240200341c0036a411041a886c500410041001001417f460d00200342103702c4042003200341c0036a3602c004200341c0016a200341c0046a104a20032802c001450d1020032802c4012228ad42307e2200422088a70d1b2000a72204417f4c0d1b2004450d01200410262229450d282028450d030c020b200341f0046a41186a22042025290300370300200341f0046a41106a2201202629030037030041082129200341f0046a41086a2202200341a0036a41086a290300370300200320032903a0033703f004201d2004290300370300201e2001290300370300200341d0036a41086a2002290300370300200320032903f0043703d0034100212a420021060c040b410821292028450d010b200341c0046a41086a2207280200212a4100212b20032802c404212c20032802c004212d41002102410021042028212e0340201a4200370300201b4200370300201c4200370300200342003703d00420074100202d202c200341d0046a4120202a100122012001417f461b220141202001412049222f1b202a6a2201360200202f0d0d201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d003200342003703d00420074100202d202c200341d0046a410820011001222a202a417f461b222a4108202a4108491b20016a2201360200202a41074d0d0d20032903d0042100200341003602d00420074100202d202c200341d0046a410420011001222a202a417f461b222f4104202f4104491b20016a222a360200202f41034d0d0d200441016a210120032802d004212f200341f0046a41186a2230201d290300370300200341f0046a41106a2231201e2903003703002022201f290300370300200320032903d0033703f00402402004202e470d00202b20012001202b491b222ead42307e2205422088a70d0d2005a722324100480d0d02402004450d00202920022032102722290d010c160b203210262229450d150b202920026a22042000370300200441206a2030290300370300200441186a2031290300370300200441106a2022290300370300200441086a20032903f004370300200441286a202f360200202b41026a212b200241306a21022001210420012028490d000b20290d010c0d0b410021014100212e2029450d0c0b200341f0046a41186a222b2025290300370300200341f0046a41106a222c202629030037030020222027290300370300200320032903a0033703f00402402001ad422086202ead842206422088a7222a4120490d0041302104202a41306c21072029ad42208621054201210020292102034002402002290300202920046a2201290300580d002001ad4220862000842105200121020b200042017c21002007200441306a2204470d000b2002450d22200542ffffffff0f580d22201d202b290300370300201e202c290300370300201f2022290300370300200320032903f0043703d003202a2005a722044d0d252029200441306c6a22042008370300200441206a201d290300370300200441186a201e290300370300200441106a201f290300370300200420032903d003370308200441013602280c030b201d202b290300370300201e202c290300370300201f2022290300370300200320032903f0043703d0032006a7202a470d010b202a4101742204202a41016a220120012004491bad220042307e2205422088a70d082005a722044100480d0802400240202a450d002029202a41306c2004102722290d010c230b200410262229450d220b2006422088a7212a200021060b2029202a41306c6a22042008370300200441206a201d290300370300200441186a201e290300370300200441106a201f290300370300200420032903d00337030820044101360228200642ffffffff0f83202a41016aad4220868421060b20224200370300200342003703f00441c1f5c0004117200341f0046a100020232022290300370300200320032903f0043703c003201f4100360200200342013703d00320032006422088a722043602f004200341f0046a200341d0036a1041024002402004450d00200441306c212c4158201f28020022046b212a2004412c6a210420032802d403210220292101034002400240024002402002202a6a41286a41204f0d00200441546a222b41206a2207202b490d0d2002410174222b20072007202b491b222b4100480d0d2002450d0120032802d0032002202b102722070d020c100b20032802d00321070c020b202b10262207450d0e0b2003202b3602d403200320073602d003202b21020b201f200441746a222d360200200720046a222b416c6a200141206a290000370000202b41646a200141186a290000370000202b415c6a200141106a290000370000202b41546a200141086a2900003700002001290300210002400240024002402002202a6a222b41086a202b4f0d00202d41086a222b202d490d0d2002410174222d202b202b202d491b222b4100480d0d2002450d0120072002202b102722070d020c110b2002212b0c020b202b10262207450d0f0b2003202b3602d403200320073602d0030b201f2004417c6a2202360200200720046a41746a2000370000200141286a280200212d0240024002400240202b202a6a41034b0d00200241046a222f2002490d0d202b4101742202202f202f2002491b22024100480d0d202b450d012007202b2002102722070d020c120b202b21020c020b200210262207450d100b200320023602d403200320073602d0030b200141306a2101201f2004360200200720046a417c6a202d360000202a41546a212a2004412c6a2104202c41506a222c0d000c020b0b20032802d403210220032802d00321070b200341c0036a41102007201f280200100402402002450d00200710230b02402006a7450d00202910230b411210262204450d1a200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d1b200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300201b4200370300201c4200370300200342003703d00420044132200341d0046a1002201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d0030240024002400240024002400240200341d0036a412041a886c500410041001001417f460d00200342203702f4042003200341d0036a3602f004200341b8016a200341f0046a104a20032802b801450d1b20032802bc012101200341a0016a200341f0046a104c20032802a001450d1b20041023410a2104200141094d0d012021410a20246a4d0d030c020b20041023410321010b20212001220420246a4d0d010b200341d0036a200341e0026a106d201f290300210020032903d00321050240200341d0036a41246a2207280200450d00200341d0036a41206a28020010230b20224200370300200342003703f00441fcf5c0004114200341f0046a100020232022290300370300200320032903f0043703c003200341c0036a411041a886c500410041001001417f460d01200341003602d003200341c0036a4110200341d0036a41044100100141016a41044d0d1620032802d00321010c020b200341f0046a41186a2017290300370300200341f0046a41106a201829030037030020222019290300370300200320032903e0023703f004410121040c020b41c0843d21010b200341f0006a20052000428094ebdc034200109704200341e0006a20032903702206200341f0006a41086a29030022084280ec94a37c427f109804200341d0006a200620082001ad22334200109804200341c0006a200329035022062033200520032903607c7e428094ebdc038042ffffffff0f837c2208200341d0006a41086a2903002008200654ad7c2004109904200341c0006a41086a290300210620032903402108200341d0036a200341e0026a106d20034180016a200341e0026a20032903d003223420052008200441ff004b2005200854200020065420002006511b7222041b22352034203554201f29030022362000200620041b22375420362037511b22041b2208201e29030022382038200856201d29030022392036203720041b22065620392006511b22041b22332006203920041b223a10840220034180016a41086a290300210020032903800121050240200329039001223b20337d223c20087c220820034180016a41186a290300203a7d203b203354ad7d20067c2008203c54ad7c223384500d00203420387d223a203620397d2034203854ad7d223684500d00200341d0036a41286a2802002201450d00200341d0036a41206a2802002204200141306c6a21020340200341106a2004290300200441086a2903002008203310980420032003290310200341106a41086a290300203a2036109704200341206a200441106a2003290300200341086a290300108402427f2000200341206a41086a2903007c200520032903207c22062005542201ad7c22052001200520005420052000511b22011b2100427f200620011b2105200441306a22042002470d000b0b200320053703f004200320003703f8042003200341f0046a3602d004200341d0046a10de0102402007280200450d00200341d0036a41206a28020010230b20224200370300200342003703f00441a2adc4004112200341f0046a1000201f2022290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f460d00200342103702d4042003200341d0036a3602d004200341f0046a200341d0046a102820032802f004222d450d252022280200210420032802f40421290c010b4101212d41002104410021290b202d20044105746a212c41002101202d21040240024002400340202c20046b41ff004d0d01200341c8016a2004460d022004200341c8016a41201096042207450d02200441206a2202200341c8016a460d022002200341c8016a4120109604222a450d02200441c0006a2202200341c8016a460d022002200341c8016a41201096042202450d02200441e0006a222b200341c8016a460d0220044180016a2104200120074100476a202a4100476a20024100476a202b200341c8016a412010960422024100476a210120020d000c020b0b2004202c460d010340200341c8016a2004460d012004200341c8016a41201096042202450d01200120024100476a2101202c200441206a2204470d000c020b0b200341013a00d00420224200370300200342003703f00441dfbac400410f200341f0046a1000201f2022290300370300200320032903f0043703d003200341d0036a4110200341d0046a410110040b02402029450d00202d10230b200341f0046a41186a2017290300370300200341f0046a41106a201829030037030020222019290300370300200320032903e0023703f004410221040b20142037370300200341d0036a41306a2035370300201f20043a0000200f20032903f004370000200e20032f00d0043b000020152020360200200f41086a2022290300370000200f41106a200341f0046a41106a290300370000200f41186a200341f0046a41186a290300370000200e41026a200341d0046a41026a2d00003a0000200341043a00d00341a886c5004100200341d0036a102c203d0d010c020b203d450d010b203e10230b201641016a2216200b470d000b0b41002104200a450d00200910230b20034190056a240020040f0b101e000b202e450d00202910230b41d4aac10041331021000b202b4101102a000b202b4101102a000b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b20324108102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b101d000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41fcaec400104f000b41f8afc400104f000b41d8f5c00041131021000b20044108102a000b20044108102a000b41ecf5c0002004202a1029000b41d4aac10041331021000b41d4aac10041331021000bcf0101047f200020014105746a210320002104024002400340200320046b41ff004d0d014101210520042002460d02200420024120109604450d02200441206a22062002460d02200620024120109604450d02200441c0006a22062002460d02200620024120109604450d02200441e0006a22062002460d0220044180016a21042006200241201096040d000c020b0b024020042003460d00200020014105746a210603404101210520022004460d02200420024120109604450d022006200441206a2204470d000b0b41000f0b20050b8e0a01037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00004101470d00200041046a280200220241808004490d01200141046a280200200141086a2802002200470d03200041016a22032000490d1b20004101742204200320032004491b22044100480d1b2000450d0920012802002000200410272203450d0a0c190b200141046a280200200141086a2802002202470d01200241016a22032002490d1a20024101742204200320032004491b22044100480d1a2002450d0420012802002002200410272203450d050c160b200241f001490d02200141046a280200200141086a2802002200470d05200041016a22032000490d1920004101742204200320032004491b22044100480d192000450d09200128020020002004102722030d0a0c120b200128020021030c150b200128020021030c160b200141046a280200200141086a2802002200470d03200041016a22032000490d1620004101742204200320032004491b22044100480d162000450d09200128020020002004102722030d0a0c100b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2004102622030d0f0b20044101102a000b200410262203450d080b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a00000240200141046a2802002203200428020022006b41024f0d00200041026a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d04200128020020032000102722030d050c090b200128020021030c050b200410262203450d060b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b200010262203450d040b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b20044101102a000b20044101102a000b20004101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240024002400240200141046a2802002203200428020022026b41204f0d00200241206a22042002490d0720034101742202200420042002491b22024100480d072003450d0120012802002003200210272203450d020c030b200128020021030c030b2002102622030d010b20024101102a000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a0000024002400240200141046a2802002203200428020022006b41044f0d00200041046a22042000490d0320034101742200200420042000491b22004100480d032003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b101e000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000b9a0b06037f037e037f027e017f027e230041b0016b22012400200141c0006a41086a220242003703002001420037034041becbc300411d200141c0006a1000200141306a41086a2002290300370300200120012903403703300240200141306a411041a886c500410041001001417f460d002001200141306a360200200141103602042001420037034020014100200141306a4110200141c0006a41084100100122022002417f461b2202410820024108491b220336020802400240024002400240024002400240024002400240200241074d0d002001290340210420014200370340200141086a4100200141306a4110200141c0006a41082003100122022002417f461b2202410820024108491b20036a360200200241074d0d0020012903402105200141c0006a200110890220012802402202450d0020012902442106200141003a0040200141086a2203200328020022032001280200220720012802042208200141c0006a41012003100141016a41014b22036a22093602000240024002402003450d0020012d00404101470d004200210a20014200370340200141086a410020072008200141c0006a41082009100122032003417f461b2203410820034108491b20096a360200200341074d0d012001290340210b4201210a0c020b4200210a0b0b200141246a2006370200200141186a200b370300200120023602202001200a370310200120053703082001200437030020042000520d082006422088a7210802400240024002400240200a500d002008ad42287e220a422088a70d06200aa72203417f4c0d062003450d0120031026220c450d072008450d020c0b0b2008ad42287e220a422088a70d05200aa72203417f4c0d052003450d0220031026220c450d072008450d030c080b4108210c20080d090b410021090c090b4108210c20080d050b410021090c050b41d4aac10041331021000b101d000b20034108102a000b20034108102a000b200841286c210741002109200c21030340200241086a290300210a200241106a2903002106200241186a290300210d2002290300210e200341206a200241206a290300370300200341186a200d370300200341106a2006370300200341086a200a3703002003200e370300200341286a2103200941016a2109200241286a2102200741586a22070d000b0b200141d8006a2009360200200141d4006a2008360200200141d0006a200c3602002001200537034820014200370340200141c0006a10ee02200520047c2000510d030c040b200841286c210741002109200c21030340200241086a290300210a200241106a2903002106200241186a290300210d2002290300210e200341206a200241206a290300370300200341186a200d370300200341106a2006370300200341086a200a3703002003200e370300200341286a2103200941016a2109200241286a2102200741586a22070d000b0b200141e0006a2009360200200141dc006a2008360200200141d8006a200c360200200141d0006a20053703002001200b37034820014201370340200141c0006a10ee020b200520047c2000520d010b200141c0006a41086a220242003703002001420037034041dbcbc300411b200141c0006a1000200141306a41086a2209200229030037030020012001290340370330200141103602442001200141306a360240200141206a2203200141c0006a108f02200141cb006a200341086a28000036000020012003290000370043200120012900403703302001200141c7006a29000037003720022001290037370000200141083a00402001200129033037004141a886c5004100200141c0006a102c200242003703002001420037034041becbc300411d200141c0006a10002009200229030037030020012001290340370330200141306a41101003200141b0016a24000f0b200141246a280200450d00200141206a28020010230b200141b0016a24000bfc0d05017f017e037f017e067f230041d0006b220124002001410036023020014201370328024002400240024002400240024002400240024002400240024002400240024002400240024002400240200029030022024201520d00410110262203450d09200141286a41086a22042004280200220541016a3602002001410136022c20012003360228200320056a41013a000020002903082106200128022c2205200428020022036b41084f0d01200341086a22042003490d0f20054101742203200420042003491b22034100480d0f2005450d0320012802282005200310272204450d040c0d0b410110262203450d092001410136022c200141286a41086a22072007280200220441016a36020020012003360228200320046a41003a0000200041106a28020021082001200041186a2802002209360208200141086a200141286a104102402009450d002008200941286c6a210a2008210303400240024002400240200128022c22052007280200220b6b41204f0d00200b41206a2204200b490d142005410174220c20042004200c491b22044100480d142005450d012001280228200520041027220c0d020c0c0b2001280228210c0c020b20041026220c450d0a0b2001200436022c2001200c3602282007280200210b200421050b2007200b41206a2204360200200c200b6a220b41186a200341186a290000370000200b41106a200341106a290000370000200b41086a200341086a290000370000200b2003290000370000200341206a29030021060240200520046b41074b0d00200441086a220b2004490d1120054101742204200b200b2004491b22044100480d11024002402005450d00200c200520041027220c0d010c0c0b20041026220c450d0b0b2001200436022c2001200c360228200728020021040b2007200441086a360200200c20046a2006370000200a200341286a2203470d000b0b20002903082106200128022c2204200728020022036b41084f0d01200341086a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d0420012802282004200310272204450d050c0a0b200128022821040c0c0b200128022821040c090b2003102622040d090b20034101102a000b2003102622040d050b20034101102a000b20044101102a000b20044101102a000b41014101102a000b41014101102a000b2001200336022c20012004360228200141306a28020021030b200141286a41086a200341086a360200200420036a20063700000c070b2001200336022c20012004360228200141306a28020021030b200141286a41086a2207200341086a360200200420036a2006370000200041186a28020021092001200041206a2802002203360208200141086a200141286a104102402003450d002009200341286c6a210a2009210303400240024002400240200128022c22052007280200220b6b41204f0d00200b41206a2204200b490d062005410174220c20042004200c491b22044100480d062005450d012001280228200520041027220c0d020c070b2001280228210c0c020b20041026220c450d050b2001200436022c2001200c3602282007280200210b200421050b2007200b41206a2204360200200c200b6a220b41186a200341186a290000370000200b41106a200341106a290000370000200b41086a200341086a290000370000200b2003290000370000200341206a29030021060240200520046b41074b0d00200441086a220b2004490d0320054101742204200b200b2004491b22044100480d03024002402005450d00200c200520041027220c0d010c070b20041026220c450d060b2001200436022c2001200c360228200728020021040b2007200441086a360200200c20046a2006370000200a200341286a2203470d000b0b200041106a2903002106024002400240200128022c2204200728020022036b41084f0d00200341086a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802282004200310272204450d020c060b200128022821040c060b2003102622040d040b20034101102a000b101e000b20044101102a000b20044101102a000b2001200336022c20012004360228200141306a28020021030b200141286a41086a200341086a360200200420036a20063700002006a721080b200141086a41086a2203200141286a41086a28020036020020012001290328370308200141246a20032802003600002001200129030837001c200141346a200141206a290000370000200141286a41146a2001290208370200200141286a411c6a2003290200370200200141c6a4b9da04360029200141023a00282001200129001937002d200141286a10d5020240024020024200510d002000411c6a280200450d0120091023200141d0006a24000f0b200041146a280200450d00200810230b200141d0006a24000bfb0c03017f017e097f230041306b2204240042002105200441186a41086a220642003703002004420037031841becbc300411d200441186a1000200441086a41086a2207200629030037030020042004290318370308024002400240024002400240024002400240024002400240200441086a411041a886c500410041001001417f460d00200041046a280200450d0120002802001023200441306a24000f0b200642003703002004420037031841af98c300410d200441186a100020072006290300370300200420042903183703080240200441086a411041a886c500410041001001417f460d0020044200370318200441086a4110200441186a41084100100141016a41084d0d05200429031821050b02402002a74101470d00200441186a41086a220642003703002004420037031841f6cbc300411a200441186a1000200441086a41086a2006290300370300200420042903183703080240200441086a411041a886c500410041001001417f460d0020044200370318200441086a4110200441186a41084100100141016a41084d0d0720042903182005580d00200041046a280200450d0220002802001023200441306a24000f0b200441186a41086a220642003703002004420037031841f6cbc300411a200441186a1000200441086a41086a2006290300370300200420042903183703082004200520014201867c370318200441086a4110200441186a410810040b200028020821062000280204210820002802002109200441186a41086a220042003703002004420037031841becbc300411d200441186a1000200441086a41086a2000290300370300200420042903183703082004410036022020044201370318410810262200450d0620044288808080800137021c200420003602182000200537000020004108411010272200450d0720044290808080800237021c20002001370008200420003602182004200636022c2004412c6a200441186a104102402006450d002009200641286c6a210a200441186a41086a220b280200210c200428021c210720092100034002400240024002402007200c6b41204f0d00200c41206a2206200c490d072007410174220d20062006200d491b220e4100480d072007450d0120042802182007200e1027220d0d020c080b200c41206a21062004280218210d0c020b200e1026220d450d060b2004200e36021c2004200d360218200e21070b200b2006360200200d200c6a220c41186a200041186a290000370000200c41106a200041106a290000370000200c41086a200041086a290000370000200c2000290000370000200041206a29030021050240200720066b41074b0d00200641086a220c2006490d042007410174220e200c200c200e491b220c4100480d04024002402007450d00200d2007200c1027220d0d010c080b200c1026220d450d070b2004200c36021c2004200d360218200c21070b200b200641086a220c360200200d20066a2005370000200a200041286a2200470d000b0b200441206a2802002100200428021c2107024002400240024002400240024002400240024002400240024020024201520d0020072000470d01200041016a22062000490d0e20004101742207200620062007491b22074100480d0e2000450d03200428021820002007102722060d040c150b20072000470d01200041016a22062000490d0d20004101742207200620062007491b220d4100480d0d2000450d0520042802182000200d102722060d060c150b200428021821060c030b200428021821062007210d0c050b200710262206450d110b2004200736021c200420063602180b200441186a41086a220b200041016a220c360200200620006a41013a000002402007200c6b41074b0d00200c41086a220d200c490d092007410174220e200d200d200e491b220d4100480d092007450d0420062007200d102722060d050c120b2007210d0c050b200d10262206450d0f0b2004200d36021c200420063602180b200441206a200041016a2207360200200620006a41003a00000c030b200d10262206450d0d0b2004200d36021c200420063602180b200b200041096a22073602002006200c6a20033700000b200441086a41102006200710040240200d450d00200610230b2008450d00200910230b200441306a24000f0b101e000b200e4101102a000b200c4101102a000b41d4aac10041331021000b41d4aac10041331021000b41084101102a000b41104101102a000b20074101102a000b200d4101102a000b200d4101102a000b130020004102360204200041f0ccc3003602000b1300200041023602042000419cfcc4003602000b130020004101360204200041fc92c4003602000b130020004103360204200041d8b0c1003602000b130020004101360204200041c8fac4003602000b130020004103360204200041a0c3c0003602000b13002000410b360204200041bc80c0003602000b130020004104360204200041f4acc1003602000b130020004106360204200041908bc4003602000b130020004101360204200041c0f9c4003602000b13002000410536020420004180e9c3003602000b130020004106360204200041ecc5c2003602000bba2806027f027e037f017e0f7f047e230041e0056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441044b0d0002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141306a2903002105200141286a2903002106200341d4006a41026a200141076a2d00003a0000200341c0016a41086a200141186a290200370300200341c0016a410d6a2001411d6a290000370000200320012f00053b01542003200141106a2902003703c001200141086a28020021072001410c6a280200210820012d000421092002411a6a290100210a200241196a2d0000210b200241186a2d0000210c200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002110200241116a2d00002111200241106a2d000021122002410e6a2f010021132002410d6a2d00002114200241046a2d00002115200241026a2f01002116412a210141db94c300210420022d0000450d054101211741002118410021190c060b41ef94c4002104410e211820022d0000450d1f200241086a2802004104490d1f200241046a28020041ff01710d1f20012802042101411210262202450d10200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272202450d112002200136001220034180046a41186a2204420037030020034180046a41106a2218420037030020034180046a41086a2207420037030020034200370380042002411620034180046a1002200341e0036a41186a2004290300370300200341e0036a41106a2018290300370300200341e0036a41086a200729030037030020032003290380043703e003200341e0036a412041a886c5004100410010012104200210232004417f460d0a20034180046a41086a22024200370300200342003703800441f487c400411220034180046a1000200341e0006a41086a2002290300370300200320032903800437036041002104200341e0006a411041a886c500410041001001417f460d0b200342103702f4042003200341e0006a3602f00420034180046a200341f0046a109202200328028004220b450d1520034188046a28020021042003290284042206422088a722022006a7460d0c200328028404210c0c170b20022d000120022d0000720d02200141186a2903002106200141106a290300210a200141086a2802002104200141206a29030021052001280204210120034180046a41086a22024200370300200342003703800441ee89c400411520034180046a1000200341e0006a41086a20022903003703002003200329038004370360410410262202450d0d20022001360000200341e0006a41102002410410042002102320034180046a41086a22024200370300200342003703800441d289c400411c20034180046a1000200341e0006a41086a22012002290300370300200320032903800437036020032006370388042003200a37038004200341e0006a411020034180046a4110100420024200370300200342003703800441c687c400411420034180046a10002001200229030037030020032003290380043703602003200537038004200341e0006a411020034180046a41081004200242003703002003420037038004418688c400410d20034180046a1000200120022903003703002003200329038004370360410410262202450d0e20022004360000200341e0006a411020024104100420021023410021040c1d0b41ef94c4002104410e211820022d0000450d1d200241086a2802004102490d1d200241046a28020041ff01710d1d20012802042101411210262202450d10200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272202450d112002200136001220034180046a41186a2201420037030020034180046a41106a2204420037030020034180046a41086a2218420037030020034200370380042002411620034180046a1002200341e0036a41186a2001290300370300200341e0036a41106a2004290300370300200341e0036a41086a201829030037030020032003290380043703e003200341e0036a412041a886c500410041001001417f460d07200342203702d4052003200341e0036a3602d00520034180046a200341d0056a10ab032003290380044201520d122003280288042101200341f0046a2003418c046a41dc001094041a200341e0036a4120100320034180036a200341f0046a41dc001094041a200341a0026a20034180036a41dc001094041a20021023200341c0016a200341a0026a41dc001094041a20032001360260200341e0006a410472200341c0016a41dc001094041a200341c0006a200341e0006a41206a2003290370200341f8006a290300109302200329034021062003200341c8006a290300370388042003200637038004200320034180046a3602f004200341f0046a10de01410021040c1c0b20022d000120022d000072450d030b41b394c3002104412821180c1b0b41012117410021184100211920022d00014101470d002002410c6a2d000021182002410a6a2f01002119200241096a2d00002101200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021170b201941ffff0371410874201841187472200141ff017172211820170d192003200a370388052003200b3a0087052003200c3a0086052003200d3b0184052003200e3a0083052003200f3a008205200320103b018005200320113a00ff04200320123a00fe04200320133b01fc04200320143a00fb04200320183600f704200320043600f304200320153a00f204200320163b01f004200341d0056a41026a2202200341d4006a41026a2d00003a000020034180046a41086a2201200341c0016a41086a29030037030020034180046a410d6a2204200341c0016a410d6a290000370000200320032f01543b01d005200320032903c00137038004200941ff01714101470d01200341e0036a200741067610870120032802e003210120032802e8032007413f7122024d0d02200341dc036a41026a200120024105746a220241026a2d00003a000020034188036a200241136a2900003703002003418d036a200241186a290000370000200320022f00003b01dc032003200229000b3703800320022800072108200228000321074101210220032802e403450d150c140b200141086a2903002106200141106a290300210a20034180046a41086a22024200370300200342003703800441aaedc300410c20034180046a1000200341e0006a41086a200229030037030020032003290380043703602003200a370388042003200637038004200341e0006a411020034180046a41101004410021040c170b200341dc036a41026a20022d00003a000020034180036a41086a200129030037030020034180036a410d6a2004290000370000200320032f01d0053b01dc032003200329038004370380030c140b4100210220032802e4030d110c120b20034180036a200341f0046a41dc001094041a200210230b41998ac4002104411921180c140b4104210b410021020b200241016a22182002490d0b20024101742207201820182007491b220cad4202862206422088a70d0b2006a722184100480d0b024002402002450d00200b200241027420181027220b450d010c0b0b20181026220b0d0a0b20184104102a000b20034194046a4101360200200341013602642003418898c4003602602003420137028404200341d497c400360280042003200341e0006a3602900420034180046a41a4eec3001061000b41044101102a000b41044101102a000b41124101102a000b41244101102a000b41124101102a000b41244101102a000b41d4aac10041331021000b41d4aac10041331021000b200421020b200b20024102746a200136020020034180046a41086a22094200370300200342003703800441f487c400411220034180046a1000200341e0006a41086a20092903003703002003200329038004370360200341003602880420034201370380042003200441016a22023602f004200341f0046a20034180046a1041024002402002450d00200441027441046a21194100200928020022026b21012003280284042118200b21040340200428020021080240024002400240201820016a41044f0d00200241046a22072002490d0720184101742217200720072017491b22174100480d072018450d0120032802800420182017102722070d020c080b20032802800421070c020b201710262207450d060b20032017360284042003200736028004201721180b200441046a21042009200241046a2217360200200720026a20083600002001417c6a2101201721022019417c6a22190d000c020b0b20092802002117200328028404211820032802800421070b200341e0006a411020072017100402402018450d00200710230b41002104200c450d06200b10230c060b101e000b20174101102a000b200110230b20020d00410121024115210841d9cac40021070c010b200341e0036a41026a200341dc036a41026a2d00003a000020034180046a41086a20034180036a41086a29030037030020034180046a410d6a20034180036a410d6a290000370000200320032f01dc033b01e003200320032903800337038004410021020b200341dc006a41026a2218200341e0036a41026a2d00003a0000200341e0006a41086a220120034180046a41086a2204290300370300200341e0006a41106a20034180046a41106a290300370300200320032f01e0033b015c200320032903800437036002402002450d0020082118200721040c020b200341d8006a41026a20182d00003a0000200341a0026a41086a2001290300370300200341a0026a410d6a200341e0006a410d6a290000370000200320032f015c3b0158200320032903603703a00220044200370300200342003703800441d289c400411c20034180046a100020012004290300370300200320032903800437036002400240200341e0006a411041a886c500410041001001417f460d0020034200370388042003420037038004200341e0006a411020034180046a4110410010012202417f460d052002410f4d0d0520034188046a290300210a200329038004211a0c010b4200211a4200210a0b20034180046a41086a22024200370300200342003703800441ee89c400411520034180046a1000200341e0006a41086a2002290300370300200320032903800437036002400240200341e0006a411041a886c500410041001001417f460d002003410036028004200341e0006a411020034180046a41044100100141016a41044d0d0420032802800421020c010b410021020b200341286a2006200542c0843d4200109704200341186a2003290328221b200341286a41086a290300221c42c0fb42427f109804200341086a201b201c2002ad221d4200109804200341386a200341f0046a201a2003290308221c201d200620032903187c7e42c0843d8042ffffffff0f837c221b201b201a54200341086a41086a290300201b201c54ad7c221b200a54201b200a511b22021b221a200a201b20021b220a105b02402003280238450d0041b889c4002104411a21180c020b20034180046a41086a22024200370300200342003703800441838ac400411620034180046a1000200341e0006a41086a20022903003703002003200329038004370360410021010240200341e0006a411041a886c500410041001001417f460d002003410036028004200341e0006a411020034180046a41044100100141016a41044d0d0520032802800421010b20034180046a41086a22024200370300200342003703800441838ac400411620034180046a1000200341e0006a41086a2204200229030037030020032003290380043703602003200141016a36028004200341e0006a411020034180046a41041004200341e0006a41186a200341f0046a41186a290300370300200341e0006a41106a200341f0046a41106a2903003703002004200341f0046a41086a29030037030020034180036a41086a200341a0026a41086a29030037030020034180036a410d6a200341a0026a410d6a290000370000200320032903f004370360200320032f01583b01d0052003200341da006a2d00003a00d205200320032903a00237038003411210262202450d05200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272204450d062004200136001220034180046a41186a2202420037030020034180046a41106a2218420037030020034180046a41086a2217420037030020034200370380042004411620034180046a1002200341e0036a41186a2002290300370300200341e0036a41106a2018290300370300200341e0036a41086a201729030037030020032003290380043703e003412010262202450d0720022003290360370000200241186a200341e0006a41186a290300370000200241106a200341e0006a41106a290300370000200241086a200341e0006a41086a2903003700002002412041c00010272202450d0820022006370020200241286a2005370000200241c00041800110272202450d092002201a370050200220032f01d0053b00302002200836003720022007360033200220032903800337003b200241d8006a200a370000200241326a20032d00d2053a0000200241c3006a20034180036a41086a290300370000200241c8006a2003418d036a290000370000200341e0036a4120200241e000100420021023200410232003418c046a20013602004100210420034180046a41086a41003a0000200341093a00800441a886c500410020034180046a102c0b0b2000201836020420002004360200200341e0056a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41244101102a000b41204101102a000b41c0004101102a000b4180014101102a000bc15004047f017e117f027e230041d0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022044101460d00024020044102460d0020044103470d0f200141216a2d00002105200141246a2802002106200341186a41186a200141196a290000370300200341186a41106a200141116a290000370300200341186a41086a200141096a290000370300200320012900013703182002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f0100211341db94c3002114412a211520022d0000450d024101211641002117410021180c030b200141086a2802002116200141046a28020021052002411a6a2901002107200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f01002106412a211541db94c300211420022d0000450d034101211741002118410021080c040b200141046a2802002117024020022d00000d0020022d00014101470d00200241196a2d00002114200241186a2d00002115200241166a2f01002116200241156a2d00002118200241146a2d00002108200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002106200241026a2f0100210520032002411a6a290100370370200320143a006f200320153a006e200320163b016c200320183a006b200320083a006a200320093b01682003200a3a00672003200b3a00662003200c3b01642003200d3a0063200320063a005a200320053b015820032010200f410874200e411874727236005f2003201320124108747220114118747236005b200341d8006a10b803450d0941002115200341003602e003200342013703d8032017200341d8036a103920032802dc03211420032802e003211620032802d8032102200341d8026a41186a22184200370300200341d8026a41106a22084200370300200341d8026a41086a22094200370300200342003703d80220022016200341d8026a1002200341c8016a41186a2018290300370300200341c8016a41106a22182008290300370300200341c8016a41086a2009290300370300200320032903d8023703c80102402014450d00200210230b200341d8036a201741f0001094041a200341d8026a410d6a200341d8006a41086a290300370000200341d8026a41156a200341d8006a41106a290300370000200341d8026a411d6a200341d8006a41186a29030037000041012116200341013a00dc02200341013a00d802200320032903583700dd022003200341d8036a200341d8026a10d202200341fd036a2003280200453a0000200341d8036a410d6a200341c8016a41086a290300370000200341d8036a41156a2018290300370000200341d8036a411d6a200341c8016a41186a290300370000200341053a00dc03200341073a00d803200320032903c8013700dd0341a886c5004100200341d8036a102c20171023410021140c2d0b41db94c3002114412a21020c2b0b41012116410021174100211820022d00014101470d002002410c6a2d000021182002410a6a2f01002117200241096a2d00002115200241066a2f0100410874200241056a2d000072200241086a2d0000411874722114410021160b201741ffff0371410874201541ff017172201841187472210220160d1420032007370350200320083a004f200320093a004e2003200a3b014c2003200b3a004b2003200c3a004a2003200d3b01482003200e3a00472003200f3a0046200320103b0144200320113a00432003200236003f2003201436003b200320123a003a200320133b0138200341386a10b803450d02200341d8036a200341186a10b60320032802e0032209450d05200341f0036a280200210b200341ec036a280200210a4110210220032802e40321184182aac4002114200620032802d803220f470d13200341f4036a280200210820032802dc03210e2009200341d8036a41106a280200220c4105746a211620092102410021150340201620026b41ff004d0d09200341386a2002460d0a20152002200341386a412010960422144100476a21152014450d0a200241206a2214200341386a460d0a20152014200341386a412010960422144100476a21152014450d0a200241c0006a2214200341386a460d0a20152014200341386a412010960422144100476a21152014450d0a200241e0006a2214200341386a460d0a20024180016a210220152014200341386a412010960422144100476a211520140d000c0a0b0b41012117410021184100210820022d00014101470d002002410c6a2d000021182002410a6a2f01002108200241096a2d00002115200241066a2f0100410874200241056a2d000072200241086a2d0000411874722114410021170b200841ffff0371410874201841187472201541ff017172210220170d0220032007370350200320093a004f2003200a3a004e2003200b3b014c2003200c3a004b2003200d3a004a2003200e3b01482003200f3a0047200320103a0046200320113b0144200320123a00432003200236003f2003201436003b200320133a003a200320063b0138200341386a10b803450d01200341003602e003200342013703d8032016200341d8036a103920032802dc03211420032802e003211520032802d8032102200341d8026a41186a22174200370300200341d8026a41106a22184200370300200341d8026a41086a22084200370300200342003703d80220022015200341d8026a1002200341d8006a41186a22152017290300370300200341d8006a41106a22172018290300370300200341d8006a41086a22182008290300370300200320032903d80237035802402014450d00200210230b200341d8036a41186a2015290300370300200341d8036a41106a2017290300370300200341d8036a41086a2018290300370300200320032903583703d803411910262202450d0a200241186a41002d00bea9443a0000200241106a41002900b6a944370000200241086a41002900aea944370000200241002900a6a94437000020024119413910272202450d0b200220032903d803370019200241316a200341d8036a41186a290300370000200241296a200341d8036a41106a290300370000200241216a200341d8036a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22174200370300200342003703d80220024139200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2017290300370300200320032903d8023703b802200341b8026a412041a886c5004100410010012114200210232014417f460d054187a9c4002114411f21020c020b41eea9c4002114411421020c110b41f0a8c4002114411721020b201610242016102341012115410021160c250b41dba9c4002114411321020c0e0b41f0a8c4002114411721020c220b200341d8036a41086a22024200370300200342003703d8030240200541014b0d004195b7c1004115200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d802410021020240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a10890220032802d8032214450d0a20032902dc032207422088a721022007a7450d00201410230b200341d8036a201641f0001094041a200341e4026a2002360200200341d8026a41086a4101360200200341003a00dc02200341013a00d802200341086a200341d8036a200341d8026a10d202200341fd036a2003280208453a0000200341e5036a200341d8006a41086a290300370000200341ed036a200341e8006a290300370000200341f5036a200341f0006a290300370000200341043a00dc03200341073a00d803200320032903583700dd0341a886c5004100200341d8036a102c0c1a0b41bfa9c400411c200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d8024100210c0240200341d8026a411041a886c500410041001001417f460d00200341003602d803200341d8026a4110200341d8036a41044100100141016a41044d0d0720032802d803210c0b200341d8036a41086a22024200370300200342003703d80341bfa9c400411c200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d80202400240200341d8026a411041a886c500410041001001417f460d00200341003602d803200341d8026a4110200341d8036a41044100100141016a41044d0d0920032802d80341016a21020c010b410121020b42002107200341d8036a41086a22144200370300200342003703d80341bfa9c400411c200341d8036a1000200341d8026a41086a22152014290300370300200320032903d8033703d802200320023602d803200341d8026a4110200341d8036a4104100420144200370300200342003703d8034188a8c4004118200341d8036a100020152014290300370300200320032903d8033703d8024100210202400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a102820032802d803220b450d0b20032902dc032107200341d8036a41186a200341d8006a41186a290300370300200341d8036a41106a200341d8006a41106a290300370300200341d8036a41086a200341d8006a41086a290300370300200320032903583703d803200341d8036a21142007422088a722022007a7460d010c1a0b200341d8036a41186a200341d8006a41186a290300370300200341d8036a41106a200341d8006a41106a2903003703002014200341d8006a41086a290300370300200320032903583703d8034101210b200341d8036a21140b200241016a22152002490d1a20024101742217201520152017491bad2219420586221a422088a70d1a201aa722154100480d1a024002402002450d00200b200241057420151027220b450d010c190b20151026220b0d180b20154101102a000b20022016460d012009200c4105746a21160340200341386a2002460d0120152002200341386a412010960422144100476a21152014450d014100210d2016200241206a2202470d000c0a0b0b4101210d0c080b4100210d0c070b200341ec036a4101360200200341013602dc022003418898c4003602d802200342013702dc03200341d497c4003602d8032003200341d8026a3602e803200341d8036a41c498c4001061000b41194101102a000b41394101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b200a20084105746a2117200a21024100211402400240024002400240024002400340201720026b41ff004d0d01200341386a2002460d0220142002200341386a412010960422164100476a21142016450d02200241206a2216200341386a460d0220142016200341386a412010960422164100476a21142016450d02200241c0006a2216200341386a460d0220142016200341386a412010960422164100476a21142016450d02200241e0006a2216200341386a460d0220024180016a210220142016200341386a412010960422164100476a211420160d000c020b0b20022017460d020340200341386a2002460d0120142002200341386a412010960422164100476a21142016450d01410021162017200241206a2202470d000c020b0b410121160b200541ff0171450d010c020b41002116200541ff01710d010b20160d01200341d8036a41186a2214200341386a41186a290300370300200341d8036a41106a2216200341386a41106a290300370300200341d8036a41086a2217200341386a41086a290300370300200320032903383703d80302400240024002400240200b2008470d00200b41016a2202200b490d16200b4101742210200220022010491b2211ad4205862207422088a70d162007a722024100480d16200b450d01200a200b41057420021027220a0d020c030b200b21110c010b20021026220a450d010b200a20084105746a220220032903d803370000200241186a2014290300370000200241106a2016290300370000200241086a2017290300370000200841016a21080240200d450d00200c20154d0d022009200c417f6a220c4105746a22022900002107200229000821192002290010211a200920154105746a221441186a200241186a2900003700002014201a37001020142019370008201420073700000b201821102011210b0c060b20024101102a000b41a8aac4002015200c1029000b200d0d00200341d8036a41186a2215200341386a41186a290300370300200341d8036a41106a2217200341386a41106a290300370300200341d8036a41086a220d200341386a41086a290300370300200320032903383703d8030240024002402018200c470d00201841016a22022018490d1320184101742210200220022010491b2210ad4205862207422088a70d132007a722024100480d132018450d01200920184105742002102722090d020c070b201821100c010b200210262209450d050b2009200c4105746a220220032903d803370000200241186a2015290300370000200241106a2017290300370000200241086a200d290300370000200c41016a210c2016450d03200820144d0d05200a2008417f6a22084105746a22022900002107200229000821192002290010211a200a20144105746a221441186a200241186a2900003700002014201a37001020142019370008201420073700000c030b4192aac4002114411621020b02402018450d00200910230b200b450d00200a10230b41012116410121150c150b200341fd036a2003290318370000200341e5036a200341386a41086a290300370000200341d8036a41156a200341386a41106a290300370000200341f5036a200341386a41186a29030037000020034185046a200341186a41086a2903003700002003418d046a200341186a41106a29030037000020034195046a200341186a41186a290300370000200341013a00dc03200341073a00d803200320032903383700dd03200341a4046a2008360200200341a0046a200c3602002003419d046a20053a00004100210241a886c5004100200341d8036a102c200341d8036a41086a22144200370300200342003703d8034195b7c1004115200341d8036a1000200341d8026a41086a2014290300370300200320032903d8033703d8020240024002400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a10890220032802d8032214450d0120032902dc032207422088a721022007a7450d00201410230b0240200c200e4f0d004100200220086b2214201420024b1b200e490d00200341f4036a2008360200200341f0036a200b360200200341e8036a200c360200200341e4036a20103602002003200a3602ec03200320093602e0032003200e3602dc032003200f3602d803411510262202450d022002410d6a41002900ada844370000200241086a41002900a8a844370000200241002900a0a84437000020024115413510272202450d03200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22164200370300200342003703d80220024135200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2016290300370300200320032903d8023703b802200341203602dc022003200341b8026a3602d802200341d8036a200341d8026a10ad03200210232010450d0c0c0b0b02400240200c200e490d00200341e5036a200341186a41086a290300370000200341ed036a200341186a41106a290300370000200341f5036a200341186a41186a290300370000200341023a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c411910262214450d07201441186a41002d00bea9443a0000201441106a41002900b6a944370000201441086a41002900aea944370000201441002900a6a94437000020144119413910272214450d0820142003290318370019201441316a200341186a41186a290300370000201441296a200341186a41106a290300370000201441216a200341186a41086a290300370000200341d8026a41186a22154200370300200341d8026a41106a22164200370300200341d8026a41086a22174200370300200342003703d80220144139200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2016290300370300200341b8026a41086a2017290300370300200320032903d8023703b802410e21150240200341b8026a412041a886c500410041001001417f460d00200342203702cc032003200341b8026a3602c803200341d8036a200341c8036a102f20032802d8032215410e460d0a200341d8026a200341d8036a41047241ec001094041a200341b8026a412010030b200341c8016a200341d8026a41ec001094041a2015410e470d0120141023411521144115102622020d0a0c0b0b200341e5036a200341206a290300370000200341ed036a200341286a290300370000200341f5036a200341306a290300370000200341033a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c41152114411510262202450d0a0c090b200341d8006a200341c8016a41ec001094041a20141023200320153602d803200341d8036a410472200341d8006a41ec001094041a200341e4026a2002360200200341d8026a41086a200e360200200341003a00dc02200341013a00d802200341106a200341d8036a200341d8026a10d202200341fd036a2003280210453a0000200341e5036a200341186a41086a290300370000200341ed036a200341286a290300370000200341f5036a200341306a290300370000200341043a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c411521144115102622020d080c090b41d4aac10041331021000b41154101102a000b41354101102a000b20024101102a000b41a8aac400201420081029000b41194101102a000b41394101102a000b41d4aac10041331021000b2002410d6a41002900ada844370000200241086a41002900a8a844370000200241002900a0a8443700000240024020022014413510272202450d00200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a29030037000042002107200341d8026a41186a22154200370300200341d8026a41106a22164200370300200341d8026a41086a22144200370300200342003703d80220024135200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2016290300370300200341b8026a41086a2014290300370300200320032903d8023703b802200341b8026a4120100320021023200341d8036a41086a22024200370300200342003703d8034188a8c4004118200341d8036a100020142002290300370300200320032903d8033703d80202400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a102820032802d803220d450d0320032902dc0321070c010b4101210d0b4100210802400240024002402007422088a72216450d0041002117410021084100211402400340024002402008450d00200d20144105746a2102200d201420176a4105746a21150340201420164f0d06200341186a2002460d022002200341186a4120109604450d02201720146a221820164f0d0720152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000200241206a2102201541206a21152016201441016a2214470d000c050b0b200d20144105746a21020340201420164f0d05200341186a2002460d012002200341186a4120109604450d01200241206a21022016201441016a2214470d000c030b0b2017417f6a2117200841016a2108201441016a22142016470d000c020b0b410021080b200341d8036a41086a22024200370300200342003703d8034188a8c4004118200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d802200341003602e003200342013703d8032003201620086b22143602c801200341c8016a200341d8036a1041024002402014450d00201641057420084105746b21184100200228020022146b211620032802d803210820032802dc032117200d210203400240201720166a411f4b0d00201441206a22152014490d0f2017410174220c20152015200c491b22154100480d0f024002402017450d00200820172015102722080d010c080b201510262208450d070b201521170b200820146a22152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000201641606a2116201441206a2114200241206a2102201841606a22180d000b200341e0036a2014360200200320173602dc03200320083602d8030c010b2002280200211420032802dc03211720032802d80321080b200341d8026a411020082014100402402017450d00200810230b02402007a7450d00200d10230b20100d060c070b41b4c4c200201420161029000b4194c5c200201820161029000b20154101102a000b41354101102a000b41d4aac10041331021000b20144101102a000b200910230b0240200b450d00200a10230b4100211441012116410121150c0b0b2007422088a72102201921070b200b200241057422176a22152014290000370000201541186a201441186a290000370000201541106a201441106a290000370000201541086a201441086a290000370000200341d8036a41086a22144200370300200342003703d8034188a8c4004118200341d8036a1000200341d8026a41086a2014290300370300200320032903d8033703d802200341003602e003200342013703d8032003200241016a22023602c801200341c8016a200341d8036a1041024002402002450d00201741206a21084100201428020022146b211720032802d803210920032802dc032118200b210203400240201820176a411f4b0d00201441206a22152014490d052018410174220a20152015200a491b22154100480d05024002402018450d00200920182015102722090d010c080b201510262209450d070b201521180b200920146a22152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000201741606a2117201441206a2114200241206a2102200841606a22080d000b200341e0036a2014360200200320183602dc03200320093602d8030c010b2014280200211420032802dc03211820032802d80321090b200341d8026a411020092014100402402018450d00200910230b02402007a7450d00200b10230b200341c8016a41186a200341d8006a41186a290300370300200341c8016a41106a200341d8006a41106a290300370300200341c8016a41086a200341d8006a41086a290300370300200320032903583703c801200341d8036a201641f0001094041a411910262202450d03200241186a41002d00bea9443a0000200241106a41002900b6a944370000200241086a41002900aea944370000200241002900a6a94437000020024119413910272202450d04200220032903c801370019200241316a200341c8016a41186a290300370000200241296a200341c8016a41106a290300370000200241216a200341c8016a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22174200370300200342003703d80220024139200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2017290300370300200320032903d8023703b802200341003602e002200342013703d802200341d8036a200341d8026a103920032802dc022114200341b8026a412020032802d802221520032802e002100402402014450d00201510230b20021023200341d8036a1024412010262202450d0520022003290338370000200241186a200341386a41186a290300370000200241106a200341386a41106a290300370000200241086a200341386a41086a290300370000200341c8016a41186a200341d8006a41186a290300370300200341c8016a41106a200341d8006a41106a290300370300200341c8016a41086a200341d8006a41086a290300370300200320032903583703c801200341f4036a4100360200200341e4036a428180808010370200200342013702ec03200320023602e003200320053602dc032003200c3602d803411510262214450d062014410d6a41002900ada844370000201441086a41002900a8a844370000201441002900a0a84437000020144115413510272214450d07201420032903c8013700152014412d6a200341c8016a41186a290300370000201441256a200341c8016a41106a2903003700002014411d6a200341c8016a41086a290300370000200341d8026a41186a22154200370300200341d8026a41106a22174200370300200341d8026a41086a22184200370300200342003703d80220144135200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2017290300370300200341b8026a41086a2018290300370300200320032903d8023703b802200341203602dc022003200341b8026a3602d802200341d8036a200341d8026a10ad032014102320021023200341d8036a410d6a200341386a41086a290300370000200341ed036a200341386a41106a290300370000200341d8036a411d6a200341386a41186a290300370000200341d8036a41256a2003290358370000200341d8036a412d6a200341d8006a41086a290300370000200341d8036a41356a200341d8006a41106a29030037000020034195046a200341d8006a41186a290300370000200341003a00dc03200341073a00d803200320032903383700dd03200341a4046a2005360200200341a0046a200c36020041a886c5004100200341d8036a102c0b201610234100211641012115410021140c080b101e000b20154101102a000b41194101102a000b41394101102a000b41204101102a000b41154101102a000b41354101102a000b201710242017102341002115410121160b02400240200441037122044101460d0020044102470d012016450d01200141086a28020022011024200110230c010b2015450d00200141046a28020022011024200110230b2000200236020420002014360200200341d0046a24000bfc09010b7f230041a0026b2202240002400240411210262203450d00200341106a41002f00c4ad443b0000200341086a41002900bcad44370000200341002900b4ad4437000020034112413210272203450d01200320012900003700122003412a6a200141186a290000370000200341226a200141106a2900003700002003411a6a200141086a290000370000200241e0006a41186a22014200370300200241e0006a41106a22044200370300200241e0006a41086a220542003703002002420037036020034132200241e0006a1002200241c0006a41186a2001290300370300200241c0006a41106a2004290300370300200241c0006a41086a200529030037030020022002290360370340024002400240200241c0006a412041a886c500410041001001417f460d0020014200370300200241f0006a4200370300200241e8006a420037030020024200370360200241c0006a4120200241e0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241e0006a41186a2204290300370300200241106a2205200241e0006a41106a2206290300370300200241086a2207200241e0006a41086a22082903003703002002200229036037030020024180026a41186a2209200129030037030020024180026a41106a2201200529030037030020024180026a41086a220520072903003703002002200229030037038002200241c0016a41186a2009290300370300200241c0016a41106a2001290300370300200241c0016a41086a200529030037030020022002290380023703c00120044200370300200642003703002008420037030020024200370360200241c0006a4120200241e0006a4120412010012201417f460d022001411f4d0d02200241186a2201200241e0006a41186a290300370300200241106a2204200241e0006a41106a290300370300200241086a2205200241e0006a41086a2903003703002002200229036037030020024180026a41186a2206200129030037030020024180026a41106a2207200429030037030020024180026a41086a220820052903003703002002200229030037038002200241e0016a41186a22092006290300370300200241e0016a41106a22062007290300370300200241e0016a41086a2207200829030037030020022002290380023703e00120024180016a41186a2208200241c0016a41186a29030037030020024180016a41106a220a200241c0016a41106a29030037030020024180016a41086a220b200241c0016a41086a29030037030020024180016a41286a220c200729030037030020024180016a41306a2207200629030037030020024180016a41386a22062009290300370300200220022903c00137038001200220022903e0013703a001200241386a22092006290300370300200241306a22062007290300370300200241286a2207200c290300370300200241206a220c20022903a001370300200120082903003703002004200a2903003703002005200b2903003703002002200229038001370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a2001290300370000200041216a200c290300370000200041296a2007290300370000200041316a2006290300370000200041396a20092903003700000c010b200041003a00000b20031023200241a0026a24000f0b41d4aac10041331021000b41124101102a000b41324101102a000b4d01017f230041206b22002400200041146a41013602002000410136021c2000418898c40036021820004201370204200041d497c4003602002000200041186a360210200041b498c4001061000b130020004100360204200041a886c5003602000b13002000410f360204200041a7e4c3003602000b130020004104360204200041d4dec3003602000b130020004101360204200041d4ddc3003602000b130020004104360204200041cdddc3003602000b130020004101360204200041b8dcc3003602000b13002000410236020420004194d8c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010262206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b41204101102a000bb00901097f230041106b2202240020024100360208200242013703002002410436020c2002410c6a200210410240024002400240024002400240024020022802042203200228020822046b41044f0d00200441046a22052004490d0520034101742206200520052006491b22064100480d052003450d0120022802002003200610272203450d020c030b200441046a2105200228020021030c030b2006102622030d010b20064101102a000b20022006360204200220033602000b200241086a22062005360200200320046a41eede91ab063600002002410e36020c2002410c6a200210410240024002400240024020022802042203200628020022066b410e4f0d002006410e6a22052006490d0520034101742204200520052004491b22074100480d052003450d0120022802002003200710272204450d020c030b2006410e6a2105200228020021040c030b2007102622040d010b20074101102a000b2002200736020420022004360200200721030b200241086a22072005360200200420066a220641066a41002900bce543370000200641002900b6e5433700000240200320056b41034b0d00200541046a22062005490d0120034101742208200620062008491b22064100480d010240024002402003450d0020042003200610272204450d010c020b2006102622040d010b20064101102a000b20022006360204200220043602000b2007200541046a360200200420056a410a360000024020022802042203200728020022056b41034b0d00200541046a22062005490d0120034101742207200620062007491b22064100480d010240024002402003450d0020042003200610272204450d010c020b2006102622040d010b20064101102a000b20022006360204200220043602000b200241086a2203200541046a360200200420056a41df003600000240024002400240024020022802042205200328020022046b41044f0d00200441046a22032004490d0520054101742206200320032006491b22034100480d052005450d0120022802002005200310272205450d020c030b200228020021050c030b2003102622050d010b20034101102a000b20022003360204200220053602000b200241086a2208200441046a360200200520046a41df003600002002410736020c2002410c6a200210412008280200210641c4e5c30021072002280204210503400240024002400240200520066b41084f0d00200641086a22042006490d0520054101742203200420042003491b22094100480d052005450d01200228020020052009102722030d020c060b200641086a2104200228020021030c020b200910262203450d040b2002200936020420022003360200200921050b20082004360200200320066a2007290000370000200741086a28020021090240200520046b41034b0d00200441046a22062004490d022005410174220a20062006200a491b22064100480d02024002402005450d00200320052006102722030d010c060b200610262203450d050b2002200636020420022003360200200621050b2008200441046a2206360200200320046a20093600002007410c6a22074198e6c300470d000b200241106a24002006ad4220862003ad840f0b101e000b20094101102a000b20064101102a000bad1d03037f027e077f23004180096b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c20024188076a200241086a108f0120024198076a2802002101200228029407210320022802900721042002290388072105200241f8036a2002419c076a41e4001094041a0240024002400240024002400240024002400240024002400240024002402004450d00200241f8006a200241f8036a41e4001094041a20024188076a200241086a10aa0202402002280288072200450d00200229028c072106200241146a200241f8006a41e4001094041a20024188016a200136020020024184016a20033602002002200436028001200220053703782002418c016a200241146a41e4001094042101200241f4016a2006370200200220003602f001200241f8006a108a0320022903782205500d0620024188076a2005427f7c10970220024188076a200141201096040d06200241f0016a28020021004104210741002108410021090240200241f8016a280200220141f8016c41f801490d002001410c6c220a10262207450d0e200121090b02402001450d00200141f8016c210a200141037441786a2104200721010340200220003602f80320024188076a200241f8036a108b03200141086a20024188076a41086a28020036020020012002290388073702002001410c6a2101200041f8016a2100200a41887e6a220a0d000b200441037641016a21080b4104210b4100210a4100210c02402008410c6c2201410c490d002001410c6e220c41037422004100480d0f20001026220b450d100b0240200720016a22032007460d004100210a200b210120072100034020002802002104200141046a200041086a28020036020020012004360200200141086a2101200a41016a210a2000410c6a22002003470d000b0b20024188076a200b200a108c030240200c450d00200b10230b02402008450d002008410c6c21002007210103400240200141046a280200450d00200128020010230b2001410c6a2101200041746a22000d000b0b02402009450d00200710230b0240200241cc016a220120024188076a4120109604450d0041defdc400410e100f20014120101720024188076a412010170b200120024188076a41201096040d0a200241f4016a2802002108200241f8006a41f8006a2802002107200241f8006a4180016a280200210a20024180026a200241f8006a41f8001094041a2007200a41f8016c6a21002002290380022106200721010240200a450d00200241f8036a41f8006a210420024188076a41086a210320072101034020024198066a200141f0001094041a200141f0006a2903002105200241f8026a200141f8006a4180011094041a20054203510d04200241f8036a20024198066a41f0001094041a200241f8036a41f0006a20053703002004200241f8026a4180011094041a2002200241f8036a3602f00520024188076a200241f0056a108b032003280200210a0240200228028c07450d0020022802880710230b20024188076a200241f8036a41f8011094041a2002410036028006200241f0056a20024188076a200a20024180066a108d0320022802f0054101460d07024020022802f405220a450d00200a200241f0056a41086a280200100f0b200141f8016a22012000470d000b200021010b20012000470d030c040b02402001450d00200141246c21002004210103400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b2003450d00200410230b2002419c076a4101360200200241013602fc032002419ce6c3003602f8032002420137028c07200241a4e6c300360288072002200241f8036a3602980720024188076a41ace6c3001061000b200141f8016a22012000460d010b20024190086a210a20024188076a41f8006a21040340200241f8026a200141f0001094041a200141f0006a290300210520024188076a200141f8006a4180011094041a20054203510d0120024198066a200241f8026a41f0001094041a200241f8036a20024188076a4180011094041a20024188076a20024198066a41f0001094041a20024188076a41f0006a20053703002004200241f8036a4180011094041a200a1024200141f8016a22012000470d000b0b02402008450d00200710230b10e00220024188076a41086a22014200370300200242003703880741f5ccc200411120024188076a1000200241f8036a41086a200129030037030020022002290388073703f803200241f8036a411010032006108e03200610ed0210910110e50220024188076a10e402200220024180026a41106a2802002209360290062002280288022103200220024188076a41106a28020022013602940620092001470d06024002402009450d0020022802900721074100210a410021080340024002402003200a6a22012d000022042007200a6a22002d0000470d0002400240024002402004417f6a220b41034b0d000240200b0e0400040203000b024020032007460d00200141016a280000200041016a280000470d050b200141106a280200220b200041106a280200470d04200141086a280200220c200041086a280200220d460d05200c200d200b1096040d040c050b20032007460d04200141016a200041016a41201096040d030c040b024020032007460d00200141016a280000200041016a280000470d030b200141106a280200220b200041106a280200470d02200141086a280200220c200041086a280200220d460d03200c200d200b1096040d020c030b2001410c6a280200220b2000410c6a280200470d01200141046a280200220c200041046a280200220d460d02200c200d200b1096040d010c020b024020032007460d00200141016a280000200041016a280000470d010b200141106a280200220b200041106a280200470d00200141086a280200220c200041086a280200220d460d01200c200d200b109604450d010b41b4eec3004114100f200241f8036a2001108f0320022802f803220b200241f8036a41086a22042802001017024020022802fc03450d00200b10230b200241f8036a2000108f0320022802f803220b20042802001017024020022802fc03450d00200b10230b20012d000020002d00002204470d030b024002400240024002402004417f6a220441034b0d00024020040e0400040203000b024020032007460d00200141016a280000200041016a280000470d080b200141106a2802002204200041106a280200470d07200141086a2802002201200041086a2802002200460d04200120002004109604450d040c070b20032007460d03200141016a200041016a4120109604450d030c060b024020032007460d00200141016a280000200041016a280000470d060b200141106a2802002204200041106a280200470d05200141086a2802002201200041086a2802002200460d02200120002004109604450d020c050b2001410c6a28020022042000410c6a280200470d04200141046a2802002201200041046a2802002200460d01200120002004109604450d010c040b024020032007460d00200141016a280000200041016a280000470d040b200141106a2802002204200041106a280200470d03200141086a2802002201200041086a2802002200460d002001200020041096040d030b200a41246a210a200841016a22082009490d000b0b024020024180026a41346a220120024188076a41346a22004120109604450d0041defdc400410e100f2001412010172000412010170b2001200041201096040d08024020024198076a2802002200450d0020024188076a41086a2802002101200041246c210003400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b024020024194076a280200450d0020024190076a28020010230b024020024190026a2802002200450d0020024180026a41086a2802002101200041246c210003400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b02402002418c026a280200450d0020024188026a28020010230b20024180096a240042010f0b41dcc6c400104f000b20022802f4052201450d0120014103460d0220014104460d0341acc6c400104f000b41b4c5c400104f000b41fcc5c400104f000b41e4c5c400104f000b4194c6c400104f000b41ccc5c400104f000b200220024190066a36028006200220024194066a3602f005200241f8036a41146a4100360200200241f8026a41146a410336020020024184036a410436020020024198066a41146a4103360200200241a886c50036028804200242013702fc03200241c4c6c4003602f803200241043602fc022002420337029c06200241d480c500360298062002200241f8036a360288032002200241f0056a36028003200220024180066a3602f8022002200241f8026a3602a80620024198066a41ccc6c4001061000b41f4c6c400104f000b200a4104102a000b101e000b20004104102a000be3780b0c7f017e017f017e067f037e0b7f0b7e017f027e177f230041800a6b22012400200141003602c003200142043703b803024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041106a28020041246c2202450d0020002802082103410421044100210541002106410021070340024020032d00004101470d00200341106a2802002208417f4c0d04200341016a2800002109024002402008450d00200341086a280200210a20081026220b450d07200b200a20081094041a0c010b4101210b0b200141f0086a41086a220c200141b0056a41086a290200370300200120012902b0053703f008024020072006470d0002400240024020052006470d00200541016a220a2005490d1120054101742206200a200a2006491b2206ad42247e220d422088a70d11200da7220a4100480d112005450d012004200541246c200a102722040d020c0a0b200521060c020b200a10262204450d080b200120063602bc03200120043602b803200621050b2004200741246c6a220a2008360210200a200836020c200a200b360208200a2009360001200a41013a0000200a20012903f008370214200a411c6a200c290300370200200141b8036a41086a200741016a22073602000b200341246a21032002415c6a22020d000c020b0b4104210441002105410021070b200141003602f008418595c3004110200141f0086a41041004200141e0066a41086a22034200370300200142003703e00641af98c300410d200141e0066a1000200141d0076a41086a220a2003290300370300200120012903e0063703d00720012000290300220d3703f008200141d0076a4110200141f0086a4108100420034200370300200142003703e00641fd98c300410d200141e0066a1000200a2003290300370300200120012903e0063703d007200141103602f4082001200141d0076a3602f008200141b8036a200141f0086a10d60220034200370300200142003703e00641fc9cc3004111200141e0066a1000200a2003290300370300200120012903e0063703d007200141d0076a4110200041146a220a41201004411010262203450d03200341086a410029009299433700002003410029008a994337000020034110412010272203450d042003200d427f7c370010200141f0086a41186a22084200370300200141f0086a41106a22024200370300200141f0086a41086a220b4200370300200142003703f00820034118200141f0086a1002200141e8036a41186a2008290300370300200141e8036a41106a2002290300370300200141e8036a41086a200b290300370300200120012903f0083703e803200141e8036a4120200a4120100420031023200141e0066a41086a22034200370300200142003703e00641bc98c3004115200141e0066a1000200141d0076a41086a2003290300370300200120012903e0063703d007200141d0076a4110200041d4006a41201004200141f0086a10d4020240024002400240024020012802f4082203450d00200120033602880420012c00f008210220012802f808210e200141fc086a280200220a41d0004b0d02200e21080c010b200141013602880441002108410021024100210a0b20014188096a2000412c6a29000037030020014180096a200041246a290000370300200141f8086a2000411c6a290000370300200120002900143703f0080240200a2008470d00200841016a22032008490d0d2008410174220a20032003200a491b220ead420586220d422088a70d0d200da7220a4100480d0d2008450d022001280288042008410574200a10272203450d030c0a0b20012802880421032008210e0c0a0b200141f0086a41186a220b2000412c6a290000370300200141f0086a41106a2206200041246a290000370300200141f0086a41086a22092000411c6a290000370300200120002900143703f008200a20024d0d07200320024105746a220820012903f008370000200841186a200b290300370000200841106a2006290300370000200841086a2009290300370000200241187441808080086a41187541d1006f21020c0a0b200a102622030d070b200a4101102a000b101d000b20084101102a000b200a4104102a000b41104101102a000b41204101102a000b41a49dc3002002200a1029000b20012003360288042008210a0b2003200a4105746a220820012903f008370000200841186a200141f0086a41186a290300370000200841106a200141f0086a41106a290300370000200841086a200141f0086a41086a290300370000200a41016a210a0b200141e0066a41086a22084200370300200142003703e006418d9dc3004115200141e0066a1000200141d0076a41086a2008290300370300200120012903e0063703d007200141003602f808200142013703f008024002400240024002400240024002400240024002400240410110262208450d00200820023a000020014281808080103702f408200120083602f0082001200a3602b005200141b0056a200141f0086a104102400240024002400240200a450d00200a41057421064100200141f0086a41086a280200220a6b210220012802f008210920012802f408210b03400240200b20026a411f4b0d00200a41206a2208200a490d13200b410174220c20082008200c491b22084100480d1302400240200b450d002009200b2008102722090d010c060b200810262209450d050b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141f8086a200a3602002001200b3602f408200120093602f0080c010b200141f8086a280200210a20012802f408210b20012802f00821090b200141d0076a41102009200a10040240200b450d00200910230b0240200e450d0020012802880410230b200141e0066a41086a22034200370300200142003703e00641b49dc300410d200141e0066a1000200141d0076a41086a220a2003290300370300200120012903e0063703d007200141d0076a4110100320034200370300200142003703e00641c19dc3004111200141e0066a1000200a2003290300370300200120012903e0063703d007200141d0076a4110100341121026220a450d04200a41106a41002f00e29d433b0000200a41086a41002900da9d43370000200a41002900d29d43370000200141f0086a41186a22034200370300200141f0086a41106a22084200370300200141f0086a41086a22024200370300200142003703f008200a4112200141f0086a1002200141c8036a41186a220b2003290300370300200141c8036a41106a2008290300370300200141c8036a41086a2002290300370300200120012903f0083703c803412010262203450d05200320012903c803370000200341186a200b290300370000200341106a200141c8036a41106a290300370000200341086a200141c8036a41086a290300370000200a1023200341201018200310232000290300210f200141a8036a41d198c3004115109201024020012802a8034101470d0020012903b003210d200141e0066a41086a22034200370300200142003703e00641e698c3004117200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008200141f0086a411041a886c500410041001001417f470d00200141e0066a41086a22034200370300200142003703e00641e698c3004117200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f0082001200d3703b005200141f0086a4110200141b0056a410810040b200f423c824200520d09200141e0066a41086a22034200370300200142003703e00641c5cac4004114200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410021100240200141f0086a411041a886c500410041001001417f460d00200141003602b005200141f0086a4110200141b0056a41044100100141016a41044d0d0320012802b00521100b200141e0066a41086a22034200370300200142003703e00641dfbac400410f200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410221030240200141f0086a411041a886c500410041001001417f460d00200141003a00b005200141f0086a4110200141b0056a41014100100141016a41014d0d0720012d00b0052103200141f0086a411010030b200141f0076a20101075024002400240024020012802f007220e450d00200141f0076a41086a280200210020012802f4072111200141e0066a41086a22034200370300200142003703e00641a2adc4004112200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008200141003602b805200142013703b005200120003602880420014188046a200141b0056a10412000450d01200041057421064100200141b0056a41086a280200220a6b210220012802b005210920012802b405210b200e210303400240200b20026a411f4b0d00200a41206a2208200a490d15200b410174220c20082008200c491b22084100480d1502400240200b450d002009200b2008102722090d010c090b200810262209450d080b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141b8056a200a3602002001200b3602b405200120093602b0050c020b200341ff01714102472003712112200141e0066a41086a22034200370300200142003703e00641a2adc4004112200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f00841002111200141f0086a411041a886c500410041001001417f460d022001421037028c042001200141f0086a36028804200141b0056a20014188046a102820012802b005220e450d0a200141b8056a280200210020012802b40521110c0b0b200141b0056a41086a280200210a20012802b405210b20012802b00521090b200141f0086a41102009200a10040240200b450d00200910230b410121120c090b4101210e410021000c080b20084101102a000b20084101102a000b41d4aac10041331021000b41014101102a000b41124101102a000b41204101102a000b41d4aac10041331021000b41d4aac10041331021000b200141e0066a41086a22034200370300200142003703e00641c5cac4004114200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410121132001201041016a22033602b005200141f0086a4110200141b0056a41041004200120033602f408200141033a00f0084100210241a886c5004100200141f0086a102c0240024002400240024002400240024002400240024002400240024002400240024002400240024020004105742203450d0020034105752210ad42e0007e220d422088a70d1a200da7220a4100480d1a200a10262213450d03200e20036a200e470d010c020b41002110200e20036a200e460d010b2000410574210b200141f0086a41206a2103200141b0056a41017221084100210220132106200e210a0340200141f0076a41186a2209200a41186a290000370300200141f0076a41106a220c200a41106a290000370300200141f0076a41086a2200200a41086a2900003703002001200a2900003703f007200141b0056a200141f0076a10fe020240024020012d00b0054101470d0020014188046a41386a200841386a29000037030020014188046a41306a200841306a29000037030020014188046a41286a200841286a29000037030020014188046a41206a200841206a29000037030020014188046a41186a200841186a29000037030020014188046a41106a200841106a29000037030020014188046a41086a200841086a29000037030020012008290000370388040c010b20014188046a41386a420037030020014188046a41306a420037030020014188046a41286a420037030020014188046a41206a420037030020014188046a41186a420037030020014188046a41106a420037030020014188046a41086a420037030020014200370388040b200a41206a210a2003200129038804370000200141f0086a41186a2009290300370300200141f0086a41106a200c290300370300200141f0086a41086a2000290300370300200341086a20014188046a41086a290300370000200341106a20014188046a41106a290300370000200341186a20014188046a41186a290300370000200341206a20014188046a41206a290300370000200341286a20014188046a41286a290300370000200341306a20014188046a41306a290300370000200341386a20014188046a41386a290300370000200120012903f0073703f008200241016a21022006200141f0086a41e00010940441e0006a2106200b41606a220b0d000b0b02402011450d00200e10230b2012450d0f4108210e410021084100211102402013200241e0006c6a220320136b221441e000490d00201441e0006e221141286c220a4100480d18200a1026220e450d030b0240201320034622150d00200241e0006c210b201341206a210a41002108200e21030340200141f0086a41186a200a41186a2900002216370300200141f0086a41106a200a41106a2900002217370300200141f0086a41086a200a41086a2900002218370300200a290000210d200141e8036a41086a22062018370300200141e8036a41106a22092017370300200141e8036a41186a220c20163703002001200d3703e8032001200d3703f008200141c8036a41186a2200200c290300370300200141c8036a41106a220c2009290300370300200141c8036a41086a22092006290300370300200120012903e8033703c803200341186a2000290300370200200341106a200c290300370200200341086a2009290300370200200320012903c803370200200341206a4201370300200341286a2103200a41e0006a210a200841016a2108200b41a07f6a220b0d000b0b4108210c200141d0076a41086a22034200370300200142003703d00741dbcbc300411b200141d0076a100020014188046a41086a2003290300370300200120012903d0073703880441002100024020014188046a411041a886c500410041001001417f460d00200142103702b405200120014188046a3602b005200141f0086a200141b0056a10890220012802f008220c450d0220012802f40821002008200141f8086a280200470d050c040b20084100460d030c040b200a4101102a000b41d4aac10041331021000b200a4108102a000b200e200c460d01417f210b200e2103200c210a0340200b41016a220b20084f0d022003200a41201096040d01200a41206a2106200341206a2109200341286a2103200a41286a210a20092903002006290300510d000b0b200141d0076a41086a22034200370300200142003703d00741aec8c3004117200141d0076a100020014188046a41086a2003290300370300200120012903d0073703880420014188046a411041a886c500410041001001417f460d01200142003703f00820014188046a4110200141f0086a41084100100141016a41084d0d0520012903f008210d200142003703f00820014188046a4110200141f0086a41084108100141016a41084d0d0520012903f008211620014188046a41101003200120083602f808200120113602f4082001200e3602f008200141f0086a200d4201201610ef0220000d020c030b02402000450d00200c10230b2011450d02200e102320120d030c090b200120083602f808200120113602f4082001200e3602f008200141f0086a42004200200d10ef022000450d010b200c10230b2012450d060b4101210e41002108410021120240201441e000490d00201441e0006e221241057422031026220e450d030b024020150d00200241e0006c2102201341c0006a210341002108200e210a0340200141f0086a41186a200341186a2900002216370300200141f0086a41106a200341106a2900002217370300200141f0086a41086a200341086a29000022183703002003290000210d200141e8036a41086a220b2018370300200141e8036a41106a22062017370300200141e8036a41186a220920163703002001200d3703e8032001200d3703f008200141c8036a41186a220c2009290300370300200141c8036a41106a22092006290300370300200141c8036a41086a2206200b290300370300200120012903e8033703c803200a41186a200c290300370000200a41106a2009290300370000200a41086a2006290300370000200a20012903c803370000200341e0006a2103200841016a2108200a41206a210a200241a07f6a22020d000b0b200141d0076a41086a22034200370300200142003703d0074192adc4004110200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e0060240200141e0066a411041a886c500410041001001417f460d00200142103702b4052001200141e0066a3602b005200141f0086a200141b0056a102820012802f0082211450d0220012802f40821142008200141f8086a280200470d050c040b410121114100211420084100460d030c040b41d4aac10041331021000b41d4aac10041331021000b20034101102a000b0240200e2011460d002008450d0041002102200e21032011210a03402003200a41201096040d02200341206a2103200a41206a210a200241016a22022008490d000b0b02402014450d00201110230b2012450d01200e102320100d020c030b200141d0076a41086a22034200370300200142003703d0074192adc4004110200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e006200141003602f808200142013703f008200120083602b005200141b0056a200141f0086a1041024002402008450d00200841057421094100200141f0086a41086a280200220a6b210b20012802f008210c20012802f4082106200e2103034002402006200b6a411f4b0d00200a41206a2202200a490d0c20064101742200200220022000491b22024100480d0c024002402006450d00200c200620021027220c0d010c090b20021026220c450d080b200221060b200c200a6a22022003290000370000200241186a200341186a290000370000200241106a200341106a290000370000200241086a200341086a290000370000200b41606a210b200a41206a210a200341206a2103200941606a22090d000b200141f8086a200a360200200120063602f4082001200c3602f0080c010b200141f0086a41086a280200210a20012802f408210620012802f008210c0b200141e0066a4110200c200a100402402006450d00200c10230b200141003602f808200142013703f008410110262203450d06200341003a000020014281808080103702f408200120033602f008200120083602b005200141b0056a200141f0086a104102402008450d00200841057421064100200141f0086a41086a280200220a6b210220012802f008210920012802f408210b200e210303400240200b20026a411f4b0d00200a41206a2208200a490d0b200b410174220c20082008200c491b22084100480d0b02400240200b450d002009200b2008102722090d010c090b200810262209450d080b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141f8086a200a3602002001200b3602f408200120093602f0080b20014188046a41086a2203200141f0086a41086a280200360200200120012903f00837038804200141bb056a200328020036000020012001290388043700b30502402012450d00200e10230b200141fc086a200141b7056a290000370000200141e1eac98b063600f108200141023a00f008200120012900b0053700f508200141f0086a10d5022014450d00201110230b2010450d010b201310230b0240200f4280e20e82500d00200141e0066a21190c050b200141d0076a41086a22034200370300200142003703d00741f186c000411f200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e0060240200141e0066a411041a886c500410041001001417f460d00200141003a00f008200141e0066a4110200141f0086a41014100100141016a41014d0d0320012d00f0082103200141e0066a411010032003450d00200141e0066a2119200f101f450d05200f102e1a0c050b200141e0066a2119200f102e450d04200f101f1a0c040b20024101102a000b20084101102a000b41d4aac10041331021000b41014101102a000b200141d0076a41086a22034200370300200142003703d007419087c0004113200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e006410021030240024002400240024002400240024002402019411041a886c500410041001001417f460d00200141003602f008200141e0066a4110200141f0086a41044100100141016a41044d0d0120012802f00821030b200141d0076a41086a220a4200370300200142003703d00741a387c0004119200141d0076a1000200141e0066a41086a200a290300370300200120012903d0073703e0064100210a02402019411041a886c500410041001001417f460d00200141003602f008200141e0066a4110200141f0086a41044100100141016a41044d0d0220012802f008210a0b02400240024002402003200a4f0d00200141fc086a210b200141f8086a210802400340200141f0086a2003103820082802002202410e470d01200341016a2203200a490d000c020b0b20012903f008210d20014188046a200b41fc001094041a200141f0076a20014188046a41fc001094041a20014180096a220820023602002001200d3703f808200120033602f00820014184096a200141f0076a41fc00109404210b0240200d200f520d00200141e0066a41086a2208200141f0086a41086a290300370300200120012903f0083703e006200141b0056a200b41fc001094041a20014188046a41086a220b2008290300370300200120012903e00637038804200141f0086a200141b0056a41fc001094041a4190011026221a450d07201a200129038804370300201a2002360210201a41086a200b290300370300201a41146a200141f0086a41fc001094041a200341016a2203200a4f0d03200141f0086a41106a2109200141f0086a41146a210c200141fc086a2100200141f0086a41086a21024101211b410121080340200141f0086a2003103802402002280200220b410e470d00200341016a2203200a490d010c040b20012903f008210d20014188046a200041fc001094041a200141f0076a20014188046a41fc001094041a2009200b3602002002200d370300200120033602f008200c200141f0076a41fc001094042106200d200f520d05200141e0066a41086a220e2002290300370300200120012903f0083703e006200141b0056a200641fc001094041a200141d0076a41086a2213200e290300370300200120012903e0063703d007200141f0086a200141b0056a41fc001094041a0240201b2008470d00201b41016a2206201b490d0f201b410174220e20062006200e491b2206ad4290017e220d422088a70d0f200da7220e4100480d0f02400240201b450d00201a201b4190016c200e1027221a0d010c0c0b200e1026221a450d0b0b2006211b0b201a20084190016c6a220620012903d007370300200641086a2013290300370300200641106a200b360200200641146a200141f0086a41fc001094041a200841016a2108200341016a2203200a490d000c030b0b200810240b4100211b4108211a410021080b419001211c201a20084190016c6a211d2008450d060c070b4101211b419001211c201a41014190016c6a211d41010d060c050b20091024419001211c201a20084190016c6a211d20080d050c040b41d4aac10041331021000b41d4aac10041331021000b4190014108102a000b200e4108102a000b201a2223201d460d020c010b20014188046a41086a211e200141f0086a41086a210e200141f0086a410472210320014188046a410c6a211f20014188046a41f8006a2120200141f9086a212120014188056a2122201a212302400340202341106a280200210a2023290208210d20232802002102200141f0086a202341146a41fc001094041a2023201c6a2123200a410e460d01200141f0076a200141f0086a41fc001094041a201e200a3602002001200d37038804201f200141f0076a41fc001094041a200141b0056a2002103020012802b0052109024002400240200141b0056a41086a2213280200220a450d00200a410574210b420021242009210a4200212542002126420021274200212842002129034020014198036a200a103420014198036a41086a2903002116200129039803210d2003200a290000370000200341086a200a41086a290000370000200341106a200a41106a290000370000200341186a200a41186a290000370000200120023602f00820014190036a200141f0086a103120012d00900341017121080240024020012d0091032206450d00200141f0026a201642002006ad2217420010980420014180036a200d420020174200109804200141e0026a42004200200d4200109804427f20014180036a41086a290300221720012903f00220012903e0027c7c221820012903f80220012903e8028442005220182017547222061b2117427f20012903800320061b21180c010b200141d0026a200d2016420a420010970420012903d0022218210d200141d0026a41086a290300221721160b200a41206a210a4200201720081b20277c4200201820081b222a20267c2226202a54ad7c21272017420020081b20297c2018420020081b221720287c2228201754ad7c2129201620257c200d20247c2224200d54ad7c2125200b41606a220b0d000b20012802b405450d020c010b42002128420021294200212642002127420021244200212520012802b405450d010b200910230b200141b0056a2002103020012802b00521100240024002402013280200220a450d00200a410574210b420021182010210a4200212b4200212a4200212c4200212d4200212e03402003200a290000370000200341086a200a41086a2208290000370000200341106a200a41106a2206290000370000200341186a200a41186a2209290000370000200120023602f008200141c8026a200141f0086a103120012d00c802210c20012d00c9022100200141f0086a41186a2009290000370300200141f0086a41106a2006290000370300200e20082900003703002001200a2900003703f008200141a8026a2002200141f0086a200041101032200141a8026a41186a290300202b7c20012903b802220d20187c2218200d54ad7c212b4200200141a8026a41086a290300220d200c41017122081b202c7c420020012903a802221620081b2217202a7c222a201754ad7c212c200d420020081b202e7c2016420020081b220d202d7c222d200d54ad7c212e200a41206a210a200b41606a220b0d000b20012802b405450d020c010b4200212d4200212e4200212a4200212c420021184200212b20012802b405450d010b201010230b42002116200141d0076a41086a222f4200370300200142003703d00741ecb5c1004116200141d0076a1000200141e0066a41086a2214202f290300370300200120012903d0073703e006024002402019411041a886c500410041001001417f460d00200142003703f808200142003703f008200141e0066a4110200141f0086a411041001001220a417f460d09200a410f4d0d09200e290300210d20012903f00821160c010b4200210d0b024002400240201820247c2217420288202b20257c2017201854ad7c2218423e868422242017852018420288222520188584500d002024202584500d004100210a0240034020014198026a20172018200a41046a41fe0071109a04200a41026a210a200129039802222420178520014198026a41086a290300222520188584500d0120242025844200520d000b0b20014188026a20172018200a41fe0071109a0420012903880220014188026a41086a29030084212442002125200a450d012024420052ad21240340200141e8016a201720184100200a417e6a22082008200a4b1b220a41ff0071109a04200141f8016a20244201862230420184222b20254201862024423f88842225202b20251098042030202b20012903f80120012903e80156200141f8016a41086a2903002224200141e8016a41086a29030022315620242031511b1b2124200a0d000c030b0b420021252017201884420052ad21240c010b2024420052ad21240b0240024002400240024002402016420288200d423e86842217201685200d4202882218200d8584500d002017201884500d004100210a02400340200141d8016a2016200d200a41046a41fe0071109a04200a41026a210a20012903d8012217201685200141d8016a41086a2903002218200d8584500d0120172018844200520d000b0b200141c8016a2016200d200a41fe0071109a0420012903c801200141c8016a41086a29030084211742002118200a450d012017420052ad21170340200141a8016a2016200d4100200a417e6a22082008200a4b1b220a41ff0071109a04200141b8016a20174201862230420184222b20184201862017423f88842218202b20181098042030202b20012903b80120012903a80156200141b8016a41086a2903002217200141a8016a41086a29030022315620172031511b1b2117200a0d000b202420258450450d020c030b420021182016200d84420052ad2117202420258450450d010c020b2017420052ad21172024202584500d010b202c20277c202a20267c2216202a54ad7c212b202e20297c202d20287c220d202d54ad7c212a20222d0000220a4102460d010240200a4101470d000340202521252024212620172018844200510d0a20014188016a200d202a2026202510970420014198016a2016202b2017201810970441012115200129039801222720012903880122285420014198016a41086a290300222420014188016a41086a290300222d542024202d51220a1b0d042028202754202d202454200a1b0d02200141f8006a2027202420172018109804200141e8006a2028202d20262025109804200d200129036822247d222d202a200141e8006a41086a2903007d200d202454ad7d222784500d02202b200141f8006a41086a2903007d212820162001290378220d54210a2016200d7d21242017210d2018212a202d211720272118202621162025212b20242028200aad7d22258450450d000c040b0b0340200141d8006a2016202b202420251097042017222620182227844200510d0a200141d8006a41086a290300211720012903582118200141c8006a200d202a2026202710970441012115201820012903482228542017200141c8006a41086a290300222d542017202d51220a1b0d032028201854202d201754200a1b0d01200141386a2018201720242025109804200141286a2028202d20262027109804200d200129032822177d2218202a200141286a41086a2903007d200d201754ad7d222d84500d01202b200141386a41086a2903007d212820162001290338220d54210a2016200d7d21172024210d2025212a20182124202d2125202621162027212b20172028200aad7d22188450450d000c030b0b410021150c010b200d201656202a202b56202a202b511b21150b200141f0086a2002103020012802f408213220012802f00821330240200e280200220a450d00200a41057421342033210a0340200141c8036a41186a2208200a41186a2209290000370300200141c8036a41106a220b200a41106a220c290000370300200141c8036a41086a2206200a41086a22002900003703002001200a2900003703c803200141d0076a41186a22352009290000370300200141d0076a41106a2236200c290000370300202f2000290000370300200a290000210d200141e8036a41086a22102006290300370300200141e8036a41106a2212200b290300370300200141e8036a41186a221120082903003703002001200d3703d007200120012903c8033703e803200a290000210d200341186a22372009290000370000200341106a2238200c290000370000200341086a223920002900003700002003200d370000200120023602f008200141206a200141f0086a1031410221090240201520012d0020410171220c45734101470d0020012d0021213a200141b0056a41186a2011290300370300200141b0056a41106a201229030037030020132010290300370300200120012903e8033703b005200c21090b200141e0066a41186a2200200141b0056a41186a223b290300370300200141e0066a41106a223c200141b0056a41106a223d29030037030020142013290300370300200120012903b0053703e006024020094102470d00200a41206a210a203441606a22340d010c020b0b200141c0066a41186a223e2000290300370300200141c0066a41106a223f203c290300370300200141c0066a41086a22402014290300370300200120012903e0063703c00620014190056a41186a2241203e29030037030020014190056a41106a2242203f29030037030020014190056a41086a22432040290300370300200120012903c00637039005200141f0086a41186a22442041290300370300200141f0086a41106a22452042290300370300200e2043290300370300200142e4cab5fbb6ccdcb0e3003703b80620012001290390053703f008200141b8066a200141f0086a203a41187441187541027441a8f9c4006a3502004280e90f7e200f7c106320344120460d00203441406a21464100210c03402008200a200c6a220941386a2234290000370300200b200941306a223a2900003703002006200941286a22472900003703002001200941206a22092900003703c803203520342900003703002036203a290000370300202f20472900003703002009290000210d201020062903003703002012200b290300370300201120082903003703002001200d3703d007200120012903c8033703e803200120023602f0082009290000210d20472900002116203a29000021172037203429000037000020382017370000203920163700002003200d370000200141186a200141f0086a1031410221090240201520012d0018410171223445734101470d0020012d00192148203b2011290300370300203d201229030037030020132010290300370300200120012903e8033703b005203421090b2000203b290300370300203c203d29030037030020142013290300370300200120012903b0053703e0060240024020094102470d002046200c470d010c030b203e2000290300370300203f203c29030037030020402014290300370300200120012903e0063703c0062041203e2903003703002042203f29030037030020432040290300370300200120012903c006370390052044204129030037030020452042290300370300200e2043290300370300200142e4cab5fbb6ccdcb0e3003703b80620012001290390053703f008200141b8066a200141f0086a204841187441187541027441a8f9c4006a3502004280e90f7e200f7c10632046200c460d020b200c41206a210c0c000b0b02402032450d00203310230b2002103502400240024002400240024002402015450d00200141f0086a410c6a220a2002360200200e41043a0000200141053a00f00841a886c5004100200141f0086a102c2020290300220d4200510d01200141b0056a20014188046a4188011094041a200141c0066a200d200f7c220d1036200141f0086a200141b0056a4188011094041a200141e0066a200e41f0001094041a20012802c4062206200141c0066a41086a2208280200220a470d02200a41016a220b200a490d0b200a4101742206200b200b2006491b2206ad42f8007e2216422088a70d0b2016a722094100480d0b200a450d0320012802c006200a41f8006c20091027220b0d040c110b200141f0086a410c6a2002360200200e41053a0000200141053a00f00841a886c5004100200141f0086a102c202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a41041004201e10242023201d470d060c050b200141f0086a201e41f0001094041a200141003b01b005200141106a200141f0086a200141b0056a10d20220012802102108200a200236020020212008453a0000200e41073a0000200141053a00f00841a886c5004100200141f0086a102c202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a410410042023201d470d050c040b20012802c006210b0c020b20091026220b450d0d0b200120063602c4062001200b3602c0060b200b200a41f8006c22006a200141e0066a41f00010940421092008200a41016a220c360200200941f0006a200236020041171026220a450d09200a410f6a41002900cb8740370000200a41086a41002900c48740370000200a41002900bc8740370000200a4117412e1027220a450d0a200a200d370017200141f0086a41186a22084200370300200141f0086a41106a22094200370300200e4200370300200142003703f008200a411f200141f0086a1002200141d0076a41186a2008290300370300200141d0076a41106a2009290300370300202f200e290300370300200120012903f0083703d007200141203602f4082001200141d0076a3602f008200141c0066a200141f0086a105c200a10230240200c450d00200041f8006a2108200b210a03400240200a280200410e460d00200a10240b200a41f8006a210a200841887f6a22080d000b0b02402006450d00200b10230b202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a410410042023201d470d010b0b201d21230b2023201d460d010b200141f0086a41106a210a200141f0086a41146a210b0340200141e0066a41086a2208202341086a290300370300200120232903003703e006202341106a2802002103200141f0086a202341146a41fc001094041a2003410e460d0120014188046a41086a22022008290300370300200120012903e00637038804200141b0056a200141f0086a41fc001094041a200a2003360200200141f0086a41086a200229030037030020012001290388043703f008200b200141b0056a41fc001094041a200a102420234190016a2223201d470d000b0b0240201b450d00201a10230b411710262203450d072003410f6a41002900cb8740370000200341086a41002900c48740370000200341002900bc874037000020034117412e10272203450d082003200f370017200141f0086a41186a220a4200370300200141f0086a41106a22084200370300200141f0086a41086a22024200370300200142003703f0082003411f200141f0086a1002200141d0076a41186a200a290300370300200141d0076a41106a2008290300370300200141d0076a41086a2002290300370300200120012903f0083703d00702400240200141d0076a412041a886c500410041001001417f460d00200142203702b4052001200141d0076a3602b005200141f0086a200141b0056a103720012802f008220e450d0b20012902f408210d200141d0076a41201003200d422088a7210a200da721130c010b410021134108210e4100210a0b20031023200e200a41f8006c22036a210202400240024002402003450d00200341887f6a2108200141f0086a4104722106200141fc086a2109200141f9086a210c200141f8086a2100200e210303402003280200210a200141b0056a200341046a41ec001094041a200a410f460d02200141f0086a200141b0056a41ec001094041a024002400240200a410e470d0020080d010c020b200341f0006a280200210b20014188046a200141f0086a41ec001094041a2001200a3602f008200620014188046a41ec001094041a200141003b01b005200141086a200141f0086a200141b0056a10d2022001280208210a2009200b360200200c200a453a0000200041073a0000200141053a00f00841a886c5004100200141f0086a102c2008450d010b200341f8006a2103200841887f6a21080c010b0b200222032002470d020c030b200e22032002470d010c020b200341f8006a22032002460d010b200141f0086a410472210803402003280200210a200141f0086a200341046a41f4001094041a200a410f460d01200141b0056a200141f0086a41f4001094041a2001200a3602f0082008200141b0056a41f4001094041a0240200a410e460d00200141f0086a10240b200341f8006a22032002470d000b0b02402013450d00200e10230b200f10880202402007450d00200741246c210a2004210303400240024020032d0000220841034b0d0002400240024020080e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a2103200a415c6a220a0d040c050b2003410c6a280200450d02200341086a2802001023200341246a2103200a415c6a220a0d030c040b2003410c6a280200450d01200341086a2802001023200341246a2103200a415c6a220a0d020c030b200341086a280200450d00200341046a28020010230b200341246a2103200a415c6a220a0d000b0b02402005450d00200410230b200141800a6a24000f0b101e000b418c95c400104f000b418c95c400104f000b41d4aac10041331021000b41174101102a000b412e4101102a000b20094108102a000b41174101102a000b412e4101102a000b41d4aac10041331021000bf31103057f027e087f230041206b22022400024002400240024002400240024002400240024002400240024041fa0110262203450d00200242fa0137020420022003360200200341003b0000410221042002410236020820022802002105200228020421060240200128020022032903704202520d0041022101024020064102470d0020054102410410272205450d032002410436020420022005360200200241086a28020021010b200520016a41013a0000200241086a2205200528020041016a3602000c060b024020064102470d0020054102410410272205450d032002410436020420022005360200200241086a28020021040b200520046a4181013a0000200241086a2205200528020041016a360200200341086a200210ec0202400240024020022802042201200528020022056b41c0004f0d00200541c0006a22062005490d0920014101742205200620062005491b22054100480d092001450d0120022802002001200510272201450d020c060b200228020021010c060b2005102622010d040b20054101102a000b41fa014101102a000b41044101102a000b41044101102a000b2002200536020420022001360200200241086a28020021050b200241086a2206200541c0006a360200200120056a220541086a200341346a290000370000200541106a2003413c6a290000370000200541186a200341c4006a290000370000200541206a200341cc006a290000370000200541286a200341d4006a290000370000200541306a200341dc006a290000370000200541386a200341e4006a2900003700002005200329002c3700002003200210980202400240024002400240024002400240024002400240200341f0006a2903004201520d0020032903782207420c882208420120084201561b22084200510d0620034180016a290300200880210820022802042201200241086a28020022056b41024f0d01200541026a22062005490d0c20014101742205200620062005491b22054100480d0c2001450d0420022802002001200510272201450d050c090b0240200228020420062802002205470d00200541016a22012005490d0c20054101742206200120012006491b22064100480d0c2005450d0220022802002005200610272201450d030c070b200228020021010c070b200228020021010c080b2006102622010d040b20064101102a000b2005102622010d040b20054101102a000b41b099c300104f000b2002200636020420022001360200200241086a28020021050b200241086a200541016a360200200120056a41003a00000c020b2002200536020420022001360200200241086a28020021050b200241086a200541026a360200200120056a2008a741047420077aa7417f6a22054101200541014b1b2205410f2005410f491b723b00000b20034188016a20021039200241086a22032802002105200241003602182002420137031020022005417e6a36021c2002411c6a200241106a1041024002400240024002402003280200220541014d0d002002280218210620022802102104200228021421092003410036020020022802002103024002400240024002400240024002402005417e6a220a450d004102210b2006450d12200320042d00003a00004101210c200241086a2201200128020041016a36020020064101460d12200420066a210d200320042d00013a00012001200128020041016a3602004102210b200441026a21014100210e2006417e6a2203450d052002280204220b20056b20034f0d01200520036a220c2005490d0d200b4101742205200c200c2005491b220c4100480d0d200b450d022002280200200b200c102722050d030c0a0b0240024002402002280204220520064f0d0020054101742201200620062001491b22014100480d0f2005450d0120032005200110272203450d020c110b4100210b2006450d120c110b2001102622030d0f0b20014101102a000b200228020021050c020b200c10262205450d070b2002200c360204200220053602000b200520066a200541026a200a1095041a02402006200241086a220b280200220c460d002002280200200c6a210520062103034020034102460d03200520012d00003a0000200b200b28020041016a360200200541016a2105200141016a2101200c2003417f6a2203470d000b200d20016b2203450d030b20034100480d0820031026220c450d042006210b2003210e0b200d2001460d060c050b2006210b200a0d0b0c0c0b4101210c2006210b200d2001470d030c040b41cce3c400104f000b20034101102a000b200c4101102a000b200c20012d00003a00004101210f0240200141016a2203200d460d00200c41016a2105200620016b21010340200520032d00003a0000200541016a2105200d200341016a2203470d000b200420016a220f450d010b200c200f6a210d024002400240024020022802042203200b200a6a22056b200f4f0d002005200f6a22012005490d0520034101742205200120012005491b22054100480d052003450d01200228020020032005102722030d020c060b200228020021030c020b200510262203450d040b20022005360204200220033602000b2003200f200b6a22106a2003200b6a200a1095041a02402010200241086a22012802002203460d00200228020020036a2105200f200b6a20036b2106200c21030340200d2003460d01200520032d00003a00002001200128020041016a360200200341016a2103200541016a21052006417f6a22060d000b0b2010210b0b0240200e450d00200c10230b200a450d060c050b101e000b20054101102a000b2002200136020420022003360200200241086a280200210b0b2003200b6a220520042d00003a0000024020064101470d00200b41016a210b0c010b2006417f6a2101200441016a2103200541016a21050340200520032d00003a0000200541016a2105200341016a21032001417f6a22010d000b200b20066a210b0b200241086a200b3602004102210b200a450d010b0240200b200241086a22052802002203460d002002280200220120036a2001200b6a200a1095041a0b20052003200a6a3602000b02402009450d00200410230b20002002290300370200200041086a200241086a280200360200200241206a24000bcb03010b7f230041206b22032400024002402002450d0020024102742204102622050d0120044104102a000b410421050b0240024002400240200120024103746a22062001460d0020024103742107200141046a210420052108034020082004280200360200200441086a2104200841046a2108200741786a22070d000b200641786a20016b41037641016a21094101210a4100210b4100210403402001280200210c0240024002400240200b20046b200141046a28020022084f0d00200420086a22072004490d07200b410174220d20072007200d491b220d4100480d07200b450d01200a200b200d1027220a0d020c080b200820046a21070c020b200d1026220a450d060b200d210b0b200a20046a200c20081094041a20072104200141086a22012006470d000c020b0b4101210a410021094100210b0b200341186a22044200370300200341106a22014200370300200341086a2208420037030020034200370300200a2005200920031019200041186a2004290300370000200041106a2001290300370000200041086a2008290300370000200020032903003700000240200b450d00200a10230b02402002450d00200510230b200341206a24000f0b101e000b200d4101102a000bd41805017f017e037f017e067f230041c0066b22042400200441e8036a200141f8011094041a200441c0026a200441e8036a10960202400240024020042802c0024101470d00200041086a20042902c4023702002000420137020020032802002200450d020c010b200441c0026a41086a2903002105200441a8016a200441d0026a4198011094041a20042005370308200441086a41086a200441a8016a419801109404210602400240024020042802382201410d460d0020014102460d010c020b2004413c6a2802000d01200441fc036a4101360200200441013602c4022004418898c4003602c002200442013702ec03200441d497c4003602e8032004200441c0026a3602f803200441e8036a41d0cec3001061000b10ff02000b200441a8016a41086a22014200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a2001290300370300200420042903a8013703e80341002101024002400240024002400240024002400240024002400240024002400240200441e8036a411041a886c500410041001001417f460d00200441003602c002200441e8036a4110200441c0026a41044100100141016a41044d0d0120042802c00221010b41042107200120026a41818080024f0d0d410021080240200441106a410020042903084201511b2201450d002001450d00024002400240200110d702220520012903202209520d0041032107200120021086020d11411310262207450d0d2007410f6a41002800a99943360000200741086a41002900a299433700002007410029009a994337000020074113413310272207450d0e200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441e8036a41186a220a4200370300200441e8036a41106a220b4200370300200441e8036a41086a220c4200370300200442003703e80320074133200441e8036a1002200441c0026a41186a200a290300370300200441c0026a41106a200b290300370300200441c0026a41086a200c290300370300200420042903e8033703c002200441c0026a412041a886c500410041001001417f460d01200442003703e803200441c0026a4120200441e8036a41084100100141016a41084d0d0820042903e80342017c2105200710234113210a4113102622070d020c0f0b4101410220092005541b21070c100b42012105200710234113210a411310262207450d0d0b2007410f6a41002800a99943360000200741086a41002900a299433700002007410029009a99433700002007200a413310272207450d0d200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441e8036a41186a22014200370300200441e8036a41106a220a4200370300200441e8036a41086a220b4200370300200442003703e80320074133200441e8036a1002200441c0026a41186a2001290300370300200441c0026a41106a200a290300370300200441c0026a41086a200b290300370300200420042903e8033703c002200420053703e803200441c0026a4120200441e8036a41081004200710230b024020032802002207450d00200341086a28020021012003280204210d4100210b0240418595c300411041a886c500410041001001417f460d00200441003602e803418595c3004110200441e8036a41044100100141016a41044d0d0520042802e803210b0b411410262208450d06200841106a41002800ef9643360000200841086a41002900e79643370000200841002900df96433700002008411441281027220a450d07200a200b360014200441e8036a41186a22084200370300200441e8036a41106a220b4200370300200441e8036a41086a220c4200370300200442003703e803200a4118200441e8036a1002200441c0026a41186a2008290300370300200441c0026a41106a200b290300370300200441c0026a41086a200c290300370300200420042903e8033703c002200441003602f003200442013703e803200420013602a801200441a8016a200441e8036a1041024002400240024020042802ec03220c20042802f003220b6b20014f0d00200b20016a2208200b490d0c200c410174220e20082008200e491b220e4100480d0c200c450d0120042802e803200c200e102722080d020c0d0b20042802e80321080c020b200e10262208450d0b0b2004200e3602ec03200420083602e803200e210c0b2008200b6a200720011094041a200441c0026a41202008200b20016a10040240200c450d00200810230b200a102341012108200d450d00200710230b20042903082105200441e8036a200441306a41f8001094041a200441c0026a200441e8036a41086a41f0001094041a200441a8016a41186a220a200641186a290300370300200441a8016a41106a220b200641106a290300370300200441a8016a41086a220c200641086a290300370300200420062903003703a80141002101024020054201520d0020044180066a41186a200a29030037030020044180066a41106a200b29030037030020044180066a41086a200c290300370300200420042903a80137038006410121010b200441a8016a200441c0026a41f0001094041a200441a0066a41186a220620044180066a41186a220a290300370300200441a0066a41106a220b20044180066a41106a220c290300370300200441a0066a41086a220d20044180066a41086a220e29030037030020042004290380063703a006200441c0026a200441a8016a41f0001094041a200441e0056a41186a220f2006290300370300200441e0056a41106a2206200b290300370300200441e0056a41086a220b200d290300370300200420042903a0063703e005200441e8036a200441c0026a41f0001094041a200a200f290300370300200c2006290300370300200e200b290300370300200420042903e005370380064102210602402001450d00200441a0066a41186a20044180066a41186a290300370300200441a0066a41106a20044180066a41106a290300370300200441a0066a41086a20044180066a41086a29030037030020042004290380063703a006410121060b200441b2016a200441a0066a41086a290300370100200441ba016a200441a0066a41106a290300370100200441a8016a411a6a200441b8066a290300370100200420063a00a901200441003a00a801200420042903a0063701aa012004200441e8036a200441a8016a10d202200428020421062004200428020022014100473a00e903200441003a00e80341a886c5004100200441e8036a102c02400240418595c300411041a886c500410041001001417f460d00200441003602e803418595c3004110200441e8036a41044100100141016a41044d0d0320042802e80341016a210a0c010b4101210a0b200441a8016a41086a220b4200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a200b290300370300200420042903a8013703e80302400240200441e8036a411041a886c500410041001001417f460d00200441003602a801200441e8036a4110200441a8016a41044100100141016a41044d0d0420042802a801210b0c010b4100210b0b2004200a3602e803418595c3004110200441e8036a41041004200441a8016a41086a220a4200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a200a290300370300200420042903a8013703e8032004417f2002200b6a220a200a2002491b3602a801200441e8036a4110200441a8016a410410040240024002402001450d0002402006411b470d0020014188abc400460d0220014188abc400411b109604450d020b200041086a2006360200200041046a200136020020004100360200200745200872450d020c120b20004100360204200041086a200636020020004100360200200745200872450d010c110b200041046a4104360200200041013602002007452008720d100b200341046a280200450d0f200710230c0f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41284101102a000b101e000b200e4101102a000b41134101102a000b41334101102a000b200a4101102a000b41334101102a000b2000410136020020002007360204200441386a102420032802002200450d010b200341046a280200450d0020001023200441c0066a24000f0b200441c0066a24000bda1508027f027e027f017e0c7f017e027f017e230041c0036b22012400200141b0026a41086a22024200370300200142003703b00241c687c4004114200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368024002400240024002400240024002400240024002400240200141e8006a411041a886c500410041001001417f460d00200142003703b002200141e8006a4110200141b0026a41084100100141016a41084d0d0220012903b00222034200510d054200210420002003824200510d010c0b0b4200210420004201824200520d0a0b200141b0026a41086a22022004370300200120043703b00241aaedc300410c200141b0026a1000200141e8006a41086a22052002290300370300200120012903b00237036802400240200141e8006a411041a886c500410041001001417f460d00200142003703b802200142003703b002200141e8006a4110200141b0026a4110410010012206417f460d062006410f4d0d06200141b8026a290300210020012903b00221040c010b420021000b2001200437034020012000370348200141c8026a2000370300200141b0026a41106a2004370300200241013a0000200141093a00b00241a886c5004100200141b0026a102c200141003a005742002107200142003703602001420037035820024200370300200142003703b00241f487c4004112200141b0026a100020052002290300370300200120012903b00237036802400240200141e8006a411041a886c500410041001001417f460d00200142103702d4012001200141e8006a3602d001200141b0026a200141d0016a10920220012802b0022208450d0820012902b40221070c010b410421080b410021090240024002402007422088a72205450d00200141b0026a41096a210a20014190026a210b200141d0016a41206a210c200141e8006a41086a210d200141e8026a210e200141e0026a210f200141dc026a2110410021114100210941002102024003400240024002402009450d00200820024102746a21062008200220116a4102746a21120340200220054f0d07200141e8006a2006280200221310aa0320012903684201520d02200141d0016a200d41e0001094041a2001290340221420012903d001220354200141c0006a41086a2903002200200141d0016a41086a29030022045420002004511b450d03200141013a0057201120026a221320054f0d0a20122006280200360200200641046a2106201241046a21122005200241016a2202470d000c060b0b200820024102746a21060340200220054f0d06200141e8006a2006280200221310aa0320012903684201520d01200141d0016a200d41e0001094041a2001290340221420012903d00122035a200141c0006a41086a2903002200200141d0016a41086a29030022045a20002004511b0d02200141013a0057200641046a21062005200241016a2202470d000c040b0b2011417f6a2111200941016a2109200241016a22022005470d010c030b200241016a21022001201420037d3703402001200020047d2014200354ad7d370348411210262206450d0c200641106a41002f00c6ed433b0000200641086a41002900beed43370000200641002900b6ed4337000020064112412410272206450d0d20062013360012200141b0026a41186a22154200370300200141b0026a41106a22164200370300200141b0026a41086a22124200370300200142003703b00220064116200141b0026a1002200141a0036a41186a2015290300370300200141a0036a41106a2016290300370300200141a0036a41086a2012290300370300200120012903b0023703a003200141a0036a4120100320061023200c200141d0016a41106a290300200141d0016a41186a290300102b200141306a200b20032004108202200141d8006a41086a2206427f20062903002200200141306a41086a2903007c2001290358221420012903307c22172014542206ad7c22142006201420005420142000511b22061b3703002001427f201720061b370358200e2004370300200f2003370300201241023a000020102013360200200a200b290000370000200a41086a200b41086a290000370000200a41106a200b41106a290000370000200a41186a200b41186a290000370000200141093a00b00241a886c5004100200141b0026a102c2011417f6a2111200941016a210920022005470d000c020b0b410021090b200141b0026a41086a220b4200370300200142003703b00241f487c4004112200141b0026a1000200141e8006a41086a200b290300370300200120012903b002370368200141003602b802200142013703b0022001200520096b22023602d001200141d0016a200141b0026a1041024002402002450d00200541027420094102746b210d200b280200210220012802b4022112200821060340200628020021110240024002400240201220026b41044f0d00200241046a22052002490d0820124101742213200520052013491b22094100480d082012450d0120012802b00220122009102722130d020c0b0b200241046a210520012802b00221130c020b200910262213450d090b200120093602b402200120133602b002200921120b200641046a2106200b2005360200201320026a201136000020052102200d417c6a220d0d000c020b0b200b280200210520012802b402211220012802b00221130b200141e8006a411020132005100402402012450d00201310230b02402007a7450d00200810230b200129035821042001200141d8006a41086a2903003703b802200120043703b0022001200141b0026a360268200141e8006a107b024020012d00570d00200141b0026a41086a22024200370300200142003703b002418688c400410d200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368410021020240200141e8006a411041a886c500410041001001417f460d00200141003602b002200141e8006a4110200141b0026a41044100100141016a41044d0d0920012802b00221020b200141206a20012903402204200141c0006a41086a2205290300220042c0843d4200109704200141106a20012903202203200141206a41086a290300221442c0fb42427f1098042001200320142002ad22074200109804200520002000200141086a29030020012903002214200420012903107c20077e42c0843d8042ffffffff0f837c2203201454ad7c22142003200456201420005620142000511b22021b22147d20042004200320021b220054ad7d3703002001200420007d370340200141c8026a2014370300200141c0026a2000370300200141b0026a41086a41033a0000200141093a00b00241a886c5004100200141b0026a102c0b20012903402104200141c8026a200141c0006a41086a2205290300370300200141b0026a41106a2004370300200141b0026a41086a220241043a0000200141093a00b00241a886c5004100200141b0026a102c200529030021042001290340210020024200370300200142003703b00241aaedc300410c200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368200120043703b802200120003703b002200141e8006a4110200141b0026a41101004200141c0036a24000f0b41b4c4c200200220051029000b101e000b41d4aac10041331021000b4194c5c200201320051029000b20094101102a000b41dc87c400104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41244101102a000b200141c0036a24000be20f01057f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220341034b0d00024020030e0400040203000b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41063a000020022802042205200428020022036b41044f0d07200341046a22042003490d2220054101742203200420042003491b22034100480d222005450d0f20022802002005200310272204450d100c200b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41023a000020022802042205200428020022036b41204f0d03200341206a22042003490d2120054101742203200420042003491b22034100480d212005450d0820022802002005200310272204450d090c1d0b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41053a000020022802042205200428020022036b41044f0d03200341046a22042003490d2020054101742203200420042003491b22034100480d202005450d0920022802002005200310272204450d0a0c1a0b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41003a0000200141046a280200210620022001410c6a280200220136020c2002410c6a2002104120022802042205200428020022036b20014f0d03200320016a22042003490d1f20054101742203200420042003491b22034100480d1f2005450d0a20022802002005200310272204450d0b0c170b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41043a000020022802042205200428020022036b41044f0d04200341046a22042003490d1e20054101742203200420042003491b22034100480d1e2005450d0d20022802002005200310272204450d0e0c140b200228020021040c1a0b200228020021040c170b200228020021040c140b200228020021040c190b200228020021040c100b2003102622040d140b20034101102a000b2003102622040d100b20034101102a000b2003102622040d0c0b20034101102a000b2003102622040d100b20034101102a000b2003102622040d060b20034101102a000b41014101102a000b41014101102a000b41014101102a000b41014101102a000b41014101102a000b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a200210410240024002400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0d20044101742203200520052003491b22034100480d0d2004450d0120022802002004200310272204450d020c030b200228020021040c030b2003102622040d010b20034101102a000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c0b0b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c090b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a200210410240024002400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0920044101742203200520052003491b22034100480d092004450d0120022802002004200310272204450d020c030b200228020021040c030b2003102622040d010b20034101102a000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c070b2002200336020420022004360200200241086a28020021030b200241086a200341206a360200200420036a220341086a200141096a290000370000200341106a200141116a290000370000200341186a200141196a290000370000200320012900013700000c050b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a2002104102400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d0120022802002004200310272204450d020c040b200228020021040c040b2003102622040d020b20034101102a000b101e000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0b200020022201290200370200200041086a200141086a280200360200200241106a24000bac0301027f23004180026b22022400024002402001450d00200220003602000c010b200241a886c5003602000b2002200136020420024180016a2002108f010240200228028801450d00200241086a20024180016a41f8001094041a200241086a108a030240200241186a2802002200450d0020022802102101200041246c210003400240024020012d0000220341034b0d0002400240024020030e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200241146a280200450d00200241106a28020010230b20024180026a240042010f0b2002411c6a4101360200200241013602fc01200241a8e7c3003602f8012002420137020c200241a4e6c3003602082002200241f8016a360218200241086a41ace6c3001061000bdc0d01087f230041206b22022400200241003602182002420137031002400240024002400240024002400240410410262203450d0020024104360214200241186a22042004280200220541046a36020020022003360210200320056a41edcad18b06360000024002400240200228021420042802002203470d00200341016a22042003490d0620034101742205200420042005491b22044100480d062003450d0120022802102003200410272205450d020c040b200228021021050c040b2004102622050d020b20044101102a000b41044101102a000b2002200436021420022005360210200241186a28020021030b200241186a2204200341016a360200200520036a41053a0000410f200241106a1092034100210302400340200341c0cfc3006a280200200341c4cfc3006a280200200241106a10930302400240024002400240024002400240024002400240024002400240024002400240200341c8cfc3006a2802004101470d00200341cccfc3006a280200200341d0cfc3006a280200200241106a109303200341d4cfc3006a22062802004102460d010c020b2002200341cccfc3006a28020011010020022802002002280204200241106a109303200341d4cfc3006a22062802004102470d010b02400240024002400240200228021420042802002205470d00200541016a22062005490d1620054101742207200620062007491b22074100480d162005450d01200228021020052007102722060d020c040b200228021021060c020b200710262206450d020b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341e4cfc3006a22062802004102470d020c030b20074101102a000b0240024002400240200228021420042802002205470d00200541016a22072005490d1420054101742208200720072008491b22084100480d142005450d01200228021020052008102722070d020c0d0b200228021021070c020b200810262207450d0b0b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109403200341e4cfc3006a22062802004102460d010b0240200228021420042802002205470d00200541016a22072005490d1020054101742208200720072008491b22084100480d102005450d02200228021020052008102722070d030c0a0b200228021021070c030b0240200228021420042802002205470d00200541016a22062005490d0f20054101742207200620062007491b22074100480d0f2005450d04200228021020052007102722060d050c0a0b200228021021060c050b200810262207450d070b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109503200341f4cfc3006a22062802004102460d030c080b200710262206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341f4cfc3006a22062802004102470d050b0240024002400240200228021420042802002205470d00200541016a22062005490d0b20054101742207200620062007491b22074100480d0b2005450d01200228021020052007102722060d020c070b200228021021060c020b200710262206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c8006a220341b808470d050c060b20084101102a000b20084101102a000b20074101102a000b20074101102a000b0240024002400240200228021420042802002205470d00200541016a22072005490d0620054101742208200720072008491b22084100480d062005450d01200228021020052008102722070d020c070b200228021021070c020b200810262207450d050b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109603200341c8006a220341b808470d000b0b200241186a2802002103200228021421072002280210210620024100360218200242013703102002200336020c2002410c6a200241106a104102400240024020022802142205200228021822046b20034f0d00200420036a22082004490d0320054101742209200820082009491b22084100480d032005450d0120022802102005200810272205450d020c050b2002280210220520046a200620031094041a200420036a21032007450d060c050b2008102622050d030b20084101102a000b101e000b20084101102a000b2002200836021420022005360210200520046a200620031094041a200420036a21032007450d010b200610230b200241206a24002003ad4220862005ad840b910701037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000413f4b0d00200141046a280200200141086a2802002202470d01200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0520012802002002200410272203450d060c170b2000418080014f0d01200141046a2802002203200141086a28020022026b41024f0d02200241026a22042002490d1020034101742202200420042002491b22024100480d102003450d0820012802002003200210272203450d090c140b200128020021030c160b20004180808080044f0d01200141046a2802002203200141086a28020022026b41044f0d04200241046a22042002490d0e20034101742202200420042002491b22024100480d0e2003450d08200128020020032002102722030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102722030d0a0c0e0b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2002102622030d0b0b20024101102a000b200210262203450d060b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b200410262203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00000240024002400240200141046a2802002203200428020022026b41044f0d00200241046a22042002490d0420034101742202200420042002491b22024100480d042003450d01200128020020032002102722030d020c070b200128020021030c020b200210262203450d050b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b101e000b20024101102a000b20044101102a000b20024101102a000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000bc60801037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0520022802002003200510272204450d060c160b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1820044101742203200520052003491b22034100480d182004450d0820022802002004200310272204450d090c130b200228020021040c150b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d08200228020020042003102722040d090c0e0b200228020021040c110b200241046a280200200241086a2802002203470d03200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d09200228020020032005102722040d0a0c0d0b2005102622040d100b20054101102a000b200228020021040c050b200228020021040c070b2003102622040d0a0b20034101102a000b200310262204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c0a0b200510262204450d030b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0c20044101742203200520052003491b22034100480d0c2004450d01200228020020042003102722040d020c060b200228020021040c020b200310262204450d040b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c070b20034101102a000b20054101102a000b20034101102a000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000c020b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000b024002400240200241046a2802002204200241086a28020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d0120022802002004200310272204450d020c040b200228020021040c040b2003102622040d020b20034101102a000b101e000b20022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a200020011094041a0bf70901097f230041206b22022400024002400240024002400240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d01200041d8006c2104410021050340200320056a220041046a280200200041086a2802002001109303200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041d4006a2d00004101470d0020072009470d01200941016a22072009490d0d2009410174220a20072007200a491b220a4100480d0d2009450d0320012802002009200a102722070d040c0e0b20072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0520012802002009200a102722070d060c0e0b200128020021070c030b200128020021070c050b200a10262207450d0a0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10262207450d080b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110f20302400240200041346a2802004101470d00200041386a280200200041c0006a28020020011093030c010b200241106a200041386a2802002000413c6a28020028020c11000020022802102209200241106a41086a28020020011093032002280214450d00200910230b200041c8006a28020021090240200041c4006a2802004101470d002009200041d0006a280200200110f3032004200541d8006a2205470d010c030b2009200041cc006a280200200110f3032004200541d8006a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d00200041d8006c2104410021050340200320056a220041046a280200200041086a2802002001109303200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041d4006a2d00004101470d0020072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0320012802002009200a102722070d040c0f0b20072009470d01200941016a22072009490d0b2009410174220a20072007200a491b220a4100480d0b2009450d0520012802002009200a102722070d060c0f0b200128020021070c030b200128020021070c050b200a10262207450d0b0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10262207450d090b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110f20302400240200041346a2802004101470d00200041386a280200200041c0006a28020020011093030c010b200241106a200041386a2802002000413c6a28020028020c11000020022802102209200241106a41086a28020020011093032002280214450d00200910230b200041c8006a28020021090240200041c4006a2802004101470d002009200041d0006a280200200110f3032004200541d8006a2205470d010c020b2009200041cc006a280200200110f3032004200541d8006a2205470d000b0b200241206a24000f0b101e000b200a4101102a000b200a4101102a000b200a4101102a000b200a4101102a000bf40201057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d012000412c6c2104410021050340200320056a220041046a280200200041086a28020020011093032000410c6a200110f403200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c030b2006200041246a280200200110f30320042005412c6a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d002000412c6c2104410021050340200320056a220041046a280200200041086a28020020011093032000410c6a200110f403200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c020b2006200041246a280200200110f30320042005412c6a2205470d000b0b200241106a24000bda0301057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d012000412c6c2104410021050340200320056a220041046a280200200041086a2802002001109303200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110f3030c010b2006200041146a280200200110f3030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c030b2006200041246a280200200110f30320042005412c6a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d002000412c6c2104410021050340200320056a220041046a280200200041086a2802002001109303200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110f3030c010b2006200041146a280200200110f3030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c020b2006200041246a280200200110f30320042005412c6a2205470d000b0b200241106a24000be00301017f230041a0066b22022400024002402001450d00200220003602000c010b200241a886c5003602000b2002200136020420024198046a20021094020240024002400240024002402002290388054203510d00200241086a20024198046a41f8011094041a20024180026a200241086a41f8011094041a200220024180026a36029804200241f8036a20024198046a108b03200228028004210120024198046a20024180026a41f8011094041a20024198066a200228028004360200200220022903f8033703900620024188046a20024198046a200120024190066a108d03024002402002280288044101470d004280828898f01f200228028c04410374ad88a7210041011026210141010d010c050b200228028c0441004721004101102621014100450d040b2001450d01200141013a000020014101410210272201450d020c040b20024194026a41013602002002410136020c200241c0e7c3003602082002420137028402200241a4e6c300360280022002200241086a3602900220024180026a41ace6c3001061000b41014101102a000b41024101102a000b2001450d01200141003a0000200141014102102722010d0041024101102a000b200120003a0001200241a0066a24002001ad428080808020840f0b41014101102a000b831403037f017e0a7f230041c0016b2202240010e00220024180016a41086a22034200370300200242003703800141af98c300410d20024180016a1000200241086a41086a2204200329030037030020022002290380013703084200210502400240024002400240024002400240200241086a411041a886c500410041001001417f460d00200242003703a001200241086a4110200241a0016a41084100100141016a41084d0d0120022903a00121050b20034200370300200242003703800141f5ccc200411120024180016a1000200420032903003703002002200229038001370308200241086a411010032005108e03200510ed0210910110e50220034200370300200242003703800141a895c300411520024180016a100020024190016a41086a200329030037030020022002290380013703900120024190016a411041a886c500410041001001417f460d0141002106200241003602084104210741012108024020024190016a4110200241086a41044100100141016a41044d0d0020022802082209450d032009ad420c7e2205422088a70d042005a722034100480d040240200310262207450d00200721044100210a03400240024002400240024002400240411410262203450d00200341106a41002800ef9643360000200341086a41002900e79643370000200341002900df96433700002003411441281027220b450d01200b200a360014200241086a41186a22034200370300200241086a41106a220c4200370300200241086a41086a2206420037030020024200370308200b4118200241086a1002200241a0016a41186a2003290300370300200241a0016a41106a200c290300370300200241a0016a41086a2006290300370300200220022903083703a001200241a0016a412041a886c500410041001001417f460d052002422037020c2002200241a0016a3602082002200241086a104a02402002280200450d0020022802042203417f4c0d03024002402003450d00200310ac01220c450d0620062006280200220d200341002002280208200228020c200c2003200d1001220d200d417f461b220d200d20034b1b220d6a360200200d2003470d010c070b4101210c2002280208200228020c41014100200628020010011a41002003460d060b2003450d00200c10230b41d4aac10041331021000b41144101102a000b41284101102a000b101d000b20034101102a000b200241a0016a41201003200c0d010b4101210c410021030b200b1023200441086a2003360200200441046a20033602002004200c3602002004410c6a21042009200a41016a220a470d000b41002108200921060c040b20034104102a000b41d4aac10041331021000b41d4aac10041331021000b4100210641012108410421070b410421094100210b4100210d02400240024002402006410c6c2203410c490d002003410c6e220d41037422044100480d04200410262209450d010b0240200720036a220a2007460d004100210b200921032007210403402004280200210c200341046a200441086a2802003602002003200c360200200341086a2103200b41016a210b2004410c6a2204200a470d000b0b200241a0016a2009200b108c030240200d450d00200910230b02402006450d002006410c6c21042007210303400240200341046a280200450d00200328020010230b2003410c6a2103200441746a22040d000b0b024020080d00200710230b200241086a41186a200241a0016a41186a290300370300200241086a41106a200241a0016a41106a290300370300200241086a41086a200241a0016a41086a290300370300200220022903a00137030820024180016a41086a22034200370300200242003703800141bc98c300411520024180016a100020024190016a41086a220b200329030037030020022002290380013703900120024190016a4110200241086a41201004200241086a10e402200241003602980120024201370390010240412010262203450d00200242a080808080043702940120022003360290012003200229021c370000200341086a200241246a290200370000200341106a2002412c6a290200370000200341186a200241346a290200370000200241086a20024190016a1098020240024002402002280294012204200b280200220c6b41204f0d00200c41206a2203200c490d072004410174220b20032003200b491b220a4100480d072004450d012002280290012004200a1027220b450d020c050b200c41206a2103200228029001210b0c050b200a1026220b0d030b200a4101102a000b41204101102a000b20044104102a000b2002200a360294012002200b36029001200a21040b20024190016a41086a220a2003360200200b200c6a220c41086a200241c4006a290200370000200c41106a200241cc006a290200370000200c41186a200241d4006a290200370000200c200229023c3700000240200420036b411f4b0d00200341206a220c2003490d0120044101742206200c200c2006491b220c4100480d010240024002402004450d00200b2004200c1027220b450d010c020b200c1026220b0d010b200c4101102a000b2002200c360294012002200b360290010b200a200341206a360200200b20036a220341186a200241f4006a290200370000200341106a200241ec006a290200370000200341086a200241e4006a2902003700002003200229025c3700002002280210210e2002200241086a41106a280200220f3602a001200241a0016a20024190016a10410240200f450d00200f41246c210d20024190016a41086a22082802002103200228029401210a200e210b0340200241a0016a200b108f0320022802a00121060240024002400240200a20036b200241a0016a41086a280200220c4f0d002003200c6a22042003490d06200a4101742209200420042009491b22074100480d06200a450d01200228029001200a2007102722090d020c070b2003200c6a210420022802900121090c020b200710262209450d050b200220073602940120022009360290012007210a0b20082004360200200920036a2006200c1094041a024020022802a401450d00200610230b200b41246a210b20042103200d415c6a220d0d000b0240200f450d00200f41246c210b200e210303400240024020032d0000220c41034b0d00024002400240200c0e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a2103200b415c6a220b0d040c050b2003410c6a280200450d02200341086a2802001023200341246a2103200b415c6a220b0d030c040b2003410c6a280200450d01200341086a2802001023200341246a2103200b415c6a220b0d020c030b200341086a280200450d00200341046a28020010230b200341246a2103200b415c6a220b0d000b0b200241146a280200450d040c030b20024198016a28020021042002280290012109200241146a2802000d020c030b101e000b20074101102a000b200e10230b200241c0016a24002004ad4220862009ad840bba0d03017f037e0a7f23004180026b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c20024190016a200241086a10ab010240024002402002280290012201450d0020022002290294013702142002200136021020024190016a200241106a109a032002280290014101460d0120024190016a41086a2201290300210320014200370300200242003703900141a298c300410d20024190016a1000200241206a41086a22002001290300370300200220022903900137032042002104024002400240200241206a411041a886c500410041001001417f460d002002420037039001200241206a411020024190016a41084100100141016a41084d0d0120022903900121040b20014200370300200242003703900141e698c300411720024190016a100020002001290300370300200220022903900137032002400240200241206a411041a886c500410041001001417f460d002002420037039001200241206a411020024190016a41084100100141016a41084d0d03200229039001210541f801210141f80110262206450d010c060b4203210541f801210141f801102622060d050b20014108102a000b41d4aac10041331021000b41d4aac10041331021000b200241a4016a410136020020024101360224200241d8e7c3003602202002420137029401200241a4e6c300360290012002200241206a3602a00120024190016a41ace6c3001061000b41c99bc300412820022802940120024198016a28020010c902000b200620024190016a41f000109404220742023703702007410136028801200720022903800137037820074180016a20024180016a41086a29030037030020072003200520047c220420042003541b3703900120074198016a200241206a41e0001094041a200241106a210120022802142108024002400240024003402001280200220941086a210a20092f0106220b4103742100417f210102400240024003402000450d01200141016a2101417f410141fec7c300200a4108109604220c4100481b4100200c1b220c450d03200041786a2100200a41086a210a200c4101460d000b20080d010c040b200b21012008450d030b2008417f6a2108200920014102746a41e4016a21010c010b0b200941e0006a2001410c6c6a2200450d002000280208210120002802002100200242003703900120024190016a20002001410820014108491b1094041a200141074d0d01200229039001210320024190016a41086a2201420037030020024200370390014198a4c100411520024190016a1000200241206a41086a200129030037030020022002290390013703204100210102400240200241206a411041a886c500410041001001417f460d0020024210370284012002200241206a3602800120024190016a20024180016a109301200228029001220a450d0420024198016a280200210120022802940121090c010b4108210a410021090b4100210002402001417f6a220c20014b0d00200c20014f0d00200a200c4103746a2201450d00200129030020035221000b02402009450d00200a10230b024002402000450d00200741f80141f00310272206450d05200641f8016a20024190016a41f0001094041a200642023703e8022006200337038803200641093602800320062002290380013703f002200641f8026a20024188016a29030037030020064190036a200241206a41e0001094041a4102210d0c010b4101210d0b20022802102002280214200228021810ae0120024100360228200242013703202002200d36029001200d41f8016c210e20024190016a200241206a1041200228022421092002280228210120024190016a41086a210f4100210a02400240034020022006200a6a3602800120024190016a20024180016a108b03200228029001210c0240024002400240200920016b200f28020022074f0d00200120076a22002001490d0520094101742208200020002008491b220b4100480d052009450d0120022802202009200b102722080d020c060b200120076a2100200228022021080c020b200b10262208450d040b2002200b36022420022008360220200b21090b200241206a41086a2000360200200820016a200c20071094041a0240200228029401450d00200c10230b20002101200e200a41f8016a220a470d000b200d41f8016c210a410021010340200620016a4188016a1024200a200141f8016a2201470d000b2006102320024180026a24002000ad4220862008ad840f0b101e000b200b4101102a000b41c8a6c100412b4186c8c300412810c902000b41c8a6c100412b4188f8c400412910c902000b41d4aac10041331021000b41f0034108102a000bae0201077f230041106b2202240020012802042103024002400240024003402001280200220541086a210620052f010622044103742101410021070240024003402001450d0141cdf8c400200641081096042208450d02200141786a2101200741016a2107200641086a21062008417f4a0d000b2007417f6a21040b2003450d022003417f6a2103200520044102746a41e4016a21010c010b0b200541e0006a2007410c6c6a2206450d00200628020821012006280200210620024200370308200241086a20062001410820014108491b1094041a200141074d0d01200041086a2002290308370300410021010c030b200041fef8c400360204200041086a41283602000c010b200041d5f8c400360204200041086a41293602000b410121010b20002001360200200241106a24000bb42515057f017e087f017e077f017e0c7f017e027f027e017f017e017f037e037f037e077f027e027f037e157f230041b0026b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241c0006a200241086a108f0102400240024002400240024020022802482203450d00200241d0006a2802002104200228024c2105200241c0006a200241086a10aa02024020022802402206450d0020022902442107200241c0006a200241086a10ab0120022802402201450d03200220022902443702142002200136021041012108200241013b012c2002420037022441f098c4002109200241f098c4003602202007422088a7220a450d0241f801210b2006200a41f8016c6a210c4108210d200241206a41086a210e41f000210f42022110410121114117211241e698c30021134100211441a886c500211541102116417f2117427f2118410321194102211a41e401211b4180f8c400211c410c211d41e000211e4107211f418801212041782121410d2122200241206a410d6a212341f098c400212442f4d2b59bc7ae98b830212541dc012126200241d4006a21274201212842818080801021294109212a42898080809001212b41a298c300212c423c212d428080808070212e4225212f20062130410021310c050b02402004450d00200441246c21012003214903400240024020492d0000220041034b0d0002400240024020000e0404000102040b2049410c6a280200450d03204941086a2802001023204941246a21492001415c6a22010d040c050b2049410c6a280200450d02204941086a2802001023204941246a21492001415c6a22010d030c040b2049410c6a280200450d01204941086a2802001023204941246a21492001415c6a22010d020c030b204941086a280200450d00204941046a28020010230b204941246a21492001415c6a22010d000b0b2005450d00200310230b200241d4006a4101360200200241013602a402200241f4e7c3003602a00220024201370244200241a4e6c3003602402002200241a0026a360250200241c0006a41ace6c3001061000b4100214041002147410021480c010b200241d4006a4101360200200241013602a402200241f4e7c3003602a00220024201370244200241a4e6c3003602402002200241a0026a360250200241c0006a41ace6c3001061000b410021010c010b410121010b037e024002400240024002400240024002400240024002400240024002400240024020010e020001010b20022802102002280214200228021810ae0102402004450d00200441246c21012003214903400240024020492d0000220041034b0d0002400240024020000e0404000102040b2049410c6a280200450d03204941086a2802001023204941246a21492001415c6a22010d040c050b2049410c6a280200450d02204941086a2802001023204941246a21492001415c6a22010d030c040b2049410c6a280200450d01204941086a2802001023204941246a21492001415c6a22010d020c030b204941086a280200450d00204941046a28020010230b204941246a21492001415c6a22010d000b0b02402005450d00200310230b2007a721000240200a450d00200a41f8016c210120064188016a2149034020491024204941f8016a2149200141887e6a22010d000b0b02402000450d00200610230b2002410036024820024201370340024002400240410110262249450d00200242818080801037024420022049360240204920083a000020494101410210272249450d01200242828080802037024420022049360240204920403a00012049410241061027224a450d0220024286808080e0003702442002204a360240204a20473600022009214902402048450d002048210120092149034020492802e40121492001417f6a22010d000b0b02402047450d004100214b4106214c417f214d4101214e410c214f41e00021504103215141082152410721534102215441e8012155410621564100215720472158410121310c0b0b4280808080e00021070c040b41014101102a000b41024101102a000b41064101102a000b0240024020310e020001010b2030200f6a2903002010520d0e20302802880122322011470d0a2030290390012133200241c0006a200d6a220142003703002002420037034020132012200241c0006a1000200241a0026a200d6a2001290300370300200220022903403703a00202400240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d04200229034021340c010b420321340b2018203420347c223520352034541b22344200510d05200241106a2136200228021421370c090b024002400240205720492f01064f0d0020492057204f6c6a20506a2101204920572051746a20526a21002057204e6a2157204c20566b20534d0d010c020b41012101024020492f01042200204928020022492f0106490d004101210103402001204e6a210120492f01042200204928020022492f01064f0d000b0b20492000204f6c6a213c204920002051746a2131204920002054746a20556a280200214902402001204e460d00204e20016b2101034020492802e40121492001204e6a22010d000b0b203c20506a2101203120526a210041002157204c20566b20534b0d010b205620526a223c2056490d0d204c204e742231203c203c2031491b223c204b480d0d02400240204c450d00204a204c203c1027224a0d010c050b203c1026224a450d040b2002203c3602442002204a3602400b200241c0006a20526a223c205620526a360200204a20566a2000290000370000200128020021312002200128020822013602a002200241a0026a200241c0006a104102400240024002402002280244224c203c28020022006b20014f0d00200020016a224a2000490d10204c204e742256204a204a2056491b2256204b480d10204c450d012002280240204c20561027224a0d020c070b2002280240214a0c020b20561026224a450d050b200220563602442002204a3602402056214c0b203c200020016a2256360200204a20006a203120011094041a2058204d6a22580d052056ad42208621070b20092048204710ae01200241b0026a24002007204aad840f0b41d4aac10041331021000b203c4101102a000b20564101102a000b41c8adc400104f000b410121310c010b410121010c070b410121010c060b4100213a0c010b410121010c010b410221010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000108080b2039201e6a203b201d6c6a2200450d09200028020821012000280200210020024200370340200241c0006a20002001200d2001200d491b1094041a2001201f4d0d0120332034802002290340223d520d02203020206a2802002132410121010c210b20322011470d072030290390012135200241c0006a200241106a109a030240024020022802402011470d00200241c0006a200d6a350200213e2002280244213f4101214020232d00000d060c010b200241c0006a200d6a220129030021414200213e2001420037030020024200370340202c2022200241c0006a1000200241a0026a200d6a22002001290300370300200220022903403703a0020240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d042002290340213e0b200142003703002002420037034020132012200241c0006a100020002001290300370300200220022903403703a002024002400240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d072002290340214220352041202d7c580d020c010b4203214220352041202d7c580d010b2043202e83202f84213e41a49bc300213f4101214020232d0000450d010c060b4100214020352042203e7c223e5a0d0820232d00000d050b024002402040450d0020022802202002280224200e28020010ae012002420037022420022024360220200220253703a0020c010b20022802202144200220253703a00220442024460d00200228022421450c1b0b201b10262244450d0541002145204441003b0106204441003602002044200d6a200241c0006a20261094041a20024100360224200220443602200c190b203d4280808080708342298421354188f8c40021090c080b41c8aec4002109413121472002412d6a2d0000450d080c090b41d4aac10041331021000b41d4aac10041331021000b4194e5c300412241b6e4c300413110c902000b41e4014104102a000b02400240203a0e020001010b20362802002239200d6a210020392f0106223820197421014100213b024003402001450d01201c2000200d109604223c450d17200120216a2101203b20116a213b2000200d6a2100203c20174a0d000b203b20176a21380b2037450d02203720176a213720392038201a746a201b6a21364100213a0c160b2044200d6a210020442f010622462019742101417f213c02400240024003402001450d01200241a0026a2000200d1096042138200120216a2101203c20116a213c2000200d6a21002017201120382014481b201420381b22382011460d000b2038450d0d20450d010c020b2046213c2045450d010b204520176a21452044203c201a746a201b6a28020021444101213a0c170b20272025370200200241c0006a20166a200e360200200241c0006a201d6a203c360200200241c0006a200d6a200241206a3602002002204436024420022014360240200241a0026a200d6a22002014360200200220283703a0022011102621010240024002400240024002402040450d002001450d11200120113a0000200220293702a402200220013602a0022002203ea72201360230200241306a200241a0026a104120022802a40222382000280200223c6b20014f0d01203c20016a2232203c490d2020382011742246203220322046491b22322014480d202038450d0220022802a00220382032102722380d030c120b2001450d12200120143a0000200220293702a402200220013602a00220012011202a10272201450d132001203e3700012002202b3702a402200220013602a0020c040b20022802a00221380c020b203210262238450d0f0b200220323602a402200220383602a0020b2000203c20016a3602002038203c6a203f20011094041a0b200241306a200d6a2000280200360200200220022903a002370330200241c0006a200241306a10ad01202320403a0000200241206a201d6a20143a0000203e214320400d050b2030200b6a2230200c470d100c1a0b203d42808080807083421c84213541b1f8c40021090b2035a721472002412d6a2d00000d010b20022802202002280224200241206a41086a28020010ae0120024200370224200241f098c400360220200242e1eac98bb68edbb7f4003703a00241e40110262201450d0c200141003b010620014100360200200141086a200241c0006a41dc011094041a200241003602242002200136022020012f01062238410374214041002100417f213c034020402000460d03200120006a2148200041086a2100203c41016a213c417f4101200241a0026a204841086a410810960422484100481b410020481b22484101460d000b2048450d0b0c030b4194e5c300412241b6e4c300413110c902000b200241286a28020021470c020b2038213c0b200242e1eac98bb68edbb7f4003702542002200e3602502002203c36024c20022001360244200241003602402002200241206a360248200241003602a802200242013703a00220022047360230200241306a200241a0026a1041024002400240024020022802a402220020022802a80222016b20474f0d00200120476a223c2001490d1620004101742248203c203c2048491b223c4100480d162000450d0120022802a0022000203c10272200450d050c020b20022802a00221000c020b203c10262200450d030b2002203c3602a402200220003602a0020b200241a0026a41086a223c200120476a360200200020016a200920471094041a200241306a41086a203c280200360200200220022903a002370330200241c0006a200241306a10ad012002412c6a4180023b0100200241206a41086a2802002147410121400b200228022421482002280220210941002108410021010c130b203c4101102a000b4194e5c300412241e7e4c300412d10c902000b41014101102a000b20324101102a000b41014101102a000b41094101102a000b4194e5c300412241e7e4c300412d10c902000b41e4014104102a000b41002131410121010c0a0b4101213a0c040b4101213a0c040b410021010c040b410221010c030b410221010c020b410221010c010b410221010c000b0b101e000b2002412d6a2d000021402002412c6a2d00002108200241286a28020021472002280224214820022802202109410021010c000b0b7901027f230041206b22022400200241a886c500410010e3010240412010262203450d0020032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241206a24002003ad42808080808004840f0b41204101102a000bbe1503057f027e077f230041c0086b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241c8066a200241086a1094020240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022903b8074203510d00200241106a200241c8066a41f8011094041a20024188026a200241106a41f8011094041a200220024188026a3602a005200241c8066a200241a0056a108b0320022802d0062101024020022802cc06450d0020022802c80610230b200241c8066a20024188026a41f8011094041a200241a0056a200241c8066a1096020240024002400240024002400240024020022802a0054101470d0020022802a405210120022802a8052200411a460d0120004115470d024102210341f6012104200141d9cac400460d10200141d9cac40041151096040d020c100b20024180046a200241a0056a41086a41a0011094041a4100210320024180046a41086a2205410020022903800442015122061b210002402006450d002000450d03410321040240200520011086020d00200510d702210741012104200041206a290300220820075a0d080b200241b0046a1024200241003602d006200242013703c8060c120b2000450d0441ec0121040c030b41002104200141eecac400460d0441002103200141eecac400411a109604450d0e0b4100210341810121040c0d0b41f60121040b0c0a0b200241a0056a200241a8046a41f8001094041a200241c8066a200241a8056a41f0001094041a41002104200241003a00b807200241c8066a1024410021030c0b0b410021030c090b410c1026220f450d01412010262200450d0220002005290000370000200041186a200541186a290000370000200041106a200541106a290000370000200041086a200541086a2900003700002000412041c00010272200450d0320002008370020200f42c08080808005370204200f200036020002400240200720085a0d00410c1026220b450d06412010262200450d0720002005290000370000200041186a200541186a290000370000200041106a200541106a290000370000200041086a200541086a2900003700002000412041c00010272200450d0820002008427f7c370020200b42c08080808005370204200b2000360200410121090c010b410021094104210b0b2001ad210741012104410121030c070b2002419c026a4101360200200241013602142002418ce8c3003602102002420137028c02200241a4e6c300360288022002200241106a3602980220024188026a41ace6c3001061000b410c4104102a000b41204101102a000b41c0004101102a000b410c4104102a000b41204101102a000b41c0004101102a000b200241b0046a10240c010b0b200241003602d006200242013703c80620034101460d0120034102470d00410110262201450d0c200241013602cc06200241d0066a22002000280200220641016a360200200220013602c806200120066a41023a000020022802cc0620002802002201470d04200141016a22002001490d1020014101742206200020002006491b22064100480d102001450d0920022802c8062001200610272200450d0a0c150b410110262201450d0a200241013602cc06200241d0066a22002000280200220641016a360200200220013602c806200120066a41003a000020022802cc0620002802002201470d01200141016a22002001490d0f20014101742206200020002006491b22064100480d0f2001450d0420022802c8062001200610272200450d050c120b410110262201450d0b200241c8066a41086a22002000280200220641016a360200200241013602cc06200220013602c806200120066a41013a000020022802cc062206200028020022016b41084f0d01200141086a22002001490d0e20064101742201200020002001491b22014100480d0e2006450d0520022802c8062006200110272200450d060c0c0b20022802c80621000c110b20022802c80621000c0b0b20022802c80621000c110b2006102622000d0d0b20064101102a000b2001102622000d060b20014101102a000b2006102622000d0b0b20064101102a000b41014101102a000b41014101102a000b41014101102a000b200220013602cc06200220003602c806200241d0066a28020021010b200241c8066a41086a2205200141086a360200200020016a2007370000200220093602880220024188026a200241c8066a104102400240024002402009450d00200b2009410c6c6a210a200b210603402006280200210c2002200641086a28020022013602880220024188026a200241c8066a1041024002400240024020022802cc06220d200528020022006b20014f0d00200020016a220e2000490d09200d4101742200200e200e2000491b22004100480d09200d450d0120022802c806200d20001027220d0d020c060b20022802c806210d0c020b20001026220d450d040b200220003602cc062002200d3602c806200528020021000b2005200020016a360200200d20006a200c20011094041a2006410c6a2206200a470d000b0b200241013602880220024188026a200241c8066a1041200f280200210d2002200f28020822013602880220024188026a200241c8066a104102400240024020022802cc062206200528020022006b20014f0d00200020016a22052000490d0620064101742200200520052000491b22004100480d062006450d0120022802c8062006200010272206450d020c040b20022802c80621060c040b2000102622060d020b20004101102a000b20004101102a000b200220003602cc06200220063602c806200241d0066a28020021000b200241c8066a41086a2205200020016a360200200620006a200d20011094041a0240024002400240024020022802cc062200200528020022016b41084f0d00200141086a22062001490d0520004101742201200620062001491b22014100480d052000450d0120022802c8062000200110272200450d020c030b20022802c80621000c030b2001102622000d010b20014101102a000b200220013602cc06200220003602c806200241d0066a28020021010b200241c8066a41086a2206200141086a360200200020016a427f37000002400240024020022802cc0620062802002201470d00200141016a22002001490d0320014101742206200020002006491b22064100480d032001450d0120022802c8062001200610272200450d020c040b20022802c80621000c040b2006102622000d020b20064101102a000b101e000b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a2206200141016a360200200020016a20043a00002006280200210620022802c806210520034101470d0502402009450d002009410c6c2100200b210103400240200141046a280200450d00200128020010230b2001410c6a2101200041746a22000d000b2009450d00200b10230b0240200f41046a280200450d00200f28020010230b200f10230c050b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a200141016a360200200020016a20043a00000c020b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a200141016a360200200020016a20043a00000b200241d0066a280200210620022802c80621050b200241c0086a24002006ad4220862005ad840b6101017f230041206b220224000240200141074d0d00200241206a240042010f0b200241146a41013602002002410136021c200241a8e8c30036021820024201370204200241a4e6c3003602002002200241186a360210200241ace6c3001061000baa0a05027f027e027f017e067f230041d0006b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241206a200241086a1090010240024002400240024002400240024020022802202203450d00200220022902242204370214200220033602102002410136024820024198e6c30036024c200241206a200241106a200241c8006a10a0030240024002400240200229032022054202520d0041002100410021060c010b200241386a2802002101200241346a28020021072002290328210820054201520d010240200228023c450d00200110230b41002100410021060b0c010b200241306a280200220021060b2002410036022820024201370320410110262109024002400240024002402006450d002009450d06200242818080801037022420022009360220200941013a000020022001360248200241c8006a200241206a10412001450d012000200141286c6a210a200241206a41086a220b2802002100200228022421092006210103400240024002400240200920006b41204f0d00200041206a220c2000490d0e2009410174220d200c200c200d491b220e4100480d0e2009450d0120022802202009200e1027220d0d020c080b200041206a210c2002280220210d0c020b200e1026220d450d060b2002200e3602242002200d360220200e21090b200b200c360200200d20006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a29000037000020002001290000370000200141206a290300210502400240024002402009200c6b41084f0d00200c41086a2200200c490d0e2009410174220e20002000200e491b220e4100480d0e2009450d01200d2009200e1027220d0d020c090b200c41086a21000c020b200e1026220d450d070b2002200e3602242002200d360220200e21090b200b2000360200200d200c6a2005370000200a200141286a2201470d000b41082101200920006b41084f0d020c080b2009450d06200242818080801037022420022009360220200941003a000042808080801021050c0b0b4108210120022802242209200241286a28020022006b4108490d060b200228022021090c080b200e4101102a000b200e4101102a000b200241346a410136020020024101360214200241c0e8c30036021020024201370224200241a4e6c3003602202002200241106a360230200241206a41ace6c3001061000b41014101102a000b41014101102a000b200020016a22012000490d002009410174220c20012001200c491b22014100480d00024002402009450d0020022802202009200110272209450d010c030b2001102622090d020b20014101102a000b101e000b20022001360224200220093602200b200241206a41086a200041086a2201360200200920006a20083700002001ad42208621052006450d002007450d00200610230b2004a7210d02402004422088a72201450d00200141246c21002003210103400240024020012d0000220c41034b0d00024002400240200c0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200d450d00200310230b200241d0006a240020052009ad840be10803067f017e017f230041e0006b220324002003200236021020032001280200220236020820032002200128020841246c22016a220436020c2003200341086a41086a3602140240024002400240024002402001419001490d00200341386a41086a210103402003200241246a360208200341386a200341146a200210a503200341186a41086a2202200141086a2204290300370300200341186a41106a2205200141106a2206290300370300200341186a41186a2207200141186a220829030037030020032001290300370318200329033822094202520d0220032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d0320032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d0420032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d05200328020c2204200328020822026b418f014b0d000b0b0240024020022004460d00200341386a41086a210103402003200241246a360208200341386a200341146a200210a503200341186a41086a200141086a290300370300200341186a41106a200141106a290300370300200341186a41186a200141186a29030037030020032001290300370318200329033822094202520d0220032802082202200328020c470d000b0b20004202370300200341e0006a24000f0b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c040b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c030b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c020b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c010b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380b2000200937030020002003290338370308200041106a200341c0006a290300370300200041186a200341386a41106a290300370300200041206a200341386a41186a290300370300200341e0006a24000bd50a05027f027e047f017e067f230041d0006b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241206a200241086a10900102400240024002400240024002400240024020022802202203450d00200220022902242204370214200220033602102002410136024820024198e6c30036024c200241206a200241106a200241c8006a10a00302400240200229032022054202520d0041002101410021060c010b200241c0006a2802002100200241386a2802002101200241306a2802002107200228023c2108200228023421092002290328210a024020054201520d00200121060c010b02402009450d002007102341002101410021060c010b4100210141002106410021090b200241003602282002420137032041011026210b024002400240024002402006450d00200b450d0620024281808080103702242002200b360220200b41013a0000200b410141091027220c450d072002428980808090013702242002200c360220200c200a37000120022000360248200241c8006a200241206a10412000450d012001200041286c6a210d200241206a41086a220e280200210f2002280224210c03400240024002400240200c200f6b41204f0d00200f41206a2200200f490d0f200c410174220b20002000200b491b22104100480d0f200c450d012002280220200c20101027220b0d020c080b200f41206a21002002280220210b0c020b20101026220b450d060b200220103602242002200b3602202010210c0b200e2000360200200b200f6a220f41186a200141186a290000370000200f41106a200141106a290000370000200f41086a200141086a290000370000200f2001290000370000200141206a290300210a0240200c20006b41074b0d00200041086a220f2000490d0c200c4101742210200f200f2010491b220f4100480d0c02400240200c450d00200b200c200f1027220b0d010c080b200f1026220b450d070b2002200f3602242002200b360220200f210c0b200e200041086a220f360200200b20006a200a370000200d200141286a2201470d000b41082101200c200f6b41084f0d020c090b200b450d074101210f200241013602242002200b360220200b41003a00000c0c0b410821012002280224220c200241286a280200220f6b4108490d070b2002280220210b0c090b20104101102a000b200f4101102a000b200241346a410136020020024101360214200241e0e8c30036021020024201370224200241a4e6c3003602202002200241106a360230200241206a41ace6c3001061000b41014101102a000b41094101102a000b41014101102a000b200f20016a2201200f490d00200c4101742200200120012000491b22014100480d0002400240200c450d002002280220200c20011027220b450d010c030b20011026220b0d020b20014101102a000b101e000b200220013602242002200b3602200b200b200f6a2009ad4220862007ad84370000200f41086a210f2008450d00200610230b2004a7210e02402004422088a72201450d00200141246c21002003210103400240024020012d0000220c41034b0d00024002400240200c0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200e450d00200310230b200241d0006a2400200fad422086200bad840baa05020b7f017e230041306b2202240041082103200241206a41086a220442003703002002420037032041dbcbc300411b200241206a1000200241086a20042903003703002002200229032037030041002104024002400240024002402002411041a886c500410041001001417f460d002002421037021420022002360210200241206a200241106a10890220022802202203450d02200241286a2802002104200228022421050c010b410021050b2002410036022820024201370320200220043602002002200241206a104102400240024002402004450d002003200441286c6a2106200241206a41086a22072802002108200228022421092003210403400240024002400240200920086b41204f0d00200841206a220a2008490d062009410174220b200a200a200b491b220c4100480d062009450d0120022802202009200c1027220b0d020c070b200841206a210a2002280220210b0c020b200c1026220b450d050b2002200c3602242002200b360220200c21090b2007200a360200200b20086a220841186a200441186a290000370000200841106a200441106a290000370000200841086a200441086a29000037000020082004290000370000200441206a290300210d02400240024002402009200a6b41084f0d00200a41086a2208200a490d062009410174220c20082008200c491b220c4100480d062009450d01200b2009200c1027220b0d020c080b200a41086a21080c020b200c1026220b450d060b2002200c3602242002200b360220200c21090b20072008360200200b200a6a200d3700002006200441286a2204470d000b2005450d060c050b200241286a28020021082002280220210b20050d040c050b101e000b200c4101102a000b200c4101102a000b41d4aac10041331021000b200310230b200241306a24002008ad422086200bad840be90104027f017e017f017e230041206b22022400200241106a41086a220342003703002002420037031041e698c3004117200241106a1000200241086a20032903003703002002200229031037030002400240024002402002411041a886c500410041001001417f460d002002420037031020024110200241106a41084100100141016a41084d0d022002290310210441082105410810262203450d010c030b42032104410821054108102622030d020b20054101102a000b41d4aac10041331021000b2003427f200420047c220620062004541b370000200241206a24002003ad42808080808001840b940403017f017e087f230041306b2202240042002103200241206a41086a22044200370300200242003703204192adc4004110200241206a1000200241086a200429030037030020022002290320370300024002400240024002402002411041a886c500410041001001417f460d002002421037021420022002360210200241206a200241106a102820022802202205450d02200229022421030c010b410121050b200241003602282002420137032020022003422088a722043602002002200241206a10410240024002402004450d0020044105742106200241206a41086a280200210720022802202108200228022421092005210403400240024002400240200920076b41204f0d00200741206a220a2007490d062009410174220b200a200a200b491b220b4100480d062009450d0120082009200b102722080d020c070b200741206a210a0c020b200b10262208450d050b200b21090b200820076a22072004290000370000200741186a200441186a290000370000200741106a200441106a290000370000200741086a200441086a290000370000200a2107200441206a2104200641606a22060d000b200241286a200a36020020022009360224200220083602202003a7450d050c040b200241286a280200210a200228022021082003a70d030c040b101e000b200b4101102a000b41d4aac10041331021000b200510230b200241306a2400200aad4220862008ad840be20602047f027e230041206b220324002001280200280200220128020421042001280200210102400240024002400240024002400240024020022d0000417f6a220541034b0d00024020050e0400040203000b200241086a210641012105200241016a210220014101470d050c040b200241016a21024100210520014101460d030c040b200241086a2106200241016a21024103210520014101470d030c020b41042105200241046a210220014101470d020c010b200241086a2106200241016a21024102210520014101470d010b20054102470d0220022004460d0120022800002004280000470d020c010b0240024020014102460d0020014103470d012002210620054104460d020c030b20054103470d0220022004460d0120022800002004280000470d020c010b20054101470d0120022004460d0020022800002004280000470d010b2006280200210120032006280208220236020c20032001360208200341003a0010200341106a2001200241004722051094041a20022005490d012003200220056b220636020c2003200120056a22013602082002450d00024002400240024020032d001022024101460d0020020d04200341106a200341086a10a70220032802102205450d04200329021421074200210820034200370310200341106a20032802082206200328020c2202410820024108491b22011094041a2003200220016b36020c2003200620016a3602082007a72101200241074d0d022007422088a72102200329031021070c010b20034200370310200341106a20012006410820064108491b22021094041a2003200620026b36020c2003200120026a360208200641074d0d0320032903102107200341106a200341086a10a70220032802102202450d032003290214210820034200370310200341106a20032802082206200328020c2201410820014108491b22051094041a2003200120056b36020c2003200620056a3602082008a72106200141074d0d022008422088a721042003280214210120032802102105420121080b2000200636021c200020013602142000200737030820002008370300200041206a2004360200200041186a2002360200200041106a2005360200200341206a24000f0b2001450d01200510230c010b2006450d00200210230b20004202370300200341206a24000f0b200520021048000b130020004105360204200041c8f0c3003602000b130020004108360204200041c1fbc3003602000b130020004108360204200041ccfbc3003602000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242013700000f0b41084101102a000b870301047f23004180026b22022400024002400240411210262203450d00200341106a41002f00c6ed433b0000200341086a41002900beed43370000200341002900b6ed4337000020034112412410272203450d012003200136001220024198016a41186a2201420037030020024198016a41106a2204420037030020024198016a41086a2205420037030020024200370398012003411620024198016a1002200241e8006a41186a2001290300370300200241e8006a41106a2004290300370300200241e8006a41086a2005290300370300200220022903980137036802400240200241e8006a412041a886c500410041001001417f460d002002422037028c012002200241e8006a3602880120024198016a20024188016a10ab032002290398014201520d04200241086a20024198016a41086a41e0001094041a20004201370300200041086a200241086a41e0001094041a0c010b200042003703000b2003102320024180026a24000f0b41124101102a000b41244101102a000b41d4aac10041331021000bf20904067f027e027f027e230041e0016b22022400200241c0016a41186a22034200370300200241c0016a41106a22044200370300200241c0016a41086a22054200370300200242003703c0012001410020012802002001280204200241c0016a41202001280208100122062006417f461b2206412020064120491b20012802086a220736020802400240024002402006411f4d0d00200241a0016a41186a22062003290300370300200241a0016a41106a22032004290300370300200241a0016a41086a22042005290300370300200220022903c0013703a00120024180016a41186a2205200629030037030020024180016a41106a2206200329030037030020024180016a41086a22032004290300370300200220022903a00137038001200241c0006a41186a2005290300370300200241c0006a41106a2006290300370300200241c0006a41086a20032903003703002002200229038001370340200242003703c801200242003703c001200141086a220341002001280200200141046a2204280200200241c0016a41102007100122062006417f461b2206411020064110491b20032802006a22033602002006410f4d0d01200241c0016a41086a2207290300210820022903c0012109200241c0016a41186a220a4200370300200241c0016a41106a220b420037030020074200370300200242003703c001200141086a2205410020012802002004280200200241c0016a41202003100122062006417f461b2206412020064120491b20052802006a22033602002006411f4d0d02200241a0016a41186a2206200a290300370300200241a0016a41106a2204200b290300370300200241a0016a41086a220a2007290300370300200220022903c0013703a00120024180016a41186a2207200629030037030020024180016a41106a2206200429030037030020024180016a41086a2204200a290300370300200220022903a00137038001200241e0006a41186a2007290300370300200241e0006a41106a2006290300370300200241e0006a41086a20042903003703002002200229038001370360200242003703c801200242003703c001200541002001280200200141046a280200200241c0016a41102003100122012001417f461b2201411020014110491b20052802006a3602002001410f4d0d03200241c0016a41086a290300210c20022903c001210d200241206a41186a2201200241c0006a41186a290300370300200241206a41106a2206200241c0006a41106a290300370300200241206a41086a2203200241c0006a41086a290300370300200241086a2204200241e0006a41086a290300370300200241106a2205200241e0006a41106a290300370300200241186a2207200241e0006a41186a2903003703002002200229034037032020022002290360370300200041206a200c370300200041186a200d370300200041106a200837030020002009370308200041286a2002290320370300200041306a2003290300370300200041386a2006290300370300200041c0006a2001290300370300200041c8006a2002290300370300200041d0006a2004290300370300200041d8006a2005290300370300200041e0006a200729030037030020004201370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000bcf0202027f017e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d0120044101200110cc02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b20004180011048000b20004180011048000ba90601097f230041106b220224002002410036020820024201370300200028020021030240024002400240410410262204450d0020024284808080c00037020420022004360200200420033600002000280204210320044104410810272204450d012002428880808080013702042004200336000420022004360200200028020821042002200041106a280200220336020c2002410c6a2002104102400240024002402003450d0020034105742105200241086a220628020021032002280204210703400240024002400240200720036b41204f0d00200341206a22082003490d0620074101742209200820082009491b220a4100480d062007450d0120022802002007200a102722090d020c070b200341206a2108200228020021090c020b200a10262209450d050b2002200a36020420022009360200200a21070b20062008360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002003200429000037000020082103200441206a2104200541606a22050d000b0b2000280214210420022000411c6a280200220336020c2002410c6a2002104102402003450d00200341057421054100200241086a220628020022036b21082002280204210703400240024002400240200720086a41204f0d00200341206a22092003490d062007410174220a20092009200a491b220a4100480d062007450d0120022802002007200a102722090d020c080b200228020021090c020b200a10262209450d060b2002200a36020420022009360200200a21070b2006200341206a220a360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a29000037000020032004290000370000200841606a2108200a2103200441206a2104200541606a22050d000b200128020020012802042009200a10042007450d070c060b200228020421042001280200200128020420022802002209200241086a280200100420040d050c060b101e000b200a4101102a000b200a4101102a000b41044101102a000b41084101102a000b200910230b200241106a24000b130020004103360204200041849ac4003602000b13002000410e36020420004198a0c4003602000b130020004104360204200041a8a0c4003602000b3101017f0240410110262202450d00200042818080801037020420002002360200200241003a00000f0b41014101102a000b130020004100360204200041a886c5003602000b130020004107360204200041b2a5c4003602000b130020004102360204200041bca5c4003602000bda0401097f230041d0006b2202240002400240410f10262203450d00200341076a41002900849544370000200341002900fd94443700002003410f411e10272204450d012004200036000f200241286a41186a22004200370300200241286a41106a22054200370300200241286a41086a220342003703002002420037032820044113200241286a1002200241086a41186a2000290300370300200241086a41106a2005290300370300200241086a41086a20032903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a104102400240024002402000450d00200041057421072003280200210020022802282108200228022c21092006210303400240024002400240200920006b41204f0d00200041206a22052000490d072009410174220a20052005200a491b220a4100480d072009450d0120082009200a102722080d020c080b200041206a21050c020b200a10262208450d060b200a21090b200820006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200741606a22070d000b200241306a20053602002002200936022c200220083602280c010b20032802002105200228022c2109200228022821080b200241086a412020082005100402402009450d00200810230b200410230240200141046a280200450d00200610230b200241d0006a24000f0b101e000b200a4101102a000b410f4101102a000b411e4101102a000bde0402047f037e230041d0006b220224000240024002400240411510262203450d002003410d6a41002900ada844370000200341086a41002900a8a844370000200341002900a0a84437000020034115413510272203450d01200320012900003700152003412d6a200141186a290000370000200341256a200141106a2900003700002003411d6a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034135200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002200236022020024120360224200241003602302002410020024120200241306a41044100100122012001417f461b2201410420014104491b2204360228200141034d0d052002350230210620024100360230200241286a410020024120200241306a41042004100122012001417f461b2201410420014104491b20046a360200200141034d0d0520023502302107200241306a200241206a102820022802302201450d0520022902342108200241306a200241206a10282008a7210420022802302205450d04200041186a2002290234370200200041146a2005360200200041106a20084220883e02002000200436020c20002001360208200020074220862006843702000c010b200041003602080b20031023200241d0006a24000f0b41154101102a000b41354101102a000b2004450d00200110230b41d4aac10041331021000bc01904027f027e077f027e230041c0016b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d252003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a200128020421012003450d062003102622060d0720034101102a000b2001410c6a2802002203417f4c0d19200128020421012003450d072003102622060d0820034101102a000b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a28020021060c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121060b2006200120031094042101200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121060b20062001200310940421012000410c6a2003360200200041086a2003360200200020013602042000410a360200200241c0016a24000f0b200241106a41086a200141186a290200370300200241106a41106a200141206a2802003602002002200141106a290200370310200141246a350200200141286a310000422086842104200141096a2f00002001410b6a2d00004110747221072001410c6a2802002106410021030b200241d0006a41106a200241106a41106a280200360200200241d0006a41086a200241106a41086a2903003703002002200229031037035020032007410874722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290350370200200041246a2004370200200041186a200241d0006a41086a290300370200200041206a200241d0006a41106a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041022101410021030c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b41f0004108102a000b8b0303027f017e057f230041306b220124004108210242002103200141206a41086a22044200370300200142003703204195b7c1004115200141206a1000200141086a200429030037030020012001290320370300024002402001411041a886c500410041001001417f460d002001421037021420012001360210200141206a200141106a10890220012802202202450d01200129022421030b20022003422088a7220541286c6a210620022104024002400340200620046b419f014d0d014101210720042000460d02200420004120109604450d02200441286a22082000460d02200820004120109604450d02200441d0006a22082000460d02200820004120109604450d02200441f8006a22082000460d02200441a0016a21042008200041201096040d000c020b0b024020062004460d002002200541286c6a210803404101210720002004460d02200420004120109604450d022008200441286a2204470d000b0b410021070b02402003a7450d00200210230b200141306a240020070f0b41d4aac10041331021000b130020004101360204200041b8b0c4003602000b1300200041073602042000419fb4c4003602000b130020004105360204200041a8b4c4003602000b9e0e050c7f057e017f017e0a7f23004180016b22082400024002400240024002400240200728020c22094100480d00200941ffffffff07460d002007410c6a210a2007410c6a200941016a220b360200200741146a280200210c200741106a220d210e410021090340024002400240024002400240024020090e020001010b200e280200220f41086a2110200f2f010622114105742112417f21090240024002400240024003402012450d01200941016a2109417f410120042010412010960422134100481b410020131b2213450d03201241606a2112201041206a211020134101460d000b200c0d010c030b20112109200c450d020b200c417f6a210c200f20094102746a41880b6a210e410021090c090b200f41e8026a200941e0006c6a2209450d002009280200450d00200941106a2903002114200941086a29030021150c010b200841286a2007411c6a2802002004200741206a28020028021c110400200841306a2903002114200728020c210b200829032821150b2007410c6a200b417f6a360200200141186a29030021162007280240210920012903102117024041004101410220152014842218501b20021b22194101460d0020194102470d0220094190016a21094200211a20172016844200520d030c0d0b20094180016a21094200211a20172016844200510d0c0c020b200d280200220f201d6a2110200f2f0106220d201e742112417f210902400240024003402012450d01200920196a2109201f201920032010202210960422132023481b202320131b2213450d03201220246a2112201020226a211020132019460d000b201c0d010c050b200d2109201c450d040b201c201f6a211c200f20092020746a20216a210d410121090c060b200f41e8026a200941e0006c6a2209450d022009280200450d02200941106a2903002116200941086a29030021170c030b200941f0006a21094200211a20172016844200510d0a0b200841186a2009290300200941086a290300201720161097042001201a200129030822172008290318427f200841186a41086a290300501b7d221620162017562016507222091b37030802402009450d0041e0bbc4002109412221070c090b200a28020022094100480d04200941ffffffff07460d04410121192007410c6a200941016a221b360200200741146a280200211c4108211d4105211e417f211f4102212041880b21214120212241002123416021240c020b200841086a2007411c6a2802002003200741206a28020028021c110400200841106a2903002116200728020c211b200829030821170b200a201b417f6a3602000240201720057d221a201756201620067d2017200554ad7d221720165620172016511b450d004182bcc4002109411d21070c070b024020184200520d00200741c0006a2802002209290360200556200941e8006a290300221620065620162006511b450d00419fbcc4002109411f21070c070b200820034102201a2017108302024020082802002209450d00200828020421070c070b0240201520057c22182015542209201420067c2009ad7c221620145420162014511b450d0041bebcc4002109412d21070c070b4100210920032004460d05200320044120109604450d05200a2003201a2017108102200a200420182016108102200841e0006a41186a200341186a290000370300200841e0006a41106a200341106a290000370300200841e0006a41086a200341086a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a29000037030020082003290000370360200820042900003703400240024002400240200741306a28020022092007412c6a280200470d00200941016a22192009490d0320094101742212201920192012491b2212ad42e8007e2216422088a70d032016a722104100480d032009450d01200741286a280200200941e8006c201010272219450d020c070b200741286a28020021190c070b2010102622190d050b20104108102a000b101e000b410121090c000b0b10e401000b2007412c6a2012360200200741286a2019360200200741306a28020021090b2019200941e8006c6a2219200829036037000141002109201941003a0000201941096a200841e0006a41086a290300370000201941116a200841e0006a41106a290300370000201941196a200841e0006a41186a290300370000201941216a2008290340370000201941296a200841c0006a41086a290300370000201941316a200841c0006a41106a290300370000201941396a200841c0006a41186a290300370000201941c1006a2008280039360000201941c4006a2008413c6a280000360000201941e0006a410036020020194201370358201941d0006a2006370300201941c8006a2005370300200741306a2207200728020041016a3602000b0b200020073602042000200936020020084180016a24000f0b41c8adc400104f000bc60101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a2802002204450d002004210520032100034020002802880b21002005417f6a22050d000b0340200320032f01064102746a41880b6a28020021032004417f6a22040d000c020b0b200321000b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a10d401200141306a24000b160020002001280208360204200020012802003602000b0e0020003502004101200110cc020b8f0301037f230041c0006b22022400200141086a280200210320012802042104200220012802002201360210024002400240200141818004490d002002413c6a41013602002002410236021c200241f8d5c4003602182002420237022c200241fcd5c4003602282002200241186a3602382002200241286a10a2012002280200450d010c020b02402004450d00200220033602140240200120034d0d00200241246a41023602002002413c6a41023602002002410236021c2002420237022c2002418cd6c4003602282002200241106a3602202002200241146a3602182002200241186a3602382002200241286a10a20120022802000d030c020b200341818004490d002002413c6a41013602002002410236021c200241f8d5c4003602182002420237022c2002419cd6c4003602282002200241186a3602382002200241286a10a20120022802000d020c010b2002410036020020022802000d010b20004100360200200241c0006a24000f0b20002002290300370200200041086a200241086a280200360200200241c0006a24000bcf0601037f230041c0006b22042400024002400240024002400240024002400240024020012802084102470d00200128020022052d0000416e6a2201411e4b0d0141002106024020010e1f0002020202020202020202020202020202020202020202020202020a030405000b20042005280204220136020c200120034f0d05200220014101746a22012d0001450d06200441346a41013602002004410236023c2004420237022420044198d8c40036022020042004410c6a3602382004200441386a360230200441106a200441206a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b412e10262201450d06200041013a0000200141266a4100290090d844370000200141206a410029008ad844370000200141186a4100290082d844370000200141106a41002900fad744370000200141086a41002900f2d744370000200141002900ead744370000200041086a42ae808080e005370200200041046a2001360200200441c0006a24000f0b412010262201450d06200041013a0000200141186a41002900d0d844370000200141106a41002900c8d844370000200141086a41002900c0d844370000200141002900b8d844370000200041086a42a08080808004370200200041046a2001360200200441c0006a24000f0b410121060c060b410221060c050b410321060c040b200441346a41013602002004410236023c20044202370224200441a8d8c40036022020042004410c6a3602382004200441386a360230200441106a200441206a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b20012d000021060c020b412e4101102a000b41204101102a000b0240200541106a2d00004106470d00200041003a0000200020063a0001200441c0006a24000f0b0240412910262201450d00200041013a0000200141286a41002d0080d9443a0000200141206a41002900f8d844370000200141186a41002900f0d844370000200141106a41002900e8d844370000200141086a41002900e0d844370000200141002900d8d844370000200041086a42a98080809005370200200041046a2001360200200441c0006a24000f0b41294101102a000b90010002400240024020002d000022004101460d0020004102460d0120004103470d02200128021841b8f6c40041032001411c6a28020028020c1102000f0b200128021841b2f6c40041032001411c6a28020028020c1102000f0b200128021841b5f6c40041032001411c6a28020028020c1102000f0b200128021841aff6c40041032001411c6a28020028020c1102000b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ccb0c5003602082002200236021820012000200241086a10e2032101200241206a240020010ba1d10103037f037e067f230041f0006b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d0000417f6a220441aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01f602001b0f01aa01a701a901a301230c13a80104141a9a01531d2454063507a101880172269101a001a60134090e8a01399d01a40105023a43744b73568d01030a4616797b4184017825287a8901080d272e1218940196012298019c01a5015da201179b01601e5c119e019f0120920177750b1044472a1597011c6231930190018b012b193699013c29664d5767644c8001427e308c0187012d8e0195011f48402f8f01713d217f614a7c85012c3332383f6f5e6e83018201378601505181017668637d6b5f3b553e694e456c4f6d596a654958525a5bf6020b200141306a2802002204200141346a22052802004f0dad0120023100012106200141206a350200210720042001412c6a280200470df402200441016a22022004490de60220044101742205200220022005491b2202ad4203862208422088a70de6022008a722054100480de6022004450de401200141286a2802002004410374200510272204450de5010cf3020b200141306a2802002202417f6a220420024f0d9f02200420024b0d9f02200141286a220228020020044103746a22042d00044101470da90120043100052106200341d8006a200141186a200210ce032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110cf032003280258450df30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0da80120022001411c6a280200470def02200241016a22042002490de30220024101742205200420042005491b22044100480de3022002450ddf01200141186a2802002002200410272202450de0010cee020b200341d8006a200141186a2202200141286a2204410010d00320032d00584101470da801200341e0006a2903002106200328025c22010df0010cf1020b200341d8006a2001200241046a2802004102410010cf032003280258450df00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210d1032003280258450def0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010d1032003280258450dee0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ded0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110d1032003280258450dec0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d3032003280258450deb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dea0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360248200441386a28020020024d0da2012003200428023020024102746a28020022023602282004412c6a28020020024d0db801200428022420024104746a22042d000d2109024020042802082202450d002004280200417f6a2104200141286a2105200141186a210a0340200341d8006a200a2005200420026a2d000010d00320032d00584101460de7012002417f6a22020d000b0b20094104460de902200141206a2802002202200141246a22042802004f0df30120022001411c6a280200470de402200241016a22042002490dda0220024101742205200420042005491b22044100480dda022002450d8702200141186a2802002002200410272202450d88020ce3020b200341d8006a2001410110d2032003280258450de80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410010cf032003280258450de70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20023100012106200341d8006a200141186a200141286a2204410010d00320032d00584101470da0012000200329025c370200200041086a200341e4006a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450de40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450de30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241046a280200210a2001280200210220034100360228200241146a280200450dac01200341d8006a200141186a2204200141286a2205410010d00320032d00584101470daf01200341e0006a2903002106200328025c22010df3010ce2020b200341d8006a200141046a200241046a28020010d50320032d00584101470d9c01200328025c2201450de102200341e0006a29030021060cb3010b200341d8006a2001410010d4032003280258450de00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450ddf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dde0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450ddc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360248200341d8006a200141046a200210d50320032d00584101470d9701200328025c21012003200341e0006a290300220637022c2003200136022820010daf010cdb020b200141306a2802002204200141346a22052802004f0d970120023100012106200141206a350200210720042001412c6a280200470dd302200441016a22022004490dcb0220044101742205200220022005491b2202ad4203862208422088a70dcb022008a722054100480dcb022004450dcb01200141286a2802002004410374200510272204450dcc010cd2020b200341d8006a2001410010d4032003280258450dd90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a28020022023602202001280200210420032002360254200441206a28020020024d0d9601200428021820024101746a22022d0001450db501200320022d000022023a0027200341d8006a200141186a200141286a410410d00320032d00584101470db801200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d9b020cd8020b200341d8006a2001410310d2032003280258450dd70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dd60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450dd50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450dd40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dd30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012d003822024104470d91010cc2020b200341d8006a2001200241046a2802004104410010d1032003280258450dd10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dd00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110d1032003280258450dcf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dce0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dcd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dcc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dcb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dca0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dc80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dc70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dc60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dc50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dc40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110d1032003280258450dc10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310d1032003280258450dc00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450dbf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450dbe0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dbd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210cf032003280258450dbc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110cf032003280258450dbb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110d7032003280258450dba0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450db90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450db80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450db70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450db60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450db50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450db40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450db30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110cf032003280258450db20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450db10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210d7032003280258450db00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450daf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dae0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dad0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410310d7032003280258450dac0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450dab0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012802002102200341003602282002280208450d750c94020b200341d8006a2001410110d4032003280258450da90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450da80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450da70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410210d7032003280258450da60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450da50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410010d7032003280258450da40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450da30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360228200441206a28020020024d0d62200141206a2802002205200141246a220a2802004f0d78200428021820024101746a2d0000210220052001411c6a280200470d8b02200541016a22042005490d93022005410174220a20042004200a491b22044100480d93022005450daa01200141186a2802002005200410272205450dab010c8a020b200341d8006a2001200241046a2802004108410110d1032003280258450da10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450da00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d6020022001411c6a280200470d8602200241016a22042002490d900220024101742205200420042005491b22044100480d90022002450d9201200141186a2802002002200410272202450d93010c85020b200341d8006a2001410110d4032003280258450d9e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450d9d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310d7032003280258450d9c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450d9b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d9a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450d990220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450d980220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450d970220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110d7032003280258450d960220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450d950220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450d940220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450d930220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010d7032003280258450d920220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d910220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d900220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d8f0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d8e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010d7032003280258450d8d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450d8c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d8b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110d7032003280258450d8a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210d7032003280258450d890220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310d7032003280258450d880220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450d870220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450d860220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002202417f6a220420024f0db101200420024b0db101200128022820044103746a220a2802002205200141206a28020022024d0d482001411c6a280200220420026b200520026b22094f0d5d200220096a220b2002490df6012004410174220c200b200b200c491b220b4100480df6012004450d7c200141186a2802002004200b1027220c450d7d0ce6010b200341d8006a2001410210d4032003280258450d840220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010d1032003280258450d830220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d4420022001411c6a280200470de201200241016a22042002490df30120024101742205200420042005491b22044100480df3012002450d77200141186a2802002002200410272202450d780ce1010b20012802002102200341003602282002280208450d4d0cda010b200341d8006a2001410010d4032003280258450d800220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450dff0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450dfe0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfa0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450df90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110d7032003280258450df80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450df70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450df60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450df50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450df40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450df30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450df20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450df10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450df00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450def0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dee0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010d1032003280258450ded0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d3032003280258450dec0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410110cf032003280258450deb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dea0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450de90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d2c20022001411c6a280200470dc001200241016a22042002490dd90120024101742205200420042005491b22044100480dd9012002450d61200141186a2802002002200410272202450d620cbf010b200341d8006a2001410210d6032003280258450de70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450de60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110d1032003280258450de40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450de30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450de10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450de00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dde0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450ddc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a200141046a200241046a28020010d50320032d00584101470d20200328025c2201450ddb01200341e0006a29030021060c420b200341d8006a2001410210d2032003280258450dda0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310cf032003280258450dd80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450dd70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450dd60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110d1032003280258450dd50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010d1032003280258450dd40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241086a280200210a200241046a280200210420032002410c6a2802002205360240200141306a280200220220054d0d1820022005417f736a220520024f0d83014104210c0240200141286a220d280200220920054103746a22052d00044103460d0020052d0005210c0b2003200c3a0038200a450d34200c41ff0171220e4104470d33200a410274210a0340200320042802002205360240200220054d0d3e20022005417f736a220520024f0d7d0240200920054103746a22052d00044103460d0020052d00054104470d3e0b200441046a2104200a417c6a220a0d000b4104210c0c340b200341d8006a2001200241046a2802004101410010cf032003280258450dd10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110d1032003280258450dcf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360240200141306a280200220420024d0d1520042002417f736a220220044f0d8001200141286a220428020020024103746a22022d00044103460d9f0120022d0005220241ff01714104460d9f01200341d8006a200141186a22052004200210d00320032d00584101470d36200328025c2202450d9f01200341e0006a29030021060c9e010b200341d8006a200141186a200141286a410410d00320032d00584101470dcd01200328025c2201450dcd012000200341e0006a29030037020420002001360200200341f0006a24000f0b200241046a2802002102200341d8006a200141186a220a200141286a2205410010d00320032d00584101470d14200341e0006a2903002106200328025c22010d92010ccc010b200141306a2802002202417f6a220420024f0d78200420024b0d78200141286a220a28020020044103746a22042d0005210520042d00044101470d14200541ff01714104460d14200341ec006a41013602002003412936022c2003200441056a3602282003420237025c200341d4d1c4003602582003200341286a360268200341086a200341d8006a10a201200041086a200341086a41086a28020036020020002003290308370200200341f0006a24000f0b411a10262201450d7d200141186a41002f00d0d1443b0000200141106a41002900c8d144370000200141086a41002900c0d144370000200141002900b8d1443700002000429a808080a00337020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc9012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a20022004410410d00320032d00584101470d16200341e0006a2903002106200328025c22010d470cc8010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc7012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc7012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a41013602002003410236023c2003420237025c20034188dac4003602582003200341c8006a3602382003200341386a360268200341086a200341d8006a10a201200329020c2106200328020822010d510cc6010b200141306a2802002202200141346a22052802004f0d15200141206a350200210720022001412c6a280200470d9b01200241016a22052002490db6012002410174220a20052005200a491b2205ad4203862208422088a70db6012008a7220a4100480db6012002450d4920042802002002410374200a10272202450d4a0c9a010b200141206a2802002202200141246a22042802004f0d1520032d0059210420022001411c6a280200470d9801200241016a22052002490db5012002410174220a20052005200a491b22054100480db5012002450d4a200141186a2802002002200510272202450d4b0c97010b200320032d005922023a0038200341d8006a200141186a200141286a410410d00320032d00584101470d16200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d170cc3010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc2012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc2012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a4101360200200341023602442003420237025c200341b8dac4003602582003200341d4006a3602402003200341c0006a360268200341086a200341d8006a10a2010c1f0b200341d8006a200141186a2205200141286a200210d00320032d00584101470d15200328025c2202450db001200341e0006a29030021060c250b200341ec006a4101360200200341023602442003420237025c200341b8dac4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a10a20120032802082201450dbf01200329020c21060c160b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbe012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbe012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbd012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbd012000200329022c37020420002001360200200341f0006a24000f0b2005200220052002491b21040ca1010b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbb012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbb012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a200141186a2205200141286a20032d0059220410d00320032d00584101470d13200328025c2201450dba01200341e0006a29030021060c210b200341086a410c6a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200328022821022003200329022c37022c2003200236022820032802282202450d7b0c8b010b200341146a4102360200200341ec006a220241023602002003410236020c200320043602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821042003200329022c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a201200328020c450d8601200328020810230c86010b200141306a280200210420032002360240200420024d0d1120042002417f736a220220044f0d6b200528020020024103746a22022d00044103460db70120022d0005220241ff01714104460db701200341d8006a200a2005200210d00320032d00584101470d38200328025c2201450db701200341e0006a29030021060c7d0b20024101470d1120012d003822024104470d1f0c83010b200341d8006a41146a41013602002003410236024c2003420237025c200341e8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a201200329020c2106200328020822010d460cb5010b200341ec006a41013602002003410236024c2003420237025c200341b8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a20120032802082202450d9e01200329020c21060c9f010b200341ec006a41013602002003410236024c2003420237025c200341b8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a20120032802082202450d8c01200329020c21060c8d010b20012802002209412c6a28020021022003200a3602282002200a4d0d112009280224200a4104746a220a2d000d21090240200a2802082202450d00200a280200417f6a210a0340200341d8006a20042005200a20026a2d000010d00320032d00584101460d372002417f6a22020d000b0b200941ff01714104460db201200141206a2802002202200141246a22052802004f0d4220022001411c6a280200470d7e200241016a22052002490da3012002410174220a20052005200a491b22054100480da3012002450d5620042802002002200510272202450d570c7d0b200341d8006a2002200420032d0059220510d00320032d00584101470d14200341e0006a2903002106200328025c22010d300cb1010b200341ec006a4101360200200341023602442003420237025c20034198dac4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a10a201200329020c2106200328020822010d3b0cb0010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450daf012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450daf012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dae012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dae01200329022c21060b2000200637020420002001360200200341f0006a24000f0b200320032d005922013a004020014104460dac01200241ff01712001460dac01200341086a41146a412b360200200341146a4123360200200341d8006a41146a41033602002003410236020c2003420337025c200341f4d1c4003602582003200341c0006a3602182003200341386a3602102003200341c8006a3602082003200341086a360268200341286a200341d8006a10a201200329022c210620032802282201450dac010b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d0e20042001411c6a280200470d74200441016a220a2004490d9b0120044101742209200a200a2009491b220a4100480d9b012004450d3c20052802002004200a10272204450d3d0c730b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450da9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450da901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141186a280200220c200222046a210b20094102490d89010c8a010b200141206a2802002202200141246a220a2802004f0d0c20022001411c6a280200470d6e200241016a220a2002490d970120024101742209200a200a2009491b220a4100480d97012002450d3a20052802002002200a10272202450d3b0c6d0b200341146a4102360200200341ec006a220141023602002003410236020c200320043602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200329022c210620032802282201450da5010c6b0b200341d8006a200141186a2202200a10ce032003280258450d1f20002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002204200141346a22052802004f0d0f200141206a350200210720042001412c6a280200470d68200441016a22052004490d94012004410174220a20052005200a491b2205ad4203862208422088a70d94012008a7220a4100480d94012004450d3b20022802002004410374200a10272202450d3c0c670b200341ec006a41013602002003410236024c2003420237025c200341c8dac4003602582003200341d4006a3602482003200341c8006a360268200341086a200341d8006a10a2010b200328020821012003200329020c220637022c200320013602282001450da1010c640b200341ec006a41013602002003410236024c2003420237025c20034198dac4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a201200329020c2106200328020822010d310ca0010b200320032d005922013a00482001200241ff0171460d9f0120014104460d9f01200341086a41146a412b360200200341146a412b360200200341d8006a41146a41033602002003410236020c2003420337025c2003418cd2c4003602582003200341c8006a3602182003200341276a3602102003200341206a3602082003200341086a360268200341286a200341d8006a10a201200329022c2106200328022822010d620c9f010b200a410274210a0340200320042802002205360240200220054d0d0a20022005417f736a220520024f0d49200920054103746a22052d00044103460d0920052d0005220b4104460d09200e200b470d09200441046a2104200a417c6a220a0d000b0b200341d8006a200141186a2202200d410010d003024020032d00584101470d00200341306a200341e4006a2802003602002003200329025c370328200328022822020d700c600b200c41ff01714104470d1a0c5e0b200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d5c200441016a220a2004490d8d0120044101742209200a200a2009491b220a4100480d8d012004450d3620022802002004200a10272202450d370c5b0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d8b012003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d8b01200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d99012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d9901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d1720042001411c6a280200470d55200441016a220a2004490d880120044101742209200a200a2009491b220a4100480d88012004450d3320052802002004200a10272204450d340c540b200341d8006a200141186a2205200a200210d00320032d00584101470d18200328025c2202450d63200341e0006a29030021060c250b200341146a4129360200200341ec006a41023602002003200541056a3602102003412936020c2003420237025c200341e4d1c4003602582003200341386a3602082003200341086a360268200341286a200341d8006a10a201200328022822020d670c570b200341146a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200328022821022003200329022c37022c20032002360228200328022822020d660c560b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d93012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d93012000200329022c37020420002001360200200341f0006a24000f0b2004102622020d8e010b20044101102a000b2005102622040d8e010b20054104102a000b2005102622040d86010b20054104102a000b2004102622020d720b20044101102a000b2004102622020d690b20044101102a000b200b1026220c0d690b200b4101102a000b2004102622020d5d0b20044101102a000b200541ff01714104460d8401200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d40200441016a220a2004490d7520044101742209200a200a2009491b220a4100480d752004450d2a20022802002004200a10272202450d2b0c3f0b200341e0006a2903002106200328025c22010d0e0c83010b200341d8006a2002200d200c10d00320032d00584101470d0e200328025c2202450d432003200341e0006a29030037022c20032002360228200328022822020d540c440b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d81012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d8101200329022c21060b2000200637020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d502003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a201200328020c450d4d20032802081023200328022822020d4e0c500b200141206a2802002204200141246a22052802004f0d0b20042001411c6a280200470d38200441016a22052004490d6f20044101742209200520052009491b22054100480d6f2004450d1e200a2802002004200510272204450d1f0c370b200141206a2802002204200141246a22092802004f0d0b20042001411c6a280200470d35200441016a22092004490d6e2004410174220b20092009200b491b22094100480d6e2004450d1f20052802002004200910272204450d200c340b200341e0006a2903002106200328025c22010d0d0c7c0b200a102622020d500b200a4104102a000b2005102622020d4c0b20054101102a000b2004102622050d5f0b20044101102a000b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d752003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d75200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a22052802004f0d0a20042001411c6a280200470d29200441016a22052004490d642004410174220a20052005200a491b22054100480d642004450d1b20022802002004200510272202450d1c0c280b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d722003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d72200329022c21060c380b200341ec006a220241013602002003410236024c200320093602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d3e2003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d3e200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d6f2003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d6f200329022c21060b2000200637020420002001360200200341f0006a24000f0b200a102622040d360b200a4101102a000b200a102622020d320b200a4101102a000b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d692003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d692000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d292003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d292003200329022c37022c20032002360228200328022822020d3a0c2a0b200a102622020d2b0b200a4104102a000b200a102622020d240b200a4101102a000b200a102622040d200b200a4101102a000b2004102622020d5b0b20044101102a000b2005102622040d180b20054101102a000b2009102622040d140b20094101102a000b2005102622020d260b20054101102a000b200a102622020d140b200a4101102a000b2005102622020d0c0b20054101102a000b4182dcc400411d1021000b4118102622000d0241184101102a000b4118102622000d0241184101102a000b4118102622000d0241184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c200320013602584184d1c4004134200341d8006a10dd03000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c200320013602584184d1c4004134200341d8006a10dd03000b4182dcc400411d1021000b4182dcc400411d1021000b411a4101102a000b4182dcc400411d1021000b2001411c6a2005360200200141186a2002360200200141206a28020021040b200141186a28020020046a200c3a0000200141206a2202200228020041016a3602000c0a0b2001411c6a2009360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c140b2001411c6a2005360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2201200128020041016a3602000c450b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c430b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c120b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c3f0b20034100360228200328022822020d100b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d382004410174220c200b200b200c491b220b4100480d382004450d02200141186a2802002004200b1027220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1026220c0d020b200b4101102a000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c3d0b2000200637020420002001360200200341f0006a24000f0b2001412c6a2005360200200141286a2002360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080802084370200200141306a2201200128020041016a3602000c3a0b2000200637020420002001360200200341f0006a24000f0b2001411c6a200a360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c370b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c250b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c330b200341d8006a200141186a200a10ce032003280258450d3220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20032802282202450d020b200329022c21060b2000200637020420002002360200200341f0006a24000f0b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d292004410174220c200b200b200c491b220b4100480d292004450d02200141186a2802002004200b1027220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1026220c0d020b200b4101102a000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c2e0b2000200329022c37020420002002360200200341f0006a24000f0b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c2b0b2001412c6a2005360200200141286a2002360200200141306a28020021020b200141286a28020020024103746a200642288620078442808080801084370200200141306a2201200128020041016a3602000c290b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41023a0000200141206a2201200128020041016a3602000c270b0240200141206a2802002202200141246a22042802004f0d0020022001411c6a280200470d05200241016a22042002490d1820024101742205200420042005491b22044100480d182002450d02200141186a2802002002200410272202450d030c040b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d262003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d26200329022c21060b2000200637020420002002360200200341f0006a24000f0b2004102622020d010b20044101102a000b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c210b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c1f0b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c1a0b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41013a0000200141206a2201200128020041016a3602000c180b2001411c6a2004360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000c160b200341d8006a200141186a2204200141286a410010d003024020032d00584101470d00200328025c2202450d16200341e0006a29030021060c010b0240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d072002410174220a20052005200a491b22054100480d072002450d0220042802002002200510272202450d030c040b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d152003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d15200329022c21060b2000200637020420002002360200200341f0006a24000f0b2005102622020d010b20054101102a000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c100b200141306a2802002202417f6a220420024f0d01200420024b0d010240024002400240200128022820044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d042004410174220c200b200b200c491b220b4100480d042004450d02200141186a2802002004200b1027220c450d030c060b2005200220052002491b21040c090b200141186a280200220c200222046a210b20094102490d050c060b200b1026220c0d030b200b4101102a000b101e000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c080b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080803084370200200141306a2201200128020041016a3602000c060b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c040b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41033a0000200141206a2201200128020041016a3602000c020b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a2006422886200784370200200141306a2201200128020041016a3602000b20004100360200200341f0006a24000b19002000200141186a280200360204200020012802103602000bb310012e7f230041a0016b2202240002400240024002402000280200220341f098c400460d00200028020421040c010b41ec0010262203450d0141002104200341003b010620034100360200200341086a200241086a41e4001094041a20004100360204200020033602000b200141ff017121050c010b41ec004104102a000b41002107024003400240024002400240024002400240024020070e020001010b200341086a210820032f0106210641002107024002400240034020062007460d014100417f4101200820076a2d0000220920054b1b20092005461b2209450d02200741016a210720094101460d000b2007417f6a21060b02402004450d002004417f6a2104200320064102746a41ec006a2802002103410021070c0a0b2000200028020841016a36020820032f01062207410b4f0d01200341086a2209200641016a220a6a200920066a2209200720066b1095041a200920013a0000200341146a2207200a4103746a200720064103746a2209200341066a22072f010020066b4103741095041a20094101360200200720072f010041016a3b0100200241a0016a24000f0b200320074103746a41146a42013702000c090b41ec001026220b450d04200b41003b0106200b4100360200200b41086a200241086a41e40010940421092003410e6a2d0000210c2003280248210d2003280244210e20092003410f6a200341066a220a2f010041796a22071094042109200b41146a200341cc006a2007410374109404210f200a41063b0100200b20073b010602400240200641064b0d00200341086a2207200641016a22096a200720066a220a200341066a22072f010020066b1095041a200a20013a0000200341146a220a20094103746a200a20064103746a220920072f010020066b4103741095041a200941013602000c010b20092006417a6a220a6a2009200641796a22066a2209200741ffff037120066b1095041a200920013a0000200f200a4103746a200f20064103746a2209200b41066a22072f010020066b4103741095041a200941013602000b4101210a200720072f010041016a3b010020032802002210450d014104210f410a2111419c0121124100211341082114419401211541c800211641c4002117410e2118410f21194106211a4179211b41cc00211c4114211d4103211e418801211f41ec002120417a21214102212241ffff03212341f0002124416c212541d4002126200341046a2f0100212720102f01062207410a4b0d060c020b201210262208450d02200820133b010620082013360200200820146a200241086a20151094042106201020166a280200212a201020176a2802002129201020186a2d000021282006201020196a2010201a6a222b2f01002209201b6a2207109404212c2008201d6a2010201c6a2007201e74109404212d200820206a2010201f6a200920216a222e202274109404212f202b201a3b0100200820073b01060240202e450d0041002107202f210603402006280200220920073b0104200920083602002006200f6a2106202e2007200a6a2207470d000b0b024002402027201a4b0d00201020146a22062027200a6a22076a200620276a2206202b2f0100220920276b222e1095041a2006200c3a00002010201d6a22062007201e746a20062027201e746a2206202e201e741095041a2006200e3602002006200d360204202b2009200a6a22063b0100201020206a22092027202274222b6a20146a200920072022746a222e2006202371220920076b2022741095041a202e200b360200202720094f0d012010202b6a20246a21070340200728020022062027200a6a22273b0104200620103602002007200f6a210720092027470d000c020b0b202c202720216a22066a202c2027201b6a22076a222e2008201a6a22092f010020076b1095041a202e200c3a0000202d2006201e746a202d2007201e746a222e20092f010020076b201e741095041a202e200e360200202e200d360204200920092f0100200a6a222e3b0100202f2027202274222b6a20256a202f20062022746a2209202e202371222720066b2022741095041a2009200b360200200620274b0d002008202b6a20266a21060340200628020022092007200a6a22073b0104200920083602002006200f6a210620272007470d000b0b024020102802002207450d002028210c2029210e202a210d2008210b2010200f6a2f01002127200722102f0106220720114d0d02410121070c070b2008210b202a210d2029210e2028210c0b419c0110262207450d03200741003b010620074100360200200741086a200241086a419401109404210920072000280200220636026c200020073602002000200028020441016a360204200641003b010420062007360200200720072f010622064103746a220a41186a200d360200200a41146a200e360200200920066a200c3a0000200741ec006a200641016a22064102746a200b360200200720063b0106200b20063b0104200b2007360200200241a0016a24000f0b201041086a2209202741016a22066a200920276a2209200720276b220a1095041a2009200c3a0000201041146a220920064103746a200920274103746a2209200a4103741095041a2009200e3602002009200d360204201041066a200741016a22073b0100201041ec006a220920274102746a41086a200920064102746a2209200741ffff0371220a20066b4102741095041a2009200b3602002027200a4f0d0520102006417f6a22074102746a41f0006a2106034020062802002209200741016a22073b010420092010360200200641046a2106200a2007470d000c060b0b419c014104102a000b41ec004104102a000b419c014104102a000b410121070c000b0b200241a0016a24000bbb3101a6017f23004190016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a280200210320012802082104024002400240200141106a2802002205450d0041002106417f2107412c2108417e2109410d210a4104210b4170210c4158210d4109210e4108210f41ffffffff03211041142111416c2112411c21134118211441ff012115410221164174211741012118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021230c010b4104215f410021604100216141002162410021634104216441002165410021664104216741002168410021694104216a4100216b4100216c4104216d41002105410021264104216e4100216f41002170410421714100217241002173410421744100217541002176410421774100217841002179410021010c010b410121010b034002400240024002400240024002400240024002400240024020010e020001010b4104210641002153410021500c010b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020230e050001020304040b20252124202221262004200520076a220520086c6a2201280024212720012800202128200128001821292001280014212a2001280010212b200128000c212c2001280008212d2001280004212e4101212f0240024020012d0000223020096a2201200a4b0d0041012131410121324101213341012134410121354101213641012122202e2125024002400240024002400240024002400240024020010e0e000203040501062d07080927272f000b02402021450d0002402037450d002037200b74212520212101034002402001200b6a280200450d00200128020010230b200141106a21012025200c6a22250d000b0b2038450d00202110230b410121314100212f202c2137202d2138202e21210c0a0b201c450d1d2039450d1c201c2039200b746a213a201c213b4100213c0c260b02402020450d000240203e450d00203e41286c212520202101034002402001200b6a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a21012025200d6a22250d000b0b203f450d00202010230b410021314101212f202c213e202d213f202e21200c080b02402040450d00201f450d00201f10230b2026212220242125202e211f202d2140202c214120050d0e0c2a0b02402042450d00201e450d00201e10230b2026212220242125202e211e202d2142202c214320050d0c0c290b02402044450d00201d450d00201d10230b2026212220242125202e211d202d2144202c214520050d0a0c280b0240201b450d0002402046450d00204620116c2125201b2101034002402001200b6a280200450d00200128020010230b200120116a2101202520126a22250d000b0b2047450d00201b10230b410021334101212f202c2146202d2147202e211b41012131410121320c1f0b201a450d192048450d18201a204820136c6a2149201a214a4101213c0c210b2019450d1a204c450d192019204c20146c6a214d2019214e4102213c0c210b2006450d1b2050450d1a2006205020136c6a2151200621524103213c0c210b410121310b41012132410821010c200b02402082012802082223450d0020820128020021012023207b7421230340024020012d0000207e470d002001207f6a28020020800171450d002001207b6a28020010230b2001207d6a210120232081016a22230d000b0b208201207d6a21010240208201207b6a280200450d0020820128020010230b20012182012001207c470d060c240b0240208e012086016a2802002223450d00208e01280204210120232089017421230340024020012d0000208b01470d0020012087016a280200208c0171450d0020012089016a28020010230b2001208a016a21012023208d016a22230d000b0b0240208e012087016a280200450d00208e012089016a28020010230b208e012084016a21010240208e012088016a280200450d00208e0128021010230b2001218e012001208501470d060c240b0240209a012092016a280200450d00209a0128020010230b0240209a012093016a2802002223450d00209a0128020c210120232092017421230340024020012d0000209601470d0020012097016a28020020980171450d0020012092016a28020010230b20012094016a210120232099016a22230d000b0b209a012090016a21010240209a012094016a280200450d00209a012095016a28020010230b2001219a012001209101470d060c240b024020a701209f016a2802002223450d0020a7012802042101202320a2017421230340024020012d000020a401470d00200120a0016a28020020a50171450d00200120a2016a28020010230b200120a3016a2101202320a6016a22230d000b0b024020a70120a0016a280200450d0020a70120a2016a28020010230b20a701209d016a2101024020a70120a1016a280200450d0020a70128021010230b200121a7012001209e01470d060c240b410021230c060b410021230c060b410021230c060b410121230c060b410221230c060b410321230c060b410421230c060b410121010c220b410121010c210b410121010c200b410121010c1f0b410121010c1e0b410121010c1d0b410121010c1c0b410021010c0d0b410121010c0c0b410221010c0b0b410321010c0a0b410421010c090b410521010c080b410621010c070b410721010c060b410921010c050b410a21010c040b410b21010c030b410b21010c020b410b21010c010b410b21010b0240024002400340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0c000102030405060708090b0d0d0b203d450d17201c1023410121010c2a0b410021324101212f202c2139202d213d202e211c410121310c1a0b204b450d16201a1023410321010c280b410021344101212f202c2148202d214b202e211a4101213141012132410121330c060b204f450d1520191023410521010c260b410021354101212f202c214c202d214f202e211941012131410121324101213341012134410121362030200a4d0d060c270b2053450d1420061023410721010c240b410021364101212f202c2150202d2153202e210641012131410121324101213341012134410121352030200a4d0d040c250b41012133410921010c220b410121340b4101213541012136410a21010c200b2030200a4b0d210b202621222024212502400240024002400240024002400240024020300e0e2800010228282803042b05060708280b0240202d450d00202e10230b202a450d29202b10230c290b202f450d28202c450d26202c200b742125202e2101034002402001200b6a280200450d00200128020010230b200141106a21012025200c6a22250d000c270b0b2031450d27202c450d25202c41286c2125202e2101034002402001200b6a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a21012025200d6a22250d000c260b0b2032450d26202c450d24202e202c200b746a2154202e21554104213c0c190b2033450d25202c450d23202c20116c2125202e2101034002402001200b6a280200450d00200128020010230b200120116a2101202520126a22250d000c240b0b2034450d24202c450d22202e202c20136c6a2156202e21574105213c0c190b2035450d23202c450d21202e202c20146c6a2158202e21594106213c0c1a0b2036450d22202c450d20202e202c20136c6a215a202e215b4107213c0c1b0b02400240202e20157122012016460d0020012018460d01202c450d23202d10230c230b202a450d02202c202a200b746a215c202c215d4108213c0c1d0b202a450d01202a410c6c212e202c21010340024020012802002225450d002001200b6a280200450d00202510230b2001410c6a2101202e20176a222e0d000c020b0b024002400240024002400240024002400240203c0e09000102030405060708080b0240203b2802082225450d00203b28020021012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b203b41106a21010240203b200b6a280200450d00203b28020010230b2001213b2001203a470d09410021010c250b0240204a410c6a2802002225450d00204a28020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b0240204a200f6a280200450d00204a200b6a28020010230b204a20136a21010240204a20116a280200450d00204a28021010230b2001214a20012049470d09410221010c240b0240204e200b6a280200450d00204e28020010230b0240204e20116a2802002225450d00204e28020c21012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b204e20146a21010240204e41106a280200450d00204e410c6a28020010230b2001214e2001204d470d09410421010c230b02402052410c6a2802002225450d00205228020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b02402052200f6a280200450d002052200b6a28020010230b205220136a21010240205220116a280200450d00205228021010230b2001215220012051470d09410621010c220b024020552802082225450d00205528020021012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b205541106a210102402055200b6a280200450d00205528020010230b2001215520012054470d090c220b02402057410c6a2802002225450d00205728020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b02402057200f6a280200450d002057200b6a28020010230b205720136a21010240205720116a280200450d00205728021010230b2001215720012056470d090c210b02402059200b6a280200450d00205928020010230b0240205920116a2802002225450d00205928020c21012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b205920146a21010240205941106a280200450d002059410c6a28020010230b2001215920012058470d090c200b0240205b410c6a2802002225450d00205b28020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b0240205b200f6a280200450d00205b200b6a28020010230b205b20136a21010240205b20116a280200450d00205b28021010230b2001215b2001205a470d090c1f0b205d225e41106a215d0240205e2802042201450d000240205e410c6a2802002225450d002025410c6c21250340024020012802002222450d002001200b6a280200450d00202210230b2001410c6a2101202520176a22250d000b0b205e200f6a280200450d00205e200b6a28020010230b205d205c470d090b202b450d1f202c10230c1f0b4100213c0c0d0b4101213c0c0d0b4102213c0c0d0b4103213c0c0d0b4104213c0c0e0b4105213c0c0f0b4106213c0c100b4107213c0c110b4108213c0c120b410121010c120b410321010c110b410521010c100b410721010c0f0b410821010c0e0b410b21010c0d0b410b21010c0c0b410b21010c0b0b410b21010c0a0b410b21010c090b410b21010c080b410b21010c070b410b21010c060b410b21010c050b410b21010c040b410b21010c030b410b21010c020b410b21010c010b410b21010c000b0b202d450d01202e10230c010b0240202d450d00202e10230b0240202a450d002029450d00202a10230b2027450d00202810230b20262122202421250b20050d070b4100210520252124202221260b204c410020191b2160204f410020191b216120484100201a1b2179204b4100201a1b217820464100201b1b216220474100201b1b216320394100201c1b2176203d4100201c1b217520454100201d1b216520444100201d1b216620434100201e1b217320424100201e1b217220414100201f1b216820404100201f1b2169203e410020201b2170203f410020201b216f2037410020211b216b2038410020211b216c2019410420191b215f201a4104201a1b2177201b4104201b1b2164201c4104201c1b2174201d4104201d1b2167201e4104201e1b2171201f4104201f1b216a2020410420201b216e2021410420211b216d20060d00410021010c0a0b2002280200217a0240200241086a2802002201450d0020014104742123207a210103400240200141046a280200450d00200128020010230b200141106a2101202341706a22230d000b0b02402002280204450d00207a10230b2002410c6a280200217a0240200241146a2802002201450d00200141286c2123207a210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101202341586a22230d000b0b0240200241106a280200450d00207a10230b02402002411c6a280200450d00200241186a28020010230b0240200241286a280200450d00200241246a28020010230b0240200241346a280200450d00200241306a28020010230b2002413c6a280200217a200241c4006a2802002201450d004104217b207a20014104746a217c4110217d4109217e4108217f41ffffffff032180014170218101207a218201410121230c050b0240200241c0006a280200450d00207a10230b200241c8006a2802002183010240200241d0006a2802002201450d00200141146c2123208301210103400240200141046a280200450d00200128020010230b200141146a21012023416c6a22230d000b0b0240200241cc006a280200450d0020830110230b200241dc006a280200218301200241e4006a2802002201450d00411c2184012083012001411c6c6a218501410c2186014108218701411421880141042189014110218a014109218b0141ffffffff03218c014170218d01208301218e01410221230c050b0240200241e0006a280200450d0020830110230b200241e8006a280200218f01200241f0006a2802002201450d004118219001208f01200141186c6a219101410421920141142193014110219401410c2195014109219601410821970141ffffffff032198014170219901208f01219a01410321230c050b0240200241ec006a280200450d00208f0110230b418001219b01200241f4006a280200219c01200241fc006a2802002201450d00411c219d01209c012001411c6c6a219e01410c219f01410821a001411421a101410421a201411021a301410921a40141ffffffff0321a501417021a601209c0121a701410421230c050b2002209b016a21010240200241f8006a280200450d00209c0110230b200110ef03024020024184016a2201280200450d0020024180016a28020010230b20024188016a20053602002001200336020020024180016a2004360200200241fc006a2050360200200241f8006a2053360200200241f4006a2006360200200241f0006a2060360200200241ec006a2061360200200241e8006a205f360200200241e4006a2079360200200241e0006a2078360200200241dc006a2077360200200241d8006a2024360200200241d4006a2026360200200241d0006a2062360200200241cc006a2063360200200241c8006a2064360200200241c4006a2076360200200241c0006a20753602002002413c6a2074360200200241386a2065360200200241346a2066360200200241306a20673602002002412c6a2073360200200241286a2072360200200241246a2071360200200241206a20683602002002411c6a2069360200200241186a206a360200200241146a2070360200200241106a206f3602002002410c6a206e360200200241086a206b3602002002206c3602042002206d36020020002002418c011094041a20024190016a24000f0b41002123410121010c040b410121010c030b410121010c020b410121010c010b410121010c000b0b9a0c02297f017e230041106b22022400024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042101200241086a200010be0320022802082208200228020c22094104746a210a4100210b20094104490d0141ff01210c200341ff0171210d4101210e410d210f411c211041182111411d2112412c21134128211441202115412d2116413c211741c0002118413821194130211a413d211b413f211c4101211d0c020b20012802042104200241106a240020040f0b410021090c010b410121090b02400240024003400240024002400240024002400240024002400240024002400240024002400240024020090e020001010b2008200a460d01410421210240200741ff017122224104470d0041102123200341ff0171212441012125410d21264100211d0c0c0b41102127200341ff0171212841012129410d212a4102211d0c0f0b024002400240201d0e03010002020b024020082d000c200d470d0020082802082004470d002008280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008200f6a2d0000221f410446221e470d00201f2009460d0720200d07201e0d070b0240200820106a2d0000200d470d00200820116a2802002004470d00200841106a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820126a2d0000221f410446221e470d00201f2009460d0420200d04201e0d040b0240200820136a2d0000200d470d00200820146a2802002004470d00200820156a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820166a2d0000221f410446221e470d00201f2009460d0520200d05201e0d050b0240200820176a2d0000200d470d00200820196a2802002004470d002008201a6a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008201b6a2d0000221f410446221e470d00201f2009460d0620200d06201e0d060b200b41046a210b200a200820186a22086b201c4b0d0a410021090c110b024020082d000c2024470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920256a2109201f2d0000201d2d0000460d000c020b0b200820266a2d00002021460d060b200b20256a210b200820236a2208200a470d080c010b024020082d000c2028470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920296a2109201f2d0000201d2d0000460d000c020b0b2008202a6a2d000022092022470d0020092021470d050b200b20296a210b200820276a2208200a470d090b024002400240200041046a28020020002802082208470d00200841016a22092008490d082008410174220e20092009200e491b220ead420486222b422088a70d08202ba7221d4100480d082008450d0120002802002008410474201d10272209450d020c120b200028020021090c120b201d102622090d100b201d4104102a000b200b410172210b20050d030c100b200b410272210b20050d020c0f0b200b410372210b0b2005450d0d0b20011023200241106a2400200b0f0b101e000b4100211d0c030b4101211d0c030b4102211d0c030b410121090c040b410121090c030b410121090c020b410121090c010b410121090c000b0b20002009360200200041046a200e360200200041086a28020021080b200920084104746a220820063b010e200820073a000d200820033a000c200820043602082008200536020420082001360200200041086a2204200428020041016a3602002002200010be032002280204417f6a210b0b200241106a2400200b0bac24032d7f017e2b7f230041306b220224002001280204210320012802002104410121050240024002400240024020012802082206450d00412c10262207450d02200720022f002d3b0001200741023a00002007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002108410121090c010b4104210741002109410121080b200141106a280200210a200128020c210b024002400240200141146a280200220c450d002009410174220d200941016a220e200e200d491b220d412c6c210e2009450d0120072009412c6c200e10272207450d020c040b2009210d0c040b200e102622070d020b200e4104102a000b412c4104102a000b20072009412c6c6a220e20022f002d3b0001200e41033a0000200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200941016a2109410021050b2001411c6a280200210f2001280218211041002111024002400240024002400240024002400240200141206a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310272207450d020c030b410021140c040b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012114200941016a21090b200141286a28020021152001280224211602402001412c6a2802002212450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310272207450d010c020b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41053a0000200e201236000c200e2015360008200e2016360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012111200941016a21090b200141346a280200211720012802302118024002400240024002400240200141386a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310272207450d020c030b410021190c040b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41063a0000200e201236000c200e2017360008200e2018360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012119200941016a21090b200141c0006a280200211a200128023c211b4101211c024002400240024002400240200141c4006a280200221d450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210272207450d020c030b4101211e0c040b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e41073a0000200e201d36000c200e201a360008200e201b360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100211e0b200141cc006a280200211f200128024821200240200141d0006a2802002221450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210272207450d010c020b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e41083a0000200e202136000c200e201f360008200e2020360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241086a41086a290200370200200e2002290208370210200941016a21094100211c0b41012122024020012802544101470d00200141d8006a28020021120240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310272207450d010c020b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41093a0000200e2012360204200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41206a280200360200200e41206a200241086a41186a290200370200200e41186a200241086a41106a290200370200200e41106a200241106a290200370200200e2002290208370208200941016a21090b200141e0006a2802002123200128025c21240240200141e4006a2802002225450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210272207450d010c020b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e410a3a0000200e202536000c200e2023360008200e2024360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021220b200141ec006a28020021262001280268212741012128024002400240024002400240200141f0006a2802002229450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210272207450d020c030b4101212a0c040b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e410b3a0000200e202936000c200e2026360008200e2027360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100212a0b200141f8006a2802002112200128027421130240200141fc006a280200222b450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22282028200e491b220ead422c7ea722284100480d02024002400240200d450d002007200d412c6c202810272207450d010c020b2028102622070d010b20284104102a000b200e210d0b20072009412c6c6a220e410c3a0000200e202b36000c200e2012360008200e2013360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021280b20014184016a280200212c200128028001210e024002400240200d20096b20014188016a280200412c6c222d412c6d22014f0d00200920016a22012009490d03200d410174222e20012001202e491b222ead422c7e222f422088a70d03202fa722304100480d03200d450d012007200d412c6c203010272207450d020c040b200920016a21010c040b2030102622070d020b20304104102a000b101e000b202e210d0b20072009412c6c6a200e202d1094041a0240202c450d00200e10230b0240024002400240024041c00510262209450d002000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200936021020024280c2cdeb16370308200241106a10ef03200910232028450d02202b450d01411c21312013202b411c6c6a2132410c2133410821344114213541042136411021374109213841ffffffff0321394170213a2013213b4100213c0c030b41c0054104102a000b410021010c020b410121010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b2012450d0e20131023410121010c160b202a450d022029450d014118213d2027202941186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff03214541702146202721474101213c0c0f0b02400240203c0e0400010407070b0240203b20336a2802002209450d00203b2802042101200920367421090340024020012d00002038470d00200120346a280200203971450d00200120366a28020010230b200120376a21012009203a6a22090d000b0b0240203b20346a280200450d00203b20366a28020010230b203b20316a21010240203b20356a280200450d00203b28021010230b2001213b20012032470d09410021010c150b02402047203f6a280200450d00204728020010230b0240204720406a2802002209450d00204728020c21012009203f7421090340024020012d00002043470d00200120446a280200204571450d002001203f6a28020010230b200120416a2101200920466a22090d000b0b2047203d6a21010240204720416a280200450d00204720426a28020010230b200121472001203e470d090b2026450d00202710230b2022450d022025450d01411c214820242025411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff03215041702151202421524102213c0c0e0b02402052204a6a2802002209450d00205228020421012009204d7421090340024020012d0000204f470d002001204b6a280200205071450d002001204d6a28020010230b2001204e6a2101200920516a22090d000b0b02402052204b6a280200450d002052204d6a28020010230b205220486a210102402052204c6a280200450d00205228021010230b2001215220012049470d070b2023450d00202410230b0240201c450d0002402021450d00202141146c21092020210103400240200141046a280200450d00200128020010230b200141146a21012009416c6a22090d000b0b201f450d00202010230b201e450d02201d450d0141042153201b201d4104746a215441102155410921564108215741ffffffff03215841702159201b215a4103213c0c0d0b0240205a2802082209450d00205a2802002101200920537421090340024020012d00002056470d00200120576a280200205871450d00200120536a28020010230b200120556a2101200920596a22090d000b0b205a20556a21010240205a20536a280200450d00205a28020010230b2001215a20012054470d050b201a450d00201b10230b02402017410047201941017371450d00201810230b02402015410047201141017371450d00201610230b0240200f410047201441017371450d00201010230b02402005450d000240200c450d00200c41286c2109200b210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200941586a22090d000b0b200a450d00200b10230b02402008450d0002402006450d00200641047421092004210103400240200141046a280200450d00200128020010230b200141106a2101200941706a22090d000b0b2003450d00200410230b200241306a24000f0b4100213c0c040b4101213c0c050b4102213c0c060b4103213c0c070b410121010c070b410221010c060b410221010c050b410221010c040b410221010c030b410221010c020b410221010c010b410221010c000b0bb505000240024002400240024002400240024002400240200041ff0171417f6a220041aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020000eab014a00000000000000000000000000010101010103030404050506060707080809094b0a0a0b0b0c0c0d0d4c4d0e0e0f0f10101111121213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f20204e212122224f2323242450252526262727282829292a2a512b2b2c2c2d2d2e2e2f2f30303131323233333434353536363737383839393a3a3b3b3c3c3d3d3e3e523f3f404041414242434344444545464647474848020202024a0b410a0f0b41080f0b41100f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410f0f0b410f0f0b410e0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b41110f0b41120f0b41050f0b41130f0b41140f0b41000f0b41020f0b41000f0b41020f0b410e0b800203047f017e017f024002400240200041086a28020022032001490d0002400240024002402003200041046a280200470d00200341016a22042003490d0320034101742205200420042005491b2206ad4204862207422088a70d032007a722084100480d032003450d0120002802002003410474200810272205450d020c050b200341016a2104200028020021050c050b2008102622050d030b20084108102a000b101e000b4180e4c400104f000b20002005360200200041046a20063602000b200520014104746a220541106a2005200320016b4104741095041a200541086a200241086a29030037030020052002290300370300200041086a20043602000b9e0503057f017e017f230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a10c8032103024002400240024002400240024002402000411c6a280200200041206a2802002204470d00200441016a22052004490d0520044101742206200520052006491b2206ad4202862207422088a70d052007a722084100480d052004450d01200041186a2802002004410274200810272205450d020c030b200041186a28020021050c030b2008102622050d010b20084104102a000b2000411c6a2006360200200041186a2005360200200041206a28020021040b200520044102746a2003360200200041206a2204200428020041016a360200200241186a41106a200241106a290300370300200241186a41086a200241086a29030037030020022002290300370318024002400240200041ec006a280200200041f0006a2802002204470d00200441016a22052004490d0320044101742203200520052003491b2203ad42187e2207422088a70d032007a722064100480d032004450d01200041e8006a280200200441186c200610272205450d020c040b200041e8006a28020021050c040b2006102622050d020b20064104102a000b101e000b200041ec006a2003360200200041e8006a2005360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000b929601150b7f017e587f037e047f017e387f027e1c7f027e137f037e3e7f027e017f017e047f047e277f017e227f23002203210420034180096b41607122032400024002400240024002400240024002400240411010262205450d00200541063a0000412010262206450d01200641063a00104100210720064100360204200620032f00c0053b00012006412d3a0000200641036a200341c2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d00200528020410230b20051023200141106a2802002208412c6c21092001280208210a024002400240024002400240034020092007460d01200a20076a21052007412c6a220b210720052d00004107470d000b200320032f01a0033b01c005200a200b6a220541586a210a2005415c6a2208280200200541606a22092802002207470d01200741016a220b2007490d0e2007410174220c200b200b200c491b220dad420486220e422088a70d0e200ea7220c4100480d0e2007450d04200541586a2802002007410474200c1027220b450d050c0b0b411010262205450d0720054180023b010c200542828080802037020420052006360200200520032f01a0033b010e2001410c6a2802002008470d09200841016a22072008490d0d20084101742209200720072009491b2207ad422c7e220e422088a70d0d200ea722094100480d0d2008450d01200a2008412c6c20091027220a450d020c080b200a280200210b0c0a0b20091026220a0d060b20094104102a000b200c1026220b0d060b200c4104102a000b41104108102a000b41204108102a000b41104104102a000b2001410c6a2007360200200141086a200a3602000b200141106a200841016a220c360200200a2008412c6c6a220720032f00b0043b0001200741073a0000200742818080801037000820072005360004200720032902c005370210200741036a200341b2046a2d00003a0000200741186a200341c8056a290200370200200741206a200341c0056a41106a290200370200200741286a200341c0056a41186a2802003602004100210f0c020b2008200d360200200541586a200b360200200928020021070b200b20074104746a22074180023b010c200742828080802037020420072006360200200720032f01c0053b010e2009200928020041016a360200200341c0006a200a10be032003280244417f6a210f200141106a280200210c200141086a280200210a0b200c412c6c2107200a41586a210502400340410021062007450d01200741546a2107200541286a21092005412c6a220b210520092d00004103470d000b200b41086a2802002207450d00200741286c2105200b28020041186a2107410021060340200620072d0000456a2106200741286a2107200541586a22050d000b0b200c412c6c2107200a41586a210502400340410021092007450d01200741546a2107200541286a210b2005412c6a22082105200b2d00004103470d000b200841086a2802002207450d00200741286c2105200828020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b200c412c6c2107200a41606a21050240024003402007450d01200741546a2107200541206a210b2005412c6a220a2105200b2d00004104470d000b200a28020021070c010b410021070b0240200720096a2210ad220e421e88a70d00200e420286a72207417f4c0d0002400240024002400240024002402007450d00200710ac01220a450d0220100d010c030b4104210a2010450d030b200a20104102746a2111410021124101211341042114200141106a2115412c211641082117200141086a2118415821194154211a4128211b410b211c4118211d4103211e200a211f410021200c030b20074104102a000b410021070c020b410021070c010b410121070b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e020001010b200141086a2802002121412c2123200141106a280200220d450d360c010b02400240024002400240024002400240024020200e050001030405050b024020122006490d002015280200220d20166c220921072018280200222120196a220b210502400340410021082007450d012007201a6a21072005201b6a210c200520166a22222105200c2d0000201e470d000b202220176a2802002207450d002007201b6c21052022280200201d6a2107410021080340200820072d0000456a21082007201b6a2107200520196a22050d000b0b201220086b220820124b0d0603402009450d032009201a6a2109200b201b6a2107200b20166a2205210b20072d0000201c470d000b200520176a28020020084d0d0720052802002008201d6c6a2802082105200341c0056a2008200110e30320032802c405210720032802c0052013460d08201f200720056a3602000b201220136a2112201f20146a221f2011470d0c410021070c420b20212d0000202a470d3b202128020c2207450d3b202128020422702007202b6c6a2171410021720c1f0b412c10262207450d07200741286a41002800e6de44360000200741206a41002900dede44370000200741186a41002900d6de44370000200741106a41002900cede44370000200741086a41002900c6de44370000200741002900bede443700000c350b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020ca01209a01712207209201460d002007209b01470d01208b0121d201410021070c4c0b20c901209a01712207209b01460d0102402007209201470d00034020990120900122076b209c014d0d05200728020c450d092007209e016a280200450d0d200720a1016a280200450d11200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c150b034020990120900122076b209c014d0d05200728020c450d092007209e016a280200450d0d200720a1016a280200450d11200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c190b20c901209a01712207209b01460d0102402007209201470d00034020990120900122076b209c014d0d06200728020c450d0a2007209e016a280200450d0e200720a1016a280200450d12200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c1b0b034020990120900122076b209c014d0d06200728020c450d0a2007209e016a280200450d0e200720a1016a280200450d12200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c1d0b024020c701209201470d00208b0120c801470d390b0340209101209701460d4d200341286a20910110c5032003280228228b01450d4d2091012096016a219101208b01208b01200328022c209b01746a22c801460d000b410321070c490b20c701209201470d28208b0120c801470d380c270b2007209901460d4a2007209d016a21d4010340200728020c450d1020d4012098016a21d40120072098016a2207209901470d000c4b0b0b2007209901460d102007209d016a21d4010340200728020c450d1420d4012098016a21d40120072098016a2207209901470d000b20990121900120c701209201460d2d0c2e0b410121c9012007209901460d102007209d016a21d4010340200728020c450d1520d4012098016a21d40120072098016a2207209901470d000b209901219001208b0121d2012094010d310c480b2007209901460d102007209d016a21d4010340200728020c450d1720d4012098016a21d40120072098016a2207209901470d000b20990121900120c701209201460d270c280b2007209d016a21d40120072098016a2190010c0c0b2007209d016a21d40120072098016a2190010c100b2007209d016a21d40120072098016a2190010c110b2007209d016a21d40120072098016a2190010c130b2007209f016a21d401200720a0016a2190010c080b2007209f016a21d401200720a0016a2190010c0c0b2007209f016a21d401200720a0016a2190010c0d0b2007209f016a21d401200720a0016a2190010c0f0b200720a2016a21d401200720a3016a2190010c040b200720a2016a21d401200720a3016a2190010c080b200720a2016a21d401200720a3016a2190010c090b200720a2016a21d401200720a3016a2190010c0b0b20d401208f016a2190010b410121c901208b0121d201410421070c360b200721900120c701209201470d1b0c1a0b2007219001208b0121d2012094010d1f0c370b200721900120c701209201470d150c140b20d401208f016a2190010b410121ca01410021c9010c020b20d401208f016a2190010b410021ca01410121c9010b208b0122d201218b01200320d40128020022d30136027c200a0d1c0c2f0b20d401208f016a2190010b410021c901410021ca01208b0122d201218b01200320d40128020022d30136027c200a0d190c2d0b20d001220720f4016a21d001200728020021c302200341e0006a21c402200328026421c5020c140b024020d1022d0000220720d302460d000240200720df02460d00200720d702470d2e20d10228020c2207450d2e20d10228020422e102200720e0026c6a21e202410b21720c290b20d10228020421e602200341e0006a21e702200328026421e8020c150b20d10228020c2207450d2c20d10228020422e902200720d4026c6a21ea02410d21720c290b412c10262207450d04200741286a41002800bade44360000200741206a41002900b2de44370000200741186a41002900aade44370000200741106a41002900a2de44370000200741086a410029009ade4437000020074100290092de443700000c310b411e10262207450d04200741166a4100290080df44370000200741106a41002900fade44370000200741086a41002900f2de44370000200741002900eade44370000429e808080e003210e0c310b200341c8056a290300210e200a102320070d314100210a412c2123200d450d350b2021200d20236c6a212441142125200341b0046a41146a2126200341b0076a212741012128200341c0056a4101722129410b212a4118212b410c212c4104212d4102212e200341a4076a212f200341a0076a21304113213120034190076a213241d700213320034184076a213420034180076a2135412d2136200341f4066a2137200341f0066a213841122139200341e4066a213a200341e0066a213b200341d0066a213c4106213d200341c0066a213e4100213f200341b0066a21404184082141200341a0066a21424137214320034194066a214420034190066a214520034184066a214620034180066a2147200341f4056a2148200341f0056a21494120214a200341c0056a41206a214b41d600214c4110214d200341c0056a41106a214e4108214f200341b0046a41086a215041ac0121514109215241ffffffff032153200341e8056a2154200341e4056a2155200341f8056a215620034188066a215720034198066a2158200341a8066a2159200341a4066a215a200341b8066a215b200341b4066a215c200341c8066a215d200341c4066a215e200341d8066a215f200341d4066a2160200341e8066a2161200341f8066a216220034188076a216320034198076a216420034194076a2165200341a8076a21664208216742042168422021694103216a4170216b41ff01216c412c216d4201216e4198dfc400216f410121200c040b412c4101102a000b412c4101102a000b411e4101102a000b41002120410121070c350b410121070c340b410321720c120b410421720c120b410521720c120b410621720c120b410521720c120b410621720c120b410721720c120b410821720c120b410721720c120b410821720c120b410921720c120b410c21720c130b410121070c140b410121070c130b410221070c120b410221070c110b410321070c100b410521070c0f0b410621070c0e0b410621070c0d0b410621070c0c0b410621070c0b0b410621070c0a0b410621070c090b410621070c080b410621070c070b410621070c060b410621070c050b410621070c040b410621070c030b410621070c020b410621070c010b410621070b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e0700010203070811110b209401450d3c410121070c390b4100219401410221ca0120930121d301410021930120d201218b01200320d30136027c200a450d39410221070c380b201020d3014d0d07200a20d301209b01746a2802002205450d0d20cc0120cb01470d0320cb012092016a220720cb01490d4c20cb01209201742209200720072009491b22cc01ad20a70186220e20a80188a70d4c200ea72207208e01480d4c20cb01450d0120ce0120cb01209b01742007102722cd010d020c0b0b208b01450d39208b01208f016a21d201410121c701410221c901208b0121d4010c190b2007102622cd01450d090b20cd0121ce0120cd0121cf0120cd0121d0010b20d00120cb01209b01746a20d301360200200341c0056a200328027c22d501200341c8006a10e50320ab0128020021d60120032802c40521d10120032802c00522d701209201460d0420d101280208220720ac014c0d4720d101280200210920d1012d000c210b024002402007450d002007102622080d010c080b410121080b200820092007109404210920d10120ad016a2d000021082003200536029c012003200328027c360298012003208e0136029001200320083a008d012003200b3a008c0120032007360288012003200736028401200320093602800102400240200328027022d801209501460d00200328027421d9010c010b20ae01102622d801450d09410021d90120d80141003b010620d801410036020020d80120aa016a200341c0056a20af011094041a20034100360274200320d8013602700b20cb012092016a21cb010c0b0b410121ca010c010b208b01208f016a21d201410021ca01410221c901410121c701208b0121d401208b01450d100b20d201218b01200320d40128020022d30136027c200a0d110c310b200341d4056a4101360200200341023602a403200341d0056a200341a0036a360200200342023702c405200341b8e4c4003602c0052003200341fc006a3602a003200341b0046a200341c0056a10a20120032902b404220e422088a7210520032802b00421d101200ea721d6010c010b20a90128020021050b20032802702003280274200341f8006a28020010e603024020cc01450d0020cd0110230b0240208c01450d00208c01412c6c218b01208d01210703402007109f012007412c6a2107208b0141546a228b010d000b0b0240200341d4006a280200450d00208d0110230b200020d10136020420004101360200200041086a2005ad42208620d601ad84370200200a450d392010450d39200a1023200424000f0b20074101102a000b20074104102a000b4194034104102a000b41022120410121070c3c0b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020720e0e000102060708090c0d0e0f101112120b207020256a22732802002274450d4e2070202c6a2175410021760c420b20d80120aa016a210920d8012f01062208209b01742105417f21070240024002400240024003402005450d0120072092016a2107208e0120ac012092012009280200220b20d5014b1b200b20d501461b220b450d04200520c4016a21052009208f016a2109200b209201460d000b20d9010d010c020b2008210720d901450d010b20d90120ac016a21d90120d8012007209b01746a20ae016a28020021d801410121720c370b200341f0006a20aa016a220520052802002092016a360200200329039801210e20032903900121da0120032903880121db0120032903800121dc0120d8012f0106220520b1014f0d0120d80120aa016a220920072092016a220b209b01746a20092007209b01746a2209200520076b209b01741095041a200920d50136020020d80120a1016a2205200b20b201746a2005200720b201746a220520d80120b0016a22092f010020076b20b201741095041a200520b3016a200e370200200520da01370210200520db01370208200520dc01370200200920092f01002092016a3b010020d701450d230c490b20d801200720b201746a220720a6016a200329039801370200200720bb016a220529020021da012005200329039001370200200720a3016a200329038801370200200720a1016a2207290200210e200720032903800137020020da0120c6018320a70185500d47200e20c50183500d47200ea710230c470b20ae0110262205450d1c2005208e013b01062005208e01360200200520aa016a200341c0056a20af01109404210b200341c0056a20b3016a22dd0120d80120b4016a290200370300200341c0056a209d016a22de0120d80120b5016a29020037030020ab0120d80120b6016a290200370300200320d8012902f4013703c00520d80128022021df01200b20d801209f016a20d80120b0016a22082f010020b7016a2209209b0174109404210b200520a1016a20d80120b8016a200920b20174109404210c200820b0013b0100200520093b0106200341b0046a20b3016a22e00120dd01290300370300200341b0046a209d016a22e10120de01290300370300200341b0046a20aa016a22e20120ab01290300370300200320032903c0053703b00402400240200720b0014b0d0020d80120aa016a220920072092016a220b209b01746a20092007209b01746a220820d80120b0016a22092f010020076b209b01741095041a200820d50136020020d80120a1016a2208200b20b201746a2008200720b201746a220b20092f010020076b20b201741095041a200b20b3016a200e370200200b20da01370210200b20db01370208200b20dc013702000c010b200b200720c1016a2220209b01746a200b200720b7016a2208209b01746a2207200920bc017120086b209b01741095041a200720d501360200200c202020b201746a200c200820b201746a2207200520b0016a22092f010020086b20b201741095041a200720b3016a200e370200200720da01370210200720db01370208200720dc013702000b200920092f01002092016a3b0100200341a0036a20b3016a22e30120e001290300370300200341a0036a209d016a22e40120e101290300370300200341a0036a20aa016a22e50120e201290300370300200320032903b0043703a00320034190026a20b3016a22e60120e30129030037030020034190026a209d016a22e70120e40129030037030020034190026a20aa016a22e80120e501290300370300200320032903a0033703900220d80128020022e901450d0120d8012f010421ea01200521eb010c270b20e30120e60129030037030020e40120e70129030037030020e50120e80129030037030020032003290390023703a00320ea0120bc0171210820e9012f0106220720bd014d0d0220b9011026220b450d1c200b208e013b0106200b208e01360200200b20aa016a200341c0056a20ba01109404210520e901209e016a280200212220dd0120e90120b4016a29020037030020de0120e90120b5016a29020037030020ab0120e90120b6016a290200370300200320e90120bf016a2902003703c005200520e901209f016a20e90120b0016a22202f0100220920b7016a2207209b0174109404218901200b20a1016a20e90120b8016a200720b20174109404218a01200b20ae016a20e90120c0016a200920c1016a220c209b0174109404210d202020b0013b0100200b20073b01060240200c450d0041002107200d210503402005280200220920073b01042009200b3602002005208f016a2105200c20072092016a2207470d000b0b20e00120dd0129030037030020e10120de0129030037030020e20120ab01290300370300200320032903c0053703b00420dd0120e00129030037030020de0120e10129030037030020ab0120e201290300370300200320032903b0043703c0050240024020ea0120bc0171220520b0014b0d0020e90120aa016a220720082092016a220c209b017422096a20072008209b0174220d6a220720202f010022890120086b228a01209b01741095041a200720df0136020020e90120a1016a2207200c20b201746a2007200820b201746a2207208a0120b201741095041a200720b3016a20e3012903003702002007209d016a20e401290300370200200720aa016a20e501290300370200200720032903a00337020020202089012092016a22073b010020e90120ae016a2220200d6a20aa016a202020096a2220200720bc01712209200c6b209b01741095041a202020eb01360200200520094f0d0120e901200d6a20be016a210703402007280200220520082092016a22083b0104200520e9013602002007208f016a210720092008470d000c020b0b208901200820c1016a2209209b017422206a208901200820b7016a2207209b01746a2205200b20b0016a220c2f010020076b209b01741095041a200520df01360200208a01200920b201746a208a01200720b201746a2205200c2f010020076b20b201741095041a200520b3016a20e3012903003702002005209d016a20e401290300370200200520aa016a20e501290300370200200520032903a003370200200c200c2f01002092016a22053b0100200d2008209b01742289016a20c2016a200d20206a220c200520bc0171220820096b209b01741095041a200c20eb01360200200920084b0d00200b2089016a20c3016a210503402005280200220920072092016a22073b01042009200b3602002005208f016a210520082007470d000b0b20e60120dd0129030037030020e70120de0129030037030020e80120ab01290300370300200320032903c00537039002024020e9012802002207450d0020e9012f010421ea01200721e901202221df01200b21eb01410221720c360b202221df0120b901102622070d010c1d0b2005210b20b90110262207450d1c0b2007208e013b01062007208e01360200200720aa016a200341c0056a20ba01109404210820072003280270220536029403200320032802742092016a3602742005208e013b01042003200736027020052007360200200720072f0106220920b201746a220520a6016a20e601290300370200200520bb016a20e701290300370200200520a3016a20e801290300370200200520a1016a20032903900237020020082009209b01746a20df01360200200720ae016a20092092016a2205209b01746a200b360200200720053b0106200b20053b0104200b200736020020d7010d440c1d0b20e90120aa016a220520082092016a2209209b0174220b6a20052008209b0174220c6a2205200720086b2220209b01741095041a200520df0136020020e90120a1016a2205200920b201746a2005200820b201746a2205202020b201741095041a200520b3016a20e3012903003702002005209d016a20e401290300370200200520aa016a20e501290300370200200520032903a00337020020e90120b0016a20072092016a22073b010020e90120ae016a2205200c6a20aa016a2005200b6a2205200720bc0171220b20096b209b01741095041a200520eb013602002008200b4f0d4220e901200920ac016a2207209b01746a20be016a210503402005280200220920072092016a22073b0104200920e9013602002005208f016a2105200b2007470d000c430b0b410121c701208b0121c801410421720c330b410221c901209101209701460d02200341186a20910110c5032091012096016a21910120032802182207450d032007228b012007200328021c209b01746a22c801460d22410521070c480b208b0120c801470d2b410121c701208b0121c801410621720c330b410221c901209101209701460d00200341106a20910110c5032091012096016a21910120032802102207450d0120072003280214209b01746a21c8012007218b010c210b2097012191010b208b0121d2012094010d240c470b208b0120c801470d25410821720c310b209101209701460d45200341206a20910110c5032003280220228b01450d452091012096016a219101208b012003280224209b01746a21c8010c1e0b20c402280200220b20ee016a2109200b2f0106220c20f001742105417f210702400240024003402005450d01200720f7016a210720f80120f50120f7012009280200220820c3024b1b200820c302461b2208450d03200520f9016a2105200920f4016a2109200820f701460d000b20c5020d010c090b200c210720c502450d080b20c50220f5016a21c502200b200720f001746a20f6016a21c402410921720c310b200b20fb016a200720fa01746a22c602450d0620c602280218210520c60228021c210720fc01200f36020020fd0120fe013a000020ff012080023a000020810220073602002082022083023a0000208402200f3602002085022086023a000020870220053602002088022089023a0000208a02208b023a0000208c0220f8013a0000208d02208e023b0100208f022090023a000020910220023602002092022083023a0000209302200f3602002094022086023a0000200341c0056a20fb016a22c702200f36020020950220fe013a00002097022098023a0000209a02200736020020ed012083023a00002003200f3602c40520032086023a00c00520c602280208220b20ec016a22c802ad220e209c0288a70d55200e209b0286a7220720f5014c0d5520c60220ee016a21c902024002400240024002402007450d002007102622ca02450d0f20c902280200220b450d020c010b410821ca02200b450d010b410021094100210703400240200720c802470d0020c80220f7016a220520c802490d5b20c80220f701742208200520052008491b2205ad209b0286220e209e0288a70d5b200ea7220820f801480d5b0240024020c802450d0020ca0220c80220f401742008102722ca020d010c0c0b2008102622ca02450d0b0b200521c8020b20ca0220096a2205209d023a0000200520f4016a2007360200200520c2026a200341a0036a20f0016a2d00003a0000200520f7016a20032f01a0033b0000200920ec016a2109200720f7016a22cb022107200b20cb02470d000b20c80220cb026b209d024f0d020c010b410021cb0220c80241006b209d024f0d010b20cb02209d026a220720cb02490d5720c80220f701742205200720072005491b2207ad209b0286220e209e0288a70d57200ea7220520f801480d570240024020c802450d0020ca0220c80220f401742005102722ca020d010c100b2005102622ca02450d0f0b200721c8020b20ca0220cb0220f401746a21cc02200341c0056a21cd020c1e0b20cb02210b024002400240024020cd022d00002205209f026a220820a0024b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020080e2f291c202d2d121d162d1b082d2d0b0a1a2417091319211f0f0e2526031807060d2214230211041e050100152827100c290b20cd022d00012109412b21050c2c0b20cd0241046a280200210720cd02350208210e412a21050c2a0b20cd0241046a280200210720cd02350208210e412521050c290b20cd0241046a280200210720cd02350208210e411d21050c280b20cd0241046a280200210720cd02350208210e412721050c270b20cd0241046a280200210720cd02350208210e412921050c260b20cd0241046a280200210720cd02350208210e412021050c250b20cd0241046a280200210720cd02350208210e411f21050c240b20cd0241046a280200210720cd022d00012109410c21050c240b20cd0241046a280200210720cd02350208210e411421050c220b20cd0241046a2802002107411021050c210b20cd0241046a2802002107410f21050c200b20cd02290308210e413021050c1e0b20cd0241046a280200210720cd02350208210e412121050c1e0b20cd0241046a280200210720cd02350208210e411a21050c1d0b20cd0241046a280200210720cd02350208210e411921050c1c0b20cd0241046a2802002107412f21050c1b0b20cd0241046a280200210720cd02350208210e412621050c1a0b20cd0241046a2802002107410721050c190b20cd0241046a280200210720cd02350208210e411521050c180b20cd0241046a280200210720cd02350208210e412321050c170b20cd022d00012109412c21050c170b20cd022802082209ad220e421e88a70d6b200e420286a72205417f4c0d6b4104210702402005450d00200510262207450d1e0b02402009450d0020cd0241046a28020021052009410274210820072109034020092005280200360200200941046a2109200541046a21052008417c6a22080d000b0b20cd02410c6a350200422086200e84210e410921050c150b20cd0241046a2802002107411321050c140b20cd0241046a280200210720cd02350208210e411e21050c130b20cd0241046a280200210720cd02350208210e411621050c120b20cd0241046a2802002107411121050c110b20cd0241046a2802002107410b21050c100b20cd022d00012109410321050c100b20cd0241046a2802002107410821050c0e0b20cd0241046a280200210720cd02350208210e412821050c0d0b20cd0241046a280200210720cd02350208210e411821050c0c0b20cd022d00012109410421050c0c0b20cd0241046a280200210720cd02350208210e411721050c0a0b20cd0241046a280200210720cd02350208210e412221050c090b20cd0241046a280200210720cd02350208210e412421050c080b20cd0241046a2802002107411221050c070b20cd0241046a280200210720cd02350208210e411b21050c060b20cd0241046a280200210720cd02350208210e411c21050c050b20cd02290308210e412e21050c030b20cd0241046a2802002107412d21050c030b20cd022d00012109410221050c030b0b0b0b20cc0220093a000120cc0220053a000020cc0220ee016a200e37030020cc0220f4016a2007360200200b20f7016a21cb0220cc0220ec016a21cc0220cd0220ec016a22cd0220f301470d1e024002400240024020c80220cb02470d0020c80220f7016a220720c802490d5920c80220f701742205200720072005491b220cad209b0286220e209e0288a70d59200ea7220720f801480d5920c802450d0120ca0220c80220f401742007102722ca020d020c110b20c802210c0c020b2007102622ca02450d0f0b20c80221cb020b20ca0220cb0220f401746a2207208b023a0000200720ee016a20a102290000370000200720032900b004370001200341b0046a20034180016a20a2021094041a20ec0110262205450d072005208b023a0000200341a0036a200341b0046a20a2021094041a20c902280200220720f5014c0d5420c6022802002120410121094101210802402007450d00200710262208450d0b0b200820202007109404210802400240024020070d00410021204101200820071094041a20070d010c020b200710262209450d0d200721202009200820071094041a2007450d010b200810230b200341b0046a200341a0036a20a2021094041a20c60231000d210e200341a0036a200341b0046a20a2021094041a200341b0046a200341a0036a20a2021094041a20034190026a200341b0046a20a2021094041a20ec0110262208450d08200b20f0016a210b20ce0220a3028322ce022007ad84200e20a502868420a60284210e2008208b023a000020081023200341a0036a20034190026a20a2021094041a200341b0046a200341a0036a20a2021094041a024020052d000020a702470d00200528020820a80271450d00200528020410230b2005102320034190026a200341b0046a20a2021094041a200341b0046a20034190026a20a2021094041a20a90220f80136020020ab02200b36020020ad02200c360200200341a0036a2096026a20ca0236020020ae0220f801360200200341a0036a2099026a209b0237020020af02200e370200200341a0036a20ee016a2020360200200320093602a403200320f7013602a003200341b0046a200341a0036a10cc0320034180016a200341b0046a20a2021094041a20c60220f70136021020c60220f201360214024020032d00c00520a702470d0020ef0128020020a80271450d0020032802c40510230b024020ed012d000020a702470d0020b00228020020a80271450d00209a0228020010230b02402097022d000020a702470d00200341c0056a20aa026a28020020a80271450d00200341c0056a20ac026a28020010230b02402095022d000020a702470d0020b10228020020a80271450d0020c70228020010230b02402094022d000020a702470d0020b20228020020a80271450d0020930228020010230b02402092022d000020a702470d0020b30228020020a80271450d0020910228020010230b0240208f022d000020a702470d0020b40228020020a80271450d0020b50228020010230b0240208d022d000020a702470d0020b60228020020a80271450d0020b70228020010230b0240208c022d000020a702470d0020b80228020020a80271450d0020b90228020010230b0240208a022d000020a702470d0020ba0228020020a80271450d0020bb0228020010230b02402088022d000020a702470d0020bc0228020020a80271450d0020870228020010230b02402085022d000020a702470d0020bd0228020020a80271450d0020840228020010230b02402082022d000020a702470d0020be0228020020a80271450d0020810228020010230b024020ff012d000020a702470d0020bf0228020020a80271450d0020c00228020010230b024020fd012d000020a702470d0020c10228020020a80271450d0020fc0128020010230b20ce0220a4028421ce0220f20120f7016a21f20120d00120f101470d140c440b20e10228020c0d3620e10228021021e302200341e0006a21e402200328026421e5020c330b20e702280200220b20d7026a2109200b2f0106220c20d502742105417f21070240024003402005450d01200720da026a210720db0220d80220da022009280200220820e6024b1b200820e602461b2208450d04200520dc026a2105200920d6026a2109200820da02460d000b20e8020d010c420b200c210720e802450d410b20e80220d8026a21e802200b200720d502746a20d9026a21e702410c21720c300b20e9022802182207450d3320e90228021022eb02200720d502746a21ec02410221070c320b200b20de026a200720dd02746a2207450d3e2007280210450d0d20d10220d6026a20072802143602000c3e0b20084108102a000b41c8e4c4004180011021000b20054104102a000b41104108102a000b41104108102a000b20074108102a000b20074101102a000b20074101102a000b20054108102a000b20074108102a000b4194034104102a000b41c4034104102a000b41c4034104102a000b41c8e5c40041351021000b410221200c020b410221200c020b410321200c020b410121070c3d0b410121070c3c0b410121070c3b0b410121720c0c0b410221720c0d0b410321720c0e0b410521720c0f0b410721720c100b410a21720c120b410a21720c120b410021070c200b410121070c1f0b410221070c1e0b410321070c1d0b410421070c1c0b410521070c1b0b410621070c1a0b410621070c190b410621070c180b410621070c170b410621070c160b410621070c150b410621070c140b410621070c130b410621070c120b410621070c110b410621070c100b410621070c0f0b410621070c0e0b410621070c0d0b410021070c010b410121070b0340024002400240024002400240024002400240024002400240024002400240024002400240024020070e03000102020b207620744f0d024101210720752802002076202d74220c6a22052d0000202a470d1120032005202d6a220536029002200a450d0302402010200528020022054d0d00200a2005202e746a2802002209450d12202f200f360200203020313a0000203220333a000020342009360200203520363a00002037200f360200203820393a0000203a2005360200203b202a3a0000203c203d3a0000203e203f3a0000204020413b0100204220433a000020442002360200204520363a00002046200f360200204720393a00002048200f360200204920313a0000204b204c3a0000200341c0056a20256a22772009360200204e20363a0000202920032f00b0043b00002029202e6a200341b0046a202e6a2d00003a0000200320393a00c0052003200f3602c40520732802002278207620286a2279490d052073207636020020752802002107200341b0046a202b6a227a2027360200200341b0046a204d6a227b207536020020502007200c6a2208204d6a220b360200200320793602b004200341b0046a202c6a227c20072079202d74227d6a22203602002026200341c0056a3602002003207820796b227e3602b404200b2107024002400240024020082d000022092051460d00410021070340200820076a210502402009206c712052470d002005204f6a280200205371450d002005202d6a28020010230b2007450d0220502005204a6a3602002007204d6a21072005204d6a2d000022092051470d000b200820076a204d6a21070b20072020470d010c020b2005204d6a22072020460d010b0340205020072205204d6a22073602000240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a28020010230b200b2007470d000b0b02400240207e450d00207920702802142207470d012027227f200341c0056a2280016b202d762281010d0b0c100b2075202610e70320502802002207207c280200220b470d110c120b200c2007202d7422076b218201207528020020076a218301200341c0056a2284012027460d0741002185010c0b0b200341c0056a20256a20283602002003206d3602a403204e200341a0036a3602002003206e3702c4052003206f3602c005200320034190026a3602a003200341b0046a200341c0056a10a20120032802b0042207450d1c20032902b404210e0c280b20e402280200220b20d7026a2109200b2f0106220c20d502742105417f210702400240024003402005450d01200720da026a210720db0220d80220da022009280200220820e3024b1b200820e302461b2208450d03200520dc026a2105200920d6026a2109200820da02460d000b20e5020d010c160b200c210720e502450d150b20e50220d8026a21e502200b200720d502746a20d9026a21e402410121070c120b200b20de026a200720dd02746a2207450d132007280210450d0420e10220cf026a20072802143602000c130b20eb0222ed0220d6026a21eb0220ed0228020021ee02200341e0006a21ef02200328026421f0020c050b4188dfc400207620741029000b41c6ddc40041cc001021000b41cce3c400104f000b41c8e5c40041351021000b41012185010c020b41042185010c030b410021070c030b410121070c020b410121070c010b410121070b034002400240024002400240024002400240024002400240024020070e020001010b02400240024002400240207b280200228601202d6a2205280200220720786b2081014f0d0020782081016a22092078490d362007202874220b20092009200b491b2209ad206886220e206988a70d36200ea7220b203f480d362007450d012086012802002007202d74200b102722070d020c040b20860128020021070c020b200b10262207450d020b2086012007360200200520093602000b200720792081016a2205202d746a2007207d6a207e202d741095041a200320053602b00420052086012802082207460d0d20762081016a202d742007202d7422076b21870120860128020020076a218801208001207f470d030c020b200b4108102a000b024002400240024002400240024002402085010e050001030406060b2026208401204d6a3602000c010b41002184010b200341a0036a20840110e80320032d00a0032051460d1120830120032903a003370300208301204f6a200341a0036a204f6a2903003703002073207328020020286a3602000240208201450d00208301204d6a218301208201206b6a2182012026280200228401207a280200470d0541012185010c090b207a280200227f20262802002280016b202d76228101450d10410021070c0f0b2026208001204d6a3602000c010b41002180010b200341a0036a20800110e80320032d00a0032051460d0e20880120032903a003370300208801204f6a200341a0036a204f6a290300370300208601204f6a2207200728020020286a360200208701450d0d208801204d6a218801208701206b6a2187012026280200228001207a280200227f460d0441022185010c0a0b20ef02280200220b20d7026a2109200b2f0106220c20d502742105417f210702400240024002400240024003402005450d01200720da026a210720db0220d80220da022009280200220820ee024b1b200820ee02461b2208450d03200520dc026a2105200920d6026a2109200820da02460d000b20f0020d010c030b200c210720f002450d020b20f00220d8026a21f002200b200720d502746a20d9026a21ef0241042185010c0e0b200b20de026a200720dd02746a2207450d002007280210450d0120ed0220072802143602000b20eb0220ec02470d010c140b41c8e5c40041351021000b410221070c110b41002185010c040b41032185010c040b41022185010c040b41032185010c040b410121070c060b410121070c050b410121070c040b410121070c030b410121070c020b410121070c010b410121070c000b0b200341a0036a204f6a2207203f360200200320673703a003200341a0036a202610e70320032802a003222220072802002205202d7422086a210b20032802a403218901202221070240024002400240024002402005450d000240024002400240207b280200220d202d6a2274280200220720032802b404220c20032802b00422056a22206b2008202d7522094f0d00202020096a228a012020490d2e20072028742220208a01208a012020491b2220ad206886220e206988a70d2e200ea7228a01203f480d2e2007450d01200d2802002007202d74208a01102722070d020c050b200d28020021070c020b208a0110262207450d030b200d2007360200207420203602000b2007200520096a2209202d7422206a20072005202d746a200c202d741095041a200320093602b004202221072009200d2802082205460d00200d280200220720206a217420072005202d746a21092022210503402008450d04200341a0036a202e6a22072005206a6a2d00003a0000200320052f00013b01a00320052d0000220c2051460d032005202d6a290200210e2005202c6a28020021202009200c3a00002009202c6a20203602002009202d6a200e37020020032f01a003210c2009206a6a20072d00003a0000200920286a200c3b0000200d204f6a2207200728020020286a3602002008206b6a21082005204d6a220721052009204d6a22092074470d000b0b2007200b460d040c030b208a014108102a000b2005204d6a2207200b470d010c020b200b2207200b460d010b03400240024020072d000022052052460d0020052051470d010c030b2007204f6a280200205371450d002007202d6a28020010230b2007204d6a2207200b470d000b0b208901450d00202210230b20502802002207207c280200220b460d010b0340205020072205204d6a22073602000240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a28020010230b200b2007470d000b0b024020032802b4042207450d00024020032802b004220b207b2802002208204f6a22092802002205460d00200828020022082005202d746a2008200b202d746a2007202d741095041a0b2009200720056a3602000b024020032d00c0052052470d00200341c0056a204f6a280200205371450d0020032802c40510230b0240204e2d00002052470d00200341c0056a202b6a280200205371450d00207728020010230b0240204b2d00002052470d002054280200205371450d00205528020010230b024020492d00002052470d002056280200205371450d00204828020010230b024020472d00002052470d002057280200205371450d00204628020010230b024020452d00002052470d002058280200205371450d00204428020010230b024020422d00002052470d002059280200205371450d00205a28020010230b024020402d00002052470d00205b280200205371450d00205c28020010230b0240203e2d00002052470d00205d280200205371450d00205e28020010230b0240203c2d00002052470d00205f280200205371450d00206028020010230b0240203b2d00002052470d002061280200205371450d00203a28020010230b024020382d00002052470d002062280200205371450d00203728020010230b024020352d00002052470d002063280200205371450d00203428020010230b024020322d00002052470d002064280200205371450d00206528020010230b024020302d00002052470d002066280200205371450d00202f28020010230b410f21070b200720766a2276207328020022744f0d0a410021070c000b0b20e90220d4026a22e90220ea02460d0b410d2172410621070c090b20e10220e0026a22e10220e202460d0a410b2172410621070c080b20d701450d010b20d601450d0120d1011023410221200c020b410221200c020b410221200c020b410121070c160b410121070c150b410121070c140b2070202b6a22702071460d0d41002172410621070c000b0b41c6ddc40041cc001021000b20d10220d0026a22d10220d202460d0241042120410121070c100b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360208c01412c6c2107208d0141586a210502400340410021092007450d01200741546a2107200541286a210b2005412c6a22082105200b2d00004103470d000b200841086a2802002207450d00200741286c2105200828020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b208c01412c6c2107208d0141606a21050240024003402007450d01200741546a2107200541206a210b2005412c6a22082105200b2d00004104470d000b200828020021070c010b410021070b411021ec01200341c0056a41106a22ed01200341c8006a41106a280200360200410821ee01200341c0056a41086a22ef01200341c8006a41086a290300370300200320032903483703c00520034180016a200341c0056a10c70320cb01450d00410221f00120d00120cb014102746a21f101200720096a21f201200341b0076a21f301410421f401417f21f50141940321f601410121f701410021f801417c21f901410521fa01413421fb01200341a4076a21fc01200341a0076a21fd01411321fe0120034190076a21ff0141d70021800220034184076a21810220034180076a218202412d218302200341f4066a218402200341f0066a2185024112218602200341e4066a218702200341e0066a218802410b218902200341d0066a218a024106218b02200341c0066a218c02200341b0066a218d02418408218e02200341a0066a218f02413721900220034194066a21910220034190066a21920220034184066a21930220034180066a219402200341f0056a2195024120219602200341c0056a41206a21970241d6002198024114219902200341c0056a41146a219a024204219b02421c219c02410f219d024220219e02417e219f02412e21a002200341b7046a21a102418c0121a202428080808080804021a3024280808080808c0121a402422821a5024280808080800c21a602410921a70241ffffffff0321a802200341cc036a21a902412821aa02200341a0036a41286a21ab02412421ac02200341a0036a41246a21ad02200341bc036a21ae02200341ac036a21af02200341d8056a21b002200341f8056a21b10220034188066a21b20220034198066a21b302200341a8066a21b402200341a4066a21b502200341b8066a21b602200341b4066a21b702200341c8066a21b802200341c4066a21b902200341d8066a21ba02200341d4066a21bb02200341e8066a21bc02200341f8066a21bd0220034188076a21be0220034198076a21bf0220034194076a21c002200341a8076a21c102410321c2020c020b024020cc01450d0020cf0110230b200341c0056a20034180016a418c011094041a200341b0046a200341c0056a10c903411021cf02200341b0046a41106a2802002207450d00412c21d00220032802b80422d1022007412c6c6a21d202410a21d302411c21d402410221d502410421d602410821d702417f21d80241940321d902410121da02410021db02417c21dc02410521dd02413421de02410921df02411421e002410421200c020b200341bc046a290200210e20032802b004210720032902b404216920032802602003280264200328026810e603200020cf026a200e370200200041086a20693702002000200736020420004100360200200a450d062010450d06200a1023200424000f0b41032120410121070c0c0b410121070c0b0b42ac808080c005210e0b200a10230b4100210a0b2000200736020420004101360200200041086a200e3702000240200a450d002010450d00200a10230b200141086a280200218b010240200141106a2802002203450d002003412c6c2107208b01210303402003109f012003412c6a2103200741546a22070d000b0b2001410c6a280200450d00208b0110230b200424000f0b202120236a22212024470d010b200341c8006a41106a2207200141106a280200360200200341c8006a41086a228b01200141086a290200370300200320012902003703482007280200228c0120236c2107208b01280200228d0141586a218b010240024003402007450d01200741546a2107208b0141286a2105208b0120236a228e01218b0120052d00004108470d000b200341386a208e0110be0320032802382105200328023c21070c010b410021050b2007410020051b218f01208c01412c6c2107208d0141586a218b01200541a886c50020051b2190010240024003402007450d01200741546a2107208b0141286a2105208b01412c6a228e01218b0120052d0000410a470d000b200341306a208e0110be0320032802302105200328023421070c010b410021050b2007410020051b2109208c01412c6c2107208d0141586a218b01200541a886c50020051b2191010240024003404100218e012007450d01200741546a2107208b0141286a2105208b01412c6a229201218b0120052d00004109470d000b20920128020021930141012194010c010b41002194010b2003420037027441f098c400219501200341f098c400360270411c2196012091012009411c6c6a2197014114219801209001208f0141146c6a2199014104218f0141ff01219a0141012192014102219b0141cf00219c014110219d014120219e014124219f01412821a001413421a101413821a201413c21a30141d00021a40141c80021a50141cc0021a601420221a701422021a801200341cc056a21a901410821aa01200341c0056a41086a21ab01417f21ac01410d21ad0141940321ae01418c0321af01410621b001410b21b101410521b201411821b301418c0221b40141840221b50141fc0121b601417921b70141940221b80141c40321b90141bc0321ba0141c40021bb0141ffff0321bc01410a21bd0141980321be0141f40121bf0141b00321c001417a21c101416c21c20141fc0221c301417c21c40142808080807021c50142ffffffff0f21c601410021c701410021c801410021c901410021ca01410021cb01410021cc01410421cd01410421ce01410421cf01410421d0010c010b410121200c010b410221200c010b410121070c010b410121070c000b0b101d000b101e000bda0502047f017e230041d0006b2203240002400240024002400240024002400240200241086a2802002204417f6a220520044f0d00200520044b0d002002280200220620054103746a2d000522054104460d02200341386a20012002200510d00320032d00384101470d012000200329023c370200200041086a200341c4006a280200360200200341d0006a24000f0b411810262202450d05200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341e8d5c4003602382003200341206a3602102003200341106a3602482000200341386a10a2012003280224450d0320032802201023200341d0006a24000f0b200241086a2802002204450d01200228020021060b200241086a2004417f6a2202360200200620024103746a290200220742808080808080c0ff0083428080808080808001520d020b411810262202450d03200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341e8d5c4003602382003200341206a3602102003200341106a3602482000200341386a10a2012003280224450d00200328022010230b200341d0006a24000f0b200141086a280200210220032007370308024020022007a7470d0020004100360200200341d0006a24000f0b2003412c6a4102360200200341cc006a410236020020034102360224200320023602342003420237023c200341c8d4c4003602382003200341086a3602282003200341346a3602202003200341206a360248200341106a200341386a10a201200041086a200341106a41086a28020036020020002003290310370200200341d0006a24000f0b41184101102a000b41184101102a000bc90301017f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005412c6a4102360200200541cc006a4102360200200541023602242005420337023c200541a4d2c40036023820052005410c6a3602282005200541086a3602202005200541206a360248200541106a200541386a10a201200041086a200541106a41086a28020036020020002005290310370200200541d0006a24000f0b2001280200210220054100360234024020022802080d00200541cc006a4101360200200541023602142005420237023c200541b8d9c4003602382005200541346a3602102005200541106a360248200541206a200541386a10a20120052802202202450d002000200529022437020420002002360200200541d0006a24000f0b200541386a200141186a2202200141286a2203200410d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b200541386a20022003410010d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b20004100360200200541d0006a24000bc00601037f230041d0006b22042400200420033a000f024002400240024020022802082205417f6a220620054f0d00200620054b0d00200141086a2802002105200228020020064103746a22062802002102024020062d0006450d0020052002460d040b02400240200520024d0d00200141086a2005417f6a2202360200200128020020026a2d000022024104460d0520024105470d01411810262202450d04200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020044298808080800337022420042002360220200441c4006a41013602002004412a36024c20044201370234200441e8d5c4003602302004200441206a3602482004200441c8006a360240200441106a200441306a10a20102402004280224450d00200428022010230b200041013a0000200041046a20042903103702002000410c6a200441106a41086a280200360200200441d0006a24000f0b412b10262202450d02200041013a0000200241276a41002800a2d544360000200241206a410029009bd544370000200241186a4100290093d544370000200241106a410029008bd544370000200241086a4100290083d544370000200241002900fbd444370000200041086a42ab808080b005370200200041046a2002360200200441d0006a24000f0b0240200341ff017122054104460d0020022005460d00200420023a0048200441206a410c6a412b360200200441c4006a41023602002004412b36022420044202370234200441a8d5c4003602302004200441c8006a36022820042004410f6a3602202004200441206a360240200441106a200441306a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441d0006a24000f0b200041003a0000200020023a0001200441d0006a24000f0b02404118102622020d0041184101102a000b2004421837023420042002360230200441306a4100411810db0320042004280238220241186a3602382002200428023022056a411841a6dbc400411810dc0320042004290234370234200420053602304184d1c4004134200441306a10dd03000b412b4101102a000b41184101102a000b20004180083b0100200441d0006a24000ba10601037f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005411c6a4102360200200541cc006a4102360200200541023602142005420337023c200541a4d2c40036023820052005410c6a3602182005200541086a3602102005200541106a360248200541206a200541386a10a201200041086a200541206a41086a28020036020020002005290320370200200541d0006a24000f0b200541386a200141186a2203200141286a410010d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b2001280200210220054100360220024020022802080d00200541cc006a4101360200200541023602342005420237023c200541b8d9c4003602382005200541206a3602302005200541306a360248200541106a200541386a10a20120052802102202450d002000200529021437020420002002360200200541d0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d03200241016a22062002490d0520024101742207200620062007491b22064100480d052002450d01200328020020022006102722020d020c060b200541cc006a2202410136020020054102360234200520063602302005420137023c200541a0dcc4003602382005200541306a360248200541106a200541386a10a20120052802102201450d032005200529021437021420052001360210200241013602002005412a3602342005420137023c200541e8d5c4003602382005200541106a3602302005200541306a360248200541206a200541386a10a20102402005280214450d00200528021010230b20052802202202450d032000200529022437020420002002360200200541d0006a24000f0b200610262202450d040b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2202200228020041016a3602000b20004100360200200541d0006a24000f0b101e000b20064101102a000bb80401047f230041c0006b22032400200341286a200141186a2204200141286a2205200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d03200241016a22052002490d0520024101742206200520052006491b22054100480d052002450d01200428020020022005102722020d020c060b2003413c6a2201410136020020034102360214200320053602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200510262202450d040b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b101e000b20054101102a000bf70301047f230041c0006b22032400200341286a200141186a2204200141286a200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d0320024101742206200520052006491b22054100480d032002450d0120042802002002200510272202450d020c040b2003413c6a2201410136020020034102360214200320053602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2005102622020d020b20054101102a000b101e000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bb80401057f230041c0006b22032400200341286a200141186a2204200141286a2205200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d03200541016a22062005490d0520054101742207200620062007491b22064100480d052005450d01200428020020052006102722040d020c060b2003413c6a2201410136020020034102360214200320063602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200610262204450d040b2001411c6a2006360200200141186a2004360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b101e000b20064101102a000bc10301057f230041c0006b220324002003200236020002402001280204220420024d0d00200041003a00002000200128020020026a2d00003a0001200341c0006a24000f0b2001280208417c6a21052001410c6a28020041037421010240024003402001450d012004200541046a2802006a22062004490d02200141786a2101200541086a2105200420024b21072006210420070d0020062104200620024d0d000b20052d00002104200041003a0000200020043a0001200341c0006a24000f0b20032004360204200341306a410c6a41023602002003412c6a4102360200200341023602342003420337021c200341f0dcc4003602182003200341046a360238200320033602302003200341306a360228200341086a200341186a10a201200041013a00002000410c6a200341106a280200360200200041046a2003290308370200200341c0006a24000f0b0240412010262204450d00200041013a0000200441186a41002900e8dc44370000200441106a41002900e0dc44370000200441086a41002900d8dc44370000200441002900d0dc44370000200041086a42a08080808004370200200041046a2004360200200341c0006a24000f0b41204101102a000bf70301057f230041c0006b22032400200341286a200141186a2204200141286a200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d05200541016a22062005490d0320054101742207200620062007491b22064100480d032005450d0120042802002005200610272205450d020c040b2003413c6a2201410136020020034102360214200320063602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2006102622050d020b20064101102a000b101e000b2001411c6a2006360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bf70301047f230041c0006b22042400200441286a200141186a2205200141286a200210d003024020042d00284101470d002000200429022c370200200041086a200441346a280200360200200441c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d05200241016a22062002490d0320024101742207200620062007491b22064100480d032002450d0120052802002002200610272202450d020c040b2004413c6a2201410136020020044102360214200420063602102004420137022c200441a0dcc4003602282004200441106a360238200441186a200441286a10a20120042802182202450d052004200429021c37021c20042002360218200141013602002004412a3602142004420137022c200441e8d5c4003602282004200441186a3602102004200441106a3602382004200441286a10a2010240200428021c450d00200428021810230b20042802002201450d052000200429020437020420002001360200200441c0006a24000f0b2006102622020d020b20064101102a000b101e000b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20033a0000200141206a2201200128020041016a3602000b20004100360200200441c0006a24000bad0201027f230041106b220224000240024020002d00004104470d00200128021841d0f6c40041082001411c6a28020028020c11020021010c010b2002200128021841bbf6c40041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0f6c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ccb0c5003602082002200236021820012000200241086a10e2032101200241206a240020010bad0201027f230041106b220224000240024020002d00004104470d00200128021841a4d3c40041032001411c6a28020028020c11020021010c010b2002200128021841a7d3c40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41b0d3c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b810101017f0240200041046a280200220320016b20024f0d0002400240200120026a22022001490d0020034101742201200220022001491b22014100480d00024002402003450d0020002802002003200110272202450d010c030b2001102622020d020b20014101102a000b101e000b20002002360200200041046a20013602000b0bea0101017f230041e0006b22042400200420013602082004200336020c024020012003470d002000200220011094041a200441e0006a24000f0b2004200441086a36024020042004410c6a360244200441c8006a41146a4100360200200441286a41146a4103360200200441346a4104360200200441106a41146a4103360200200441a886c5003602582004420137024c200441a881c5003602482004410436022c20044203370214200441d480c5003602102004200441c8006a3602382004200441c4006a3602302004200441c0006a3602282004200441286a360220200441106a41e481c5001061000b6c01017f230041306b2203240020032001360204200320003602002003412c6a412d3602002003411c6a410236020020032002360228200341013602242003420237020c2003419083c500360208200320033602202003200341206a360218200341086a41a083c5001061000bf10202047f057e230041d0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d004101210420062802184184b1c50041a2b1c50020051b4102410120051b2006411c6a28020028020c1102000d0120012000280200200228020c11030021040c010b024020050d0041012104200628021841a0b1c50041022006411c6a28020028020c1102000d01200028020021060b41012104200341013a00102006290210210720062902082108200341346a220541e8b0c50036020020032006290218370308200629022021092006290228210a200320062d00303a00482006290200210b20032008370320200320073703282003200a370340200320093703382003200b3703182003200341086a3602302001200341186a200228020c1103000d00200341306a2802004182b1c5004102200528020028020c11020021040b200041086a20043a00002000200028020441016a360204200341d0006a240020000b820201027f230041106b220224002002200128021841a8b1c50041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0dcc40010de031a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b160020002802002200280200200028020820011099010b110020012000280200200028020810b3010b9a09010a7f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a360200200342808080808004370308200320003602204100210620034100360218200341003602102003200536023020032005360228024002400240024020022802082207450d0020022802002108200228020422092002410c6a2802002205200520094b1b220a450d01200020082802002008280204200128020c1102000d02200841086a2105200341386a2101200341346a210b200341306a210c41012106024003402001200741206a2d00003a00002003200741086a28020036020c20032007410c6a2802003602084100210202400240024002400240200741186a28020022004101460d00024020004102460d0020004103460d052007411c6a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b2007411c6a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b41e88bc500200020041029000b200341086a410c6a2004360200200341086a41086a20023602004100210202400240024002400240200741106a28020022004101460d00024020004102460d0020004103460d05200741146a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b200741146a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b41e88bc500200020041029000b200341086a41146a2004360200200341086a41106a200236020002400240024020072802004101470d00200741046a2802002202200b28020022044f0d02200c28020020024103746a21020c010b200341086a41206a22042802002202200341086a41246a280200460d032004200241086a3602000b2002280200200341086a200241046a2802001103000d052006200a4f0d04200541046a210220052802002104200541086a2105200741246a2107200641016a2106200341086a41186a28020020042002280200200341086a411c6a28020028020c110200450d010c050b0b41f88bc500200220041029000b41b88ac500104f000b20022802002108200228020422092004200420094b1b220a450d00200020082802002008280204200128020c1102000d01200841086a2107200341206a2100200341246a21014101210603402005280200200341086a200541046a2802001103000d022006200a4f0d01200741046a210220072802002104200541086a2105200741086a2107200641016a2106200028020020042002280200200128020028020c110200450d000c020b0b200920064d0d01200341206a280200200820064103746a22072802002007280204200341246a28020028020c110200450d010b200341c0006a240041010f0b200341c0006a240041000bdb39030e7f017e017f230041c0006b220324002002280208220441586a2105200241106a2802002206412c6c210702400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024003402007450d01200741546a2107200541286a21082005412c6a2209210520082d00004104470d000b2006412c6c2107200441586a210503402007450d02200741546a2107200541286a21082005412c6a220a210520082d0000410b470d000b2006412c6c2107200441586a210503402007450d03200741546a2107200541286a21082005412c6a2204210520082d00004102470d000b200341106a200910be03200328021420014d0d03200328021020014102746a2207450d03200341086a200410be03200328020c200728020022074d0d04200328020820074104746a2207450d04200a41086a28020020014d0d05200a2802002109200341186a41086a420037030020034280808080c00037031820072d000d2108200341306a41026a220a2003412d6a41026a2d00003a0000200320032f002d3b0130411010262207450d3f200341206a220b4101360200200341186a410c6a220528020021062003200736021c200720064104746a220741003a000c2007410036020820072008410447220c3602042007200c360200200720032f01303b000d2007410f6a200a2d00003a00002005200528020041016a3602004100210802402009200141186c6a22072802142205450d002007410c6a2106200741146a210a200341306a410472210d4100210841002107034002402003280218220920084d0d00200341306a200341186a410010e90320032802304101460d0920082003280218220920032802342d000c1b2108200a28020021050b200720054f0d3e02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006280200220120074104746a2d0000220541ab014b0d00024020050eac01141e0707071e13120c181915110e0d0b17160f1004040404040404040404040404040505050505050505050a1a06060606080000000000000000000008000000000000000000000000000000000000000000000303030101010101010101010101010101010303030101010101010101010101010101010303030303030301010101010101030303030303030101010101010102020202020202020202020202020202020202020202020202140b200341306a200341186a410210ea0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1f0c200b200341306a200341186a410210ea0320032802300d272003280218220541016a22092005490d2820032009360218200741016a2207200a2802002205490d1e0c1f0b200341306a200341186a410110ea0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1d0c1e0b200341306a200341186a410110ea0320032802300d2b2003280218220541016a22092005490d2c20032009360218200741016a2207200a2802002205490d1c0c1d0b200341306a200341186a410110ea0320032802300d2c2003280218220541016a22092005490d2d20032009360218200741016a2207200a2802002205490d1b0c1c0b200341306a200341186a410210ea032003280230450d180c2f0b200941016a22052009490d2f20032005360218200741016a2207200a2802002205490d190c1a0b200120074104746a2d0001210e200341306a41026a2003412d6a41026a2d00003a0000200320032f002d3b0130200341246a2802002201200341206a280200470d01200141016a220f2001490d5b20014101742210200f200f2010491b2210ad4204862211422088a70d5b2011a722124100480d5b2001450d13200328021c200141047420121027220f0d140c5c0b200341306a200341186a410110ea0320032802300d2e2003280218220541016a22092005490d3020032009360218200741016a2207200a2802002205490d170c180b200328021c210f0c130b200941016a22052009490d3d20032005360218200741016a2207200a2802002205490d150c160b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d140c150b200341306a200341186a200120074104746a41046a28020010e90320032802304101460d2f200341306a200341186a2003280234280204220510ea0320032802300d41200341306a200341186a410110ea0320032802300d4a2003280218220920056a22052009490d4b20032005360218200741016a2207200a2802002205490d130c140b200341306a200341186a410210ea0320032802300d34200341306a200341186a410110ea0320032802300d3e2003280218220541016a22092005490d4820032009360218200741016a2207200a2802002205490d120c130b200341306a200341186a410110ea032003280230450d0f0c300b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d100c110b200341306a200341186a410110ea032003280230450d0d0c2f0b2003200410be032003280204200120074104746a41046a28020022054d0d2b2003280200220920054104746a2201450d2b200341306a200341186a200920054104746a28020810ea0320032802300d3b2003280218220520012d000d4104476a22092005490d4320032009360218200741016a2207200a2802002205490d0e0c0f0b200341306a200341186a200120074104746a41046a28020010e90320032802304101460d32200341306a200341186a200328023428020410ea0320032802300d38200341246a2802002205417f6a220920054f0d41200920054b0d41200328021c20094104746a41013a000c200741016a2207200a2802002205490d0d0c0e0b200341246a22052802002209450d2420052009417f6a2209360200200328021c20094104746a22052d000c4102460d2420052802002109200320052802082205360218200520096a22092005490d3f20032009360218200741016a2207200a2802002205490d0c0c0d0b200341246a2802002205417f6a220920054f0d31200920054b0d31200328021c20094104746a41013a000c200741016a2207200a2802002205490d0b0c0c0b200341306a200120074104746a41046a280200200210e50320032802304101460d25200341306a200341186a2003280234220528020810ea0320032802300d392003280218220920052d000d4104476a22052009490d3c20032005360218200741016a2207200a2802002205490d0a0c0b0b200341306a200341186a410110ea0320032802300d2d2003280218220541016a22092005490d3920032009360218200741016a2207200a2802002205490d090c0a0b200341306a200341186a410110ea032003280230450d060c290b200341306a200341186a200120074104746a2209410c6a28020010e90320032802304101460d2120032802342802042101200941086a2802004102742105200941046a280200210903402005450d07200341306a200341186a200928020010e90320032802304101460d1b2005417c6a2105200941046a210920032802342802042001460d000c1c0b0b200341306a200341186a200c10ea0320032802300d24200341246a2802002205417f6a220920054f0d30200920054b0d30200328021c20094104746a41013a000c200741016a2207200a2802002205490d060c070b200341306a200341186a410110ea0320032802300d2e2003280218220541016a22092005490d3620032009360218200741016a2207200a2802002205490d050c060b20121026220f450d480b200341206a20103602002003200f36021c200341246a28020021010b200f20014104746a220141003a000c2001200936020820012005410347200e41044722057136020420012005360200200120032f01303b000d2001410f6a200341326a2d00003a0000200341246a2205200528020041016a3602000b200741016a2207200a2802002205490d010c020b200341306a200341186a200110ea0320032802300d39200341246a2802002205417f6a220920054f0d3a200920054b0d3a200328021c20094104746a41013a000c200741016a2207200a2802002205490d000b0b2000410036020020002008360204200b280200450d5c200328021c1023200341c0006a24000f0b411310262207450d382007410f6a41002800aae644360000200741086a41002900a3e6443700002007410029009be644370000200041086a4293808080b0023702002000200736020420004101360200200341c0006a24000f0b410f10262207450d38200741076a41002900b5e644370000200741002900aee644370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b410f10262207450d38200741076a41002900c4e644370000200741002900bde644370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b412510262207450d392007411d6a41002900e9e644370000200741186a41002900e4e644370000200741106a41002900dce644370000200741086a41002900d4e644370000200741002900cce644370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412510262207450d392007411d6a41002900e9e644370000200741186a41002900e4e644370000200741106a41002900dce644370000200741086a41002900d4e644370000200741002900cce644370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412710262207450d3a2007411f6a4100290090e744370000200741186a4100290089e744370000200741106a4100290081e744370000200741086a41002900f9e644370000200741002900f1e644370000200041086a42a7808080f0043702002000200736020420004101360200200341c0006a24000f0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a280200450d550c540b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d530c540b410e10262207450d3a200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d520c530b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d510c520b410e10262207450d39200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d500c510b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4f0c500b410e10262207450d38200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4e0c4f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4d0c4e0b410e10262207450d37200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4c0c4d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4b0c4c0b410e10262207450d36200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4a0c4b0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d490c4a0b412710262207450d352007411f6a41002900dce744370000200741186a41002900d5e744370000200741106a41002900cde744370000200741086a41002900c5e744370000200741002900bde744370000200041086a42a7808080f0043702002000200736020420004101360200200341206a2802000d480c490b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d470c480b410e10262207450d34200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d460c470b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d450c460b411710262207450d332007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d440c450b410e10262207450d33200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d430c440b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d420c430b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d410c420b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d400c410b410e10262207450d30200741066a41002900eae744370000200741002900e4e744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d3f0c400b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3e0c3f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3d0c3e0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3c0c3d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3b0c3c0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3a0c3b0b410e10262207450d2b200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d390c3a0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d380c390b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d370c380b411710262207450d292007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d360c370b410e10262207450d29200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d350c360b410e10262207450d29200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d340c350b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d330c340b411710262207450d282007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d320c330b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d310c320b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d300c310b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2f0c300b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2e0c2f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2d0c2e0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2c0c2d0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2b0c2c0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2a0c2b0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d290c2a0b411710262207450d232007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d280c290b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d270c280b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d260c270b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d250c260b410e10262207450d22200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d240c250b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d230c240b411710262207450d212007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d220c230b41134101102a000b410f4101102a000b410f4101102a000b41f4e7c400200720051029000b41254101102a000b41254101102a000b41104104102a000b41274101102a000b101e000b20124104102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41274101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b200328021c10230b200341c0006a24000b110020002802003502004101200110cc020bbf0a020b7f017e230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c21020240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a200810be0320032802182107200328021c21020c010b410021070b2002410020071b21092006412c6c2102200441586a2105200741a886c50020071b210a0240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a200810be032003280210210b2003280214210c0c010b4100210b0b2006412c6c2102200441586a2105200b41a886c500200b1b210d024002400240024002400240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210503402002450d09200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a200810be0320032802082207200328020c41286c6a210803402008200722026b419f014d0d0320022d0018450d04200241c0006a2d0000450d05200241e8006a2d0000450d06200241a0016a210720024190016a2d00000d000b20024194016a210520010d060c090b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22050d080b200341cc006a41013602002003410236022c2003420237023c200341d4e1c4003602382003200341206a3602282003200341286a360248200341d0006a200341386a10a2012003290254210e200328025021020c0a0b20022008460d042002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c060b0b2005410c6a210720010d030c060b2002411c6a2105200241286a210720010d020c050b200241c4006a2105200241d0006a210720010d010c040b200241ec006a2105200241f8006a21072001450d030b02400240024003402001417f6a2101024002400240024003402008200722026b419f014d0d0120022d0018450d02200241c0006a2d0000450d03200241e8006a2d0000450d04200241a0016a210720024190016a2d00000d000b20010d040c070b20022008460d072002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c090b0b2005410c6a210720010d030c090b200241286a210720010d020c030b200241d0006a210720010d010c030b200241f8006a210720010d000b2003200241ec006a2802002202360224200920024b0d060c070b20032002411c6a2802002202360224200920024b0d050c060b2003200241c4006a2802002202360224200920024b0d040c050b200320024194016a2802002202360224200920024b0d030c040b41f7e0c40041dd001021000b41b5e0c40041c2001021000b200320052802002202360224200920024d0d010b200a20024104746a2202450d002000410036020020002002360204200341e0006a24000f0b200341dc006a4102360200200341cc006a4102360200200341023602542003420337023c200341e4e1c4003602382003200341206a3602582003200341246a3602502003200341d0006a360248200341286a200341386a10a201200329022c210e200328022821020b2000200236020420004101360200200041086a200e370200200341e0006a24000bf50303047f017e017f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441386a2802002105200441346a2802002106200141016a2101200441c4006a2802004102460d030c010b0240024020002802002201450d0020003301044220862003ad842107410121040c010b2003ad210741002104410021010b200010232007a72103024002402007422088a7220620012f01064f0d00200121050c010b03400240024020012802002205450d00200441016a210420013301044220862003ad8421070c010b2003ad2107410021050b200110232007a72103200521012007422088a7220620052f01064f0d000b0b200520064102746a4198036a2802002100200520064105746a220141c4006a2802002108200141386a2802002105200141346a2802002106024020044101460d00410120046b210103402000280294032100200141016a22010d000b0b4100210120084102460d020b2002417f6a210202402005450d00200610230b20020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002105200110232005450d00024020052802002201450d000340200510232001210520012802002200210120000d000b0b200510230b0b940302067f017e230041106b2202240002400240024002400240024002400240200041046a2802002203200041086a28020022046b20012802042205200128020022066b41047622074f0d00200420076a22062004490d0320034101742204200620062004491b2206ad4204862208422088a70d032008a722044100480d032003450d0120002802002003410474200410272203450d020c040b2000280200210320062005460d040c050b2004102622030d020b20044108102a000b101e000b20002003360200200041046a2006360200200041086a280200210420012802002206200141046a280200470d010b410021060c010b2001200641106a3602000b2002200610e803024020022d000041ac01460d00200320044104746a2106034020062002290300370300200641086a200241086a2903003703000240024020012802002203200141046a280200460d002001200341106a3602000c010b410021030b200441016a2104200641106a21062002200310e80320022d000041ac01470d000b0b200041086a2004360200200241106a24000bc80903037f017e017f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001450d0020012d00002202417e6a2203412e4b0d01024020030e2f001f233030152019301e0b30300e0d1d271a0c161c242212112829061b0a091025172605140721080403182b2a130f000b20012d00012104410221020c2f0b200041ac013a00000f0b0c2b0b20012d00012104412b21020c2c0b200141046a280200210620013502082105412a21020c2a0b200141046a280200210620013502082105412521020c290b200141046a280200210620013502082105411d21020c280b200141046a280200210620013502082105412721020c270b200141046a280200210620013502082105412921020c260b200141046a280200210620013502082105412021020c250b200141046a280200210620013502082105411f21020c240b200141046a280200210620012d00012104410c21020c240b200141046a280200210620013502082105411421020c220b200141046a2802002106411021020c210b200141046a2802002106410f21020c200b20012903082105413021020c1e0b200141046a280200210620013502082105412121020c1e0b200141046a280200210620013502082105411a21020c1d0b200141046a280200210620013502082105411921020c1c0b200141046a2802002106412f21020c1b0b200141046a280200210620013502082105412621020c1a0b200141046a2802002106410721020c190b200141046a280200210620013502082105411521020c180b200141046a280200210620013502082105412321020c170b20012d00012104412c21020c170b20012802082204ad2205421e88a70d122005420286a72202417f4c0d124104210602402002450d00200210262206450d140b02402004450d00200141046a28020021022004410274210320062104034020042002280200360200200441046a2104200241046a21022003417c6a22030d000b0b2001410c6a3502004220862005842105410921020c150b200141046a2802002106411321020c140b200141046a280200210620013502082105411e21020c130b200141046a280200210620013502082105411621020c120b200141046a2802002106411121020c110b200141046a2802002106410b21020c100b20012d00012104410321020c100b200141046a2802002106410821020c0e0b200141046a280200210620013502082105412821020c0d0b200141046a280200210620013502082105411821020c0c0b20012d00012104410421020c0c0b200141046a280200210620013502082105411721020c0a0b200141046a280200210620013502082105412221020c090b200141046a280200210620013502082105412421020c080b200141046a2802002106411221020c070b200141046a280200210620013502082105411b21020c060b200141046a280200210620013502082105411c21020c050b20012903082105412e21020c030b200141046a2802002106412d21020c030b101d000b20024104102a000b0b0b200020043a0001200020023a0000200041086a2005370300200041046a20063602000ba00201027f02400240024002402001410c6a2802002203417f6a220420034d0d00411610262201450d01200020013602042001410e6a41002900bee944370000200141086a41002900b8e944370000200141002900b0e944370000200041086a4296808080e002370200200041013602000f0b0240200420026b220220044d0d00411b10262201450d0220002001360204200141176a41002800dde944360000200141106a41002900d6e944370000200141086a41002900cee944370000200141002900c6e944370000200041086a429b808080b003370200200041013602000f0b200320024d0d022000200141046a28020020024104746a360204200041003602000f0b41164101102a000b411b4101102a000b41e4e9c400200220031029000bf60201037f230041106b22032400024002402002450d0020032001410010e90320032802004101470d01200020034104722202290200370200200041086a200241086a280200360200200341106a24000f0b20004100360200200341106a24000f0b02400240024002402001280200220420032802042205280208470d0020052d000c450d0120004100360200200341106a24000f0b0240200420026b220220044d0d00410f10262202450d022000428f808080f00137020420002002360200200241076a41002900a8e944370000200241002900a1e944370000200341106a24000f0b2000410036020020012002360200200341106a24000f0b412510262202450d01200042a5808080d004370204200020023602002002411d6a4100290099e944370000200241186a4100290094e944370000200241106a410029008ce944370000200241086a4100290084e944370000200241002900fce844370000200341106a24000f0b410f4101102a000b41254101102a000be40601087f230041d0006b220224002000280200220041046a28020021032000280200210041012104200128021841a7b1c50041012001411c6a28020028020c11020021050240024002402003450d002002200036020402400240024020050d00024020012d00004104710d00200241046a200110dc0221044101210620034101460d020c030b41012104200141186a220528020041a5b1c50041012001411c6a28020028020c1102000d002001280200210741012104200241086a41086a41013a0000200241186a411c6a41e8b0c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022007360218200241186a41186a200241086a360200200220052902003703082002200141046a28020036021c200241046a200241186a10dc020d00200241306a2802004182b1c5004102200241346a28020028020c11020021040b4101210620034101470d010b4101210020040d020c030b200041046a21002003410274417c6a2103200141186a21072001411c6a210820042105034020022000360204200541ff0171210441012105024020040d000240200128020022044104710d0020072802004184b1c5004102200828020028020c1102000d01200241046a200110dc022105200041046a21002003417c6a22030d020c030b200241086a41086a20063a0000200241186a411c6a220941e8b0c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022004360218200241186a41186a2204200241086a360200200220072902003703082002200141046a28020036021c200241046a200241186a10dc020d0020042802004182b1c5004102200928020028020c1102002105200041046a21002003417c6a22030d010c020b200041046a21002003417c6a22030d000b0b410121002005450d010b200241d0006a240020000f0b200141186a28020041a6b1c50041012001411c6a28020028020c1102002100200241d0006a240020000bdd0202027f027e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d0120042004423f8722057c2005852004427f55200110cc02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b20004180011048000b20004180011048000bdb0203027f017e017f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210020034120710d012000ac2204420020047d2000417f4a22001b2000200110cc02210020024180016a240020000f0b20002802002103410021000340200220006a41ff006a2003410f712205413072200541d7006a2005410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712205413072200541376a2005410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b20034180011048000b20004180011048000bd20201037f23004180016b22022400200028020021000240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff01834101200110cc02210020024180016a240020000f0b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000b931001157f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024002400240024002400240024002400240024002400240024002400240024002400240024020042d00002200410d4b0d00024020000e0e000203040506070809140a0b0c0d000b200441086a280200450d13200441046a280200102320022003470d140c150b0240200441086a280200450d00200441046a28020010230b0240200441146a2802002200450d00200441186a280200450d00200010230b200441246a280200450d12200441206a280200102320022003470d130c140b0240200441086a280200450d00200441046a28020010230b200441146a280200450d11200441106a280200102320022003470d120c130b200441046a210502402004410c6a2802002201450d00200528020021002001410474210103400240200041046a280200450d00200028020010230b200041106a2100200141706a22010d000b0b200441086a280200450d102005280200102320022003470d110c120b200441046a210502402004410c6a2802002201450d0020052802002100200141286c210103400240200041046a280200450d00200028020010230b0240200041106a280200450d002000410c6a28020010230b200041286a2100200141586a22010d000b0b200441086a280200450d0f2005280200102320022003470d100c110b200441086a280200450d0e200441046a280200102320022003470d0f0c100b200441086a280200450d0d200441046a280200102320022003470d0e0c0f0b200441086a280200450d0c200441046a280200102320022003470d0d0c0e0b200441046a21062004410c6a2802002200450d0a2006280200220720004104746a2108410021000c050b200441046a210502402004410c6a2802002201450d0020052802002100200141146c210103400240200041046a280200450d00200028020010230b200041146a21002001416c6a22010d000b0b200441086a280200450d0a2005280200102320022003470d0b0c0c0b200441046a21092004410c6a2802002200450d072009280200220a2000411c6c6a210b410121000c030b200441046a210c2004410c6a2802002200450d05200c280200220d200041186c6a210e410221000c020b200441046a210f2004410c6a2802002200450d03200f28020022102000411c6c6a2111410321000c010b024002400240200441046a2d000022004102460d0020004101460d0120000d022004410c6a280200450d09200441086a280200102320022003470d0a0c0b0b2004410c6a2112200441146a2802002200450d032012280200221320004104746a2114410421000c020b2004410c6a21150240200441146a2802002201450d00201528020021002001410c6c21010340024020002802002205450d00200041046a280200450d00200510230b2000410c6a2100200141746a22010d000b0b200441106a280200450d072015280200102320022003470d080c090b2004410c6a280200450d06200441086a28020010230c060b0340024002400240024002400240024002400240024020000e050001020304040b024020072802082201450d0020072802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b200741106a21000240200741046a280200450d00200728020010230b2000210720002008470d040c0e0b0240200a410c6a2802002201450d00200a2802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b0240200a41086a280200450d00200a41046a28020010230b200a411c6a21000240200a41146a280200450d00200a28021010230b2000210a2000200b470d040c0c0b0240200d41046a280200450d00200d28020010230b0240200d41146a2802002201450d00200d28020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b200d41186a21000240200d41106a280200450d00200d410c6a28020010230b2000210d2000200e470d040c0a0b02402010410c6a2802002201450d0020102802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b0240201041086a280200450d00201041046a28020010230b2010411c6a21000240201041146a280200450d00201028021010230b2000211020002011470d040c080b2013221541106a2113024020152802042200450d0002402015410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d00200510230b2000410c6a2100200141746a22010d000b0b201541086a280200450d00201541046a28020010230b20132014470d040c060b410021000c040b410121000c030b410221000c020b410321000c010b410421000c000b0b200441106a280200450d042012280200102320022003470d050c060b200441086a280200450d03200f280200102320022003470d040c050b200441086a280200450d02200c280200102320022003470d030c040b200441086a280200450d012009280200102320022003470d020c030b200441086a280200450d002006280200102320022003470d010c020b20022003470d000b0b0b0c002000280200200110c2030bb20201027f230041106b2202240002400240200028020022002d00004104470d00200128021841d0f6c40041082001411c6a28020028020c11020021010c010b2002200128021841bbf6c40041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0f6c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470ba41b01037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000022024101460d0020024102470d01200141046a280200200141086a2802002202470d03200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0720012802002002200410272203450d080c0f0b200141046a280200200141086a2802002202470d01200241016a22032002490d1020024101742204200320032004491b22044100480d102002450d0420012802002002200410272203450d050c0c0b200141046a280200200141086a2802002202470d02200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d0720012802002002200410272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2004102622030d070b20044101102a000b2004102622030d070b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a28020020011093030f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d2020024101742204200320032004491b22044100480d202002450d0f20012802002002200410272203450d100c1b0b200141046a28020020042802002202470d03200241016a22032002490d1f20024101742204200320032004491b22044100480d1f2002450d0820012802002002200410272203450d090c180b200141046a280200200141086a2802002202470d03200241016a22032002490d1e20024101742204200320032004491b22044100480d1e2002450d0920012802002002200410272203450d0a0c150b200141046a280200200141086a2802002202470d03200241016a22032002490d1d20024101742204200320032004491b22044100480d1d2002450d0a20012802002002200410272203450d0b0c120b200141046a280200200141086a2802002202470d04200241016a22032002490d1c20024101742204200320032004491b22044100480d1c2002450d0d20012802002002200410272203450d0e0c0f0b200128020021030c150b200128020021030c120b200128020021030c0f0b200128020021030c140b200128020021030c0b0b2004102622030d0f0b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a2802002001109303200041146a280200200041186a280200200110930302400240024002400240200141046a280200200141086a2802002202470d00200241016a22032002490d0720024101742204200320032004491b22044100480d072002450d0120012802002002200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a200041026a2d00003a00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d1e20024101742204200320032004491b22044100480d1e2002450d0f20012802002002200410272203450d100c1b0b200141046a28020020042802002202470d03200241016a22032002490d1d20024101742204200320032004491b22044100480d1d2002450d0820012802002002200410272203450d090c180b200141046a280200200141086a2802002202470d03200241016a22032002490d1c20024101742204200320032004491b22044100480d1c2002450d0920012802002002200410272203450d0a0c150b200141046a280200200141086a2802002202470d03200241016a22032002490d1b20024101742204200320032004491b22044100480d1b2002450d0a20012802002002200410272203450d0b0c120b200141046a280200200141086a2802002202470d04200241016a22032002490d1a20024101742204200320032004491b22044100480d1a2002450d0d20012802002002200410272203450d0e0c0f0b200128020021030c150b200128020021030c120b200128020021030c0f0b200128020021030c140b200128020021030c0b0b2004102622030d0f0b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a2802002001109303200041146a280200200041186a2802002001109303200041206a280200200041246a28020020011093030240024002400240024002400240024002400240024002400240024002400240024002400240200041026a2d0000417f6a220041034b0d00024020000e0400040203000b200141046a280200200141086a2802002200470d07200041016a22022000490d1320004101742203200220022003491b22034100480d132000450d0f20012802002000200310272202450d100c1c0b200141046a280200200141086a2802002200470d03200041016a22022000490d1220004101742203200220022003491b22034100480d122000450d0820012802002000200310272202450d090c190b200141046a280200200141086a2802002200470d03200041016a22022000490d1120004101742203200220022003491b22034100480d112000450d0920012802002000200310272202450d0a0c160b200141046a280200200141086a2802002200470d03200041016a22022000490d1020004101742203200220022003491b22034100480d102000450d0a20012802002000200310272202450d0b0c130b200141046a280200200141086a2802002200470d04200041016a22022000490d0f20004101742203200220022003491b22034100480d0f2000450d0d20012802002000200310272202450d0e0c100b200128020021020c160b200128020021020c130b200128020021020c100b200128020021020c150b200128020021020c0c0b2003102622020d100b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d080b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41023a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41043a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41033a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41013a00000be80701037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d0520022802002003200510272204450d060c170b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1020044101742203200520052003491b22034100480d102004450d0820022802002004200310272204450d090c140b200228020021040c160b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d08200228020020042003102722040d090c0f0b200228020021040c120b200241046a280200200241086a2802002203470d03200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d09200228020020032005102722040d0a0c0e0b2005102622040d110b20054101102a000b200228020021040c050b200228020021040c070b2003102622040d0b0b20034101102a000b200310262204450d060b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a2001410274410272360000200141037422010d0b0c0c0b200510262204450d040b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0420044101742203200520052003491b22034100480d042004450d01200228020020042003102722040d020c070b200228020021040c020b200310262204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a200136000020014103742201450d090c080b101e000b20034101102a000b20054101102a000b20034101102a000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b0000200141037422010d020c030b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a000020014103742201450d010b200020016a210103402000280200200041046a2802002002109303200041086a22002001470d000b0b0bd50101027f200028020421020240024020002802004101470d002000410c6a280200220020011092032000450d01200041186c2103200241146a21000340200041706a280200200041746a28020020011093032000417c6a28020020002802002001109303200041186a2100200341686a22030d000c020b0b200041086a280200220020011092032000450d00200041186c2103200241146a21000340200041706a280200200041746a28020020011093032000417c6a28020020002802002001109303200041186a2100200341686a22030d000b0b0b2700200028020c200041106a280200100f200041146a350200101a200041186a350200101a00000b080020002001100f0b06002000101b0b06002000101c0b2801017f02402002101b2203450d002003200020022001200120024b1b1094041a2000101c0b20030b1c01017f02402000101b2201450d002001410020001093041a0b20010b7601017f230041c0006b220024002000413336020c200041dc82c500360208200041346a412f360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000b1c00200128021841a8b1c50041052001411c6a28020028020c1102000bba0101037f024002400240024002400240200028020022002802042203200028020822046b20024f0d00200420026a22052004490d0320034101742204200520052004491b22044100480d032003450d0120002802002003200410272203450d020c040b200028020021030c040b2004102622030d020b20044101102a000b101e000b20002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a200120021094041a41000bba0401047f230041106b22022400200028020021000240024002400240024002400240024002400240024020014180014f0d00200028020822032000280204470d09200341016a22042003490d0520034101742205200420042005491b22044100480d052003450d0120002802002003200410272203450d020c080b2002410036020c0240024020014180104f0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b024020002802042204200028020822036b20014f0d00200320016a22052003490d0520044101742203200520052003491b22034100480d052004450d0320002802002004200310272204450d040c060b200028020021040c060b2004102622030d060b20044101102a000b2003102622040d020b20034101102a000b101e000b20002004360200200041046a2003360200200041086a28020021030b200041086a200320016a360200200420036a2002410c6a20011094041a0c020b20002003360200200041046a2004360200200041086a28020021030b200028020020036a20013a0000200041086a2200200028020041016a3602000b200241106a240041000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41c482c500200241086a10e2032101200241206a240020010b02000b0c0042afd4e7bdc6bbf3dc230b5501017f0240024002402001418080c400460d0041012104200028021820012000411c6a2802002802101103000d010b2002450d012000280218200220032000411c6a28020028020c11020021040b20040f0b41000bd30801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b21074180022108024003400240200820014f0d00200020086a2c000041bf7f4a0d020b2008417f6a21064100210520084101460d02200720086a21092006210820094101470d000c020b0b41002105200821060b200420063602142004200036021020044100410520051b36021c200441a886c50041da89c50020051b360218024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b20042002360220024002402002450d0020022001460d00200141016a210903400240200220014f0d00200020026a2c000041404e0d020b2002417f6a210820024101460d0220092002462106200821022006450d000c020b0b200221080b20082001460d02410121064100210502400240200020086a22092c000022024100480d002004200241ff0171360224200441286a21020c010b200020016a220621010240200941016a2006460d00200941026a2101200941016a2d0000413f7121050b2002411f712109024002400240200241ff017141e001490d004100210020062107024020012006460d00200141016a210720012d0000413f7121000b20002005410674722101200241ff017141f001490d0141002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d060c020b200520094106747221010c010b20012009410c747221010b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441ec006a4101360200200441e4006a4101360200200441c8006a41146a4130360200200441d4006a4131360200200441306a41146a4105360200200420023602582004410236024c20044205370234200441d08ac5003602302004200441186a3602682004200441106a3602602004200441246a3602502004200441206a3602482004200441c8006a360240200441306a41f88ac5001061000b20042002200320081b360228200441c8006a41146a4101360200200441d4006a4101360200200441306a41146a41033602002004410236024c20044203370234200441e089c5003602302004200441186a3602582004200441106a3602502004200441286a3602482004200441c8006a360240200441306a41f889c5001061000b200441e4006a4101360200200441c8006a41146a4101360200200441d4006a4102360200200441306a41146a41043602002004410236024c20044204370234200441888ac5003602302004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a3602482004200441c8006a360240200441306a41a88ac5001061000b41b88ac500104f000b830101037f230041206b2202240002400240200028020020011087040d002001411c6a2802002103200128021821042002411c6a4100360200200241a886c5003602182002420137020c200241e08bc50036020820042003200241086a10e203450d010b200241206a240041010f0b200028020420011087042101200241206a240020010b860c03037f017e167f410121020240200128021841272001411c6a2802002802101103000d00410221020240024002400240024002400240024002402000280200220341776a2200411e4b0d0041f4002104024020000e1f09000202030202020202020202020202020202020202020202070202020207090b41ee0021040c030b200341dc00460d050b2003108604450d02200341017267410276410773ad4280808080d0008421050c030b41f20021040b0c040b024002400240200341ffff034b0d0020034180fe0371410876210641a098c5002107410021084102210941b002210a41f098c500210b41f098c500210c417f210d4101210e200341ff0171210f410021020c010b0240200341ffff074b0d0020034180fe0371410876211341db9dc50021144100211541022116419f012117419d9ec5002118419d9ec5002119417f211a4101211b200341ff01712112410121020c010b200341ef83384b0d01200341e28b746a41e28d2c490d012003419fa8746a419f18490d01200341dee2746a410e490d01200341feffff0071419ef00a460d01200341a9b2756a4129490d01200341cb91756a410a4d0d01410121020c030b034002400240024002400240024002400240024002400240024020020e020001010b200720096a2110200820072d000122026a211102400240024020072d000022002006470d0020112008490d042011200a4f0d052008200b6a210003402002450d022002200d6a210220002d000021042000200e6a21002004200f470d000c100b0b200020064b0d0120112108201021072010200c470d090c010b20112108201021072010200c470d090b200341ffff03712100419f9bc50021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41db9dc500460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241db9dc500470d000b0b41012102200f410171450d0c0c0e0b201420166a2110201520142d000122026a211102400240024020142d000022002013470d0020112015490d05201120174f0d06201520186a210003402002450d022002201a6a210220002d000021042000201b6a210020042012470d000c0f0b0b200020134b0d01201121152010211420102019470d0a0c010b201121152010211420102019470d0a0b200341ffff0371210041bb9fc50021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41b8a2c500460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241b8a2c500470d000b0b41012102200f410171450d0b0c0d0b200820111048000b201141af02108c01000b201520111048000b2011419e01108c01000b41b88ac500104f000b41b88ac500104f000b410021020c030b410021020c020b410121020c010b410121020c000b0b200341017267410276410773ad4280808080d0008421050b410321020c010b0b200321040b200141186a210f2001411c6a210e02400340024002400240024002400240024020024101460d0041dc002100024020024102460d0020024103470d092005422088a741ff0171417f6a220241044b0d09024020020e050006040503000b200542ffffffff8f6083210541fd0021000c060b410121020c060b41002102200421000c050b200542ffffffff8f60834280808080c0008421050c030b200542ffffffff8f608342808080802084210541fb0021000c020b200542ffffffff8f608342808080803084210541f50021000c010b20042005a7220d410274411c7176410f712202413072200241d7006a2002410a491b21000240200d450d002005427f7c42ffffffff0f832005428080808070838421050c010b200542ffffffff8f60834280808080108421050b410321020b200f2802002000200e280200280210110300450d000b41010f0b200141186a28020041272001411c6a28020028021011030021020b20020b960201017f0240024002400240024002400240200041ff0f4b0d00200041037641f8ffffff017141a88cc5006a21010c010b0240200041ffff034b0d00200041067641606a220141df074b0d02200141c08ec5006a2d0000220141c9004b0d03200141037441b0a3c5006a21010c010b2000410c7641706a220141ff014b0d03200141a096c5006a2d00004106742000410676413f7172220141ff034b0d0420014180a8c5006a2d0000220141364b0d0520014103744180acc5006a21010b200129030042012000413f71ad86834200520f0b41b8a2c500200141e0071029000b41c8a2c500200141ca001029000b41d8a2c50020014180021029000b41e8a2c50020014180041029000b41f8a2c500200141371029000bb30201037f23004180016b220224000240024002400240200128020022034110710d0020034120710d012000ad4101200110cc02210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b20004180011048000b20004180011048000b0e0020003502004101200110cc020bc50501077f41002104024020024103712205450d00410420056b2205450d00200220032005200520034b1b22046a210641002105200141ff017121072004210820022109024002400340200620096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210603402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2006470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b20002005360204200041013602000f0b200141ff017121070240024020034108490d002004200341786a220a4b0d00200741818284086c210502400340200220046a220941046a2802002005732208417f73200841fffdfb776a7120092802002005732209417f73200941fffdfb776a7172418081828478710d01200441086a2204200a4d0d000b0b200420034b0d010b200220046a2109200220036a2102200320046b2108410021050240024002400340200220096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210203402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2002470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b2000200520046a360204200041013602000f0b2000200520076a20046a360204200041003602000f0b200420031048000b2701017f20002802002201280200200128020420002802042802002000280208280200108304000be104010d7f230041306b2203240002402002450d00200341286a2104200041086a2105200341206a21062003411c6a2107200341246a2108200041046a210902400240024002400340024020052d0000450d00200028020041e4b0c5004104200928020028020c1102000d020b2004410a3602002006428a8080801037030020072002360200200341106a41086a220a41003602002003200236021420032001360210200341086a410a200120021089040240024002400240024020032802084101470d00200328020c210b0340200a200b200a2802006a41016a220b36020002400240200b2008280200220c4f0d002003280214210d2007280200220e200b4f0d010c040b02402003280214220d200b490d00200c41054f0d062003280210200b200c6b220f6a220e2004460d05200e2004200c109604450d050b2007280200220e200b490d030b200d200e490d022003200341106a200c6a41176a2d00002003280210200b6a200e200b6b1089042003280204210b20032802004101460d000b0b200a20072802003602000b200541003a00002002210b0c020b200541013a0000200f41016a210b0c010b200c4104108c01000b2009280200210e2000280200210c0240200b452002200b4672220a0d002002200b4d0d042001200b6a2c000041bf7f4c0d040b200c2001200b200e28020c1102000d010240200a0d002002200b4d0d052001200b6a2c000041bf7f4c0d050b2001200b6a21012002200b6b22020d000c020b0b200341306a240041010f0b200341306a240041000f0b200120024100200b108304000b20012002200b2002108304000b200341306a240041000b02000bfa0101017f230041106b220224002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a2001108b042101200241106a240020010b6101017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a4188b1c500200241086a10e2032101200241206a240020010b02000b0e00200028020020012002108b040b810201017f230041106b22022400200028020021002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a2001108b042101200241106a240020010b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a4188b1c500200241086a10e2032101200241206a240020010b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f02400240200120004f0d002002450d012001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000c020b0b2002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b4401037f024002402002450d00410021030340200020036a2d00002204200120036a2d00002205470d02200341016a22032002490d000b41000f0b41000f0b200420056b0b3e01017f230041106b22052400200520012002200320044100109b04200529030021012000200541086a29030037030820002001370300200541106a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080bc30502037f057e230041306b2206240002400240024002400240024002400240024002400240024002400240024020024200510d0020034200510d0120044200510d03200479a7200279a76b220741c0004f0d0241ff0020076b2108200741016a21070c0c0b20044200520d012005450d0520034200510d0d20054200370308200520012003823703000c060b20044200510d0c20014200510d032004427f7c22092004834200510d07200479a7200279a76b2207413f490d090b2005450d012005200137030020052002370308420021010c070b2003427f7c22092003834200510d044100200379a741c1006a200279a76b22076b21080c080b420021010c050b02402005450d0020054200370300200520022004823703080b200220048021010c040b20034200510d070b200120038021010c020b02402005450d0020054200370308200520092001833703000b20034201510d04200641206a2001200220037aa7109a04200641286a2903002102200629032021010c040b02402005450d0020052001370300200520092002833703080b200220047a423f838821010b420021020c020b41ff0020076b2108200741016a21070b200620012002200841ff0071109904200641106a20012002200741ff0071109a04200641086a2903002102200641106a41086a290300210a20062903002101200629031021094200210b0340200a4201862009423f8884220c200c427f8520047c20094201862002423f88842209427f85220c20037c200c54ad7c423f87220c2004837d2009200c200383220d54ad7d210a2009200d7d2109420020024201862001423f8884842102200b2001420186842101200c420183220c210b2007417f6a22070d000b02402005450d00200520093703002005200a3703080b20024201862001423f88842102200c20014201868421010b2000200137030020002002370308200641306a24000f0b00000b0bb8b1050100418080c0000badb10518001000240000001d411100170000004002000009000000547269656420746f20736872696e6b20746f2061206c61726765722063617061636974790000000098061100080000000000000020021000020000000000000000000000284311000000000000000000000000003002100006000000000000003802100003000000000000000000000028431100000000000000000000000000500210000e0000000000000028431100000000000000000000000000284311000000000000000000000000005e021000070000000000000068021000020000000000000000000000284311000000000000000000000000007802100006000000000000008002100001000000000000000000000028431100000000000000000000000000880210000900000000000000800210000100000000000000000000002843110000000000000000000000000091021000090000000000000080021000010000000000000000000000284311000000000000000000000000003c07110008000000000000009c02100002000000000000000000000028431100000000000000000000000000ac021000090000000000000028a4100002000000000000000000000028431100000000000000000000000000b50210000b00000000000000ece6100001000000000000000000000028431100000000000000000000000000c00210000600000000000000c802100003000000000000000000000028431100000000000000000007031000090000005bf61000070000005461626c6564000007031000090000005bf6100007000000e65710000e00000045787465726e616c5461626c656453746172746564000000eb0210000f000000fa0210000d0000005061737365640000eb0210000f0000004e6f7450617373656443616e63656c6c65640000eb0210000f0000002f1c11000400000044656c656761746564556e64656c6567617465645665746f65640000f6081100090000000408110004000000e00210000b000000426c6f636b4e756d6265725265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e64657844656d6f637261637920566f74654f6644656d6f63726163792050726f787944656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6644656d6f6372616379204465706f7369744f6644656d6f6372616379204c6173745461626c656457617345787465726e616c44656d6f6372616379204e65787454616c6c7944656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7344656d6f6372616379204e65787445787465726e616c4e6f2065787465726e616c2070726f706f73616c2077616974696e6743616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d44656d6f6372616379205075626c696350726f7073000000c0041000480000008d0a00000e0000004e6f207075626c69632070726f706f73616c732077616974696e67002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000c00d11000700000000000000c8071000020000000000000000000000f80710000600000000000000000000002808100006000000000000003008100001000000000000000000000048081000060000000000000000000000180e1100040000000000000078081000020000000000000000000000a8081000070000000000000000000000e00810000a0000000000000078081000020000000000000000000000ec0810000700000000000000000000002409100011000000000000003809100004000000000000000000000098091000060000000000000000000000c80910001000000000000000d8091000010000000000000000000000f0091000020000000000000000000000000a100010000000000000006cec1000010000000000000000000000100a1000020000000000000000000000200a100019000000000000006cec10000100000000000000000000003c0a10000200000000000000000000004c0a10000d000000000000005c0a1000010000000000000000000000740a10000100000000000000000000007c0a10001100000000000000900a1000010000000000000000000000a80a1000010000000000000000000000b00a10000d00000000000000c00a1000030000000000000000000000080b1000010000000000000000000000100b100009000000000000001c0b1000010000000000000000000000340b10000500000000000000000000005c0b10000c0000000000000028431100000000000000000000000000680b1000050000000000000000000000900b10000c000000000000001c0b10000100000000000000000000009c0b1000050000000000000000000000c40b10000800000000000000cc0b1000020000000000000000000000fc0b1000050000000000000000000000240c10000a0000000000000028431100000000000000000000000000300c1000050000000000000000000000fc0e1100080000000000000026ee100010000000000000008efd100005000000000000004cfc10001500000008111000280000002843110000000000d31911000b000000de191100080000004211100020000000fc1911000c0000007365636f6e64000000000000fc0e11000800000000000000301110001200000008111000280000002843110000000000d31911000b000000de19110008000000dc36100010000000fc1911000c00000000000000670d100009000000000000003a0d10001800000000000000180e110004000000000000000411100004000000881010004d000000d51010002f0000002843110000000000d31911000b000000de19110008000000691010001f000000fc1911000c00000070726f78795f766f74650000d70f1000540000002b1010003e0000002843110000000000d31911000b000000de19110008000000691010001f000000fc1911000c000000656d657267656e63795f70726f706f736500000000000000fc0e1100080000000000000026ee100010000000000000007f0f11000900000000000000fa0210000d00000000000000c50f10000d00000000000000e30011000e00000000000000d20f10000500000000000000e30011000e000000c60e1000220000002843110000000000e80e100058000000400f1000460000002843110000000000860f10003f000000656d657267656e63795f63616e63656c00000000670d10000900000000000000eb0210000f000000720e100054000000660e10000c00000065787465726e616c5f70726f706f73651a0e10004c000000660e10000c00000065787465726e616c5f70726f706f73655f6d616a6f72697479000000ac0d100056000000020e1000180000007665746f5f65787465726e616c000000000000009f0d10000d00000000000000040f110007000000700d10002f00000063616e63656c5f7265666572656e64756d00000000000000670d100009000000000000003a0d100018000000520d10001500000063616e63656c5f717565756564000000000000002d0d100004000000000000006dfc10001700000000000000310d10000500000000000000266810000c00000000000000360d100004000000000000003a0d100018000000050d1000280000007365745f70726f787900000000000000000d10000500000000000000561c11000c000000da0c1000260000002843110000000000d31911000b000000e619110016000000fc1911000c00000072657369676e5f70726f7879b40c1000260000002843110000000000d31911000b000000e3fb100010000000fc1911000c00000072656d6f76655f70726f78798e0c1000260000002843110000000000d31911000b000000e3fb100010000000fc1911000c00000064656c656761746500000000780c10000200000000000000561c11000c000000000000007a0c10000a00000000000000840c10000a000000690c10000f0000002843110000000000d31911000b000000e619110016000000fc1911000c000000756e64656c65676174650000580c1000110000002843110000000000d31911000b000000de19110008000000fc1911000c00000020556e64656c656761746520766f74652e2044656c656761746520766f74652e746f636f6e76696374696f6e436f6e76696374696f6e20436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e776869636877686174436f6d706163743c5265666572656e64756d496e6465783e2052656d6f76652061207265666572656e64756d2e7265665f696e646578205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e70726f706f73616c5f68617368205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d65205363686564756c6520616e20656d657267656e6379207265666572656e64756d2e20546869732077696c6c206372656174652061206e6577207265666572656e64756d20666f7220746865206070726f706f73616c602c20617070726f766564206173206c6f6e6720617320636f756e74656420766f7465732065786365656420607468726573686f6c646020616e642c20696620617070726f7665642c20656e61637465642061667465722074686520676976656e206064656c6179602e204974206d61792062652063616c6c65642066726f6d206569746865722074686520526f6f74206f722074686520456d657267656e6379206f726967696e2e766f74696e675f706572696f6464656c617920566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e566f74652050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e436f6d706163743c50726f70496e6465783e202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e44656d6f63726163790000000000941610000f000000000000000000000007031000090000000000000000000000000000000000000000000000000000000000000028431100541710000000000000000000a416100001000000000000000100000000000000ac1610000b0000000000000000000000b71610002b0000000000000000000000000000000000000000000000000000000000000028431100101810000000000000000000e416100001000000000000000100000000000000ec161000090000000101000000000000070310000900000000000000f51610002100000000000000000000000000000000000000284311001817100000000000000000002817100001000000000000000000000000000000301710000f0000000000000000000000eb0210000f0000000000000000000000000000000000000000000000000000000000000028431100541710000000000000000000401710000100000000000000010000000000000048171000090000000000000000000000eb0210000f000000000000000000000000000000000000000000000000000000000000002843110054171000000000000000000064171000010000000000000001000000000000006c171000100000000101000000000000eb0210000f000000000000007c1710002d0000000000000000000000000000000000000028431100881810000000000000000000ac17100001000000000000000000000000000000b41710000d0000000101000000000000e30011000e00000000000000c11710002b0000000000000000000000000000000000000028431100ec1710000000000000000000fc1710000100000000000000010000000000000004181000090000000101000000000000eb0210000f00000000000000ea1b11001100000000000000000000000000000000000000284311001018100000000000000000002018100001000000000000000100000000000000281810000600000001010000000000002e1810001f0000000000000004111000040000000000000000000000000000000000000028431100501810000000000000000000601810000400000000000000010000000000000080181000050000000101000000000000561c11000c00000000000000561c11000c00000000000000000000000000000000000000284311008818100000000000000000009818100002000000000000000000000000000000a81810000b0000000101010000000000561c11000c00000000000000b31810001a0000000000000000000000000000000000000028431100d01810000000000000000000e018100001000000000000000100000000000000e81810001500000000000000000000002f1c1100040000000000000000000000000000000000000000000000000000000000000028431100c419100000000000000000000019100002000000000000000100000000000000101910000c00000000000000000000001c1910001c0000000000000000000000000000000000000000000000000000000000000028431100381910000000000000000000481910000400000000000000000000000000000068191000090000000101000000000000040f1100070000000000000071191000230000000000000000000000000000000000000028431100941910000000000000000000a419100002000000000000000000000000000000b41910000d0000000101000000000000040f110007000000000000002f1c1100040000000000000000000000000000000000000028431100c41910000000000000000000d41910000100000000000000010000005075626c696350726f70436f756e7400441f10003d0000005075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0000241f1000200000004465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29000032000000000000000100000033000000031f1000210000005265666572656e64756d436f756e7400b71e10004c0000004e65787454616c6c7900000032000000000000000100000034000000851e1000320000005265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29000000581e10002d000000446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e32000000000000000100000035000000281e100030000000566f74657273466f7200000032000000000000000100000035000000ff1d100029000000566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e7449642900000032000000000000000100000036000000c01c100058000000181d1000530000006b1d100057000000c21d10003d00000050726f787900000032000000000000000100000036000000521c10004c0000009e1c10002200000044656c65676174696f6e7328543a3a4163636f756e7449642c20436f6e76696374696f6e2900000032000000000000000100000037000000021c1000500000004c6173745461626c656457617345787465726e616c000000a21b100056000000f81b10000a0000004e65787445787465726e616c28543a3a50726f706f73616c2c20566f74655468726573686f6c642932000000000000000100000038000000b41a1000560000000a1b1000550000005f1b100029000000881b10001a000000426c61636b6c69737428543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e2932000000000000000100000033000000261a1000540000007a1a10003a00000043616e63656c6c6174696f6e7300000032000000000000000100000036000000dc1910004a000000205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e2041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d6265722028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e20546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e20546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743a202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f72202d20605075626c696350726f70736020697320656d7074792e205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c69632070726f706f73616c2e2047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e000000703b1100280000009c1f1000440000003f010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f64656d6f63726163792f7372632f6c69622e72739c1f1000440000003f0100000100000076616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7744656d6f6372616379205075626c696350726f70436f756e7463616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f7744656d6f63726163792043616e63656c6c6174696f6e7370726f706f73616c207374696c6c20626c61636b6c697374656470726f706f73616c20616c7265616479206d6164656964656e74697479206d6179206e6f74207665746f20612070726f706f73616c20747769636544656d6f637261637920426c61636b6c6973746e6f2065787465726e616c2070726f706f73616c756e6b6e6f776e2070726f706f73616c616c726561647920612070726f787977726f6e672070726f78796e6f742064656c65676174656470726f706f73616c206e6f7420666f756e64756e6b6e6f776e20696e64657863616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e00000000000024221000060000000000000074f510000100000000000000000000002c221000010000000000000000000000342210000e000000000000004422100002000000000000000000000054221000020000000000000000000000642210000c00000000000000e8581000020000000000000000000000702210000100000000000000526577617264000056231000380000004f66666c696e655761726e696e670000f608110009000000821c110003000000c12210005200000013231000430000004f66666c696e65536c6173687822100049000000204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20676976656e20616e206f66666c696e652d7761726e696e6720286974206973207374696c6c2077697468696e20697473206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e20416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67204c65646765720000000000000c26100004000000000000001026100003000000000000000000000058261000110000000000000000000000e02610000a00000000000000ec261000010000000000000000000000042710000c00000000000000000000006427100006000000000000006c271000010000000000000000000000842710001700000000000000000000003c28100011000000000000002843110000000000000000000000000050281000100000000000000000000000d02810000800000000000000d8281000010000000000000000000000f02810000b000000000000000000000048291000080000000000000050291000010000000000000000000000682910000b0000000000000000000000c0291000050000000000000028431100000000000000000000000000c82910000b0000000000000000000000202a100009000000000000002c2a1000010000000000000000000000442a10000b00000000000000000000009c2a10000e00000000000000ac2a1000010000000000000000000000c42a10000b00000000000000000000001c2b10001300000000000000302b1000010000000000000000000000482b1000010000000000000000000000502b10000d0000000000000028431100000000000000000000000000602b1000080000000000000000000000a02b10001700000000000000302b1000010000000000000000000000b82b1000010000000000000000000000c02b10001100000000000000d42b1000010000000000000000000000ec2b10000100000000000000626f6e6400000000cf2e10000a000000000000009efd100023000000000000008efd100005000000000000004cfc100015000000000000002e2f10000500000000000000332f100011000000bf37100059000000183810002200000028431100000000003a381000490000002843110000000000d31911000b0000008338100035000000de19110008000000b83810001a0000002843110000000000d23810005b0000002d3910004900000028431100000000007639100041000000b739100069000000203a10005a000000fc1911000c000000626f6e645f6578747261000000000000b13710000e000000000000004cfc100015000000f6361000590000004f3710000e00000028431100000000005d371000540000002843110000000000e82d1000550000002843110000000000d31911000b0000003d2e10003a000000de19110008000000dc36100010000000fc1911000c000000756e626f6e640000000000008efd100005000000000000004cfc10001500000007331000550000005c331000400000009c3310004d0000002843110000000000e9331000520000003b3410003000000028431100000000006b3410004f000000ba3410004f000000093510003f0000002843110000000000d92e100055000000284311000000000048351000260000002843110000000000d31911000b0000006e35100050000000772e100026000000be35100059000000173610005c0000007336100069000000dc36100010000000ec3610000a00000077697468647261775f756e626f6e646564000000fe3010004b0000002843110000000000493110004d00000096311000130000002843110000000000d92e1000550000002843110000000000a93110001b0000002843110000000000d31911000b000000c43110006000000024321000520000007632100033000000a93210005e0000009d2e100032000000fc1911000c00000076616c696461746500000000dd3010000500000000000000e23010001c000000a33010003a0000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000006e6f6d696e617465000000007430100007000000000000007b301000280000008b2f1000440000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b000000cf2f10004900000018301000260000003e30100036000000fc1911000c0000006368696c6c000000442f1000320000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000762f1000150000009d2e100032000000fc1911000c0000007365745f7061796565000000000000002e2f10000500000000000000332f100011000000832d10002e0000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000007365745f636f6e74726f6c6c6572000000000000cf2e10000a000000000000009efd100023000000832d10002e0000002843110000000000b12d1000370000002843110000000000e82d1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000007365745f76616c696461746f725f636f756e740000000000c5ed10000300000000000000266810000c000000632d100020000000666f7263655f6e65775f657261000000552c10004f000000a42c1000490000002843110000000000d31911000b000000988a100020000000ed2c100045000000322d100031000000fc1911000c0000007365745f6f66666c696e655f736c6173685f677261636500312c1000240000007365745f696e76756c6e657261626c657300000000000000272c10000a00000000000000ea1b110011000000f42b10003300000020536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72732053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e202d205472696767657273207468652050687261676d656e20656c656374696f6e2e20457870656e7369766520627574206e6f7420757365722d636f6e74726f6c6c65642e202d20446570656e6473206f6e2073746174653a20604f287c65646765737c202a207c76616c696461746f72737c29602e2054686520696465616c206e756d626572206f662076616c696461746f72732e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e636f6e74726f6c6c657220546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e202d20436f6e7461696e73206f6e6520726561642e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c2077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602e202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e20497420696d706c69657320202060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c20776869636820697320696e6469726563746c79202020757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360292063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e65656420746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e6365602920202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e202d204f6e6520444220656e7472792e203c2f7765696768743e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f7220207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c2062652074686520206163636f756e74207468617420636f6e74726f6c732069742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e202d20546872656520657874726120444220656e74726965732e204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e204e4f54453a20417420746865206d6f6d656e742c20746865726520617265206e6f2066696e616e6369616c207265737472696374696f6e7320746f20626f6e6420287768696368206372656174657320612062756e6368206f662073746f72616765206974656d7320666f7220616e206163636f756e74292e20496e20657373656e63652c206e6f7468696e672070726576656e7473206d616e79206163636f756e74732066726f6d207370616d6d696e6720605374616b696e67602073746f7261676520627920626f6e64696e67203120554e49542e20536565207465737420636173653a2060626f6e645f776974685f6e6f5f7374616b65645f76616c7565602e5374616b696e675374616b696e6720496e76756c6e657261626c65735374616b696e6720536c617368436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e6720526563656e746c794f66666c696e6576206973206e6f6e2d656d7074793b2071656400203b1000480000008d0a00000e0000005374616b696e67204f66666c696e65536c6173685374616b696e67205374616b657273002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000484210000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100c04410000000000000000000584210000100000000000000010000000000000060421000150000000000000000000000821c11000300000000000000000000000000000000000000000000000000000000000000284311007842100000000000000000008842100001000000000000000100000000000000904210000d00000000000000000000009d421000070000000000000000000000000000000000000000000000000000000000000028431100a44210000000000000000000b442100001000000000000000100000000000000642210000c00000000000000000000009d421000070000000000000000000000000000000000000000000000000000000000000028431100bc4210000000000000000000cc42100001000000000000000100000000000000d4421000110000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100c04410000000000000000000e842100001000000000000000100000000000000f04210000d0000000000000000000000ea1b1100110000000000000000000000000000000000000000000000000000000000000028431100184510000000000000000000004310000300000000000000010000000000000018431000060000000101000000000000561c11000c00000000000000561c11000c0000000000000000000000000000000000000028431100584310000000000000000000204310000100000000000000000000000000000028431000060000000101000000000000561c11000c000000000000002e431000290000000000000000000000000000000000000028431100584310000000000000000000684310000100000000000000000000000000000070431000050000000101000000000000561c11000c00000000000000332f10001100000000000000000000000000000000000000284311007843100000000000000000008843100001000000000000000100000000000000e01b11000a0000000101010000000000561c11000c00000000000000e23010001c0000000000000000000000000000000000000028431100904310000000000000000000a043100001000000000000000100000000000000a84310000a0000000101010000000000561c11000c00000000000000ea1b1100110000000000000000000000000000000000000028431100184510000000000000000000b443100001000000000000000100000000000000bc431000070000000101000000000000561c11000c00000000000000c3431000240000000000000000000000000000000000000028431100e84310000000000000000000f843100004000000000000000100000000000000184410000e0000000000000000000000ea1b11001100000000000000000000000000000000000000000000000000000000000000284311001845100000000000000000002844100001000000000000000100000000000000304410000a00000000000000000000003a441000080000000000000000000000000000000000000000000000000000000000000028431100c0441000000000000000000044441000010000000000000001000000000000004c441000140000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c4410000000000000000000b44210000100000000000000010000000000000060441000100000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c4410000000000000000000704410000200000000000000010000000000000080441000090000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c44100000000000000000009c44100003000000000000000100000000000000b44410000a0000000101000000000000561c11000c00000000000000821c1100030000000000000000000000000000000000000028431100c04410000000000000000000d044100002000000000000000100000000000000e04410000f0000000000000000000000ef4410002800000000000000000000000000000000000000000000000000000000000000284311001845100000000000000000002845100002000000000000000100000000000000384510000b00000000000000000000002f1c11000400000000000000000000000000000000000000000000000000000000000000284311004445100000000000000000005445100001000000000000000100000056616c696461746f72436f756e740000314c10002a0000004d696e696d756d56616c696461746f72436f756e7400000032000000000000000100000039000000e14b10005000000053657373696f6e52657761726450657262696c6c3200000000000000010000003a000000994b1000480000003200000000000000010000003b000000454b1000540000004f66666c696e65536c6173684772616365000000f74a10004e000000496e76756c6e657261626c6573000000234a100056000000794a100053000000cc4a10002b000000426f6e6465640000e3491000400000004c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0032000000000000000100000036000000924910005100000050617965650000003200000000000000010000003600000059491000390000003200000000000000010000003c00000008491000510000004e6f6d696e61746f72730000af481000590000005374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e003200000000000000010000003d000000f247100053000000454810004600000028431100000000008b4810002400000043757272656e74456c65637465640000b34710003f00000043757272656e74457261457261496e64657800009c4710001700000043757272656e7453657373696f6e52657761726443757272656e744572615265776172640f471000560000006547100037000000536c6f745374616b650000003200000000000000010000003e000000934610004c0000002843110000000000df46100030000000536c617368436f756e740000320000000000000001000000340000001f46100057000000764610001d000000526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e0032000000000000000100000035000000a345100055000000f845100027000000466f7263654e657745726100320000000000000001000000360000005c45100047000000205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202857686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e2054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e6420696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e5374616b696e672043757272656e7453657373696f6e5265776172645374616b696e672043757272656e744572615265776172645374616b696e6720466f7263654e65774572615374616b696e672043757272656e74456c6563746564804e100019000000a04e100048000000bb0100002d0000005374616b696e6720536c6f745374616b655374616b696e672043757272656e744572615374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e7468656164206f66205374616b696e672056616c696461746f727368656164206f66205374616b696e67204e6f6d696e61746f727300003f000000280000000400000040000000410000000000000000000000420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005374616b696e672053657373696f6e5265776172645374616b696e6720506179656500000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b110028000000004f10004200000060020000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f6c69622e72730000004f1000420000006002000001000000636f6e74726f6c6c657220616c726561647920706169726564737461736820616c726561647920626f6e6465646e6f74206120636f6e74726f6c6c65726e6f74206120737461736863616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b73756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d7074794c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656400a051100048000000b801000023000000a051100048000000b901000023000000795110001c0000005444110018000000ec0300000d0000003051100049000000870200001d000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f736f72742e7273617373657274696f6e206661696c65643a206d6964203c3d206c656e00000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727330511000490000009d0000003a0000003051100049000000a40000003000000054696d657374616d702055706461746554696d657374616d7020526563656e7448696e74730000004852100031000000795210004b000000790000000400000046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e7273dc52100023000000795210004b0000007a0000000400000046696e616c697a6564206865696768742061626f766520626c6f636b206e756d626572002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72734765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e74206461746154696d657374616d7020496e697469616c697a656454696d657374616d70204f72646572656448696e747354696d657374616d70204d656469616e54696d657374616d702057696e646f7753697a65616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656400005754100043000000795210004b000000b2000000040000000053100048000000870a00000a00000054696d657374616d70205265706f72744c6174656e63797072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b20716564000000000000c85410000a00000000000000d4541000010000000000000000000000ec541000020000000000000066696e616c5f68696e740000000000005972100004000000000000006dfc100017000000fc5410003d000000395510001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e73746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c6964207479706576616c69646174696f6e206572726f7200b05510007c0000002c561000480000007a00000006000000657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f6d6f642e727300000000245710000b0000000000000028a4100002000000000000000000000030571000010000000000000000000000385710001000000000000000ece6100001000000000000000000000048571000010000000000000000000000505710000c0000000000000064a410000100000000000000000000005c571000010000000000000000000000645710000e0000000000000074571000020000000000000000000000845710000100000000000000566f746572526561706564004058100015000000426164526561706572536c6173686564315810000f00000054616c6c7953746172746564f45710003d00000054616c6c7946696e616c697a65640000e65710000e000000e65710000e0000008c5710005a00000020412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e5665633c4163636f756e7449643e20412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c2072656170657200000000000000dc5810000a00000000000000e8581000020000000000000000000000f8581000010000000000000000000000005910000d00000000000000ece6100001000000000000000000000010591000010000000000000000000000f4a310000800000000000000185910000400000000000000000000003859100001000000000000004e65774163636f756e740000f6081100090000005bf6100007000000835910001b0000005265617065644163636f756e740000006c59100017000000f608110009000000f6081100090000005bf61000070000005bf6100007000000405910002c000000205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e416c69766520636f6e7472616374206f7220746f6d6273746f6e6520616c726561647920657869737473647572696e6720657865637574696f6e703b110028000000f05910004c0000005f000000080000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f72756e74696d652e727376657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e7442616c616e63657320546f74616c49737375616e636542616c616e636573204578697374656e7469616c4465706f73697442616c616e636573205472616e73616374696f6e4261736546656542616c616e636573205472616e73616374696f6e42797465466565436f756e63696c205265676973746572496e666f4f6642616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e6365436f756e63696c20416374697665436f756e63696c42616c616e636573204c6f636b73616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f776564f05b10004300000055010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f62616c616e6365732f7372632f6c69622e7273004c5c1000330000007f5c10004a000000ad00000005000000636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6163636f756e745f64622e7273707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a09090909716564000000000000f46010000d00000000000000046110000300000000000000000000004c6110001800000000000000000000000c6210001300000000000000046110000300000000000000000000002062100006000000000000000000000050621000130000000000000064621000040000000000000000000000c46210000c0000000000000000000000246310000d00000000000000346310000100000000000000000000004c6310000a00000000000000000000009c6310001000000000000000ac631000010000000000000000000000c46310000d00000000000000000000002c6410000e000000000000003c64100003000000000000000000000084641000080000000000000000000000c46410001100000000000000d8641000010000000000000000000000f0641000030000000000000000000000086510000d0000000000000018651000010000000000000000000000306510000400000000000000000000005065100019000000000000006c651000010000000000000000000000846510000200000000000000000000009465100011000000000000006c651000010000000000000000000000a865100002000000000000007365745f617070726f76616c73000000000000004b72100005000000000000005072100009000000000000000b0f110005000000000000003469100012000000000000005972100004000000000000005d72100008000000196e100058000000cd6d1000100000002843110000000000716e100030000000a16e10004a0000002843110000000000eb6e100035000000206f100051000000716f10002c0000009d6f100053000000f06f1000620000005270100060000000b27010001d000000cf70100057000000267110003500000028431100000000005b7110006b000000c67110001d0000002843110000000000d31911000b000000de19110008000000e3711000270000000a72100041000000fc1911000c00000070726f78795f7365745f617070726f76616c7300686d100065000000cd6d1000100000002843110000000000d31911000b000000dd6d10003c000000fc1911000c000000726561705f696e6163746976655f766f74657200000000003f6d10000e00000000000000266810000c000000000000006367100003000000000000009efd100023000000000000004d6d10000900000000000000266810000c00000000000000566d100012000000000000003469100012000000de6b100058000000366c10005c000000926c1000280000002843110000000000ba6c1000450000002843110000000000ff6c1000400000002843110000000000d31911000b000000de19110008000000b76b100027000000fc1911000c000000726574726163745f766f746572000000000000000b0f11000500000000000000266810000c000000db6a10004b0000002843110000000000266b1000420000002843110000000000686b10004f0000002843110000000000d31911000b000000de19110008000000b76b100027000000fc1911000c0000007375626d69745f63616e64696461637900000000d76a10000400000000000000266810000c000000466910001e000000284311000000000064691000440000002843110000000000a869100048000000f069100051000000416a10004c0000008d6a10001e0000002843110000000000d31911000b000000ab6a100018000000c36a100014000000fc1911000c00000070726573656e745f77696e6e65720000000000002669100009000000000000009efd100023000000000000002f69100005000000000000004cfc100015000000000000000b0f11000500000000000000346910001200000032681000590000008b68100068000000f36810001e0000002843110000000000d31911000b000000116910001500000093fb100011000000fc1911000c0000007365745f646573697265645f7365617473000000000000007a6610000500000000000000266810000c0000006667100059000000bf67100052000000116810001500000072656d6f76655f6d656d626572000000000000006367100003000000000000009efd1000230000007f6610004c0000002843110000000000cb6610004800000013671000500000007365745f70726573656e746174696f6e5f6475726174696f6e000000000000007a66100005000000000000006dfc10001700000024661000560000000c661000180000007365745f7465726d5f6475726174696f6e000000b8651000540000000c6610001800000020536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722066726f6d2074686520636f756e63696c2e20546869732069732065666665637469766520696d6d6564696174656c792e204e6f74653a20412074616c6c792073686f756c642068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e436f6d706163743c7533323e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e28296020607369676e6564602073686f756c642068617665206174206c65617374202d204f28766f746572732920636f6d707574652e63616e646964617465746f74616c436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e204e4f54453a20696620606f726967696e602068617320616c72656164792061737369676e656420617070726f76616c7320766961205b607365745f617070726f76616c73605d2c2069742077696c6c204e4f54206861766520616e7920757361626c652066756e647320746f20706173732063616e64696461637920626f6e6420616e64206d75737420666972737420726574726163742e204e6f746520746861742073657474696e6720617070726f76616c732077696c6c206c6f636b2074686520656e746972652062616c616e6365206f662074686520766f74657220756e74696c2072657472616374696f6e206f72206265696e67207265706f727465642e202d20496e646570656e64656e74206f6620696e7075742e202d205468726565204442206368616e6765732e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2054686520696e646578206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e20416c736f2072656d6f76657320746865206c6f636b206f6e207468652062616c616e6365206f662074686520766f7465722e20536565205b60646f5f7365745f617070726f76616c732829605d2e202d2054776f20666577657220444220656e74726965732c206f6e65204442206368616e67652e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e20426f746820696e6469636573206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e202d2053616d6520617320607365745f617070726f76616c73602077697468206f6e65206164646974696f6e616c2073746f7261676520726561642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473204c6f636b732074686520746f74616c2062616c616e6365206f662063616c6c657220696e646566696e6974656c792e204f6e6c79205b60726574726163745f766f746572605d206f72205b60726561705f696e6163746976655f766f746572605d2063616e20756e6c6f636b207468652062616c616e63652e206068696e746020617267756d656e7420697320696e74657270726574656420646966666572656e746c79206261736564206f6e3a202d20696620606f726967696e602069732073657474696e6720617070726f76616c7320666f72207468652066697273742074696d653a2054686520696e6465782077696c6c20626520636865636b656420666f72206265696e6720612076616c6964205f686f6c655f20696e2074686520766f746572206c6973742e2020202d206966207468652068696e7420697320636f72726563746c7920706f696e74696e6720746f206120686f6c652c206e6f206665652069732064656475637465642066726f6d20606f726967696e602e2020202d204f74686572776973652c207468652063616c6c2077696c6c2073756363656564206275742074686520696e6465782069732069676e6f72656420616e642073696d706c792061207075736820746f20746865206c617374206368756e6b2020207769746820667265652073706163652068617070656e732e20496620746865206e65772070757368206361757365732061206e6577206368756e6b20746f20626520637265617465642c20612066656520696e646963617465642062792020205b60566f74696e67466565605d2069732064656475637465642e202d20696620606f726967696e6020697320616c7265616479206120766f7465723a2074686520696e646578205f5f6d7573745f5f2062652076616c696420616e6420706f696e7420746f2074686520636f727265637420706f736974696f6e206f662074686520606f726967696e6020696e207468652063757272656e7420766f74657273206c6973742e204e6f7465207468617420616e7920747261696c696e67206066616c73656020766f74657320696e2060766f746573602069732069676e6f7265643b20496e20617070726f76616c20766f74696e672c206e6f7420766f74696e6720666f7220612063616e64696461746520616e6420766f74696e672066616c73652c2061726520657175616c2e202d2054776f20657874726120444220656e74726965732c206f6e65204442206368616e67652e202d20417267756d656e742060766f74657360206973206c696d6974656420696e206c656e67746820746f206e756d626572206f662063616e646964617465732e766f7465735665633c626f6f6c3e68696e74536574496e646578436f756e63696c00000000547a10000d0000000000000000000000c30011000c0000000000000000000000000000000000000000000000000000000000000028431100647a10000000000000000000747a1000010000000000000001000000000000007c7a10000a0000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311004c9310000000000000000000887a100001000000000000000100000000000000907a1000090000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311004c93100000000000000000009c7a100001000000000000000100000000000000a47a1000140000000000000000000000c30011000c0000000000000000000000000000000000000000000000000000000000000028431100b87a10000000000000000000c87a100001000000000000000100000000000000d07a10000a0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100dc7a10000000000000000000ec7a100001000000000000000100000000000000f47a1000140000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100587b10000000000000000000087b100001000000000000000100000000000000107b1000130000000000000000000000237b10000900000000000000000000000000000000000000000000000000000000000000284311002c7b100000000000000000003c7b1000020000000000000001000000000000004c7b10000c0000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100587b10000000000000000000687b100001000000000000000100000000000000707b10000c0000000000000000000000e30011000e00000000000000000000000000000000000000000000000000000000000000284311007c7b100000000000000000008c7b100001000000000000000100000000000000947b10000c0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000a07b100001000000000000000100000000000000a87b10000a0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100b47b10000000000000000000c47b100004000000000000000100000000000000e47b10000d0000000000000000000000f17b10002300000000000000000000000000000000000000000000000000000000000000284311006c7d10000000000000000000147c100004000000000000000100000000000000347c1000090000000000000000000000237b1000090000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000407c100001000000000000000100000000000000487c10000b0000000101000000000000537c100018000000000000006b7c10001100000000000000000000000000000000000000284311006c7d100000000000000000007c7c100005000000000000000100000000000000a47c10000e0000000101000000000000561c11000c00000000000000b27c1000100000000000000000000000000000000000000028431100c09210000000000000000000c47c100002000000000000000000000000000000d47c10000b0000000101000000000000561c11000c00000000000000df7c1000170000000000000000000000000000000000000028431100f87c10000000000000000000087d100001000000000000000000000000000000107d10000600000001010000000000005d7210000800000000000000167d10001900000000000000000000000000000000000000284311006c7d10000000000000000000307d100001000000000000000100000000000000387d10000c00000000000000000000005d721000080000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000447d1000010000000000000001000000000000004c7d10000a00000000000000000000005d721000080000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000587d100001000000000000000100000000000000607d10000a0000000000000000000000ea1b11001100000000000000000000000000000000000000000000000000000000000000284311006c7d100000000000000000007c7d100001000000000000000100000000000000847d10000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000a47d100001000000000000000100000000000000ac7d10000c0000000000000000000000b87d1000280000000000000000000000000000000000000000000000000000000000000028431100e07d10000000000000000000f07d100001000000000000000000000000000000f87d10000b0000000000000000000000037e1000210000000000000000000000000000000000000000000000000000000000000028431100247e10000000000000000000347e100002000000000000000000000043616e646964616379426f6e6400000032000000000000000100000043000000f586100041000000566f74696e67426f6e640000b386100042000000566f74696e674665650000004c8610006700000050726573656e74536c617368506572566f7465723200000000000000010000004400000009861000430000004361727279436f756e74000032000000000000000100000045000000bc8510004d00000050726573656e746174696f6e4475726174696f6e6d8510004f000000496e6163746976654772616365506572696f64566f7465496e64657832000000000000000100000046000000f1841000680000005985100014000000566f74696e67506572696f6432000000000000000100000047000000c38410002e0000005465726d4475726174696f6e320000000000000001000000480000009d84100026000000446573697265645365617473638410003a0000004465636179526174696f000032000000000000000100000049000000388310004d000000858310003b000000c08310005b0000001b84100048000000416374697665436f756e63696c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e0b8210005b000000668210005c000000c28210005c0000001e8310001a000000566f7465436f756e74000000c481100047000000417070726f76616c734f6628543a3a4163636f756e7449642c20536574496e646578295665633c417070726f76616c466c61673eaf8010006800000028431100000000001781100059000000284311000000000070811000540000005265676973746572496e666f4f6628566f7465496e6465782c207533322900003a8010005f0000009980100016000000566f746572496e666f4f66566f746572496e666f3c42616c616e63654f663c543e3e0000320000000000000001000000360000001980100021000000566f746572735665633c4f7074696f6e3c543a3a4163636f756e7449643e3e00d67f1000430000004e657874566f746572536574977f10003f000000566f746572436f756e7400007d7f10001a00000043616e64696461746573000032000000000000000100000035000000617f10001c00000043616e646964617465436f756e740000320000000000000001000000340000003d7f1000240000004e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e2932000000000000000100000033000000f57e1000480000004c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e32000000000000000100000033000000447e100067000000ab7e10004a0000002047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e2054686520666972737420656c656d656e742069732074686520776569676874206f66206561636820656e7472793b204974206d617920626520746865206469726563742073756d6d656420617070726f76616c207374616b65732c206f7220612077656967687465642076657273696f6e206f662069742e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e2043757272656e74206e756d626572206f66206163746976652063616e64696461746573205468652070726573656e742063616e646964617465206c6973742e2043757272656e74206e756d626572206f6620566f746572732e20746865206e65787420667265652073657420746f2073746f7265206120766f74657220696e2e20546869732077696c6c206b6565702067726f77696e672e205468652070726573656e7420766f746572206c69737420286368756e6b656420616e6420636170706564206174205b60564f5445525f5345545f53495a45605d292e20426173696320696e666f726d6174696f6e2061626f7574206120766f7465722e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722e2054686520766f746573206172652073746f726564206173206e756d657269632076616c75657320616e642070617273656420696e2061206269742d77697365206d616e6e65722e20496e206f7264657220746f2067657420612068756d616e2d7265616461626c6520726570726573656e746174696f6e2028605665633c626f6f6c3e60292c20757365205b60616c6c5f617070726f76616c735f6f66605d2e20467572746865726d6f72652c206561636820766563746f72206f66207363616c617273206973206368756e6b656420776974682074686520636170206f662060415050524f56414c5f5345545f53495a45602e2054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e20446563617920666163746f72206f6620776569676874207768656e206265696e6720616363756d756c617465642e2049742073686f756c64207479706963616c6c792062652073657420746f205f5f6174206c656173745f5f2060636f756e63696c5f73697a65202d316020746f206b6565702074686520636f756e63696c207365637572652e205768656e2073657420746f20604e602c20697420696e64696361746573206028312f4e295e7460206f66207374616b656420697320646563617965642061742077656967687420696e6372656d656e742073746570206074602e20302077696c6c20726573756c7420696e206e6f20776569676874206265696e6720616464656420617420616c6c20286e6f726d616c20617070726f76616c20766f74696e67292e204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206d616e7920766f746520696e6469636573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e2054686520616d6f756e74206f662066656520706169642075706f6e206561636820766f7465207375626d697373696f6e2c20756e6c6573732069662074686579207375626d69742061205f686f6c655f20696e64657820616e64207265706c6163652069742e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e00000000000090871000080000000000000098871000020000000000000000000000c8871000170000000000000000000000808810000b000000000000008c881000030000000000000000000000d48810000d000000000000007472616e736665720000000025ad100004000000000000009efd100023000000000000008efd10000500000000000000f18a100013000000108b1000360000002843110000000000468b100042000000888b100048000000d08b100045000000158c10002d0000002843110000000000428c1000460000002843110000000000d31911000b000000888c10004c000000d48c100033000000078d10005a0000002843110000000000618d1000130000002843110000000000748d100054000000c88d10004b000000138e100035000000488e1000370000007f8e1000560000002843110000000000fc1911000c0000007365745f62616c616e636500000000006367100003000000000000009efd10002300000000000000e98a10000800000000000000f18a10001300000000000000048b10000c00000000000000f18a1000130000003c8910002500000028431100000000006189100048000000a989100042000000eb89100046000000318a10003a00000028431100000000006b8a10002d0000002843110000000000d31911000b000000988a100020000000b88a100031000000fc1911000c00000020536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e6e65775f66726565436f6d706163743c543a3a42616c616e63653e6e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c2074726967676572202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e42616c616e6365732056657374696e6742616c616e63657300000000000000609210000d00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c93100000000000000000007892100001000000000000000100000000000000809210001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c9310000000000000000000949210000100000000000000010000000000000018bc10000b00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000024bc1000010000000000000001000000000000002cbc10000b00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000038bc10000100000000000000010000000000000040bc10001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000054bc1000010000000000000001000000000000005cbc10001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000080bc1000010000000000000001000000000000009c921000070000000101000000000000561c11000c00000000000000a39210001b0000000000000000000000000000000000000028431100c09210000000000000000000d092100001000000000000000000000000000000d89210000b0000000101000000000000561c11000c000000000000006d9210000a00000000000000000000000000000000000000284311004c9310000000000000000000e49210000b0000000000000001000000000000003c9310000f0000000101000000000000561c11000c000000000000006d9210000a00000000000000000000000000000000000000284311004c93100000000000000000005c9310000b000000000000000100000000000000b4931000050000000101000000000000561c11000c00000000000000b99310002c0000000000000000000000000000000000000028431100e89310000000000000000000f8931000010000000000000001000000546f74616c49737375616e6365543a3a42616c616e6365005e991000260000004578697374656e7469616c4465706f7369740000299910003500000056657374696e6756657374696e675363686564756c653c543a3a42616c616e63653e000032000000000000000100000036000000f3981000360000004672656542616c616e63650079961000270000002843110000000000a096100050000000f09610005d0000004d97100055000000a29710004f000000f197100051000000429810001500000028431100000000005798100057000000ae98100045000000526573657276656442616c616e6365003200000000000000010000003e0000002e9410005d0000008b941000270000002843110000000000b29410005b0000000d951000490000002843110000000000569510005d000000b39510002d0000002843110000000000e09510005300000033961000460000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00000032000000000000000100000035000000009410002e00000020416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e20546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e436f756e63696c20566f74696e67506572696f64f09b100039000000a09b100048000000100200002d000000436f756e63696c20446573697265645365617473436f756e63696c204e65787446696e616c697a65436f756e63696c205465726d4475726174696f6e309b100048000000870a00000a000000809b100019000000a09b100048000000bb0100002d000000436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c204361727279436f756e74436f756e63696c204c6561646572626f617264000000309b1000480000008d0a00000e000000436f756e63696c2043616e64696461746573436f756e63696c2043616e646964617465436f756e74436f756e63696c20566f7465436f756e74436f756e63696c2043616e646964616379426f6e64436f756e63696c20566f746572496e666f4f6647757275206d656469746174696f6e66696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e436f756e63696c20417070726f76616c734f66436f756e63696c20566f7465727300002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f6e6f7420656e6f75676820667265652066756e64730000703b110028000000f05b1000430000005501000001000000703b110028000000709c10004400000098000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f73656174732e7273709c100044000000980000000100000042616c616e636573204372656174696f6e46656542616c616e636573205472616e73666572466565676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c75656e6f7420612070726f787963616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572696e76616c6964207265706f7274657220696e646578766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665436f756e63696c20496e6163746976654772616365506572696f64696e76616c69642074617267657420696e646578626164207265706f7274657220696e6465786261642074617267657420696e646578436f756e63696c20566f74696e67426f6e6472657472616374696f6e20696e646578206d69736d6174636872657472616374696f6e20696e64657820696e76616c696463616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f7465726475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e64737374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f63616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e746c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647370726573656e7465642063616e646964617465206d7573742062652063757272656e7463616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c6563746564436f756e63696c204465636179526174696f6475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c436f756e63696c2050726573656e74536c617368506572566f746572436f756e63696c20566f746572436f756e746e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e64696461746573696e76616c696420766f74657220696e64657877726f6e6720766f74657220696e6465786e657720766f746572206d75737420686176652073756666696369656e742066756e647320746f207061792074686520626f6e64436f756e63696c204e657874566f746572536574436f756e63696c20566f74696e67466565000014a210001d000000b831110013000000db03000009000000617373657274696f6e206661696c65643a20696e646578203c206c656e00000050a2100043000000ce0a0000250000000000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962616c6c6f632f7665632e72730050a2100043000000d40a00002c000000746f6f206d616e7920696e737472756374696f6e73436f6e7472616374204163636f756e74436f756e746572436f6e74726163742053746f7261676553697a654f6666736574000000000000f4a310000800000000000000fca3100003000000000000000000000014a410000100000000000000000000001ca410000c0000000000000028a4100002000000000000000000000038a4100001000000000000000000000040a410000a00000000000000180711000100000000000000000000004ca4100001000000000000000000000054a410000f0000000000000064a410000100000000000000000000006ca4100001000000000000000000000074a410000a0000000000000080a4100002000000000000000000000090a41000020000000000000000000000a0a410000800000000000000a8a41000020000000000000000000000b8a4100001000000000000005472616e73666572f608110009000000f6081100090000005bf6100007000000e3a5100055000000496e7374616e746961746564f608110009000000f608110009000000aca5100037000000436f646553746f72656400007ea510002e0000005363686564756c655570646174656400821c1100030000004ea5100030000000446973706174636865640000f6081100090000002f1c110004000000e3a410004e00000031a510001d000000436f6e7472616374f608110009000000181a110007000000c0a410002300000020416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e44656164206f7220696e6578697374656e74206163636f756e7420686173206265656e206578656d70742061626f76653b2071656464656661756c743a436f6e7472616374204761735370656e74436f6e747261637420426c6f636b4761734c696d6974436f6e747261637420436f6e7472616374496e666f4f66436f6e7472616374204761735072696365436f6e74726163742052656e7442797465466565436f6e747261637420546f6d6273746f6e654465706f736974436f6e74726163742052656e744465706f7369744f6666736574436f6e7472616374205472616e73616374696f6e42617365466565436f6e7472616374205472616e73616374696f6e4279746546656500000054a710004300000058010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6c69622e72730000000000a0a810000f00000000000000b0a81000010000000000000000000000c8a81000030000000000000000000000e0a810000800000000000000e8a8100002000000000000000000000018a9100002000000000000000000000027221100040000000000000028a9100004000000000000000000000088a91000070000000000000000000000c0a910000600000000000000c8a9100004000000000000000000000028aa10000a000000000000000000000078aa10000f0000000000000088aa1000020000000000000000000000b8aa1000050000000000000000000000e0aa10000a00000000000000ecaa10000400000000000000000000004cab100006000000000000007570646174655f7363686564756c6500000000006eb31000080000000000000076b3100010000000feb210002d00000028431100000000002bb31000430000007075745f636f646500000000bdb010000900000000000000c6b010000f00000000000000fab210000400000000000000181a1100070000006eb2100057000000c5b21000350000000000000025ad100004000000000000009efd100023000000000000008efd100005000000000000004cfc10001500000000000000bdb010000900000000000000c6b010000f00000000000000d5b010000400000000000000181a110007000000d9b010004200000028431100000000001bb110004a00000065b110002c00000091b1100046000000d7b110005200000029b2100045000000637265617465000000000000b4b0100009000000000000004cfc10001500000000000000bdb010000900000000000000c6b010000f0000000000000029ad1000090000000000000032ad10000b00000000000000d5b010000400000000000000181a1100070000009dae10006a000000284311000000000007af100021000000284311000000000028af10005000000078af100041000000b9af10005b00000014b01000570000006bb010002a00000095b010001f000000636c61696d5f737572636861726765000000000025ad10000400000000000000561c11000c000000000000007fae10000a0000000000000089ae10001400000065ad10005c000000c1ad100045000000284311000000000006ae10004e00000054ae10002b000000726573746f72655f746f00000000000025ad10000400000000000000561c11000c0000000000000029ad1000090000000000000032ad10000b000000000000003dad10000e00000000000000c30011000c000000000000004bad1000050000000000000050ad1000150000007cab1000400000002843110000000000bcab10006f0000002bac10004e00000079ac100064000000ddac10004800000020416c6c6f7773206120636f6e747261637420746f20726573746f7265206120746f6d6273746f6e6520627920676976696e67206974732073746f726167652e2054686520636f6e747261637420746861742077616e747320746f20726573746f72652028692e652e206f726967696e206f66207468652063616c6c2c206f7220606d73672e73656e6465726020696e20536f6c6964697479207465726d73292077696c6c20636f6d70757465206120746f6d6273746f6e652077697468206974732073746f7261676520616e642074686520676976656e20636f64655f686173682e2049662074686520636f6d707574656420746f6d6273746f6e65206d61746368207468652064657374696e6174696f6e206f6e652c207468652064657374696e6174696f6e20636f6e747261637420697320726573746f7265642077697468207468652072656e745f616c6c6f77616e636560207370656369666965642c207768696c6520746865206f726967696e2073656e647320616c6c206974732066756e647320746f207468652064657374696e6174696f6e20616e642069732072656d6f7665642e64657374636f64655f68617368436f6465486173683c543e72656e745f616c6c6f77616e636564656c74615665633c657865633a3a53746f726167654b65793e20416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f6475636572206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e20496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e6175785f73656e6465724f7074696f6e3c543a3a4163636f756e7449643e20437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e746761735f6c696d6974436f6d706163743c543a3a4761733e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c653c543a3a4761733e00000000000018bb1000130000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110000be100000000000000000002cbb1000040000000000000001000000000000004cbb1000100000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc100000000000000000005cbb10000100000000000000010000000000000064bb1000110000000000000000000000821c110003000000000000000000000000000000000000000000000000000000000000002843110078bb1000000000000000000088bb10000200000000000000010000000000000098bb10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc10000000000000000000a4bb100001000000000000000100000000000000acbb1000110000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc10000000000000000000c0bb100007000000000000000100000000000000f8bb10000f0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000008bc10000200000000000000010000000000000018bc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000024bc1000010000000000000001000000000000002cbc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000038bc10000100000000000000010000000000000040bc1000120000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000054bc1000010000000000000001000000000000005cbc1000120000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000080bc10000100000000000000010000000000000088bc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110094bc10000000000000000000a4bc100001000000000000000100000000000000acbc10000b0000000000000000000000b7bc1000060000000000000000000000000000000000000000000000000000000000000028431100c0bc10000000000000000000d0bc100001000000000000000100000000000000d8bc10000d0000000000000000000000b7bc1000060000000000000000000000000000000000000000000000000000000000000028431100e8bc10000000000000000000f8bc10000100000000000000010000000000000000bd1000080000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110008bd1000000000000000000018bd10000100000000000000010000000000000020bd1000080000000000000000000000821c110003000000000000000000000000000000000000000000000000000000000000002843110028bd1000000000000000000038bd10000100000000000000010000000000000040bd10000d0000000000000000000000b7bc100006000000000000000000000000000000000000000000000000000000000000002843110050bd1000000000000000000060bd10000100000000000000010000000000000068bd1000080000000000000000000000b7bc100006000000000000000000000000000000000000000000000000000000000000002843110000be1000000000000000000070bd10000100000000000000010000000000000078bd10000f000000000000000000000076b3100010000000000000000000000000000000000000000000000000000000000000002843110088bd1000000000000000000098bd100001000000000000000100000000000000a0bd10000c000000010100000000000032ad10000b00000000000000181a1100070000000000000000000000000000000000000028431100d8bd10000000000000000000acbd100001000000000000000000000000000000b4bd10000b000000010100000000000032ad10000b00000000000000bfbd1000160000000000000000000000000000000000000028431100d8bd10000000000000000000e8bd100001000000000000000000000000000000f0bd10000e000000000000000000000095d1100003000000000000000000000000000000000000000000000000000000000000002843110000be1000000000000000000010be10000100000000000000010000000000000018be10000e0000000101000000000000561c11000c0000000000000026be10000f000000000000000000000000000000000000002843110038be1000000000000000000048be10000100000000000000000000005369676e6564436c61696d48616e6469636170002ec4100038000000284311000000000066c4100042000000a8c410001a000000546f6d6273746f6e654465706f736974f9c310003500000053746f7261676553697a654f66667365740000003200000000000000010000003400000080c310004b000000cbc310002e00000052656e74427974654665650033c310004d00000052656e744465706f7369744f6666736574000000bbc1100041000000fcc1100016000000284311000000000012c210005a0000006cc2100056000000c2c210005300000015c310001e0000005375726368617267655265776172640068c1100039000000a1c110001a0000005472616e736665724665650043c11000250000004372656174696f6e466565001cc11000270000005472616e73616374696f6e426173654665650000e5c01000370000005472616e73616374696f6e4279746546656500003200000000000000010000003e000000a2c0100043000000436f6e7472616374466565003200000000000000010000004a00000072c010003000000043616c6c42617365466565543a3a4761730000003200000000000000010000004b00000040c0100032000000437265617465426173654665650000003200000000000000010000004c00000012c010002e000000476173507269636532000000000000000100000044000000f4bf10001e0000004d617844657074683200000000000000010000004d000000c2bf100032000000426c6f636b4761734c696d69740000003200000000000000010000004e00000086bf10003c0000004761735370656e7466bf10002000000043757272656e745363686564756c65003200000000000000010000004f00000041bf1000250000005072697374696e65436f6465e8be100059000000436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c65000000320000000000000001000000360000008fbe1000590000004163636f756e74436f756e7465720000320000000000000001000000500000007abe100015000000436f6e7472616374496e666f4f66436f6e7472616374496e666f3c543e0000003200000000000000010000003300000050be10002a0000002054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20546865207375627472696520636f756e7465722e2041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e20546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e20546865207072696365206f66206f6e6520756e6974206f66206761732e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c656420746f2072656d6f76616c206f66206120636f6e74726163742e2054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f66667365742074686520636f7374206f66206f6e6520627974652e204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e20427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c207468656e20697420776f756c6420706179203530302042552f6461792e205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e2053697a65206f66206120636f6e7472616374206174207468652074696d65206f66206372656174696f6e2e205468697320697320612073696d706c652077617920746f20656e73757265207468617420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e20546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e205768656e20636c61696d2073757263686167652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b656420666f722063757272656e745f626c6f636b202d2064656c6179436f6e747261637420436f646553746f72616765636f6465206973206e6f7420666f756e64436f6e7472616374205072697374696e65436f64657072697374696e6520636f6465206973206e6f7420666f756e64000067c710001e00000085c710001f00000066756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2071656466756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2066756e6374696f6e5f73656374696f6e5f6c656e203d3d20636f64655f73656374696f6e5f6c656e3b2071656400004dc710001a00000028c710000a00000032c710001b00000073746172742066756e6374696f6e20657870656374656420746f20686176652074797065205b5d202d3e205b5d00000080c610001100000060c610002000000040c610002000000018c61000280000007365676d656e74206f66667365742073686f756c642072657475726e20493332746f6f206d616e79206d656d6f727920726567696f6e7320696e20696e6465782073706163653a20746f6f206d616e79207461626c657320696e20696e6465782073706163653a20747279696e6720746f20696d706f7274206d757461626c6520676c6f62616c206475706c6963617465206578706f727420000000acc610001c000000c8c610005a0000004d0000002800000048617368207461626c65206361706163697479206f766572666c6f772f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6861736862726f776e2d302e312e382f7372632f7261772f6d6f642e72730000ffffffff46756e6374696f6e20232072656164696e672f76616c69646174696f6e206572726f723a204d697373696e6720626f647920666f722066756e6374696f6e206c656e677468206f662066756e6374696f6e2073656374696f6e206973202c207768696c65206c656e206f6620636f64652073656374696f6e20697320703b11002800000054a71000430000005801000001000000436f6e74726163742043757272656e745363686564756c656e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e747468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f6465436f6e7472616374205369676e6564436c61696d48616e6469636170436f6e747261637420537572636861726765526577617264496e76616c69642073757263686172676520636c61696d3a206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e7443616e6e6f7420726573746f72652066726f6d20696e6578697374696e67206f7220746f6d6273746f6e6520636f6e74726163744f726967696e20547269654964207772697474656e20696e207468652063757272656e7420626c6f636b546f6d6273746f6e657320646f6e2774206d6174636843616e6e6f7420726573746f726520746f20696e6578697374696e67206f7220616c69766520636f6e7472616374436f6e7472616374204d61784465707468436f6e747261637420436f6e7472616374466565436f6e7472616374204372656174696f6e466565436f6e7472616374205472616e73666572466565436f6e74726163742043616c6c42617365466565436f6e7472616374204372656174654261736546656552657475726e207479706573206c656e6774682073686f756c642062652030206f722031626164206f726967696e3a20657870656374656420746f206265206e6f206f726967696e626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e64657854696d657374616d702044696455706461746553797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e7369637357656967687400f0ca10002b0000001bcb100044000000f70000000400000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74696d657374616d702f7372632f6c69622e727353797374656d2045787472696e73696344617461008ccb1000300000001bcb100044000000e10000000400000054696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636bd4cb10004e0000001bcb100044000000e20000000400000054696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f7753797374656d204e756d62657253797374656d2045787472696e73696373526f6f7454696d657374616d7020426c6f636b506572696f6454696d657374616d70204d696e696d756d506572696f6453797374656d2044696765737453797374656d20426c6f636b4861736853797374656d204163636f756e744e6f6e6365000000d0cc100019000000f0cc100048000000bb0100002d0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b11002800000050cd100041000000c3000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f73797374656d2f7372632f6c69622e727300000050cd100041000000c30000000100000054696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e74206461746173657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a090909716564000000703b110028000000983b110050000000370100000900000053797374656d20506172656e744861736853797374656d2052616e646f6d4d6174657269616c0000f0ce1000480000008d0a00000e00000053797374656d204576656e747353797374656d204576656e74436f756e7453797374656d204576656e74546f706963730000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000014d0100006000000000000001cd0100001000000000000000000000034d010000100000000000000000000003cd010000e000000000000004cd0100001000000000000000000000064d010000100000000000000000000006cd01000080000000000000074d010000100000000000000000000008cd0100001000000000000000000000094d010000b00000000000000a0d01000010000000000000000000000b8d01000010000000000000000000000c0d010000c00000000000000ccd01000010000000000000000000000e4d01000010000000000000072656d61726b000000000000b3d110000700000000000000181a11000700000098d110001b0000007365745f686561705f706167657300000000000090d11000050000000000000095d110000300000051d110003f0000007365745f636f646500000000c5ed10000300000000000000181a1100070000003fd11000120000007365745f73746f7261676500000000002dd11000050000000000000032d110000d00000012d110001b0000006b696c6c5f73746f7261676500000000081a110004000000000000000ad1100008000000ecd010001e000000204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e5665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573753634204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b53797374656d0000000038d610000c0000000101000000000000561c11000c0000000000000044d6100008000000000000000000000000000000000000002843110084e1100000000000000000004cd610000100000000000000010000000000000054d610000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100a8e11000000000000000000064d61000010000000000000000000000000000006cd61000130000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100a8e11000000000000000000080d610000100000000000000000000000000000088d61000090000000101000000000000e30011000e00000000000000040f110007000000000000000000000000000000000000002843110038d71000000000000000000094d61000010000000000000001000000000000009cd610000d0000000101000000000000821c11000300000000000000181a1100070000000000000000000000000000000000000028431100acd610000000000000000000bcd6100001000000000000000100000000000000c4d610000e0000000000000000000000d2d61000120000000000000000000000000000000000000000000000000000000000000028431100e4d610000000000000000000f4d610000200000000000000010000000000000004d71000060000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110084e1100000000000000000000cd710000100000000000000010000000000000014d710000a0000000000000000000000040f110007000000000000000000000000000000000000000000000000000000000000002843110038d71000000000000000000020d710000100000000000000010000000000000028d710000e0000000000000000000000040f110007000000000000000000000000000000000000000000000000000000000000002843110038d71000000000000000000048d710000100000000000000010000000000000050d7100006000000000000000000000056d710000b000000000000000000000000000000000000000000000000000000000000002843110064d71000000000000000000074d71000010000000000000001000000000000007cd7100006000000000000000000000082d71000230000000000000000000000000000000000000000000000000000000000000028431100a8d710000000000000000000b8d7100001000000000000000100000000000000c0d710000a0000000000000000000000cad710000a0000000000000000000000000000000000000000000000000000000000000028431100d4d710000000000000000000e4d7100001000000000000000100000000000000ecd710000b0000000201010000000000f7d710000200000000000000040f11000700000000000000f9d710002100000000000000284311001cd8100000000000000000002cd810000d00000000000000010000004163636f756e744e6f6e6365543a3a496e64657815de10001f00000045787472696e736963436f756e740000e7dd10002e000000416c6c45787472696e7369637357656967687400a2dd100045000000426c6f636b486173680000007cdd10002600000045787472696e73696344617461000000320000000000000001000000350000002ddd10004f00000052616e646f6d4d6174657269616c2869382c205665633c543a3a486173683e293200000000000000010000005100000070dc100069000000d9dc1000540000004e756d62657200002edc100042000000506172656e7448617368000012dc10001c00000045787472696e73696373526f6f74000032000000000000000100000052000000cddb1000450000004469676573744469676573744f663c543e0000003200000000000000010000003500000091db10003c0000004576656e74735665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e0000003200000000000000010000003500000069db1000280000004576656e74436f756e744576656e74496e646578320000000000000001000000340000003bdb10002e0000004576656e74546f7069637328295665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e00003200000000000000010000003500000094d8100049000000ddd8100025000000284311000000000002d910004b0000004dd910002a000000284311000000000077d9100054000000cbd91000510000001cda100039000000284311000000000055da100053000000a8da100053000000fbda100040000000204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20546865206669727374206b657920736572766573206e6f20707572706f73652e2054686973206669656c64206973206465636c6172656420617320646f75626c655f6d6170206a75737420666f7220636f6e76656e69656e6365206f66207573696e67206072656d6f76655f707265666978602e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e20536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e6720627566666572207769746820746865206069386020707265666978206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e0000000060de1000030000000000000064de10000100000000000000000000007cde100008000000000000007365740000000000f7df10000300000000000000fadf100012000000bcde1000160000002843110000000000d2de10005d0000002fdf10002f00000028431100000000005edf1000630000002843110000000000c1df10003600000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920606d696e696d756d5f706572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d700000000000000078e110000300000000000000000000007be1100009000000000000000000000000000000000000000000000000000000000000002843110084e11000000000000000000094e11000010000000000000001000000000000009ce110000b00000000000000000000007be11000090000000000000000000000000000000000000000000000000000000000000028431100a8e110000000000000000000b8e1100001000000000000000000000000000000c0e110000d00000000000000000000007be11000090000000000000000000000000000000000000000000000000000000000000028431100d0e110000000000000000000e0e110000400000000000000010000000000000000e210000900000000000000000000002f1c11000400000000000000000000000000000000000000000000000000000000000000284311000ce2100000000000000000001ce210000100000000000000010000004e6f77543a3a4d6f6d656e7432000000000000000100000050000000cbe3100024000000426c6f636b506572696f6400320000000000000001000000360000007ae31000510000004d696e696d756d506572696f640000003200000000000000010000005300000051e210005a000000abe210005a00000005e31000590000005ee310001c0000004469645570646174650000003200000000000000010000003600000024e210002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f20546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e204f6c642073746f72616765206974656d2070726f766964656420666f7220636f6d7061746962696c6974792e2052656d6f766520616674657220616c6c206e6574776f726b732075706772616465642e2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e3a6865617070616765733a636f646566696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e644772616e64706146696e616c697479205374616c6c6564000000703b11002800000060e410003f00000069000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7375646f2f7372632f6c69622e727300c0e4100019000000e0e4100042000000520000001f0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e7273576974686472617720686173206265656e20636865636b65642061626f76653b0a09090909676f5f62656c6f775f73756273697374656e63652069732066616c736520616e642073756273697374656e6365203e206578697374656e6369616c5f6465706f7369743b0a0909090971656443616e20776974686472617720616e6420646f6e277420676f2062656c6f772073756273697374656e63654772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c69747920417574686f7269746965734772616e64706146696e616c697479204e657874466f7263656473797374656d696e646963657362616c616e63657373657373696f6e7374616b696e6764656d6f6372616379636f756e63696c636f756e63696c5f6d6f74696f6e736772616e6470617472656173757279636f6e74726163747375646f00000000000000c8e610000500000000000000d0e61000010000000000000000000000d8e61000010000000000000000000000e0e610000a00000000000000ece61000010000000000000000000000f4e61000010000000000000053756469640000002f1c11000400000038e71000180000004b65794368616e6765640000f608110009000000fce610003c00000020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e60e410003f00000069000000010000005375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b65796f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f000000000010e610000600000000000000540000000000000000000000550000000000000000000000000000005600000000000000000000000000000057000000000000000000000000000000f4eb10000400000000000000580000000000000002000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000f8eb100009000000000000005900000000000000000000005a0000000000000000000000000000005b0000000000000000000000020000000000000000000000000000000000000016e6100007000000000000005c00000000000000000000005d0000000000000000000000000000005e0000000000000000000000000000005f0000000000000000000000000000001de61000080000000000000060000000000000000000000061000000000000000000000000000000620000000000000000000000000000006300000000000000000000000000000025e6100007000000000000006400000000000000000000006500000000000000000000000000000066000000000000000000000000000000670000000000000000000000000000002ce610000700000000000000680000000000000000000000690000000000000000000000000000006a0000000000000000000000000000006b00000000000000000000000000000033e6100009000000000000006c00000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f0000000000000000000000000000003ce61000070000000000000070000000000000000000000071000000000000000000000000000000720000000000000000000000000000007300000000000000000000000000000043e610000f0000000000000074000000000000000000000075000000000000000000000000000000760000000000000000000000000000007700000000000000000000000000000001ec1000100000000000000058000000000000000200000000000000000000000000000000000000780000000000000000000000020000000000000000000000000000000000000052e6100007000000000000007900000000000000000000007a0000000000000000000000000000007b0000000000000000000000000000007c00000000000000000000000000000059e6100008000000000000007d00000000000000000000007e0000000000000000000000000000007f0000000000000000000000000000008000000000000000000000000000000061e61000080000000000000081000000000000000000000082000000000000000000000000000000830000000000000000000000000000008400000000000000000000000000000069e61000040000000000000085000000000000000000000086000000000000000000000000000000870000000000000000000000000000008800000000000000000000006175726174696d657374616d7066696e616c6974795f747261636b65720000000000000069e6100004000000000000006cec100001000000000000000000000084ec1000090000000000000000000000ccec10000700000000000000d4ec1000010000000000000000000000ecec1000090000000000000000000000fc0e1100080000000000000026ee100010000000c8ed10004e000000284311000000000091ed1000340000002843110000000000d31911000b000000de191100080000007afb10001900000016ee100010000000fc1911000c0000007365745f6b65790000000000c5ed100003000000000000009efd10002300000034ed10005d000000284311000000000091ed1000340000002843110000000000d31911000b000000de191100080000007afb10001900000093fb100011000000fc1911000c0000002041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e6e65772041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e202d204e6f204442207772697465732e426f783c543a3a50726f706f73616c3e00000000000090ee1000030000000000000000000000561c11000c000000000000000000000000000000000000000000000000000000000000002843110094ee10000000000000000000a4ee10000100000000000000010000004b65790032000000000000000100000089000000acee1000210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e5375646f0000000000000000ef1000120000000000000014ef10000100000000000000000000002cef100001000000000000007265706f72745f6d69736265686176696f720000000000004def10000700000000000000181a11000700000034ef100019000000205265706f727420736f6d65206d69736265686176696f722e5f7265706f727400000000b4f010000b0000000000000000000000bff01000230000000000000000000000000000000000000000000000000000000000000028431100e4f010000000000000000000f4f0100001000000000000000100000000000000fcf010000d000000000000000000000009f1100023000000000000000000000000000000000000000000000000000000000000002843110070f1100000000000000000002cf110000100000000000000000000000000000034f110000a0000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110070f11000000000000000000040f110000100000000000000000000000000000048f110000700000000000000000000004ff1100020000000000000000000000000000000000000000000000000000000000000002843110070f11000000000000000000080f11000010000000000000000000000417574686f7269746965735665633c28417574686f7269747949642c20417574686f72697479576569676874293e0000320000000000000001000000350000000cf210001b00000050656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723edbf11000310000004e657874466f726365640000acf110002f0000005374616c6c656428543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d62657229003200000000000000010000003600000088f110002400000020607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205468652063757272656e7420617574686f72697479207365742e4772616e64706146696e616c6974794e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f7221496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473215468657265206973206f6e6c79206f6e6520666174616c206572726f723b207165647375627374726174652d6e6f6465df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000dd718d5cc53262d40100000046524e4b99f310000d0000007ef310001b0000003cf31000420000001e010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b0000b0f3100010000000696e697469616c697a655f626c6f636bc8f310000f0000006170706c795f65787472696e73696300e0f3100013000000696e686572656e745f65787472696e7369637300fcf310000f000000636865636b5f696e686572656e74730014f410001400000076616c69646174655f7472616e73616374696f6e30f410000f0000006f6666636861696e5f776f726b65720048f41000160000006772616e6470615f70656e64696e675f6368616e6765000068f41000150000006772616e6470615f666f726365645f6368616e6765000000000000009806110008000000000000005cf5100001000000000000000000000064f510000100000000000000000000006cf51000080000000000000074f510000100000000000000000000007cf5100001000000000000000000000084f5100007000000000000008cf51000030000000000000000000000a4f51000010000000000000000000000acf51000050000000000000074f51000010000000000000000000000b4f51000010000000000000000000000bcf51000080000000000000074f51000010000000000000000000000c4f5100001000000000000006d0911000d0000009cf610000e0000005370656e64696e675bf610000700000062f610003a00000041776172646564006d0911000d0000005bf6100007000000f6081100090000003bf61000200000004275726e7400000018f6100023000000526f6c6c6f766572ccf510004c000000205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e42616c616e6365205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e547265617375727920506f7454726561737572792050726f706f73616c73703b110028000000e0f61000430000006b000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74726561737572792f7372632f6c69622e727300e0f61000430000006b000000010000004469676573744974656d206e6f7420657175616c00f81000480000008d0a00000e00000090f7100019000000b0f7100047000000e20000000a00000090f7100019000000b0f7100047000000df0000000a0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f70687261676d656e2e72730000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000024f910000d0000000000000034f9100002000000000000000000000064f91000090000000000000000000000acf910000700000000000000b4f91000010000000000000000000000ccf91000010000000000000000000000d4f910000900000000000000e0f9100004000000000000000000000040fa100001000000000000000000000048fa10000f0000000000000058fa100001000000000000000000000070fa1000070000000000000000000000a8fa1000100000000000000058fa1000010000000000000000000000b8fa1000080000000000000070726f706f73655f7370656e64000000000000008efd100005000000000000004cfc1000150000000000000093fd10000b000000000000009efd100023000000bcfc10004b00000007fd10004d00000054fd1000150000002843110000000000d31911000b000000de191100080000007afb10001900000069fd100025000000fc1911000c0000007365745f706f740000000000b5fc100007000000000000004cfc10001500000088fc10002d000000636f6e666967757265000000000000001afc10000d0000000000000027fc1000100000000000000037fc100015000000000000004cfc1000150000000000000061fc10000c000000000000006dfc1000170000000000000084fc1000040000000000000027fc100010000000fefb10001c00000072656a6563745f70726f706f73616c0000000000f3fb10000b00000000000000100f110016000000a4fb10003f0000002843110000000000d31911000b000000de191100080000007afb100019000000e3fb100010000000fc1911000c000000617070726f76655f70726f706f73616cf8fa1000570000004ffb10002b0000002843110000000000d31911000b000000de191100080000007afb10001900000093fb100011000000fc1911000c00000020417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e202d204c696d697465642073746f726167652072656164732e202d204f6e65204442206368616e67652e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e202d204f6e6520444220636c6561722e70726f706f73616c5f6964202852652d29636f6e6669677572652074686973206d6f64756c652e70726f706f73616c5f626f6e64436f6d706163743c5065726d696c6c3e70726f706f73616c5f626f6e645f6d696e696d756d436f6d706163743c42616c616e63654f663c543e3e7370656e645f706572696f64436f6d706163743c543a3a426c6f636b4e756d6265723e6275726e20536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e6e65775f706f742050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e76616c756562656e65666963696172793c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263655472656173757279000000000000008c0011000c000000000000000000000098001100070000000000000000000000000000000000000000000000000000000000000028431100340111000000000000000000a000110002000000000000000100000000000000b0001100130000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311001c0111000000000000000000d000110001000000000000000100000000000000d80011000b0000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100f4001100000000000000000004011100010000000000000001000000000000000c01110004000000000000000000000098001100070000000000000000000000000000000000000000000000000000000000000028431100340111000000000000000000100111000100000000000000010000000000000018011100030000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311001c01110000000000000000002c01110001000000000000000100000000000000041211000d00000000000000000000006d0911000d00000000000000000000000000000000000000000000000000000000000000284311003401110000000000000000004401110001000000000000000100000000000000881111000900000001010000000000006d0911000d000000000000004c01110024000000000000000000000000000000000000002843110070011100000000000000000080011100010000000000000000000000000000008801110009000000000000000000000091011100120000000000000000000000000000000000000000000000000000000000000028431100a40111000000000000000000b401110001000000000000000100000050726f706f73616c426f6e645065726d696c6c002d03110055000000820311004400000050726f706f73616c426f6e644d696e696d756d42616c616e63654f663c543e00db021100520000005370656e64506572696f64543a3a426c6f636b4e756d6265720000003200000000000000010000008a000000b9021100220000004275726e7502110044000000506f74003200000000000000010000003e000000420211003300000032000000000000000100000034000000190211002900000050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e32000000000000000100000036000000fa0111001f000000417070726f76616c735665633c50726f706f73616c496e6465783e0032000000000000000100000035000000bc0111003e0000002050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e2050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e5472656173757279205370656e64506572696f64000020041100390000006004110048000000100200002d000000547265617375727920417070726f76616c735472656173757279204275726e00000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e727300f8100048000000870a00000a00000050726f706f73657227732062616c616e636520746f6f206c6f7754726561737572792050726f706f73616c426f6e644d696e696d756d54726561737572792050726f706f73616c426f6e6454726561737572792050726f706f73616c436f756e744e6f2070726f706f73616c206174207468617420696e6465782f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d332e352e312f7372632f636f6465632e727300000000000000980611000800000000000000a0061100040000000000000000000000c0061100020000000000000000000000d00611000500000000000000d8061100050000000000000000000000000711000200000000000000000000001007110008000000000000001807110001000000000000000000000020071100010000000000000000000000280711000b0000000000000018071100010000000000000000000000340711000100000000000000000000003c071100080000000000000044071100020000000000000000000000540711000100000000000000000000005c0711000e00000000000000440711000200000000000000000000006c071100010000000000000050726f706f736564f6081100090000006d0911000d0000000408110004000000ff0811000b0000000a091100530000005d09110010000000566f746564000000f60811000900000004081100040000002f1c110004000000ff0811000b000000ff0811000b0000006e08110042000000b008110046000000417070726f76656404081100040000003d08110031000000446973617070726f766564000808110035000000457865637574656404081100040000002f1c110004000000c3071100410000004d656d62657245786563757465640000740711004f00000020412073696e676c6520636f756e63696c6c6f722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e486173682041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4163636f756e7449644d656d626572436f756e742041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292e50726f706f73616c496e646578000000000000a80911000f00000000000000b8091100020000000000000000000000c809110004000000000000004e65774163636f756e74496e64657800f608110009000000630a11000c000000e80911002200000028431100000000000a0a1100410000004b0a1100180000002041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e646578496e76616c6964206f726967696e496e646963657320456e756d536574b00a110019000000d00a110048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b110028000000300b1100420000004a000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f696e64696365732f7372632f6c69622e72730000703b1100280000008c0b1100460000006b000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f6d6f74696f6e732e72730000dc0b11002a000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a200000100c1100230000005f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e00300b1100420000004a000000010000008c0b1100460000006b00000001000000cd0c110036000000320511005b000000bc01000005000000000000000000000000000000900c11003d000000320511005b000000c301000005000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b207165640000000000880d11000700000000000000900d1100010000000000000000000000a80d1100030000000000000000000000c00d11000700000000000000c80d1100020000000000000000000000f80d1100040000000000000000000000180e110004000000000000001c0e1100030000000000000000000000640e11000400000000000000657865637574650000000000fc0e110008000000000000009c0f11001b000000b70f1100400000002843110000000000f70f11002100000070726f706f736500000000007f0f11000900000000000000880f11001400000000000000fc0e110008000000000000009c0f11001b000000d31911000b0000002d0f110024000000510f11002e000000fc1911000c000000766f746500000000fc0e11000800000000000000040f110007000000000000000b0f11000500000000000000100f11001600000000000000260f110007000000000000002f1c110004000000d31911000b000000840e110023000000a70e110055000000fc1911000c000000202d20426f756e6465642073746f72616765207265616420616e64207772697465732e202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e70726f706f73616c543a3a48617368696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f7665202d20426f756e6465642073746f7261676520726561647320616e64207772697465732e202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e7468726573686f6c64436f6d706163743c4d656d626572436f756e743e426f783c3c542061732054726169743e3a3a50726f706f73616c3e20446973706174636820612070726f706f73616c2066726f6d206120636f756e63696c6f72207573696e672074686520604d656d62657260206f726967696e2e204f726967696e206d757374206265206120636f756e63696c206d656d6265722e436f756e63696c4d6f74696f6e7300000000000088111100090000000000000000000000911111000c0000000000000000000000000000000000000000000000000000000000000028431100a81311000000000000000000a011110001000000000000000100000000000000a81111000a0000000101000000000000040f11000700000000000000b2111100160000000000000000000000000000000000000028431100ec1111000000000000000000c811110001000000000000000000000000000000d0111100060000000101000000000000040f11000700000000000000d6111100130000000000000000000000000000000000000028431100ec1111000000000000000000fc11110001000000000000000000000000000000041211000d0000000000000000000000821c11000300000000000000000000000000000000000000000000000000000000000000284311008813110000000000000000001412110001000000000000000100000050726f706f73616c735665633c543a3a486173683e0000008e1211002400000050726f706f73616c4f663c542061732054726169743e3a3a50726f706f73616c5b12110033000000566f74696e67566f7465733c543a3a4163636f756e7449643e000000320000000000000001000000360000002e1211002d00000050726f706f73616c436f756e740000001c121100120000002050726f706f73616c7320736f206661722e20566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e2054686520686173686573206f6620746865206163746976652070726f706f73616c732e496e6469636573000000000000006c1311000b0000000000000000000000771311000f00000000000000000000000000000000000000000000000000000000000000284311008813110000000000000000009813110001000000000000000100000000000000a0131100070000000101000000000000771311000f00000000000000ea1b1100110000000000000000000000000000000000000028431100a81311000000000000000000b81311000100000000000000010000004e657874456e756d536574543a3a4163636f756e74496e646578000032000000000000000100000034000000d61311001f000000456e756d5365740032000000000000000100000035000000c0131100160000002054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e496e6469636573204e657874456e756d536574436f756e63696c4d6f74696f6e732050726f706f73616c73436f756e63696c4d6f74696f6e7320566f74696e67000000cd0c110036000000320511005b000000f00100000500000000000000000000000000000000000000320511005b000000f70100000500000070726f706f736572206e6f74206f6e20636f756e63696c6475706c69636174652070726f706f73616c73206e6f7420616c6c6f776564436f756e63696c4d6f74696f6e732050726f706f73616c4f66436f756e63696c4d6f74696f6e732050726f706f73616c436f756e7470726f706f73616c206d757374206578697374766f746572206e6f74206f6e20636f756e63696c6d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f72656440151100480000008d0a00000e00000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e7273626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d69742062792070726963650000e4151100340000001816110044000000a50000000300000074686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f657865632e72733200000000000000010000008b0000008c0000008d0000008e0000008f0000009000000041757261204c61737454696d657374616d704175726120417574686f72697469657353657373696f6e2056616c696461746f727353657373696f6e204e6578744b6579466f720000e0161100190000000017110048000000bb0100002d000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e727374696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c0000009417110022000000b61711003f000000f8000000030000004175726120736c6f74206475726174696f6e2063616e6e6f74206265207a65726f2e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f617572612f7372632f6c69622e72730000001018110028000000b61711003f000000fe000000030000004f6e6c79206f6e6520626c6f636b206d617920626520617574686f7265642070657220736c6f742e000000006418110008000000000000006c1811000200000000000000000000009c1811000a000000000000007365745f6b65797300000000081a110004000000000000000c1a11000700000000000000131a11000500000000000000181a110007000000ec1811003900000025191100480000006d1911003100000028431100000000009e191100350000002843110000000000d31911000b000000de19110008000000e619110016000000fc1911000c0000002053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e2023203c7765696768743e202d204f2831292e202d204f6e6520657874726120444220656e7472792e2023203c2f7765696768743e6b657973543a3a4b65797370726f6f665665633c75383e53657373696f6e000000000000e01b11000a0000000000000000000000ea1b1100110000000000000000000000000000000000000000000000000000000000000028431100941c11000000000000000000fc1b110001000000000000000100000000000000041c11000c00000000000000000000000f3e11000c0000000000000000000000000000000000000000000000000000000000000028431100101c11000000000000000000201c110001000000000000000100000000000000281c11000700000000000000000000002f1c1100040000000000000000000000000000000000000000000000000000000000000028431100341c11000000000000000000441c1100010000000000000001000000000000004c1c11000a0000000101000000000000561c11000c000000000000000c1a1100070000000000000000000000000000000000000028431100641c11000000000000000000741c1100010000000000000000000000000000007c1c1100060000000101000000000000821c11000300000000000000851c11000e0000000000000000000000000000000000000028431100941c11000000000000000000a41c110001000000000000000100000056616c696461746f72735665633c543a3a4163636f756e7449643e00401d11001f00000043757272656e74496e64657832000000000000000100000034000000221d11001e0000004368616e676564626f6f6c0032000000000000000100000036000000f41c11002e0000004e6578744b6579466f72543a3a4163636f756e744964000032000000000000000100000036000000d01c1100240000004163746976657533325665633c4f70617175654b65793e0032000000000000000100000035000000ac1c11002400000020546865206b6579732074686174206172652063757272656e746c79206163746976652e20546865206e657874206b657920666f72206120676976656e2076616c696461746f722e205472756520696620616e797468696e6720686173206368616e67656420696e20746869732073657373696f6e2e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e53657373696f6e204368616e67656472656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c2066656500009100000018000000040000009200000093000000940000009500000096000000970000006e6f7420656e6f7567682067617320746f20706179207472616e736665722066656562616c616e636520746f6f206c6f7720746f2073656e642076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7464657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756572656163686564206d6178696d756d2064657074682c2063616e6e6f74206372656174656e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e7469617465206665654d6f64756c65206973206e6f742076616c696443616e2774206465636f6465207761736d20636f6465756e6b6e6f776e206578706f72743a20657870656374696e67206f6e6c79206465706c6f7920616e642063616c6c2066756e6374696f6e73657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e61747572656d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72794f6e20656e74727920746f207468652066756e6374696f6e20606d6f64756c65602063616e277420626520604e6f6e65603b207165646d656d6f727976616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706543616e6e6f7420696d706f727420676c6f62616c736d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e6d6f64756c6520696d706f72747320606578745f7072696e746c6e60206275742064656275672066656174757265732064697361626c656443616e6e6f7420696d706f7274207461626c65736d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163654d656d6f727920696d706f7274206d757374206861766520746865206669656c64206e616d6520276d656d6f7279274d756c7469706c65206d656d6f727920696d706f72747320646566696e656452657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e4d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c65646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6563616c6c63616c6c2066756e6374696f6e2069736e2774206578706f727465646465706c6f792066756e6374696f6e2069736e2774206578706f727465646465706c6f796578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e66756e6374696f6e206861732061206e6f6e2d6578697374656e742074797065000000292511001c000000b423110044000000b4000000030000000525110024000000b423110044000000bd00000003000000cd24110038000000b423110044000000fb0000002a000000a524110028000000b423110044000000fc000000320000007d24110028000000b423110044000000fe0000002c000000512411002c000000b423110044000000fd0000004c0000001f24110032000000b4231100440000003701000003000000f823110027000000b4231100440000003f010000040000008c23110028000000b423110044000000450100000300000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f2070617920746865697220666565735472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e53657373696f6e2043757272656e74496e646578696e76616c6964206163636f756e7420696e646578626164207369676e617475726520696e2065787472696e7369634e6f6e2d656d7074792066756e6374696f6e20626f6479206578706563746564662611000f00000075261100020000007726110003000000d825110030000000082611005e0000007d00000005000000617373657274696f6e206661696c65643a20636f6e746578742e6672616d655f737461636b2e69735f656d70747928292f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7761736d692d76616c69646174696f6e2d302e312e302f7372632f66756e632e7273417420696e737472756374696f6e202840293a2070726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b207165646475706c6963617465206b65792070726f766964656453657373696f6e204163746976654552524f523a2061637469766520646f65736e277420636f6e7461696e206f7574676f696e67206b65796578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d6578745f6e6f776578745f64697370617463685f63616c6c6578745f696e7075745f73697a656578745f696e7075745f636f70796578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e746578745f7365745f72656e745f616c6c6f77616e63656578745f72656e745f616c6c6f77616e63656578745f7072696e746c6e6d616b655f746f705f6672616d655f706f6c796d6f72706869632069732063616c6c6564207769746820656d707479206672616d6520737461636b746869732066756e6374696f6e2063616e27742062652063616c6c6564207769746820656d707479206672616d6520737461636b4d6973706c6163656420656c736520696e737472756374696f6e0000fc29110047000000432a110005000000c029110037000000f7291100050000008d291100170000008429110009000000d62b1100140000006c291100180000008429110009000000d62b1100140000003c2911001d0000005929110013000000a458110001000000546f6f206c61726765206d656d6f727920616c69676e6d656e7420325e20286578706563746564206174206d6f737420547279696e6720746f2075706461746520676c6f62616c20206f66207479706520547279696e6720746f20757064617465206c6f63616c20416e79537065636966696300980000000400000004000000990000004c6162656c7320696e2062725f7461626c6520706f696e747320746f20626c6f636b206f6620646966666572656e742074797065733a2020616e6420496620626c6f636b20776974686f757420656c736520726571756972656420746f2068617665204e6f526573756c7420626c6f636b20747970652e2042757420697420686173202074797065582a110018000000702a11000b000000556e657870656374656420737461636b20686569676874202c20657870656374656420547279696e6720746f2061636365737320706172656e74206672616d6520737461636b2076616c7565732e0000b82a110017000000cf2a11001600000045787065637465642076616c7565206f66207479706520206f6e20746f70206f6620737461636b2e20476f7420000000f02a110007000000537461636b3a2000000001007a2b110024000000502b110006000000562b11000e000000642b1100160000002c2b110024000000502b1100060000006d6178696d756d206d656d6f72792073697a65206d757374206265206174206d6f7374202070616765736d6178696d756d206c696d697420206973206c657373207468616e206d696e696d756d20696e697469616c206d656d6f72792073697a65206d757374206265206174206d6f7374200000b02b110026000000d62b110014000000547279696e6720746f20696e697469616c697a65207661726961626c65206f6620747970652020776974682076616c7565206f66207479706520496e69742065787072657373696f6e2073686f756c6420616c776179732062652077697468206c656e6774682032812c110007000000aa2c11000b000000812c110007000000882c1100220000004e6f6e20636f6e7374616e74206f70636f646520696e20696e6974206578707245787072657373696f6e20646f65736e277420656e647320776974682060656e6460206f70636f6465476c6f62616c2020646f65736e277420657869737473206f72206e6f742079657420646566696e6564206973206d757461626c65000000c82c110010000000d82c11000f0000004d656d6f727920617420696e6465782020646f65736e27742065786973747300f82c11000f000000d82c11000f0000005461626c6520617420696e64657820002931110012000000d82c11000f000000282d11000e000000d82c11000f0000005479706520617420696e646578200000962d110010000000d82c11000f000000682d110010000000882d11000e000000682d110010000000782d110010000000457870656374656420676c6f62616c2020746f20626520696d6d757461626c6520746f206265206d757461626c65476c6f62616c20617420696e646578206e6f6e2d656d70747920737461636b2065787065637465640000d02d110020000000f02d110012000000747279696e6720746f206765742076616c756520617420706f736974696f6e20206f6e20737461636b206f662073697a6520636865636b656420636f75706c65206f66206c696e65732061626f766500282e110015000000657863656564656420737461636b206c696d6974200000009800000004000000040000009a0000004c6f63616c732072616e6765206e6f7420696e2033322d6269742072616e6765882e110022000000aa2e110015000000bf2e110007000000547279696e6720746f20616363657373206c6f63616c207769746820696e64657820207768656e20746865726520617265206f6e6c7920206c6f63616c7366756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e6473d02f1100650000002301000017000000a02f11002500000043616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a2000000000000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a0909090971656429311100120000003b3111000f000000fc3011000a00000006311100140000001a3111000f0000005369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e76676173603111005800000088000000160000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e727300e43111001c000000b831110013000000c604000009000000617373657274696f6e206661696c65643a20656e64203c3d206c656e183211001e000000b831110013000000b303000009000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e0000fd321100120000000f3311000c0000006066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e644e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e46756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64737461636b206d757374206265206e6f6e2d656d707479737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e640000103411006c000000c8000000110000000000000000000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e7273747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e64730000000035110048000000870a00000a0000000000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e7273556e726561636861626c654e6f70426c6f636b009800000004000000040000009b0000004c6f6f704966456c7365456e64427200980000000400000004000000040000004272496642725461626c65009800000004000000040000009c00000052657475726e43616c6c43616c6c496e64697265637400009800000004000000040000009d00000044726f7053656c6563744765744c6f63616c5365744c6f63616c5465654c6f63616c476574476c6f62616c536574476c6f62616c4933324c6f61644936344c6f61644633324c6f61644636344c6f61644933324c6f616438534933324c6f616438554933324c6f61643136534933324c6f61643136554936344c6f616438534936344c6f616438554936344c6f61643136534936344c6f61643136554936344c6f61643332534936344c6f616433325549333253746f726549363453746f726546333253746f726546363453746f726549333253746f72653849333253746f7265313649363453746f72653849363453746f7265313649363453746f7265333243757272656e744d656d6f727947726f774d656d6f7279493332436f6e7374009800000004000000040000009e000000493634436f6e73749800000004000000040000009f000000463332436f6e7374463634436f6e73749800000004000000040000002200000049333245717a49333245714933324e654933324c74534933324c74554933324774534933324774554933324c65534933324c655549333247655349333247655549363445717a49363445714936344e654936344c74534936344c74554936344774534936344774554936344c65534936344c655549363447655349363447655546333245714633324e654633324c7446333247744633324c65463332476546363445714636344e654636344c7446363447744636344c654636344765493332436c7a49333243747a493332506f70636e744933324164644933325375624933324d756c493332446976534933324469765549333252656d5349333252656d55493332416e644933324f72493332586f7249333253686c4933325368725349333253687255493332526f746c493332526f7472493634436c7a49363443747a493634506f70636e744936344164644936345375624936344d756c493634446976534936344469765549363452656d5349363452656d55493634416e644936344f72493634586f7249363453686c4936345368725349363453687255493634526f746c493634526f74724633324162734633324e65674633324365696c463332466c6f6f724633325472756e634633324e656172657374463332537172744633324164644633325375624633324d756c4633324469764633324d696e4633324d6178463332436f70797369676e4636344162734636344e65674636344365696c463634466c6f6f724636345472756e634636344e656172657374463634537172744636344164644636345375624636344d756c4636344469764636344d696e4636344d6178463634436f70797369676e493332577261704936344933325472756e63534633324933325472756e63554633324933325472756e63534636344933325472756e6355463634493634457874656e6453493332493634457874656e64554933324936345472756e63534633324936345472756e63554633324936345472756e63534636344936345472756e6355463634463332436f6e7665727453493332463332436f6e7665727455493332463332436f6e7665727453493634463332436f6e766572745549363446333244656d6f7465463634463634436f6e7665727453493332463634436f6e7665727455493332463634436f6e7665727453493634463634436f6e766572745549363446363450726f6d6f74654633324933325265696e746572707265744633324936345265696e746572707265744636344633325265696e746572707265744933324636345265696e74657270726574493634547261696c696e6744617461556e6578706563746564456f66496e76616c69644461746100243b11000b000000492f4f204572726f723a2049333249363446333246363456616c7565980000000400000004000000990000004e6f526573756c74703b110028000000983b1100500000008700000009000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e7273703b110028000000983b110050000000900000000900000061757261736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214175726120696e686572656e742064617461206e6f7420666f756e6474696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e000000000000010000000200000004000000080000001000000000000000ec3c11000e00000000000000fc3c1100010000000000000000000000043d110001000000000000004e6577417574686f7269746965730000303d1100170000000c3d110024000000204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c28417574686f7269747949642c20753634293e0000000000743d11000a00000000000000803d1100010000000000000000000000883d110002000000000000004e657753657373696f6e00000f3e11000c000000983d110055000000ed3d110022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e53657373696f6e496e6465780000000000743e1100100000000000000028431100000000000000000000000000843e11000100000000000000000000008c3e11000f00000000000000284311000000000000000000000000009c3e1100010000000000000045787472696e73696353756363657373b93e11002500000045787472696e7369634661696c656400a43e11001500000020416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e48617368206e6f7420657175616c00000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e7273f03e110019000000103f1100500000005800000022000000903f110019000000b03f110048000000570100002a000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e72736578745f6368696c645f73746f726167655f726f6f74206e657665722072657475726e73207533323a3a6d61785f76616c75653b2071656452756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e6700006c4011002d000000994011000c000000a540110003000000617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20b04011003400000064657374696e6174696f6e20616e6420736f7572636520736c69636573206861766520646966666572656e74206c656e6774687354441100180000004b080000090000000c411100110000001d41110017000000ec020000050000006361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e7273d0411100460000006301000013000000980000000400000004000000a0000000a1000000a20000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f720028431100000000008058110002000000b041110015000000e7030000050000007372632f6c6962636f72652f726573756c742e727300000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f666d742f6d6f642e727301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000202020202020202020202020202020202020202020202020202020202020303030303030303030303030303030304040404040000000000000000000000000038431100200000005843110012000000320000000000000001000000a3000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e64657820697320303030313032303330343035303630373038303931303131313231333134313531363137313831393230323132323233323432353236323732383239333033313332333333343335333633373338333934303431343234333434343534363437343834393530353135323533353435353536353735383539363036313632363336343635363636373638363937303731373237333734373537363737373837393830383138323833383438353836383738383839393039313932393339343935393639373938393900006c4411000600000072441100220000005444110018000000090a0000050000007372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820b444110016000000ca4411000d00000054441100180000000f0a000005000000736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d009e4511000b0000001a58110016000000d7441100010000008845110016000000e107000009000000f85711000e00000006581100040000000a58110010000000d7441100010000008845110016000000e507000005000000b85711002b000000e3571100150000005b010000150000009e4511000b000000a945110026000000cf45110008000000d745110006000000d7441100010000008845110016000000f2070000050000007372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f6620600000002646110002000000104611001600000054040000110000001046110016000000480400002800000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f20b05111004a0000000054110000020000005611003700000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b020001020202020302020202040205060202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200010305050606030706080809110a1c0b190c140d120e160f0410031212130916011705180219031a071c021d011f1620032b062c022d0b2e01300331023202a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f1838586898b8c98a0a4a6a8a9acbabebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74759697c9ff2f5f262e2fa7afb7bfc7cfd7df9a409798308f1fffceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100856070207150d500443032d03010411060f0c3a041d250d064c206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082a0682ff1118082f112d032010210f808c048297190b158894052f053b07020e180980af31740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880ba3d35040a06380846080c06740b1e035a0459098083181c0a1609460a808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b0210011104120513111402150217021a021c051d0824016a036b02bc02d102d40cd509d602d702da01e005e802ee20f004f9040c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1c848509379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a2225c5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d03f71727b5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a80a64e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b5f2148080a80a65e22450b0a060d1338080a362c041080c03c64530c0181004808531d398107460a1d03474937030e080a0639070a8136198107839a66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b65450b2f101140021e97f20e82f3a50d811f51818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b87d580d7294b050a0402831144814b3c06010455051b3402810e2c04640c560a0d035c043d391d0d2c040907020e06809a83d50b0d030a06740c59270c0438080a0628081e520c046703290d0a06030d30600e8592905111002000000027000000190000009051110020000000280000002000000090511100200000002a0000001900000090511100200000002b0000001800000090511100200000002c0000002000000000000000000000007372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21b003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000d0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c813000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d000000000000001e1f20000000000021002200232425000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027280000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000002b2c00002d0000000000000000000000000000000000000000000000000000000000002e2f300000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000000000320033000000000000000000000000000000000000000000000000000034350000353535360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff06fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db07000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f662060426f72726f774572726f72426f72726f774d75744572726f720000002843110000000000e3571100150000000c0400000500000020202020a40000000c00000004000000a5000000a6000000a70000003a202c0a2c200000980000000400000004000000a8000000a9000000aa000000280a282c290a5d5b4572726f72008ae202046e616d650181e2029c04000c6578745f74776f785f31323801146578745f6765745f73746f726167655f696e746f020e6578745f626c616b65325f32353603116578745f636c6561725f73746f72616765040f6578745f7365745f73746f7261676505166578745f73616e64626f785f6d656d6f72795f6e6577061b6578745f73616e64626f785f6d656d6f72795f74656172646f776e07176578745f73616e64626f785f696e7374616e746961746508126578745f73616e64626f785f696e766f6b65091d6578745f73616e64626f785f696e7374616e63655f74656172646f776e0a1f6578745f6765745f616c6c6f63617465645f6368696c645f73746f726167650b156578745f7365745f6368696c645f73746f726167650c176578745f636c6561725f6368696c645f73746f726167650d166578745f6b696c6c5f6368696c645f73746f726167650e166578745f73616e64626f785f6d656d6f72795f6765740f0e6578745f7072696e745f7574663810166578745f73616e64626f785f6d656d6f72795f73657411126578745f737232353531395f76657269667912126578745f656432353531395f76657269667913166578745f6368696c645f73746f726167655f726f6f7414196578745f6765745f616c6c6f63617465645f73746f7261676515106578745f73746f726167655f726f6f7416186578745f73746f726167655f6368616e6765735f726f6f74170d6578745f7072696e745f68657818106578745f636c6561725f70726566697819236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f741a0d6578745f7072696e745f6e756d1b0a6578745f6d616c6c6f631c086578745f667265651d48616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303066616135336238376530653661621e34616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68363534333630666363653539333038361f3b73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f7075626c69633a3a6866623261623538306438366130353931204e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864336433333837396635363662373062212e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a6866343337386339613663343034313036223873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a6862366265373730623536363037303262230e5f5f727573745f6465616c6c6f632430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6832373532316332623635333961663462253d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835323730333337313965616561396439260c5f5f727573745f616c6c6f63270e5f5f727573745f7265616c6c6f63284e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68333162333430633638356463353561372936636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68346631303163306137313663303262662a08727573745f6f6f6d2b8c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a68653338646664303539333431636136652c4073726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a68633431353362653330353734666463382d3f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a68333833386466623938633032323536302e3d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f65787465726e616c3a3a68353766336365383464336137636238302f796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a683433396135666231626132393631376230a9013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6864316238313536383831333534326562313573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a6834643363623566353064323239656164323d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a68653062633364306533383933643731643380023c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2073726d6c5f64656d6f63726163793a3a436f6e76696374696f6e292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68353930353032663038313161616131613486013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a6862633164313832343832613636613633353e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a686261613031663936316563346463613036ef013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6834666234646432626135653563343161374e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866366335393132386261393533653036383d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a6863333463353730393734326433353766397c6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a68353336663137633665353765313237373a3c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68316663386164393065613531346234343b4173726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68343934616563663265376262353363663c4673726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68666161383338663661316237343063323d6f3c73726d6c5f64656d6f63726163793a3a5f5f476574427974655374727563744e65787445787465726e616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68666437363537366638326239333736663e6e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68396439323936363335643430313436363f8c0173726d6c5f64656d6f63726163793a3a5f494d504c5f454e434f44455f464f525f436f6e76696374696f6e3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f64656d6f63726163793a3a436f6e76696374696f6e3e3a3a656e636f64655f746f3a3a683864643663653333376432343436653140703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683038376634656163303033396364303241633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683433303838336563313633396132396142b5013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a683030373732303864306663333335623343800173726d6c5f64656d6f63726163793a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f64656d6f63726163793a3a43616c6c3c543e3e3a3a6465636f64653a3a683431656466376434313732336531313744796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6866326464383363666439383038363036455d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832646431383630646366363235346630465d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833326631626466383562373532623062475e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68323565303232396230663361386137394836636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a683736396238303062623465336330323349800173726d6c5f64656d6f63726163793a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f64656d6f63726163793a3a43616c6c3c543e3e3a3a6465636f64653a3a68366330363165343466643531633534324a5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383033383965346537373737383439334b5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68316462643964653166316533363161384c5e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68326335326466333664353632656536374d493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68623939383539636362323533323036384e443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68656366343530313532633963373339394f29636f72653a3a70616e69636b696e673a3a70616e69633a3a683930306462653831356663633632336250443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a686563663435303135326339633733393951463c73726d6c5f73797374656d3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837326239303930303932623764316664524e3c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683137393532326533376265306633366453503c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683036643461313538626363343934393054483c73726d6c5f636f6e74726163743a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683339326361316463623530653934313655473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683636626363613030646664346261373056473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830643631356565623361626262396137575e3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a686664343433636362383337633437373358ef013c73726d6c5f64656d6f63726163793a3a426c61636b6c6973743c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c20616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e293e3e3a3a6765743a3a6836613764356235663139653863376665596f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a68636361343332336438616136626264385a3573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a68366438303866636531366531616539345b8a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a68373264633635373838616237653435385c3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68316334623366356537353961306662325db50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a68653734386162343266306433366464315e483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a68396637356363353361663162363438375f3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a686135626464656330353832393464663960323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6832346231323866373631326130323533612d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68393563313864623831313666633930666289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6866643364363035613962363562326163638c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a6835653463336266613636376433333061646f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866633134656636336262303965356532653d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683766313063393363376136383765333366643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6839646533666434666432303039313861673d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862343132623566326132333534663734683d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862623562313130626465623239363433693a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68633739326333373764643635653436336a3f73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68376139663564323161663138626333316bc9023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a68356134613565333938653162353335646c9e0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a68386535616136323961383538396464666d3373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a68393535643464306633666437383264336eb4013c73726d6c5f7374616b696e673a3a426f6e6465643c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a68356435656265333066373637333939646f4473726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a686165656266636464346532626634303570683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838383633396439623963363830333564716b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835373232343437623438373336343566726d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866386232316161323838326335376533736e3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637453657373696f6e5265776172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683735336538386436396637306631383574763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68353639323166626330353134366232397586013c73726d6c5f7374616b696e673a3a4d6f64756c653c543e2061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e456e64696e673c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f73657373696f6e5f656e64696e673a3a686535313633306636363638636361363176673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6866326439313535326334303637623864776a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a68626635393135363135343133393639667844636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a683932653839393334616233333963393779f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68333733366566623434363166356632627a3773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a68633337363639633262643933303135317b483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a68336239653437613061613366663166667c6d3c6e6f64655f72756e74696d653a3a43757272656e6379546f566f746548616e646c65722061732073725f7072696d6974697665733a3a7472616974733a3a436f6e766572743c753132382c7536343e3e3a3a636f6e766572743a3a68353637666237386237323465313434367d613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68363831316136353639356566373033667e8e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a68396435343430393131383236656437317f3973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6834393035336663653939393664353862800130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683237386236313539333331396136636281013e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a68323662636361343964663735316562388201d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683436633539386334323439626161393383015c3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838366432623236333166646333346264840185013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a68646562353262626431313032366638658501483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a68373662376631353363626165383533328601483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a683837316531646162333963366664653287013473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a683863616333643766656561643836333088016f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a683866636637393031303130323364383589012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68636430313236643637393166366466338a0134636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a68373930316437393431343736333863338b013c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a68613236643732366361313234646137358c0134636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68396133653135623333653732623336358d012e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a68396134613139636665393430326233398e012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68643032636466333230343961613863358f016f3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683239313630343165646363333739323690014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686334393265383265343832393137646491018f013c73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a683432363237643732313730333731653092013673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a683038393461396331626164353230643093014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683737366564343637623834353637323794012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a683631343137393464626265336134666495014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68323631646237643031626138343532379601303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835333964383965373864336432386636970135636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68626232333962346333656230313863619801303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68663966343739623738313364643766329901313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68653961663431646462346636653666319a016b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68356462343963643635646562396561369b01713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343432336537396237666136333364639c01713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68373535376161643232383364663738389d01683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68653333393636303464383766313162329e016b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68336533366161393132333730623438649f0130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6838623865663864653663643565663130a0016f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6839656432363761666263376163303338a101443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864643538643239613837336539366430a20125616c6c6f633a3a666d743a3a666f726d61743a3a6836363238323931366635643839636166a301743c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a56617255696e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835333337616335653133303232393336a401457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6863343039653861623936343865363938a50127636f72653a3a7374723a3a66726f6d5f757466383a3a6861303162383536303462626661643632a6017c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6832396434356534336335396636373566a7016c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835656534336634343261306436306335a801793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835636361393566393536386433663966a90186017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a6863373130393263326433353730393230aa016f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6838363932336464383833646464333432ab01693c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830373635356166323066616638633434ac01135f5f727573745f616c6c6f635f7a65726f6564ad014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6832386631653666366637316263366436ae01613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6861313534656437353133373565343033af01723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6834326161333662363739326430643866b001723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6864323035306537666665386430383164b1013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6834373937653534376136323663326430b201323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6838316135313335323361343266643731b3012c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6862323466623938633663613936336537b4014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6833633137313734326664343464363431b501613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6866396465623032633130313431363831b60148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6836613231616631656164313134353561b7015a3c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a6866613236356165323336393333666263b8017b3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a6861393434356539656631666338613634b90187013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a6862336666633035383733356436363334ba0187013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a6831653439303531353836633433633137bb0180013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a6831396333313936396362613630646262bc0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a6862613566353261373763386565613862bd0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a6832333831646137343636336138303363be0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a6835656233323666313336306535663566bf0183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a6838306163646635383464356163343739c00185013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a6837313736326661336363396635383131c10184013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a6838666138346134313862303336643766c20183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a6836343433386230306632303431663766c3018d013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a6834383165313066303230396462623061c40182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d3a3a6830646231363535363634323230353335c5017f3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a6839393863386639323461343030373766c60189013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a6835653930636536356562616661666239c70186013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f73697a653a3a6836393432666133373539633532363561c80186013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f636f70793a3a6865613864363566623932646262663032c90188013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a6862333638653731633732333932623934ca0188013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a6861356238363437613064633065323037cb0189013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6835663639653663613338666431653232cc018e013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f72656e745f616c6c6f77616e63653a3a6863306261363734316164623665343462cd018a013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72656e745f616c6c6f77616e63653a3a6832366637353133323438386361626366ce0183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7072696e746c6e3a3a6831303139323034333536653238623532cf013273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a6863333265616162336663633834663734d001a7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a6830333332613261323966396434666363d1014473726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a6865393064306631643436366138613330d201673c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a6836613662316266663034383730643065d301613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831636561376633356531383534376639d401613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6834643765343630363733636637623463d501773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6864613538363437373364393161633062d601773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6863633237633664653363643436303964d701793c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6830616538343035383365663932653431d801b7013c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f3c543e3e3e3a3a6765743a3a6834656437633633653831363131623530d9017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6835303333313332653233393234313938da017e3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6836383237393262643365346631376362db01723c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831656665633264656436313436383737dc018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a6865353131643163343631323236326636dd01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6831383934623633353565653739633265de01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6839323033653539333130616162373435df013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a6833396665333063616239643263336134e0017f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a6834306266313536333830363533643562e1013673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a6831396138616331613331343433303262e2014c73726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a6832386330326662363135343738393533e3013173726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a72616e646f6d3a3a6836653661373533396336333832346535e4012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6835323963333139393332366435346334e5017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6833636431376332336265613732616238e6012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6832323538333565333135383964613337e7014573726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6831643433663038326464303036646130e8017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6861303534656163333938613038326137e9017d3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6836356334643665616263623034616561ea017f3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6864393232353437646465646135656565eb0182013c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6862363037336636626665396661363266ec01763c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831633439366566636164346364626663ed013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830333363396462666564626136316537ee014173726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862626532316466343639636135663839ef014573726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6836663332383366323231386434633839f0014673726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838633363643830353162373562323835f1014b73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6862396631373532643866633062313738f201713c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f7465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862383334386332323031333439346662f301723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744465636179526174696f3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861326133313034363234303765303530f401743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563745465726d4475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831353665656134653234393865343464f501743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f74696e67506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838346662313465646262326639386134f6017b3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374496e6163746976654772616365506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862383635353034333836316635346530f701723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744361727279436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865653634366138333735353061656132f8017c3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637450726573656e74536c617368506572566f7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833613531376362613564626131653435f9016f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744372656174696f6e4665653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830303932656436636465313735316632fa01753c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637443616e646964616379426f6e643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833636562636665643539663638636338fb013d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6864396430353365663436653261316535fc013e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a6831323531373431656231613331333261fd014273726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f6e616d653a3a6863393235393565363038306138336533fe014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a6866356237356638623531313835323531ff014773726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683561323363366238356235373263666280023473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a683066646566366166633961653262366381024e73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a6836356234396161336263356434393136820289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a686265643565656631393135333063633383028c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a683733343431616137643561616338363184027e3c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173683a3a6866313031323732386365373032323764850281013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6830316333386330613937386565316132860288013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4d616b655061796d656e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f7061796d656e743a3a68363139313938343438626364636535398702483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6835643061373731396530373135343637880291013c73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e496e697469616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a686263653862373630336434383762613089024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68363162653461373530356262373662658a023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68306433363162653734663931396633618b024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68656566623665313461326533326666328c023d73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a616c6c5f766f746572733a3a68353262343038613865363763376630358d023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a68613261336630666435656465303333358e02b5023c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572496e666f3c3c3c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a68346365623639653138663131333339338f023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6839393964396238646138633331613839900291013c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e2061732073726d6c5f636f756e63696c3a3a4f6e4d656d626572734368616e6765643c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6d656d626572735f6368616e6765643a3a68626165626438616330656462313561629102c1013c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572733c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3e3a3a6765743a3a686636306262343236303735353134643892024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831343736336633383532313236366166930291013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a68343732376664363632623638383933619402b5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68646130316166643635373932373538329502723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383862356433623533356662643738379602c2013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c436f6e746578743e3e3a3a636865636b3a3a683036653564313134313734396336623097023573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a68636461343636313732363935303962329802633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a686431646632373534313466366664326599025f3c73726d6c5f62616c616e6365733a3a43616c6c3c542c493e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68346362313634363335393462393532389a02633c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68396631643662393862653761643263339b024373726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a68363937366237623035303866623533349c023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a68613562363662306433323539366664649d02513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68343632616537383636383366626532669e023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68346430633965333565643661663364329f02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6833313735373132313132333835633233a002693c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830316338343363633632306238666165a102693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6831333461663738653338346137626365a202693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6862343163666461376564303937303036a3026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866623838366462613837613133666162a4026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866666636363639376566353239376636a5024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835363536323866646432306635316437a6024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836363833346364613430356432633764a7024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838316166663434383562396538663962a8024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838336238616335356434653661346232a9024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861623830383237656337626438656130aa024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862656565623131663538616539396239ab02513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6835353465656535616338353764643066ac02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835363839613464326237393731653532ad02553c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838373631313638303936383131366166ae026b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6865323933633735663634643061626636af027d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6831666330386437643034626634383931b0026f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6836326264653134663536643062353962b1026f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6864616238623536303035613534306666b2028b0173726d6c5f636f6e74726163743a3a5f494d504c5f454e434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a656e636f64655f746f3a3a6861383261333733366437633236323266b3023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862626464383561363032643039373134b402bc0173726d6c5f636f6e74726163743a3a5f494d504c5f454e434f44455f464f525f526177416c697665436f6e7472616374496e666f3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e74726163743a3a526177416c697665436f6e7472616374496e666f3c436f6465486173682c42616c616e63652c426c6f636b4e756d6265723e3e3a3a656e636f64655f746f3a3a6830303736613438386139383963656165b5023b73726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863393730616532633038646531383034b6024073726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6836623664333738393861383966646630b7024573726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6831356530653963346437396161323135b802703c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e7472616374496e666f4f663c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839333866393561376661383066386139b902703c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744163636f756e74436f756e7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833323031343334336266306266323434ba02713c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835623437343165616434316365623934bb026f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374426c6f636b4761734c696d69743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837653532336438306337633333343732bc026a3c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744d617844657074683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864666161616234353338353461353233bd026f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374437265617465426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836636530396362373239356265656564be026d3c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443616c6c426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861653663643564663437623563663936bf026d3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e74726163744665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830383538386639643632306338306166c0027e73726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a43616c6c3c543e3e3a3a6465636f64653a3a6830643962346233303935336164666131c102880173726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a6465636f64653a3a6837623265656434386238383563613031c202723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837643536313431386431386263333665c3027e73726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a43616c6c3c543e3e3a3a6465636f64653a3a6837393835653335613037616339616431c4023873726d6c5f636f6e74726163743a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a6830613834363432353534326634363832c5024173726d6c5f636f6e74726163743a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a6861656436383936333733373961393039c602416861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a7472795f776974685f63617061636974793a3a6831656136316166333338653832306261c7023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6831373535373533376236336263656262c802483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831333831393434366437653064303262c9022e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6833393364613938653639323439383564ca02453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838363734326534666666666630303164cb0249636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a6831666562313135616361656230666432cc022f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a6836333234636430343836666166656636cd02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6833333437623132303630363137626532ce025d3c73726d6c5f636f6e74726163743a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6830353135393834636235663036343465cf022e73726d6c5f636f6e74726163743a3a6761733a3a6275795f6761733a3a6836363661333430633161383932303333d0023473726d6c5f636f6e74726163743a3a436f6e6669673c543e3a3a7072656c6f61643a3a6834316164653736613335306633316235d1024173726d6c5f636f6e74726163743a3a72656e743a3a7472795f65766963745f6f725f616e645f7061795f72656e743a3a6834323138616332613764663135623736d202593c6e6f64655f72756e74696d653a3a43616c6c2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862626638633431636165653434313765d302aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6861663162323439316632316436306638d4023573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a6835366637353766356337656262646466d5023673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6833343638386266303463643066363137d6023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6831653535316635373736306166383030d7023873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6163636f756e745f6e6f6e63653a3a6835616137393765343961623139373366d80230636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6864383935313939363031376332386466d902643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6837326364353931616639636132323162da028d0173726d6c5f73797374656d3a3a5f494d504c5f454e434f44455f464f525f4576656e745265636f72643a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f73797374656d3a3a4576656e745265636f72643c452c543e3e3a3a656e636f64655f746f3a3a6838323837396666306663333164326230db02443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6863333464643934323638613031353930dc02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830393762623431386138383864633836dd027e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6831306637373263333663646337343331de023973726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6838666439616539396365306433653365df023e73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6833376561333837666563663834386238e0024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a6831376563653461336162623566643336e1024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836393735623434353263653664613731e202693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866363537326462303239613532303539e3026e3c73726d6c5f73797374656d3a3a5f5f4765744279746553747275637452616e646f6d4d6174657269616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865396561333661373034663364333732e4023373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6832333262613534633836316662643139e50288013c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6865613363376233363363383231313966e6023c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6865633138323463353265366161373461e7024173726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6861376537396265333130613633373935e8024673726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6863316561623737313962613238396561e902703c73726d6c5f74696d657374616d703a3a5f5f476574427974655374727563744d696e696d756d506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832643835666531326337646634366261ea025e3c73726d6c5f74696d657374616d703a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6864626661323637383662393436396336eb0234636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a6836396461666637393039373061313131ec02753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6862386336353535306336313834396538ed0286013c73726d6c5f6772616e6470613a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6861333436363963343964393361643239ee023773726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6863656665626663343965636232336532ef023b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6830646337636465646430343838646565f0023e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a6830353763643235373336633566323161f102406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a6833303966626664316235383230343331f202416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a6835313638376461316431373635363336f302426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a6830313034353861633265346163316633f402416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a6837306531373138353463393136636462f502416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a6831616430376264623933343831383832f602436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a6835336535366433356462663934383238f702416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c3a3a6864663564313939396433366136323231f802496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f6d6f74696f6e733a3a6864613933353738393165313134333763f902416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a6833353338356331323036326335363830fa02426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a6864346339636463356334633366393333fb02426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e74726163743a3a6839613734613861663361393964663838fc025d3c73726d6c5f74726561737572793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6831363430633263376565613064643238fd02653c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862363465326662356639636662646265fe02453c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a6765743a3a6831306235373565303766633764306438ff02573c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a776569676874733a3a576569676861626c653e3a3a7765696768743a3a6861393836303337636335303561333732800339636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a686237636163326533636430336665653681033f73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683333633630393633646361383235656482034473726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683563633437316233666233343232366283033a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686361353835346539613437333536373684033c73726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a686333633031393532613965623234653485034173726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683966373733386635663264626264616386033773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68643361353435376133303436313365348703613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683862633436363235383930393364366188030c436f72655f76657273696f6e890312436f72655f657865637574655f626c6f636b8a037973726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a696e697469616c697a655f626c6f636b3a3a68376233366163313939613337393135378b034173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a68613533393833653538653062636430648c036c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a68363130383336343662393432383739388d03810173726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a68303635373131643530343264336366398e0387013c73726d6c5f74726561737572793a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68643434613665343736396233643037348f036c3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6834366464366662356238333562393731900315436f72655f696e697469616c697a655f626c6f636b9103114d657461646174615f6d657461646174619203603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68613366393836333937346566363933659303433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68356261663237376630323439353930399403623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68633139393633623465353564366132629503623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68636130653235643436326465303339619603623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683434666466653133623032306564633697031c426c6f636b4275696c6465725f6170706c795f65787472696e73696398031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b990320426c6f636b4275696c6465725f696e686572656e745f65787472696e736963739a033873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a68633264616634656231393762336433329b031c426c6f636b4275696c6465725f636865636b5f696e686572656e74739c0318426c6f636b4275696c6465725f72616e646f6d5f736565649d032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e9e03214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b65729f03214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765a0034e73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573743c486173683e3a3a636f6e766572745f66697273743a3a6836366333363234366332653461666564a103204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765a2031e4772616e6470614170695f6772616e6470615f617574686f726974696573a30315417572614170695f736c6f745f6475726174696f6ea40313417572614170695f617574686f726974696573a5037a3c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a7b7b636c6f737572657d7d3a3a6830633830656137323332346530373965a6033b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832366562646163613532656363613561a7034073726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6835393339323736626561306163656166a8034573726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6839663139653639643062656237313738a9036d3c73726d6c5f74726561737572793a3a5f5f476574427974655374727563745370656e64506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836306239646532646139656632343639aa033673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a6865666535383230393831636338313263ab03960173726d6c5f74726561737572793a3a5f494d504c5f4445434f44455f464f525f50726f706f73616c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f74726561737572793a3a50726f706f73616c3c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6861396236356662323336616562633266ac03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835373062333834306365353164316338ad033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6861646235326434323663363837373737ae034373726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833366464326631646134636339643265af034873726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838383137333832346434613662363731b0034d73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6861646238366366633866623461333036b103703c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a5f5f47657442797465537472756374566f74696e673c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862366262393764653065346336306438b2033a73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837616532366131643234643932326237b3033f73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6831306132303733303438396137353732b4034473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6866363865306666626566326438646465b503483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6832363635303738306162303339663662b603d6013c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a566f74696e673c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a566f7465733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6864363432643232336231656163383566b703443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865636634353031353263396337333939b8034273726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a69735f636f756e63696c6c6f723a3a6832383539316166633763383138613038b9033a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835613734376161303337613130323730ba033f73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6865663337623938613262616336636165bb034473726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6833646333393663383139373062623730bc033073726d6c5f636f6e74726163743a3a657865633a3a7472616e736665723a3a6836623662363532303861393239356436bd0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6866656635303035393964613961653264be03467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a6834633238383839393133366536353162bf034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6835313966313864636237326261336539c003397761736d695f76616c69646174696f6e3a3a76616c69646174655f6d656d6f72795f747970653a3a6865366631393266326664613039643832c103347761736d695f76616c69646174696f6e3a3a657870725f636f6e73745f747970653a3a6861656163356431346336623830396639c203553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863326134356666353061376161396539c303473c7761736d695f76616c69646174696f6e3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6866353933393766323137613636373964c4034a7761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a737465703a3a6832666537613565366332363331356661c503457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6837623865636664383363666165356131c60348616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6830656462363861303163356265306337c7033c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a6834323534626164656230616363376166c803537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a6863663565633265313765663537323035c903a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a6830353536356238326665343262306538ca033a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a6830316332396565616463663335313062cb032d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a6830393332363436363438313361366335cc03507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a6838643061356230363637363139613838cd033c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a6831636436386663336433373839336439ce03347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f6c6162656c3a3a6863626562643038326466356364303865cf03547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f73746f72653a3a6862643739363133313339343332383965d003347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f76616c75653a3a6833313763366332356339306365653430d103537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6c6f61643a3a6834393035633532663833363531346161d203547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f72656c6f703a3a6837353761346463393739376562316230d303557761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f746573746f703a3a6864346366646335333561663030633362d403547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f62696e6f703a3a6838633331313330663565623336316632d503407761736d695f76616c69646174696f6e3a3a7574696c3a3a4c6f63616c733a3a747970655f6f665f6c6f63616c3a3a6831386566303365653833303566666561d603537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f756e6f703a3a6838353331303135666166633861336431d703547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6376746f703a3a6833613733343330326264616561376664d803553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a426c6f636b5479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839346532626165616538343162313330d9034e3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6835613733643831626162386430626264da03543c7761736d695f76616c69646174696f6e3a3a66756e633a3a537461636b56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862373235313739336638363630383535db0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6836613038356231346265396435633734dc033b636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a6836303961663164643666613232333735dd032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6865363865663431386238643863316331de0339636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a6835313334393661303431643563636232df034c3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832666536663963363630326265346663e003303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837326234353830626637326537303332e103453c616c6c6f633a3a737472696e673a3a537472696e6720617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6863663738346335653363613266373731e20323636f72653a3a666d743a3a77726974653a3a6836646264346536386638373035323231e30341707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6864366233373132356536666366663333e403323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6835653966383665363861346464343266e5033f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6835396131346330396137303930383238e603613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6865316438363535626666663531343030e703533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6839626638343738306239303233323334e80333636f72653a3a6f7074696f6e3a3a4f7074696f6e3c26543e3a3a636c6f6e65643a3a6861333566626630386639653461636131e90346707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6865663534363634346336306434623135ea034b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6865646435396332323933383537653261eb03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831643539383166653938316462313737ec03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834626661363434626431393266666236ed03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837613536343663303430373264333733ee03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837646638663737353332306532373734ef03463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6861363537336135373632656161343632f003303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832633037393736363432656561653630f103303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864323138616636666239353832313839f2039c0173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f7261676546756e6374696f6e547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f7261676546756e6374696f6e547970653e3a3a656e636f64655f746f3a3a6836653731323166623136653532633661f303423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6836323336336636653364383535303264f403623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6830613634326534663332376539616135f50311727573745f626567696e5f756e77696e64f6034e73725f696f3a3a696d703a3a6578743a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6832333837396334613931313463373565f7030a5f5f72675f616c6c6f63f8030c5f5f72675f6465616c6c6f63f9030c5f5f72675f7265616c6c6f63fa03115f5f72675f616c6c6f635f7a65726f6564fb032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6864653239343433393239313531623639fc033e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835313235643164306563633239393130fd033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6839353965666131623335626366643438fe033b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6835343638363039306564663265396539ff033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6833636663653965373133323661336239800430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68303031396461623065383937633336378104313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6834613532623136633830303234616261820443636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a683432386265353039346339343164336383042e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a683164313363613733343265626666353384044a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68316436363734336535623538343039638504323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686431393739333162373737643337336386043d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a683531623662343337336438653836356287044e636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68316665623131356163616562306664322e31393039880434636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a686364353964306437623539306436323289042e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a68363461663862323537393838646230348a048001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a68656163303763393531626335663764648b04533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68366538633033663965636631646139308c0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68333430303565383966626464336335388d042f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a68313532633662643433626438333336308e042e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a68623730623339363562646162393237308f0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683031343735323165623962333830323190043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a686366366133663535383139656366646491043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a683138313637396666343166303265313792043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68623438316365373666653862323234389304066d656d7365749404066d656d6370799504076d656d6d6f76659604066d656d636d709704095f5f756469767469339804085f5f6d756c7469339904095f5f6173686c7469339a04095f5f6c7368727469339b040c5f5f756469766d6f6474693400590970726f64756365727302086c616e677561676501045275737404323031380c70726f6365737365642d62790105727573746325312e33372e302d6e696768746c79202834303062343039656620323031392d30362d303929", - "0x5286264f4d2ddb5a0d2950bf3bcfb9f6": "0x10000000000000000000000000000000", - "0x6d5b60e78cadb1cc37887b7ee4a5ab10": "0x00000000", - "0x24586f4898a5a637b755b658ec163d00": "0x00407a10f35a00000000000000000000", - "0xabe32953315ab8fe7b2b925eba5f4c80": "0x00e40b54020000000000000000000000", - "0x52c9048efbfc40fd1e312b7bed451dee": "0x06000000", - "0x90d5871cf3f4d0a3642cf2043a7d8eda": "0x0010a5d4e80000000000000000000000", - "0x6e45a8645fa8f905c49fecfef3d06c67": "0x01000000", - "0x4e62513de81454ce76df887573f7f98b101eb4585b1485a222b7db599f4e93e2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0x8b4621d5f16433d6024b5a31547c59ee24e749e051dbb4bc7e64502f2a4f62fb": "0x66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", + "0x4ac2684a5a20e7a5adf17ed7aa792a3f6334a0505f02b2a44c3934d36cc4ee0a": "0xc8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e", + "0xd546f8df064d356bc9db11de6d1207a8": "0x00", + "0x71020fee971bd00e8248d1830b8cffbe5b9cf4de1ea2911a1665c44fd70ab6f3": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630f0000c16ff286230f0000c16ff2862300", + "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b65797394f72a73893fbd00b11fcce65a014cc5b9ff5066ec15aa6be068b4cabfe67fdb": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378", + "0x3a636f6465": "0x0061736d0100000001c6022b60027f7f0060017f0060037f7f7f0060047f7f7f7f0060027f7f017f60037f7f7f017f60057f7f7f7f7f0060057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f0060047f7f7f7f017f60077f7f7f7f7f7f7f017f60027e7f017f60017f017f60047e7f7f7f017f60017e0060000060077f7e7e7e7e7e7e0060087f7f7f7f7f7f7f7f0060047f7f7f7f017e60047f7f7e7e0060037f7e7e0060057f7f7e7e7f0060057f7f7f7e7e0060077f7e7e7f7f7f7f0060047f7f7e7f0060037f7f7e0060067f7f7e7e7e7f0060037e7f7f017f60087f7f7e7e7f7f7f7f0060097f7f7f7e7e7f7f7f7f0060047f7e7e7e0060027f7e0060027f7f017e60087f7f7f7f7f7e7e7f0060017e017f60057f7e7f7f7e0060037f7e7f0060017f017e60047f7e7e7f0060057f7e7e7e7e0060067f7e7e7e7e7f0002cd072503656e760e6578745f626c616b65325f323536000203656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e76176578745f636c6561725f6368696c645f73746f72616765000303656e760f6578745f7365745f73746f72616765000303656e760c6578745f74776f785f313238000203656e76196578745f6765745f616c6c6f63617465645f73746f72616765000503656e76166578745f73616e64626f785f6d656d6f72795f6e6577000403656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000103656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000103656e76146578745f6765745f73746f726167655f696e746f000703656e76116578745f636c6561725f73746f72616765000003656e76166578745f6b696c6c5f6368696c645f73746f72616765000003656e76106578745f636c6561725f707265666978000003656e76166578745f6368696c645f73746f726167655f726f6f74000503656e760e6578745f7072696e745f75746638000003656e76156578745f7365745f6368696c645f73746f72616765000a03656e76166578745f73616e64626f785f6d656d6f72795f676574000b03656e76166578745f73616e64626f785f6d656d6f72795f736574000b03656e76126578745f737232353531395f766572696679000b03656e76126578745f656432353531395f766572696679000b03656e760d6578745f7072696e745f686578000003656e76156578745f6c6f63616c5f73746f726167655f676574000b03656e76216578745f6c6f63616c5f73746f726167655f636f6d706172655f616e645f736574000c03656e760a6578745f7075626b6579000d03656e76116578745f6e6574776f726b5f7374617465000e03656e76086578745f7369676e000f03656e76166578745f7375626d69745f7472616e73616374696f6e000403656e76156578745f6c6f63616c5f73746f726167655f736574000603656e76106578745f73746f726167655f726f6f74000103656e76186578745f73746f726167655f6368616e6765735f726f6f74000503656e760b6578745f74776f785f3634000203656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000303656e760d6578745f7072696e745f6e756d001003656e760a6578745f6d616c6c6f63000e03656e76086578745f66726565000103b404b20400000e0501001100000000000000000000000200110100000100000000000000000000000000000000000000000000000404000100040000001202020013110303030303030303030303030303030303030303030314020e00020004040515021502010216000100000200171800000200190101010100160101151a00030101011b001c041d08151601010000020010020001000003020001010001000000000000000002040600000002060204020000010000011e0202060403031f02020402000001010020010101000000000015022001000002000200000101010002020300210002040000000000000000000000001111000000000000010101010101010101010101010002110311020202020201010001001003222200020210012222000200000000222222002222220222222222222222000000010101000000010000000000000000000000000000000101010e120500000001000300000004000e02000102020101000100010102000002000100010101000001001111230100242400000006012100000001000100002500010100000001000000000000000b0000000001010101000000000000000100150000010200000402020602260000040000020502060002000400020000040003040204040001000203030202040606020202020304050104040405040404070204020402020000040204010404010404040400010100020000000e01050e050404270b0304040e0404040404030105010404050404040505050528282929292a0407017001cf01cf0105030100120611027f01418080c0000b7f0041c882c6000b07ab0414066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010c436f72655f76657273696f6e00bd0212436f72655f657865637574655f626c6f636b00be0215436f72655f696e697469616c697a655f626c6f636b00c402114d657461646174615f6d6574616461746100c5021c426c6f636b4275696c6465725f6170706c795f65787472696e73696300cc021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00cd0220426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300ce021c426c6f636b4275696c6465725f636865636b5f696e686572656e747300d00218426c6f636b4275696c6465725f72616e646f6d5f7365656400d1022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e00d202214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657200d402214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e676500d502204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500d6021e4772616e6470614170695f6772616e6470615f617574686f72697469657300d70214426162654170695f737461727475705f6461746100d8020d426162654170695f65706f636800d90218436f6e73656e7375734170695f617574686f72697469657300da02098903010041010bce01f403ca0155565a6465666768696a6b6c6d6e6f707172737475767778797a8001c204e503f703f903fa03ef039e0483048b049004bf0497049904bb04bc04f7018101e0029b01bb03c601e902ea02ce038d03c401a104a901b001e802e202c701c501c301c201bf01c101ee02c104c004ea01f101f001ef01f801f901fa0182029b039a03a0029e03b003b2038c038b038e0391039003fd02a1029a019901a2029d01cc03cb03a302d4038002ff01a4028102b803b703a502bc03f502f402a602f602be01bd01a702c001ae01af01e901e801a802ed01ec01a902ee01df02de02aa02e402b602b7029f02a401a301ab02a501b802e302e102f002ef02ed02ec02eb02e702e602e5028f03d001d101d301d201cf01d4019d039c03a303dd01e301e501e401e201e601b103b403b303ba03b903c003bf03be03bd03d203d103d003cf03cd03d503d903ae03d703da038d0492048e048f04a0049404a204a304a504a604a704a804a904aa04b504b604b704cc04b804c604c504c704c804c904ca04cb040a84f838b2049a1002187f017e230041f0006b2202240002400240024020012802042203200128020022046b41e100490d0003402001200441206a3602002001280208220341306a280200210520032802282106200241d0006a41186a22034200370300200241d0006a41106a22074200370300200241d0006a41086a220842003703002002420037035020044120200241d0006a1000200241106a41186a22092003290300370300200241106a41106a220a2007290300370300200241106a41086a220b2008290300370300200220022903503703102002410036025020062005200241106a4120200241d0006a100121060240024020022802502205417f470d002002200c36020c2002200d3602082002200e3602040c010b2001280208220f2802302110200f280228210f2003420037030020074200370300200842003703002002420037035020044120200241d0006a1000200241306a41186a2003290300370300200241306a41106a2007290300370300200241306a41086a200829030037030020022002290350370330200f2010200241306a412010022002200536020c20022005360208200220063602042006210e2005210d2005210c2004450d00200241046a21010c030b20012001280200220441206a3602002001280208220541306a2802002106200528022821052003420037030020074200370300200842003703002002420037035020044120200241d0006a100020092003290300370300200a2007290300370300200b2008290300370300200220022903503703102002410036025020052006200241106a4120200241d0006a100121060240024020022802502205417f470d002002201136020c20022012360208200220133602040c010b2001280208220f2802302110200f280228210f2003420037030020074200370300200842003703002002420037035020044120200241d0006a1000200241306a41186a2003290300370300200241306a41106a2007290300370300200241306a41086a200829030037030020022002290350370330200f2010200241306a412010022002200536020c20022005360208200220063602042006211320052112200521112004450d00200241046a21010c030b20012001280200220441206a3602002001280208220541306a2802002106200528022821052003420037030020074200370300200842003703002002420037035020044120200241d0006a100020092003290300370300200a2007290300370300200b2008290300370300200220022903503703102002410036025020052006200241106a4120200241d0006a100121060240024020022802502205417f470d002002201436020c20022015360208200220163602040c010b2001280208220f2802302110200f280228210f2003420037030020074200370300200842003703002002420037035020044120200241d0006a1000200241306a41186a2003290300370300200241306a41106a2007290300370300200241306a41086a200829030037030020022002290350370330200f2010200241306a412010022002200536020c20022005360208200220063602042006211620052115200521142004450d00200241046a21010c030b20012001280200220441206a3602002001280208220541306a2802002106200528022821052003420037030020074200370300200842003703002002420037035020044120200241d0006a100020092003290300370300200a2007290300370300200b2008290300370300200220022903503703102002410036025020052006200241106a4120200241d0006a1001210a0240024020022802502209417f470d002002201736020c20022018360208200220193602040c010b2001280208220b2802302105200b280228210b2003420037030020074200370300200842003703002002420037035020044120200241d0006a1000200241306a41186a2003290300370300200241306a41106a2007290300370300200241306a41086a200829030037030020022002290350370330200b2005200241306a412010022002200936020c200220093602082002200a360204200a211920092118200921172004450d00200241046a21010c030b20012802042203200128020022046b41e0004b0d000b0b024020042003460d0003402001200441206a3602002001280208220341306a280200210a20032802282103200241d0006a41186a22074200370300200241d0006a41106a22084200370300200241d0006a41086a220942003703002002420037035020044120200241d0006a1000200241106a41186a2007290300370300200241106a41106a2008290300370300200241106a41086a200929030037030020022002290350370310200241003602502003200a200241106a4120200241d0006a1001210a0240024020022802502203417f470d002002200b36020c20022005360208200220063602040c010b2001280208220b2802302105200b280228210b2007420037030020084200370300200942003703002002420037035020044120200241d0006a1000200241306a41186a2007290300370300200241306a41106a2008290300370300200241306a41086a200929030037030020022002290350370330200b2005200241306a412010022002200336020c200220033602082002200a360204200a2106200321052003210b2004450d00200241046a21010c030b200128020022042001280204470d000b0b200041003602000c010b200241d0006a41086a200141086a280200220336020020022001290200221a370350200020043602002000201a3702042000410c6a20033602000b200241f0006a24000b910202077f017e0240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641a8016d2207490d00200028020021020c010b200320076a22082003490d0220024101742203200820082003491b2203ad42a8017e2209422088a70d022009a722084100480d020240024020020d002008102721020c010b2000280200200241a8016c2008102821020b2002450d0120002002360200200041046a2003360200200041086a28020021030b2002200341a8016c6a2005200610ce041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010290b0f0b20084108102a000b102b000b0700200010b1040b0b0020002001200210b3040b0700200010b2040b0e0041e8cfc500412210ac0400000b0a0041b0d2c5001058000b910202077f017e0240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641e8006d2207490d00200028020021020c010b200320076a22082003490d0220024101742203200820082003491b2203ad42e8007e2209422088a70d022009a722084100480d020240024020020d002008102721020c010b2000280200200241e8006c2008102821020b2002450d0120002002360200200041046a2003360200200041086a28020021030b2002200341e8006c6a2005200610ce041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010290b0f0b20084108102a000b102b000b9904010f7f230041d0006b22022400200241086a2001102e02400240024020022802080d00200041003602000c010b02400240200228020c22034180012003418001491b22040d00410121050c010b2004410574220610272205450d020b02402003450d00200241306a41186a2107200241306a41106a2108200241306a41086a21094100210a4100210b4100210c034020074200370300200842003703002009420037030020024200370330200241306a2001280200220d20012802042206412020064120491b220e10ce041a20012006200e6b3602042001200d200e6a36020002402006411f4b0d00200041003602002004450d03200510290c030b200c41016a2106200241106a41186a220e2007290300370300200241106a41106a220d2008290300370300200241106a41086a220f2009290300370300200220022903303703100240200c2004470d000240200a20062006200a491b220441ffffff3f712004470d00200441057422104100480d0002400240200c0d002010102721050c010b2005200b2010102821050b20050d0120104101102a000b102b000b2005200b6a220c2002290310370000200c41186a200e290300370000200c41106a200d290300370000200c41086a200f290300370000200a41026a210a200b41206a210b2006210c20032006470d000b0b2000200436020420002005360200200041086a20033602000b200241d0006a24000f0b20064101102a000bbd0301077f230041106b22022400200241003a0003200241036a2001280200220320012802042204410047220510ce041a0240024002400240024020042005490d002001200420056b22063602042001200320056a22053602002004450d02024020022d0003220341037122044103460d0002400240024020040e03000102000b20034102762101410121040c070b200241003a000b2002410b6a20052006410047220410ce041a20062004490d032001200620046b3602042001200520046a3602002006450d0420022d000b4108742003724102762101410121040c060b41002104200241003a000e200241003b010c2002410c6a200520064103200641034922071b220810ce041a2001200620086b3602042001200520086a36020020070d0520022f010c20022d000e411074724108742003724102762101410121040c050b200341034b0d024100210420024100360204200241046a200520064104200641044922081b220310ce041a2001200620036b3602042001200520036a36020020080d0320022802042101410121040c040b20052004103e000b20042006103e000b410021040b0b2000200136020420002004360200200241106a24000b860402077f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210300240024002400240024020000d002002280208210020022802042104200228020021050c010b2003200041286c6a21062002280204210420022802082100034002400240200420006b4120490d00200041206a2107200228020021050c010b200041206a22072000490d0520044101742205200720072005491b22084100480d050240024020040d002008102721050c010b200228020020042008102821050b2005450d032002200836020420022005360200200821040b200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a2900003700002002200736020820002003290000370000200341206a290300210902400240200420076b4108490d00200741086a21000c010b200741086a22002007490d0520044101742208200020002008491b22084100480d050240024020040d002008102721050c010b200520042008102821050b2005450d042002200836020420022005360200200821040b20022000360208200520076a20093700002006200341286a2203470d000b0b2001280200200128020420052000100302402004450d00200510290b200241106a24000f0b20084101102a000b20084101102a000b102b000b9e0701037f02400240024002400240024020002802002202413f4b0d0002400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d0620004101742204200320032004491b22044100480d060240024020000d002004102721030c010b200128020020002004102821030b2003450d0220012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000f0b200241808001490d032002418080808004490d020c010b20044101102a000b0240024002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0520024101742204200320032004491b22044100480d050240024020020d002004102721030c010b200128020020022004102821030b2003450d0120012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00002000280200210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d0520024101742200200420042000491b22004100480d050240024020020d002000102721020c010b200128020020022000102821020b2002450d0220012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20044101102a000b20004101102a000b024002400240200141046a2802002203200141086a28020022006b4104490d00200128020021030c010b200041046a22042000490d0320034101742200200420042000491b22004100480d030240024020030d002000102721030c010b200128020020032000102821030b2003450d0120012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b20004101102a000b024002400240200141046a2802002203200141086a28020022006b4102490d00200128020021030c010b200041026a22042000490d0220034101742200200420042000491b22004100480d020240024020030d002000102721030c010b200128020020032000102821030b2003450d0120012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20004101102a000b102b000b800501067f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a20021030024002400240024002402000450d0020004190016c2104034020022802042105200228020821000240024020032802004112470d000240024020052000460d00200228020021050c010b200041016a22052000490d0820004101742206200520052006491b22064100480d080240024020000d002006102721050c010b200228020020002006102821050b2005450d052002200636020420022005360200200228020821000b2002200041016a360208200520006a41003a00000c010b0240024020052000460d00200228020021050c010b200041016a22052000490d0720004101742206200520052006491b22064100480d070240024020000d002006102721050c010b200228020020002006102821050b2005450d052002200636020420022005360200200228020821000b2002200041016a360208200520006a41013a000020032002103220034188016a28020021060240024020022802042205200228020822006b4104490d00200228020021050c010b200041046a22072000490d0720054101742200200720072000491b22004100480d070240024020050d002000102721050c010b200228020020052000102821050b2005450d062002200036020420022005360200200228020821000b2002200041046a360208200520006a20063600000b20034190016a2103200441f07e6a22040d000b0b2002280204210020012802002001280204200228020022032002280208100302402000450d00200310290b200241106a24000f0b20064101102a000b20064101102a000b20004101102a000b102b000be3d00104057f017e067f017e230041206b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000280200220341114b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e12000102030405060708090a0b0c0d0e0f1011000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5e20034101742205200420042005491b22054100480d5e0240024020030d002005102721040c010b200128020020032005102821040b2004450d1320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000280208417f6a220341054b0d1102400240024002400240024020030e06000102030405000b200241003a001c02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d6320004101742204200320032004491b22044100480d630240024020000d002004102721030c010b200128020020002004102821030b2003450d1920012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a00000c160b200241013a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d6220034101742205200420042005491b22054100480d620240024020030d002005102721040c010b200128020020032005102821040b2004450d1920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200028020c21062002200041146a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d6220044101742203200520052003491b22034100480d620240024020040d002003102721040c010b200128020020042003102821040b2004450d1a20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c150b200241023a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d6120034101742205200420042005491b22054100480d610240024020030d002005102721040c010b200128020020032005102821040b2004450d1a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000290310210702400240200141046a2802002203200528020022006b4108490d00200128020021030c010b200041086a22042000490d6120034101742200200420042000491b22004100480d610240024020030d002000102721030c010b200128020020032000102821030b2003450d1b20012003360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200320006a20073700000c140b200241033a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d6020034101742205200420042005491b22054100480d600240024020030d002005102721040c010b200128020020032005102821040b2004450d1b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200028020c21062002200041146a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d6020044101742203200520052003491b22034100480d600240024020040d002003102721040c010b200128020020042003102821040b2004450d1c20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c130b200141086a2802002103200241043a001c024002402003200141046a280200460d00200128020021050c010b200341016a22042003490d5f20034101742205200420042005491b22044100480d5f0240024020030d002004102721050c010b200128020020032004102821050b2005450d1c20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41043a0000200028020c21032002200041146a2802002200360208200241086a200110302000450d122003200041186c6a2108200141046a21060340200328020021092002200341086a2802002200360208200241086a20011030024002402006280200220a200428020022056b2000490d002001280200210a0c010b200520006a220b2005490d60200a4101742205200b200b2005491b22054100480d6002400240200a0d0020051027210a0c010b2001280200200a20051028210a0b200a450d1e2001200a36020020062005360200200428020021050b2004200520006a360200200a20056a2009200010ce041a2003410c6a28020021092002200341146a2802002200360208200241086a20011030024002402006280200220a200428020022056b2000490d002001280200210a0c010b200520006a220b2005490d60200a4101742205200b200b2005491b22054100480d6002400240200a0d0020051027210a0c010b2001280200200a20051028210a0b200a450d1f2001200a36020020062005360200200428020021050b2004200520006a360200200a20056a2009200010ce041a200341186a22032008470d000c130b0b200241053a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5e20034101742205200420042005491b22054100480d5e0240024020030d002005102721040c010b200128020020032005102821040b2004450d1e20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41053a0000200028020c21042002200041146a2802002200360208200241086a200110302000450d1120042000410c6c6a2108200141046a210903402004280200210a2002200441086a2802002203360208200241086a200110300240024020092802002205200628020022006b2003490d00200128020021050c010b200020036a220b2000490d5f20054101742200200b200b2000491b22004100480d5f0240024020050d002000102721050c010b200128020020052000102821050b2005450d202001200536020020092000360200200628020021000b2006200020036a360200200520006a200a200310ce041a2004410c6a22042008470d000c120b0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d5d20004101742204200320032004491b22044100480d5d0240024020000d002004102721030c010b200128020020002004102821030b2003450d1f20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c100b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c0240024020030d002005102721040c010b200128020020032005102821040b2004450d1f20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c0240024020030d002005102721040c010b200128020020032005102821040b2004450d2020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110540c0f0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b0240024020030d002005102721040c010b200128020020032005102821040b2004450d2020012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b0240024020030d002005102721040c010b200128020020032005102821040b2004450d2120012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a00002000280204210c20022000410c6a2802002200360208200241086a200110302000450d0e200c200041f8006c6a210d200141046a210b034002400240200b2802002203200628020022006b4120490d00200128020021030c010b200041206a22042000490d5c20034101742200200420042000491b22004100480d5c0240024020030d002000102721030c010b200128020020032000102821030b2003450d2320012003360200200b2000360200200628020021000b2006200041206a360200200320006a220041186a200c412c6a290000370000200041106a200c41246a290000370000200041086a200c411c6a2900003700002000200c290014370000200c2001105402400240200b2802002203200628020022006b4120490d00200128020021030c010b200041206a22042000490d5c20034101742200200420042000491b22004100480d5c0240024020030d002000102721030c010b200128020020032000102821030b2003450d2420012003360200200b2000360200200628020021000b2006200041206a360200200320006a220041186a200c41cc006a290000370000200041106a200c41c4006a290000370000200041086a200c413c6a2900003700002000200c29003437000002400240200b2802002203200628020022006b4120490d00200128020021030c010b200041206a22042000490d5c20034101742200200420042000491b22004100480d5c0240024020030d002000102721030c010b200128020020032000102821030b2003450d2520012003360200200b2000360200200628020021000b2006200041206a360200200320006a220041186a200c41ec006a290000370000200041106a200c41e4006a290000370000200041086a200c41dc006a2900003700002000200c290054370000200c28020821042002200c2802102200360208200241086a2001103002402000450d00200041246c21090340200241086a2004104f2002280208210a02400240200b2802002205200628020022006b20022802102203490d00200128020021050c010b200020036a22082000490d5e20054101742200200820082000491b22004100480d5e0240024020050d002000102721050c010b200128020020052000102821050b2005450d2820012005360200200b2000360200200628020021000b2006200020036a360200200520006a200a200310ce041a0240200228020c450d00200a10290b200441246a21042009415c6a22090d000b0b200c41f8006a220c200d470d000c0f0b0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d5a20004101742204200320032004491b22044100480d5a0240024020000d002004102721030c010b200128020020002004102821030b2003450d2520012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41043a00000c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d2520012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000280208417f6a220341014b0d0c02400240024020030e020001000b200241003a001c02400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22042003490d5b20034101742205200420042005491b22044100480d5b0240024020030d002004102721050c010b200128020020032004102821050b2005450d2820012005360200200141046a2004360200200141086a28020021030b200041306a2104200141086a200341016a360200200520036a41003a00002000410c6a20011051200241186a21000c010b200241013a001c02400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22042003490d5a20034101742205200420042005491b22044100480d5a0240024020030d002004102721050c010b200128020020032004102821050b2005450d2820012005360200200141046a2004360200200141086a28020021030b200041c0006a2104200141086a200341016a360200200520036a41013a00002000410c6a200110512002200041306a36021c2002411c6a20011059200241086a21000b200020043602002000200110590c0c0b02400240200141046a2206280200200141086a22042802002203460d00200128020021050c010b200341016a22052003490d582003410174220a20052005200a491b220a4100480d580240024020030d00200a102721050c010b20012802002003200a102821050b2005450d2720012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41063a000020002d0008417f6a2203410c4b0d0b024002400240024002400240024002400240024002400240024020030e0d000102030405060708090a0b0c000b200241003a001c02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d642003410174220a20052005200a491b220a4100480d640240024020030d00200a102721050c010b20012802002003200a102821050b2005450d3420012005360200200141046a200a360200200141086a28020021030b200141086a200341016a360200200520036a41003a00002000410c6a200110512002200041306a360208200241086a2001105920002d0009220041024b0d1702400240024020000e03000102000b200241003a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d6620004101742205200320032005491b22054100480d660240024020000d002005102721030c010b200128020020002005102821030b2003450d3720012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a00000c190b200241013a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d6520004101742205200320032005491b22054100480d650240024020000d002005102721030c010b200128020020002005102821030b2003450d3720012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a00000c180b200241023a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d6420004101742205200320032005491b22054100480d640240024020000d002005102721030c010b200128020020002005102821030b2003450d3720012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c170b200241013a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6320034101742205200420042005491b22054100480d630240024020030d002005102721040c010b200128020020032005102821040b2004450d3720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a360208200241086a200110590c160b200241023a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6220034101742205200420042005491b22054100480d620240024020030d002005102721040c010b200128020020032005102821040b2004450d3720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a360208200241086a200110590c150b200241033a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d6120004101742205200320032005491b22054100480d610240024020000d002005102721030c010b200128020020002005102821030b2003450d3720012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41033a00000c140b200241043a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6020034101742205200420042005491b22054100480d600240024020030d002005102721040c010b200128020020032005102821040b2004450d3720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a200110302002200041106a360208200241086a200110590c130b200241053a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5f20034101742205200420042005491b22054100480d5f0240024020030d002005102721040c010b200128020020032005102821040b2004450d3720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a0000200028020c21032002200041146a2802002200360208200241086a200110302000450d12200041246c21000340200320011051200341246a21032000415c6a22000d000c130b0b200241063a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5e20004101742205200320032005491b22054100480d5e0240024020000d002005102721030c010b200128020020002005102821030b2003450d3720012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41063a00000c110b200241073a001c02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d5d2003410174220a20052005200a491b220a4100480d5d0240024020030d00200a102721050c010b20012802002003200a102821050b2005450d3720012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41073a000020002d0009220041024b0d1002400240024020000e03000102000b200241003a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5f20004101742205200320032005491b22054100480d5f0240024020000d002005102721030c010b200128020020002005102821030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a00000c120b200241013a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5e20004101742205200320032005491b22054100480d5e0240024020000d002005102721030c010b200128020020002005102821030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a00000c110b200241023a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5d20004101742205200320032005491b22054100480d5d0240024020000d002005102721030c010b200128020020002005102821030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c100b200241083a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c0240024020030d002005102721040c010b200128020020032005102821040b2004450d3a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110510c0f0b200241093a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b0240024020030d002005102721040c010b200128020020032005102821040b2004450d3a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a200110300c0e0b2002410a3a001c02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d5a20004101742205200320032005491b22054100480d5a0240024020000d002005102721030c010b200128020020002005102821030b2003450d3a20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410a3a00000c0d0b2002410b3a001c02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d3a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a200110300c0c0b2002410c3a001c02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d582003410174220a20052005200a491b220a4100480d580240024020030d00200a102721050c010b20012802002003200a102821050b2005450d3a20012005360200200141046a200a360200200141086a28020021030b200141086a220b200341016a360200200520036a410c3a0000200028020c21032002200041146a2802002200360208200241086a200110302000450d0b2000410574210a200141046a210803400240024020062802002205200428020022006b4120490d00200128020021050c010b200041206a22092000490d5920054101742200200920092000491b22004100480d590240024020050d002000102721050c010b200128020020052000102821050b2005450d3c2001200536020020082000360200200b28020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200a41606a220a0d000c0c0b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5720034101742205200420042005491b22054100480d570240024020030d002005102721040c010b200128020020032005102821040b2004450d3b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5720034101742205200420042005491b22054100480d570240024020030d002005102721040c010b200128020020032005102821040b2004450d3c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5720044101742203200520052003491b22034100480d570240024020040d002003102721040c010b200128020020042003102821040b2004450d3d20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041106a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5720044101742203200520052003491b22034100480d570240024020040d002003102721040c010b200128020020042003102821040b2004450d3e20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041306a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000280204210620022000410c6a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d5720044101742203200520052003491b22034100480d570240024020040d002003102721040c010b200128020020042003102821040b2004450d3f20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c0a0b02400240200141046a2206280200200141086a22042802002203460d00200128020021050c010b200341016a22052003490d562003410174220a20052005200a491b220a4100480d560240024020030d00200a102721050c010b20012802002003200a102821050b2005450d3f20012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41083a0000200041086a22032d0000417f6a220541104b0d090240024002400240024002400240024002400240024002400240024002400240024020050e11000102030405060708090a0b0c0d0e0f10000b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6620034101742205200420042005491b22054100480d660240024020030d002005102721040c010b200128020020032005102821040b2004450d5020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200028020c200110322002200041106a360208200241086a200110590c190b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6520034101742205200420042005491b22054100480d650240024020030d002005102721040c010b200128020020032005102821040b2004450d5020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110300c180b02400240200628020020042802002205460d00200128020021060c010b200541016a22062005490d642005410174220a20062006200a491b220a4100480d640240024020050d00200a102721060c010b20012802002005200a102821060b2006450d5020012006360200200141046a200a360200200141086a28020021050b200141086a220a200541016a360200200620056a41023a00002000410c6a2001103020032d00012105200341026a2d0000210602400240200141046a280200200a2802002200460d00200128020021030c010b200041016a22032000490d642000410174220a20032003200a491b220a4100480d640240024020000d00200a102721030c010b20012802002000200a102821030b2003450d5120012003360200200141046a200a360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a00000c170b02400240200628020020042802002205460d00200128020021060c010b200541016a22062005490d632005410174220a20062006200a491b220a4100480d630240024020050d00200a102721060c010b20012802002005200a102821060b2006450d5120012006360200200141046a200a360200200141086a28020021050b200141086a220a200541016a360200200620056a41033a00002000410c6a2001103020032d00012105200341026a2d0000210602400240200141046a280200200a2802002200460d00200128020021030c010b200041016a22032000490d632000410174220a20032003200a491b220a4100480d630240024020000d00200a102721030c010b20012802002000200a102821030b2003450d5220012003360200200141046a200a360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a00000c160b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d622003410174220a20052005200a491b220a4100480d620240024020030d00200a102721050c010b20012802002003200a102821050b2005450d5220012005360200200141046a200a360200200141086a28020021030b200141086a220a200341016a360200200520036a41043a0000200028020c2001103220002d0009210902400240200141046a280200200a2802002203460d00200128020021050c010b200341016a22052003490d622003410174220a20052005200a491b220a4100480d620240024020030d00200a102721050c010b20012802002003200a102821050b2005450d5320012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a20093a0000200029031021070240024020062802002205200428020022036b4108490d00200128020021050c010b200341086a220a2003490d6220054101742203200a200a2003491b22034100480d620240024020050d002003102721050c010b200128020020052003102821050b2005450d5420012005360200200141046a2003360200200141086a28020021030b2004200341086a360200200520036a2007370000200029031821070240024020062802002203200428020022006b4108490d00200128020021030c010b200041086a22052000490d6220034101742200200520052000491b22004100480d620240024020030d002000102721030c010b200128020020032000102821030b2003450d5520012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a20073700000c150b02400240200628020020042802002203460d00200128020021050c010b200341016a22052003490d612003410174220a20052005200a491b220a4100480d610240024020030d00200a102721050c010b20012802002003200a102821050b2005450d5520012005360200200141046a200a360200200141086a28020021030b2004200341016a360200200520036a41053a0000200028020c21050240024020062802002203200428020022006b4104490d00200128020021030c010b200041046a22062000490d6120034101742200200620062000491b22004100480d610240024020030d002000102721030c010b200128020020032000102821030b2003450d5620012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c140b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d6020034101742205200420042005491b22054100480d600240024020030d002005102721040c010b200128020020032005102821040b2004450d5620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a0000200028020c200110320c130b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5f20034101742205200420042005491b22054100480d5f0240024020030d002005102721040c010b200128020020032005102821040b2004450d5620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200028020c200110320c120b02400240200628020020042802002205460d002001280200210a0c010b200541016a220a2005490d5e20054101742209200a200a2009491b22094100480d5e0240024020050d0020091027210a0c010b2001280200200520091028210a0b200a450d562001200a360200200141046a2009360200200141086a28020021050b2004200541016a360200200a20056a41083a0000024002402006280200220a200428020022056b4120490d002001280200210a0c010b200541206a22092005490d5e200a4101742205200920092005491b22054100480d5e02400240200a0d0020051027210a0c010b2001280200200a20051028210a0b200a450d572001200a360200200141046a2005360200200141086a28020021050b2004200541206a360200200a20056a220541186a200341196a290000370000200541106a200341116a290000370000200541086a200341096a29000037000020052003290001370000200029033021070240024020062802002205200428020022036b4108490d00200128020021050c010b200341086a220a2003490d5e20054101742203200a200a2003491b22034100480d5e0240024020050d002003102721050c010b200128020020052003102821050b2005450d5820012005360200200141046a2003360200200141086a28020021030b2004200341086a360200200520036a2007370000200029033821070240024020062802002203200428020022006b4108490d00200128020021030c010b200041086a22052000490d5e20034101742200200520052000491b22004100480d5e0240024020030d002000102721030c010b200128020020032000102821030b2003450d5920012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a20073700000c110b02400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d5d2000410174220a20052005200a491b220a4100480d5d0240024020000d00200a102721050c010b20012802002000200a102821050b2005450d5920012005360200200141046a200a360200200141086a28020021000b2004200041016a360200200520006a41093a00000240024020062802002205200428020022006b4120490d00200128020021050c010b200041206a22062000490d5d20054101742200200620062000491b22004100480d5d0240024020050d002000102721050c010b200128020020052000102821050b2005450d5a20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a290000370000200020032900013700000c100b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c0240024020030d002005102721040c010b200128020020032005102821040b2004450d5a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a00002000410c6a200110300c0f0b02400240200628020020042802002203460d00200128020021040c010b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b0240024020030d002005102721040c010b200128020020032005102821040b2004450d5a20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a0000200041186a200110542000410c6a20011030200041106a200110300c0e0b02400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d9a012000410174220a20052005200a491b220a4100480d9a010240024020000d00200a102721050c010b20012802002000200a102821050b2005450d5b20012005360200200141046a200a360200200141086a28020021000b2004200041016a360200200520006a410c3a00000240024020062802002205200428020022006b4120490d00200128020021050c010b200041206a22062000490d9a0120054101742200200620062000491b22004100480d9a010240024020050d002000102721050c010b200128020020052000102821050b2005450d5c20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a290000370000200020032900013700000c0d0b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d990120004101742205200320032005491b22054100480d99010240024020000d002005102721030c010b200128020020002005102821030b2003450d5c20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410d3a00000c0c0b02400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d98012000410174220a20052005200a491b220a4100480d98010240024020000d00200a102721050c010b20012802002000200a102821050b2005450d5c20012005360200200141046a200a360200200141086a28020021000b2004200041016a360200200520006a410e3a00000240024020062802002205200428020022006b4120490d00200128020021050c010b200041206a22062000490d980120054101742200200620062000491b22004100480d98010240024020050d002000102721050c010b200128020020052000102821050b2005450d5d20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a290000370000200020032900013700000c0b0b02400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d97012000410174220a20052005200a491b220a4100480d97010240024020000d00200a102721050c010b20012802002000200a102821050b2005450d5d20012005360200200141046a200a360200200141086a28020021000b2004200041016a360200200520006a410f3a00000240024020062802002205200428020022006b4120490d00200128020021050c010b200041206a220a2000490d970120054101742200200a200a2000491b22004100480d97010240024020050d002000102721050c010b200128020020052000102821050b2005450d5e20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000020032d0021220041054b0d0a024002400240024002400240024020000e06000102030405000b410021030c050b410121030c040b410221030c030b410321030c020b410421030c010b410521030b200220033a001c02400240200628020020042802002200460d00200128020021050c010b200041016a22052000490d970120004101742206200520052006491b22064100480d97010240024020000d002006102721050c010b200128020020002006102821050b2005450d5f20012005360200200141046a2006360200200141086a28020021000b2004200041016a360200200520006a20033a00000c0a0b02400240200628020020042802002200460d00200128020021030c010b200041016a22032000490d960120004101742205200320032005491b22054100480d96010240024020000d002005102721030c010b200128020020002005102821030b2003450d5f20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41103a00000c090b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d950120034101742205200420042005491b22054100480d95010240024020030d002005102721040c010b200128020020032005102821040b2004450d5f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041046a20011092020c080b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d940120034101742205200420042005491b22054100480d94010240024020030d002005102721040c010b200128020020032005102821040b2004450d5f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041046a20011092020c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d930120034101742205200420042005491b22054100480d93010240024020030d002005102721040c010b200128020020032005102821040b2004450d5f20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000280208417f6a220341094b0d06024002400240024002400240024002400240024020030e0a00010203040506070809000b200241003a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9c0120034101742205200420042005491b22054100480d9c010240024020030d002005102721040c010b200128020020032005102821040b2004450d6920012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a0000200028020c21042002200041146a280200220a360208200241086a200110300240200a450d00200141046a2109034002400240200928020020062802002203460d00200128020021050c010b200341016a22052003490d9e012003410174220b20052005200b491b220b4100480d9e010240024020030d00200b102721050c010b20012802002003200b102821050b2005450d6c200120053602002009200b360200200628020021030b2006200341016a360200200520036a20042d00003a0000200441016a2104200a417f6a220a0d000b0b200041186a20011030200028021c210402400240200141046a2802002203200628020022006b4104490d00200128020021030c010b200041046a22052000490d9c0120034101742200200520052000491b22004100480d9c010240024020030d002000102721030c010b200128020020032000102821030b2003450d6b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0f0b200241013a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9b0120034101742205200420042005491b22054100480d9b010240024020030d002005102721040c010b200128020020032005102821040b2004450d6b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41013a0000200028020c21042002200041146a280200220a360208200241086a200110300240200a450d00200141046a2109034002400240200928020020062802002203460d00200128020021050c010b200341016a22052003490d9d012003410174220b20052005200b491b220b4100480d9d010240024020030d00200b102721050c010b20012802002003200b102821050b2005450d6e200120053602002009200b360200200628020021030b2006200341016a360200200520036a20042d00003a0000200441016a2104200a417f6a220a0d000b0b200041186a20011030200028021c210402400240200141046a2802002203200628020022006b4104490d00200128020021030c010b200041046a22052000490d9b0120034101742200200520052000491b22004100480d9b010240024020030d002000102721030c010b200128020020032000102821030b2003450d6d20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0e0b200241023a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d9a0120034101742205200420042005491b22054100480d9a010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011030200041106a20011051200041346a20011030200041386a200110300c0d0b200241033a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d990120034101742205200420042005491b22054100480d99010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a200110300c0c0b200141086a2802002103200241043a001c024002402003200141046a280200460d00200128020021040c010b200341016a22042003490d980120034101742205200420042005491b22054100480d98010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a200110300c0b0b200241053a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d970120034101742205200420042005491b22054100480d97010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a200110512002200041386a360208200241086a20011059200041306a200110300c0a0b200241063a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d960120034101742205200420042005491b22054100480d96010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a200110300c090b200241073a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d950120034101742205200420042005491b22054100480d95010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a200110510c080b200141046a2802002104200241083a001c024002402004200141086a2802002203460d00200128020021040c010b200341016a22042003490d940120034101742205200420042005491b22054100480d94010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a200110540c070b200241093a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d930120034101742205200420042005491b22054100480d93010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a200110540c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d920120034101742205200420042005491b22054100480d92010240024020030d002005102721040c010b200128020020032005102821040b2004450d6d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d920120034101742205200420042005491b22054100480d92010240024020030d002005102721040c010b200128020020032005102821040b2004450d6e20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110540c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d910120034101742205200420042005491b22054100480d91010240024020030d002005102721040c010b200128020020032005102821040b2004450d6e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d910120034101742205200420042005491b22054100480d91010240024020030d002005102721040c010b200128020020032005102821040b2004450d6f20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280204210620022000410c6a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d910120044101742203200520052003491b22034100480d91010240024020040d002003102721040c010b200128020020042003102821040b2004450d7020012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d900120034101742205200420042005491b22054100480d90010240024020030d002005102721040c010b200128020020032005102821040b2004450d7020012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410e3a00002000280208417f6a220341024b0d0302400240024020030e03000102000b200241003a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d920120034101742205200420042005491b22054100480d92010240024020030d002005102721040c010b200128020020032005102821040b2004450d7320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a360208200241086a200110592000410c6a200110510c050b200241013a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d910120034101742205200420042005491b22054100480d91010240024020030d002005102721040c010b200128020020032005102821040b2004450d7320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110300c040b200241023a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d900120034101742205200420042005491b22054100480d90010240024020030d002005102721040c010b200128020020032005102821040b2004450d7320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110300c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d8f0120034101742205200420042005491b22054100480d8f010240024020030d002005102721040c010b200128020020032005102821040b2004450d7320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410f3a0000200041086a22032d0000417f6a220441054b0d0202400240024002400240024020040e06000102030405000b200241003a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d940120034101742205200420042005491b22054100480d94010240024020030d002005102721040c010b200128020020032005102821040b2004450d7920012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041106a20011093020c070b200241013a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d930120034101742205200420042005491b22054100480d93010240024020030d002005102721040c010b200128020020032005102821040b2004450d7920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a20011054200028020c21062002200041146a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d930120044101742203200520052003491b22034100480d93010240024020040d002003102721040c010b200128020020042003102821040b2004450d7a20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c060b200241023a001c02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d920120034101742205200420042005491b22054100480d92010240024020030d002005102721040c010b200128020020032005102821040b2004450d7a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a200110512002200041c0006a360208200241086a20011059200041d0006a20011054200028023021062002200041386a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d920120044101742203200520052003491b22034100480d92010240024020040d002003102721040c010b200128020020042003102821040b2004450d7b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0c050b200241033a001c02400240200141046a280200200141086a2802002204460d00200128020021050c010b200441016a22052004490d910120044101742206200520052006491b22064100480d91010240024020040d002006102721050c010b200128020020042006102821050b2005450d7b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41033a00002002200041386a360208200241086a20011059200041c8006a2001105402400240200141046a2802002205200628020022046b4120490d00200128020021050c010b200441206a22062004490d910120054101742204200620062004491b22044100480d91010240024020050d002004102721050c010b200128020020052004102821050b2005450d7c20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a29000037000020042003290001370000200028022c21052002200041346a2802002200360208200241086a2001103002400240200141046a2802002204200628020022036b2000490d00200128020021040c010b200320006a22062003490d910120044101742203200620062003491b22034100480d91010240024020040d002003102721040c010b200128020020042003102821040b2004450d7d20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2005200010ce041a0c040b200141086a2802002100200241043a001c024002402000200141046a280200460d00200128020021040c010b200041016a22042000490d900120004101742205200420042005491b22054100480d90010240024020000d002005102721040c010b200128020020002005102821040b2004450d7d20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41043a000002400240200141046a2802002204200528020022006b4120490d00200128020021040c010b200041206a22052000490d900120044101742200200520052000491b22004100480d90010240024020040d002000102721040c010b200128020020042000102821040b2004450d7e20012004360200200141046a2000360200200141086a28020021000b200141086a2205200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a29000037000020002003290001370000024020032d00214101460d00200241003a001c02400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d910120004101742204200320032004491b22044100480d91010240024020000d002004102721030c010b200128020020002004102821030b2003450d800120012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a00000c040b200241013a001c02400240200141046a28020020052802002200460d00200128020021040c010b200041016a22042000490d900120004101742205200420042005491b22054100480d90010240024020000d002005102721040c010b200128020020002005102821040b2004450d800120012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41013a000002400240200141046a2802002204200528020022006b4120490d00200128020021040c010b200041206a22052000490d900120044101742200200520052000491b22004100480d90010240024020040d002000102721040c010b200128020020042000102821040b2004450d810120012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220041186a200341226a220341186a290000370000200041106a200341106a290000370000200041086a200341086a290000370000200020032900003700000c030b200241053a001c02400240200141046a280200200141086a2802002204460d00200128020021050c010b200441016a22052004490d8f0120044101742206200520052006491b22064100480d8f010240024020040d002006102721050c010b200128020020042006102821050b2005450d810120012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41053a000002400240200141046a2802002205200628020022046b4120490d00200128020021050c010b200441206a22062004490d8f0120054101742204200620062004491b22044100480d8f010240024020050d002004102721050c010b200128020020052004102821050b2005450d820120012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000002400240200141046a2802002205200628020022046b4120490d00200128020021050c010b200441206a22062004490d8f0120054101742204200620062004491b22044100480d8f010240024020050d002004102721050c010b200128020020052004102821050b2005450d830120012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341216a220341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200041e0006a29030021072000290358210e02400240200141046a2802002204200628020022036b4110490d00200128020021040c010b200341106a22052003490d8f0120044101742203200520052003491b22034100480d8f010240024020040d002003102721040c010b200128020020042003102821040b2004450d840120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320073700082003200e370000200028024c21032002200041d4006a2802002200360208200241086a200110302000450d0220004105742106200141046a210a034002400240200a2802002204200528020022006b4120490d00200128020021040c010b200041206a22092000490d900120044101742200200920092000491b22004100480d90010240024020040d002000102721040c010b200128020020042000102821040b2004450d860120012004360200200a2000360200200528020021000b2005200041206a360200200420006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000c030b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d8e0120034101742205200420042005491b22054100480d8e010240024020030d002005102721040c010b200128020020032005102821040b2004450d850120012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41103a00002000280204417f6a220341014b0d010240024020030e020001000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d8f0120034101742205200420042005491b22054100480d8f010240024020030d002005102721040c010b200128020020032005102821040b2004450d870120012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000280208200110320c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d8e0120034101742205200420042005491b22054100480d8e010240024020030d002005102721040c010b200128020020032005102821040b2004450d870120012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110510c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d8d0120034101742205200420042005491b22054100480d8d010240024020030d002005102721040c010b200128020020032005102821040b2004450d870120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41113a0000200241003a001c02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d8d0120034101742205200420042005491b22054100480d8d010240024020030d002005102721040c010b200128020020032005102821040b2004450d880120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000290308210702400240200141046a2802002204200528020022036b4108490d00200128020021040c010b200341086a22052003490d8d0120044101742203200520052003491b22034100480d8d010240024020040d002003102721040c010b200128020020042003102821040b2004450d890120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341086a360200200420036a2007370000200041106a20011061200041286a280200210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d8d0120044101742203200520052003491b22034100480d8d010240024020040d002003102721040c010b200128020020042003102821040b2004450d8a0120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a200636000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d8d0120044101742203200520052003491b22034100480d8d010240024020040d002003102721040c010b200128020020042003102821040b2004450d8b0120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a2000412c6a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200028025021062002200041d8006a2802002200360208200241086a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d8d0120044101742203200520052003491b22034100480d8d010240024020040d002003102721040c010b200128020020042003102821040b2004450d8c0120012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2006200010ce041a0b200241206a24000f0b20054101102a000b20044101102a000b20054101102a000b20034101102a000b20054101102a000b20004101102a000b20054101102a000b20034101102a000b20044101102a000b20054101102a000b20054101102a000b20054101102a000b20004101102a000b20044101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20004101102a000b20004101102a000b20004101102a000b20004101102a000b20044101102a000b20054101102a000b20044101102a000b20044101102a000b200a4101102a000b200a4101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b200a4101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b200a4101102a000b20004101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b20034101102a000b200a4101102a000b20054101102a000b20054101102a000b200a4101102a000b200a4101102a000b200a4101102a000b200a4101102a000b200a4101102a000b200a4101102a000b20034101102a000b20004101102a000b200a4101102a000b20004101102a000b20054101102a000b20054101102a000b20094101102a000b20054101102a000b20034101102a000b20004101102a000b200a4101102a000b20004101102a000b20054101102a000b20054101102a000b102b000b200a4101102a000b20004101102a000b20054101102a000b200a4101102a000b20004101102a000b200a4101102a000b20004101102a000b20064101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b200b4101102a000b20004101102a000b20054101102a000b200b4101102a000b20004101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20034101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20034101102a000b20054101102a000b20034101102a000b20064101102a000b20044101102a000b20034101102a000b20054101102a000b20004101102a000b20044101102a000b20054101102a000b20004101102a000b20064101102a000b20044101102a000b20044101102a000b20034101102a000b20004101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b20034101102a000b20034101102a000b102b000bae0401067f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210300240024002400240024020000d002002280208210020022802042104200228020021050c010b200041b0016c21062002280204210420022802082100034020034188016a280200210702400240200420006b4104490d00200228020021040c010b200041046a22052000490d0520044101742200200520052000491b22004100480d050240024020040d002000102721040c010b200228020020042000102821040b2004450d032002200036020420022004360200200228020821000b2002200041046a360208200420006a20073600002003200210320240024020022802042204200228020822006b4120490d00200228020021050c010b200041206a22072000490d0520044101742200200720072000491b22074100480d050240024020040d002007102721050c010b200228020020042007102821050b2005450d04200220073602042002200536020020022802082100200721040b200520006a220741086a20034194016a290000370000200741106a2003419c016a290000370000200741186a200341a4016a2900003700002002200041206a220036020820072003418c016a290000370000200341b0016a2103200641d07e6a22060d000b0b2001280200200128020420052000100302402004450d00200510290b200241106a24000f0b20004101102a000b20074101102a000b102b000b840403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210300240024020000d002002280208210420022802042100200228020021050c010b2003200041306c6a21062002280200210520022802042100200228020821040340200341086a29030021072003290300210802400240024002400240200020046b4110490d00200441106a21090c010b200441106a22092004490d012000410174220a20092009200a491b220a4100480d010240024020000d00200a102721050c010b20052000200a102821050b2005450d02200a21000b200520046a22042007370008200420083700000240200020096b4120490d00200941206a21040c030b200941206a22042009490d002000410174220a20042004200a491b220a4100480d000240024020000d00200a102721050c010b20052000200a102821050b02402005450d00200a21000c030b200a4101102a000b102b000b200a4101102a000b200520096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032006470d000b2002200036020420022004360208200220053602000b2001280200200128020420052004100302402000450d00200510290b200241106a24000b990501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103002400240024002400240024020000d002002280208210420022802042105200228020021000c010b200041216c210603400240024020032d00004101460d00024002402002280204220520022802082207460d00200228020021000c010b200741016a22002007490d0820074101742205200020002005491b22054100480d080240024020070d002005102721000c010b200228020020072005102821000b2000450d0520022005360204200220003602000b2002200741016a2204360208200020076a41003a00000c010b024002402002280204220520022802082207460d00200228020021000c010b200741016a22002007490d0720074101742205200020002005491b22054100480d070240024020070d002005102721000c010b200228020020072005102821000b2000450d0520022005360204200220003602000b2002200741016a2208360208200020076a41013a000002400240200520086b4120490d00200741216a21040c010b200841206a22042008490d0720054101742207200420042007491b22074100480d070240024020050d002007102721000c010b200020052007102821000b2000450d062002200736020420022000360200200721050b200020086a220741086a200341016a220841086a290000370000200741106a200841106a290000370000200741186a200841186a29000037000020022004360208200720082900003700000b200341216a21032006415f6a22060d000b0b2001280200200128020420002004100302402005450d00200010290b200241106a24000f0b20054101102a000b20054101102a000b20074101102a000b102b000b9203010a7f200041086a220228020021034100210420024100360200024002402003450d004100210541002106410021044100210702400340024002402004450d00200741057421080340200720034f0d062001200028020022096b2008460d02200920086a220a2001412010d004450d020240200620076a220b20034f0d00200920056a20086a2209200a290000370000200941186a200a41186a290000370000200941106a200a41106a290000370000200941086a200a41086a290000370000200841206a2108200741016a22072003490d010c050b0b419481c000200b20031037000b200028020020074105746a21080340200720034f0d0520012008460d0120082001412010d004450d01200841206a2108200741016a22072003490d000b410021040c030b200541606a21052006417f6a2106200441016a2104200741016a22072003490d000b0b2004450d00200320074d0d00200028020020074105746a220820044105746b2008200320076b41057410cf041a0b2002200320046b3602000f0b41b880c000200720031037000b6c01017f230041306b2203240020032002360204200320013602002003411c6a41023602002003412c6a41013602002003420237020c200341a8d6c500360208200341013602242003200341206a360218200320033602282003200341046a360220200341086a20001057000bae0a03027f017e1a7f230041f0006b22022400024002400240024002400240024020012802082203ad42f8007e2204422088a70d002004a72205417f4c0d00200128020021060240024020050d00410821070c010b200510272207450d020b0240024020030d00410021080c010b2006200341f8006c6a2109410021082007210a0340200241c0006a41086a220b2006411c6a290000370300200241c0006a41106a220c200641246a290000370300200241c0006a41186a220d2006412c6a290000370300200241206a41086a220e2006413c6a29000037030020062900142104200241206a41106a220f200641c4006a290000370300200241206a41186a2210200641cc006a290000370300200241106a2211200641e4006a290000370300200241086a2212200641dc006a290000370300200241186a2213200641ec006a29000037030020022004370340200220062900343703202002200629005437030020062802102214ad42247e2204422088a70d022004a72201417f4c0d0220062903002104200628020821150240024020010d00410421160c010b200110272216450d050b0240024020140d00410021170c010b201441246c211841002119410021170340024002400240024002400240201520196a22012d00000e050001020304000b2002200141146a2900003703602002200141196a290000370065200141056a2f0000200141076a2d000041107472211a200141106a280000211b2001410c6a2800002105200141086a280000211c200141016a280000211d4100211e0c040b200141106a2802002205417f4c0d08200141086a280200211b200141016a280000211d4101211e4101211c02402005450d0020051027221c450d0c0b201c201b200510ce041a2005211b0c030b200141106a2802002205417f4c0d07200141086a280200211e200141016a280000211d0240024020050d004101211c0c010b20051027221c450d0c0b201c201e200510ce041a4102211e2005211b0c020b200141106a2802002205417f4c0d06200141086a280200211e200141016a280000211d0240024020050d004101211c0c010b20051027221c450d0c0b201c201e200510ce041a4103211e2005211b0c010b2001410c6a280200221c417f4c0d05200141046a280200210102400240201c0d00410121050c010b201c10272205450d0c0b20052001201c10ce042201410876211a2001411874211d4104211e201c21050b201620196a2201201e3a0000200141076a201a4110763a0000200141056a201a3b0000200141106a201b3600002001410c6a2005360000200141086a201c360000200141016a201d360000200141146a20022903603702002001411c6a200241e0006a41086a290300370200201741016a21172018201941246a2219470d000b0b200a2016360208200a410c6a2014360200200a41106a2017360200200a2002290340370214200a411c6a200b290300370200200a2004370300200a2002290320370234200a41246a200c290300370200200a412c6a200d290300370200200a413c6a200e290300370200200a41c4006a200f290300370200200a41cc006a2010290300370200200a41ec006a2013290300370200200a41e4006a2011290300370200200a41dc006a2012290300370200200a2002290300370254200841016a2108200a41f8006a210a200641f8006a22062009470d000b0b200020083602082000200336020420002007360200200241f0006a24000f0b1039000b20054108102a000b20014104102a000b20054101102a000b20054101102a000b20054101102a000b201c4101102a000b0500102b000b900201077f024020002802082201200028020c460d0003402000200141306a36020820012d00284102460d01200141246a2802002102200141206a2802002103200141146a2802002104200128021c2105200128021021060240200141186a2802002201450d002001410c6c21072006210103400240200141046a280200450d00200128020010290b2001410c6a2101200741746a22070d000b0b02402004450d00200610290b02402002450d002002410c6c21072005210103400240200141046a280200450d00200128020010290b2001410c6a2101200741746a22070d000b0b02402003450d00200510290b20002802082201200028020c470d000b0b02402000280204450d00200028020010290b0bbb06020c7f017e230041b0056b2202240020022001102e02400240024002400240024020022802000d00200041003602000c010b0240024020022802042203411c2003411c491b22040d00410821050c010b20044190016c220610272205450d020b02402003450d0020024198036a41047221074100210841002106410021090340200241003a00a004200241a0046a2001280200220a2001280204220b410047220c10ce041a200b200c490d042001200b200c6b3602042001200a200c6a36020002400240024002400240200b450d0020022d00a004220b41014b0d000240200b0e020400040b200241a0046a2001103c0240024020022802a0044112460d0020024198036a200241a0046a41880110ce041a200241003602ac05200241ac056a2001280200220a2001280204220b4104200b4104491b220c10ce041a2001200b200c6b3602042001200a200c6a360200200b41034b0d0120024198036a103d0b200241a0046a20024194026a41840110ce041a0c010b20022802ac05210d200228029803210c20024194026a200741840110ce041a200241a0046a20024194026a41840110ce041a200c4112470d010b200241a0046a20024190016a41840110ce041a0c010b20024190016a200241a0046a41840110ce041a200241a0046a20024190016a41840110ce041a200c4113470d020b2000410036020002402009450d00200521010340024020012802004112460d002001103d0b20014190016a2101200641f07e6a22060d000b0b2004450d04200510290c040b200241a0046a20024190016a41840110ce041a4112210c0b200941016a210b2002410c6a200241a0046a41840110ce041a024020092004470d002008200b200b2008491b2204ad4290017e220e422088a70d07200ea7220a4100480d070240024020090d00200a102721050c010b20052006200a102821050b2005450d060b200520066a2209200c360200200941046a2002410c6a41840110ce041a20094188016a200d360200200841026a210820064190016a2106200b21092003200b470d000b0b2000200436020420002005360200200041086a20033602000b200241b0056a24000f0b20064108102a000b200c200b103e000b200a4108102a000b102b000bfe5e07067f017e047f037e017f037e047f23004190096b22022400200241003a00e803200241e8036a2001280200220320012802042204410047220510ce041a0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d002001200420056b22063602042001200320056a2205360200024020040d00200041123602000c290b0240024002400240024002400240024002400240024020022d00e803220441114b0d0002400240024002400240024002400240024002400240024002400240024002400240024020040e12000102030405060708090a0b0c0d0e0f1011000b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d1d2001200620046b22033602042001200520046a22053602002006450d4220022d00f008220641054b0d42410121070240024002400240024020060e06480001020304480b200241f8056a2001104420022802f8052204450d4620022902fc052108410221070c470b200242003703f805200241f8056a20052003410820034108491b220410ce041a2001200320046b3602042001200520046a360200200341074d0d4520022903f8052108410321070c460b200241f8056a2001104420022802f8052204450d4420022902fc052108410421070c450b20022001102e2002280200450d43024002402002280204220941aa01200941aa01491b220a0d00410421040c010b200a41186c220510272204450d200b02402009450d0020024180066a210b4100210741002105410021030340200241e8036a200110440240024020022802e803220c450d0020022902ec032108200241f8056a2001104420022802f8050d012008a7450d00200c10290b02402003450d002004210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141186a2101200541686a22050d000b0b200a0d450c460b200341016a2106200b350200210d20022903f805210e02402003200a470d002007200620062007491b220aad42187e220f422088a70d3c200fa722104100480d3c0240024020030d002010102721040c010b200420052010102821040b2004450d230b200420056a2203200c360200200341146a200d3e02002003410c6a200e370200200341046a2008370200200741026a2107200541186a21052006210320092006470d000b0b2004450d432009ad422086200aad842108410521070c440b200241086a2001102e2002280208450d4202400240200228020c220941d502200941d502491b220a0d00410421040c010b200a410c6c220510272204450d210b02402009450d004100210741002105410021030340200241f8056a20011044024020022802f805220c0d0002402003450d002004210103400240200141046a280200450d00200128020010290b2001410c6a2101200541746a22050d000b0b200a450d450c440b200341016a210620022902fc05210802402003200a470d002007200620062007491b220aad420c7e220d422088a70d3b200da7220b4100480d3b0240024020030d00200b102721040c010b20042005200b102821040b2004450d240b200420056a2203200c360200200341046a2008370200200741026a21072005410c6a21052006210320092006470d000b0b2004450d422009ad422086200aad842108410621070c430b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d212001200620046b3602042001200520046a360200200041123602000c430b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d212001200620046b3602042001200520046a36020002402006450d0020022d00e8030d00200241106a200110522002290310a7450d002002290318210820004102360200200041086a2008370300200041106a200241f0046a41f80010ce041a0c430b200041123602000c420b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d212001200620046b3602042001200520046a36020002402006450d0020022d00e8030d00200241206a2001102e2002280220450d000240024020022802242209412220094122491b220a0d004108210c0c010b200a41f8006c22041027220c450d240b02402009450d00200241f0046a410c6a210b4100210741002106410021050340200241f0046a2001108e0220022903f004210820022802f8042103200241e8036a200b41ec0010ce041a024020030d0002402005450d00200c20066a2103200c210603400240200641106a2802002204450d0020062802082101200441246c210403400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012004415c6a22040d000b0b200641f8006a210102402006410c6a280200450d00200628020810290b2001210620032001470d000b0b200a450d03200c10290c030b200541016a210420024180086a200241e8036a41ec0010ce041a02402005200a470d002007200420042007491b220aad42f8007e220d422088a70d39200da722104100480d390240024020050d0020101027210c0c010b200c200620101028210c0b200c450d270b200c20066a22052008370300200541086a20033602002005410c6a20024180086a41ec0010ce041a200741026a2107200641f8006a21062004210520092004470d000b0b200c0d120b200041123602000c410b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d232001200620046b3602042001200520046a360200200041123602000c400b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d232001200620046b3602042001200520046a36020002402006450d0020022d00f008220441014b0d0002400240024020040e020001000b200241f8056a2001105020022d00f80522044102460d0220022d00fb05210320022f00f905210720024184066a290200210820024198066a280200210520024190066a290300210d2002418c066a280200210620022902fc05210e200241286a200110532002280228450d0220072003411074722101200241286a41106a290300210f41012103200229033021110c010b200241f8056a2001105020022d00f80522044102460d0120022d00fb05210320022f00f905210720024184066a290200210820024198066a280200210520024190066a290300210d2002418c066a280200210620022902fc05210e200241d8006a200110532002290358a7450d01200241d8006a41106a290300210f20022903602111200241c0006a200110532002290340a7450d0120072003411074722101200241d0006a290300211220022903482113410221030b200020013b000d200041053602002000410f6a20014110763a0000200041c8006a2012370200200041c0006a2013370200200041386a200f370200200041306a2011370200200041186a2008370000200041106a200e3700002000412c6a2005360000200041246a200d370000200041206a20063600002000410c6a20043a0000200041086a2003360200200041d0006a20022903f004370300200041d8006a200241f0046a41086a290300370300200041e0006a200241f0046a41106a290300370300200041e8006a200241f0046a41186a290300370300200041f0006a200241f0046a41206a290300370300200041f8006a20024198056a29030037030020004180016a200241f0046a41306a2903003703000c400b200041123602000c3f0b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d232001200620046b22093602042001200520046a220b3602002006450d3a20022d00f008220a410c4b0d3a41042107024002400240024002400240024002400240024002400240200a0e0d00010245030405060708090a0b000b200241f8056a2001105020022d00f80522044102460d4520022d00fb05210a20022f00f905210920024184066a290200210d20024198066a280200210320024190066a29030021082002418c066a280200210520022902fc05210e200241f0006a200110532002290370a7450d45200241f0006a41106a29030021112002290378210f200241003a00f008200241f0086a2001280200220c20012802042206410047220710ce041a20062007490d2f2001200620076b3602042001200c20076a3602002006450d4520022d00f008220641024b0d452009200a41107472210c410121070c440b20024188016a20011053200229038801a7450d4420024198016a290300210d200229039001210e200220022f01f8053b018008410221074100210c0c430b200241a0016a2001105320022903a001a7450d43200241b0016a290300210d20022903a801210e200220022f01f8053b018008410321074100210c0c420b200241d0016a2001102e20022802d001450d4220022802d4012105200241b8016a2001105320022903b801a7450d42200241c8016a290300210d20022903c001210e200220022f01f8053b018008410521074100210c0c410b200241d8016a2001102e20022802d801450d410240024020022802dc01221441f100201441f100491b22150d00410421040c010b201541246c220510272204450d2d0b02402014450d004120210320024184066a211641002107410021050340200241f8056a20011050024020022d00f805220c4102470d002015450d44200410290c440b200541016a210620022d00fb05210a20022f00f90521092016290200210820022902fc05210d200228029806210b200229039006210e200228028c062110024020052015470d002007200620062007491b2215ad42247e220f422088a70d3c200fa722174100480d3c0240024020050d002017102721040c010b2004200341606a2017102821040b2004450d300b200420036a2205200b360000200541616a220b2009200a41107472220a3b0000200541646a220920083700082009200d370000200541786a200e370000200541746a2010360000200541606a200c3a0000200b41026a200a4110763a0000200741026a2107200341246a21032006210520142006470d000b0b2004450d412014ad4220862015ad84210e200220022f01e8033b0180082004410876210c410621070c400b410721070c3f0b200241003a00f008200241f0086a200b2009410047220410ce041a20092004490d2c2001200920046b3602042001200b20046a3602002009450d3f20022d00f008220641034f0d3f200220022f01f8053b018008410821074200210d4100210c0c3e0b200241f8056a2001105020022d00f80522044102460d3e20024184066a290200210d20022902fc05210e200220022f01e8033b01800820022f00f90520022d00fb0541107472210c2002418c066a280200210520024190066a290300210820024198066a2802002103410921070c3d0b200241e0016a2001102e20022802e001450d3d20022802e4012104200220022f01f8053b0180082004410876210c410a21074200210d0c3c0b410b21070c3b0b200241e8016a2001102e20022802e801450d3b20022802ec012104200220022f01f8053b0180082004410876210c410c21074200210d0c3a0b200241f8056a2001102d20022802f8052204450d3a200220022f01e8033b0180082004410876210c20022902fc05210e410d21070c390b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d272001200620046b22033602042001200520046a220436020002402006450d0020022d00f0080d00200241e0076a2003412020034120491b22056a41004100412020056b2005411f4b1b10cd041a200241e0076a2004200510ce041a2001200320056b22063602042001200420056a22053602002003411f4d0d00200241f0086a41086a2203200241e0076a41086a2207290300370300200241f0086a41106a220c200241e0076a41106a220a290300370300200241f0086a41186a2209200241e0076a41186a220b290300370300200220022903e00722083703a007200220083703f008200241e0076a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241e0076a2005200410ce041a2001200620046b3602042001200520046a3602002006411f4d0d0020024180076a41086a2204200729030037030020024180076a41106a2205200a29030037030020024180076a41186a2206200b290300370300200241f0046a41186a22072009290300370300200241f0046a41106a220a200c290300370300200241f0046a41086a220c2003290300370300200220022903e00722083703a0072002200837038007200220022903f0083703f004200241f0046a41386a22032006290300370300200241f0046a41306a22062005290300370300200241f0046a41286a22052004290300370300200220022903800737039005200241f8056a41386a22042003290300370300200241f8056a41306a22032006290300370300200241f8056a41286a22062005290300370300200241f8056a41206a2205200229039005370300200241f8056a41186a2007290300370300200241f8056a41106a200a290300370300200241f8056a41086a200c290300370300200220022903f0043703f805200241f0046a2001104420022802f00422010d0f0b200041123602000c3d0b200241f8056a2001108f02200220022f01fa053b01e80320022d00f80522014112470d0e200041123602000c3c0b200241f8056a2001109002200241e8036a41086a2201200241f8056a41096a290000370300200241e8036a41106a220420024189066a290000370300200241e8036a41186a220520024191066a290000370300200241e8036a411f6a220620024198066a290000370000200220022900f9053703e80320022d00f80522034105470d0e200041123602000c3b0b200241f8056a2001109002200241e8036a41086a220120024181066a290000370300200241e8036a41106a220420024189066a290000370300200241e8036a41186a220520024191066a290000370300200241e8036a411f6a220620024198066a290000370000200220022900f9053703e80320022d00f80522034105470d0e200041123602000c3a0b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d242001200620046b3602042001200520046a3602002006450d3320022d00f008220441094b0d33024002400240024002400240024002400240024020040e0a00010203040506070809000b200241f8056a2001104220022802f8052204450d3c20022902fc052108200241f0016a2001102e2008a72105024020022802f0010d002005450d3d0c3c0b20022802f4012106200241003602f805200241f8056a2001280200220c20012802042203410420034104491b220710ce041a2001200320076b3602042001200c20076a3602000240200341034b0d0020050d3c0c3d0b2008422088210820024180086a41086a200241e8036a41086a280200360200200220022902e80337038008200541087621092004410876210b20022802f80521014101210a0c3a0b200241f8056a2001104220022802f8052204450d3b20022902fc052108200241f8016a2001102e2008a72105024020022802f8010d0020050d3b0c3c0b20022802fc012106200241003602f805200241f8056a2001280200220c20012802042203410420034104491b220710ce041a2001200320076b3602042001200c20076a3602000240200341034b0d0020050d3b0c3c0b2008422088210820024180086a41086a200241e8036a41086a280200360200200220022902e80337038008200541087621092004410876210b20022802f80521014102210a0c390b20024190026a2001102e200228029002450d3a2002280294022104200241f8056a2001105020022d00f80522054102460d3a20022d00fb05210620022f00f905210320024184066a290200210e20024198066a280200210720024190066a290300210d2002418c066a280200210a20022902fc05210820024188026a2001102e200228028802450d3a200228028c02210c20024180026a2001102e200228028002450d3a2003200641107472210920022802840221012002200d370284082002200a360280082004410876210b2008422088a72106200e422088a721032001ad210d200ea721014200210e4103210a0c380b20024198026a2001102e200228029802450d39200228029c02210420024180086a41086a200241f8056a41086a280200360200200220022902f805370380082004410876210b4104210a0c360b200241a0026a2001102e20022802a002450d3820022802a402210420024180086a41086a200241f8056a41086a280200360200200220022902f805370380082004410876210b4105210a0c350b200241f8056a2001105020022d00f80522044102460d3720022d00fb05210520022f00f905210620024184066a290200210f20024198066a280200210c20024190066a29030021082002418c066a280200210320022902fc052111200241b0026a2001105320022903b002a7450d37200241b0026a41106a290300210e20022903b802210d200241a8026a2001102e20022802a802450d372006200541107472210b20022802ac0221072002200c360288082002200837038008201142208821082011a722054108762109200f422088a72101200fa721064106210a0c350b200241c8026a2001102e20022802c802450d3620022802cc02210420024180086a41086a200241f8056a41086a280200360200200220022902f805370380082004410876210b4107210a0c330b200241f8056a2001105020022d00f80522044102460d3520024184066a290200210d20022902fc05210e200220024198066a28020036028808200220024190066a29030037038008200e42208821084108210a200ea72205410876210920022f00f90520022d00fb0541107472210b200d422088a721012002418c066a2802002103200da721060c330b200241d0026a2001105220022903d002a7450d3420022903d802220d4220882108200da7220541087621094109210a0c320b200241e0026a2001105220022903e002a7450d3320022903e802220d4220882108200da722054108762109410a210a0c310b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d242001200620046b3602042001200520046a36020002402006450d0020022d00e8030d00200241f0026a2001105220022903f002a7450d0020022903f80221082000410c360200200041086a2008370300200041106a200241f0046a41f80010ce041a0c390b200041123602000c380b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d242001200620046b3602042001200520046a36020002402006450d0020022d00e8030d00200241f8056a2001104420022802f80522010d0d0b200041123602000c370b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d242001200620046b3602042001200520046a36020002402006450d0020022d00f008220441024b0d0002400240024020040e03000102000b20024180036a20011053200229038003a7450d0220024190036a2903002108200229038803210d200241f8056a2001105020022d00f80522014102460d0220022f00f90520022d00fb0541107472210420024184066a290200210e2002418c066a280200210520024190066a290300210f20024198066a280200210620022902fc052111410121030c2f0b20024198036a2001102e200228029803450d01200228029c032201410876210442002111410221030c2d0b200241a0036a2001102e20022802a003450d0020022802a4032201410876210442002111410321030c2c0b200041123602000c360b200241f0046a200110910220022d00f0042101200241f8056a200241f0046a41017241ff0010ce041a20014107470d0b200041123602000c350b200241003a00e803200241e8036a20052006410047220410ce041a20062004490d232001200620046b3602042001200520046a36020002402006450d0020022d00e803220441014b0d0002400240024020040e020001000b200241f0046a2001103c20022802f0042104200241f8056a200241f0046a41047241840110ce041a20044112460d02200241e8036a200241f8056a41840110ce041a41880110272201450d2720012004360200200141046a200241e8036a41840110ce041a200241f0086a41086a200241b0036a41086a290200370300200241f0086a41106a200241b0036a41106a290200370300200241f0086a41186a200241b0036a41186a290200370300200220022902b0033703f008410121040c010b200241f0046a20011050200241f8056a41086a2201200241fc046a290200370300200241f8056a41106a220520024184056a290200370300200241f8056a41186a22062002418c056a290200370300200220022902f4043703f8054102210420022d00f00422034102460d0120022d00f304210720022f00f104210c200241f0086a41186a2006290300370300200241f0086a41106a2005290300370300200241f0086a41086a2001290300370300200220022903f8053703f008200c20074110747241087420037221010b200241e0076a41086a200241f0086a41086a2903002208370300200241e0076a41106a200241f0086a41106a290300220d370300200241e0076a41186a200241f0086a41186a290300220e370300200220022903f008220f3703e007200041086a200136020020002004360204200041103602002000410c6a200f370200200041146a20083702002000411c6a200d370200200041246a200e3702002000412c6a20024180086a41dc0010ce041a0c350b200041123602000c340b200241003a00f008200241f0086a20052006410047220410ce041a20062004490d242001200620046b22033602042001200520046a220436020002402006450d0020022d00f0080d00200242003703f805200241f8056a20042003410820034108491b220510ce041a2001200320056b3602042001200420056a360200200341074d0d0020022903f805210f200241f8056a2001104420022802f8052210450d0020022902fc05210e200241a8036a2001102e200ea721150240024020022802a803450d000240024020022802ac03220941d502200941d502491b220a0d00410421070c010b200a410c6c220410272207450d290b02402009450d004100210341002104410021060340200241f8056a20011044024020022802f805220c0d0002402006450d002007210103400240200141046a280200450d00200128020010290b2001410c6a2101200441746a22040d000b0b200a450d03200710290c030b200641016a210520022902fc05210802402006200a470d002003200520052003491b220aad420c7e220d422088a70d2d200da7220b4100480d2d0240024020060d00200b102721070c010b20072004200b102821070b2007450d2c0b200720046a2206200c360200200641046a2008370200200341026a21032004410c6a21042005210620092005470d000b0b20070d010b2015450d01201010290c010b200241003602f805200241f8056a2001280200220320012802042204410420044104491b220610ce041a2001200420066b22053602042001200320066a22033602002009ad422086200aad842208422088a721062008a7210c02400240200441034b0d0002402015450d00201010290b02402006450d002006410c6c21042007210103400240200141046a280200450d00200128020010290b2001410c6a2101200441746a22040d000b0b200c0d010c020b20022802f805210a200241e0076a2005412020054120491b22046a41004100412020046b2004411f4b1b10cd041a200241e0076a2003200410ce041a2001200520046b3602042001200320046a36020002402005411f4b0d0002402015450d00201010290b02402006450d002006410c6c21042007210103400240200141046a280200450d00200128020010290b2001410c6a2101200441746a22040d000b0b200c0d010c020b200241a0076a41086a2204200241e0076a41086a290300370300200241a0076a41106a2205200241e0076a41106a290300370300200241a0076a41186a2203200241e0076a41186a290300370300200220022903e0073703a007200241f8056a2001104420022802f80522010d0302402015450d00201010290b02402006450d002006410c6c21042007210103400240200141046a280200450d00200128020010290b2001410c6a2101200441746a22040d000b0b200c450d010b200710290b200241f8056a41186a200241e8036a41186a290300370300200241f8056a41106a200241e8036a41106a290300370300200241f8056a41086a200241e8036a41086a290300370300200220022903e8033703f8050c020b200041123602000c320b200241e8036a41086a20042903002208370300200241e8036a41106a2005290300220d370300200241e8036a41186a20032903002211370300200220022903a00722133703e80320022902fc052112200241f8056a41186a2011370300200241f8056a41106a200d370300200241f8056a41086a2008370300200220133703f80520100d080b200041123602000c300b2000200c36020420004103360200200041086a2009ad422086200aad84370200200041106a200241f8056a41f80010ce041a0c2f0b200241e8036a41086a2207200241f8056a41086a290300370300200241e8036a41106a220c200241f8056a41106a290300370300200241e8036a41186a220a200241f8056a41186a290300370300200241e8036a41206a22092005290300370300200241e8036a41286a22052006290300370300200241e8036a41306a22062003290300370300200241e8036a41386a22032004290300370300200220022903f8053703e80320022902f404210820024180086a41386a2204200329030037030020024180086a41306a2203200629030037030020024180086a41286a2206200529030037030020024180086a41206a2205200929030037030020024180086a41186a2209200a29030037030020024180086a41106a220a200c29030037030020024180086a41086a220c2007290300370300200220022903e80337038008200041086a20083702002000200136020420004107360200200041106a200229038008370200200041186a200c290300370200200041206a200a290300370200200041286a2009290300370200200041306a2005290300370200200041386a2006290300370200200041c0006a2003290300370200200041c8006a200429030037020020004180016a200241b0036a41306a290300370300200041f8006a200241b0036a41286a290300370300200041f0006a200241b0036a41206a290300370300200041e8006a200241b0036a41186a290300370300200041e0006a200241b0036a41106a290300370300200041d8006a200241b0036a41086a290300370300200041d0006a20022903b0033703000c2e0b20022d00f9052104200220022f01e80322053b018008200241f8056a41186a280200210620024194066a2902002108200241f8056a41246a2802002103200241f8056a41086a290300210d200241f8056a41106a290300210e200241a0066a290300210f20022802fc052107200041386a200241f8056a41306a290300370200200041306a200f370200200041186a200e370200200041106a200d370200200020043a0009200041086a20013a0000200041083602002000412c6a2003360200200041246a2008370200200041206a20063602002000410c6a2007360200200020053b000a200041c0006a200241f0046a41c80010ce041a0c2d0b20024180086a411f6a2207200629000037000020024180086a41186a2206200529030037030020024180086a41106a2004290300220837030020024180086a41086a2001290300220d370300200220022903e803220e37038008200020033a0004200041093602002000200e3700052000410d6a200d370000200041156a20083700002000411d6a2006290300370000200041246a20072900003700002000412c6a200241f0046a41dc0010ce041a0c2c0b20024180086a411f6a2207200629000037000020024180086a41186a2206200529030037030020024180086a41106a2004290300220837030020024180086a41086a2001290300220d370300200220022903e803220e37038008200020033a00042000410a3602002000200e3700052000410d6a200d370000200041156a20083700002000411d6a2006290300370000200041246a20072900003700002000412c6a200241f0046a41dc0010ce041a0c2b0b200041086a20022902fc05370200200020013602042000410d360200200041106a200241f0046a41f80010ce041a0c2a0b200241e8036a200241f8056a41ff0010ce041a200041086a20013a00002000410f360200200041096a200241e8036a41ff0010ce041a0c290b20024180086a41186a2204200241f8056a41186a29030037030020024180086a41106a2205200241f8056a41106a29030037030020024180086a41086a2203200241f8056a41086a290300370300200220022903f80537038008200041286a200a360200200041246a2006360200200041206a200c3602002000411c6a2007360200200041186a200e422088a7360200200041146a2015360200200041106a2010360200200041086a200f37020020004111360200200041d4006a2012370200200041d0006a20013602002000412c6a200229038008370200200041346a20032903003702002000413c6a2005290300370200200041c4006a200429030037020020004180016a200241f0046a41206a290300370300200041f8006a200241f0046a41186a290300370300200041f0006a200241f0046a41106a290300370300200041e8006a200241f0046a41086a290300370300200041e0006a20022903f0043703000c280b20052004103e000b20042006103e000b20054104102a000b20104104102a000b20054104102a000b200b4104102a000b20042006103e000b20042006103e000b20042006103e000b20044108102a000b20104108102a000b20042006103e000b20042006103e000b20042006103e000b20072006103e000b20054104102a000b20174104102a000b20042009103e000b20042006103e000b20042006103e000b20042006103e000b20042006103e000b20042006103e000b20042006103e000b4188014108102a000b20042006103e000b20044104102a000b200b4104102a000b102b000b4200210e4200210f0b2000410e360200200041386a2008370200200041306a200d370200200041186a200e370200200041106a20113702002000412c6a2006360200200041246a200f370200200041206a2005360200200041086a20033602002000410c6a2004410874200141ff017172360200200041c0006a200241f0046a41c80010ce041a0c090b42002108410021090b200241b0036a41086a20024180086a41086a28020022103602002002200229038008220f3703b003200041206a20033602002000411c6a2001360200200041186a2006360200200041106a20084220862009ad42ffffff07834208862005ad42ff018384843702002000410c6a200b410874200441ff017172360200200041086a200a3602002000410b360200200041c0006a200e370200200041386a200d370200200041246a200f3702002000412c6a2010360200200041346a200c360200200041306a2007360200200041c8006a20022903f004370300200041d0006a200241f0046a41086a290300370300200041d8006a200241f0046a41106a290300370300200041e0006a200241f0046a41186a290300370300200041e8006a200241f0046a41206a290300370300200041f0006a20024198056a290300370300200041f8006a200241f0046a41306a29030037030020004180016a200241f0046a41386a2903003703000c070b200410290b200041123602000c050b200220022f01800822013b01b003200041386a2011370200200041306a200f370200200041186a200d370200200041106a200e370200200020063a0009200041086a20073a0000200041063602002000412c6a2003360200200041246a2008370200200041206a20053602002000410c6a200c410874200441ff017172360200200020013b000a200041c0006a200241f0046a41c80010ce041a0c040b200041123602000c030b200410290b200041123602000c010b20004100360200200041106a20083702002000410c6a2004360200200041086a2007360200200041186a200241f0046a41f00010ce041a0b20024190096a24000b960b01057f024002402000280200220141104b0d000240024002400240024002400240024002400240024020010e11000c0c010c0c0203040506070c080c090a000b0240200041086a280200220141054b0d0002400240024020010e060f0f000f01020f0b200041106a280200450d0e2000410c6a28020010290f0b200041106a280200450d0d2000410c6a28020010290f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141186a2101200241686a22020d000b0b200041106a280200450d0c200028020c10290f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010290b2001410c6a2101200241746a22020d000b0b200041106a280200450d0b200028020c10290f0b02402000410c6a2802002201450d0020002802042203200141f8006c6a210403400240200341106a2802002202450d0020032802082101200241246c210203400240024020012d0000220541034b0d0002400240024020050e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012002415c6a22020d000b0b200341f8006a210102402003410c6a280200450d00200328020810290b2001210320012004470d000b0b200041086a280200450d0a200028020410290f0b0240200041086a2d00002201410c4b0d0020014106470d0a200041106a280200450d0a2000410c6a28020010290f0b200041106a280200450d092000410c6a28020010290f0b200041086a280200450d08200028020410290f0b200041086a2d0000417f6a220141074b0d07024002400240024020010e08000b0b0b010b0203000b2000410c6a2201280200103d200128020010290f0b2000410c6a2201280200103d200128020010290f0b2000410c6a2201280200103d200128020010290f0b2000410c6a2201280200103d200128020010290f0b20002d0004417f6a220141024b0d0602400240024020010e03000102000b2000410c6a280200450d08200041086a28020010290f0b200041086a2201280200103d200128020010290f0b2000410c6a2201280200103d200128020010290f0b20002d0004417f6a220141024b0d0502400240024020010e03000102000b2000410c6a280200450d07200041086a28020010290f0b200041086a2201280200103d200128020010290f0b2000410c6a2201280200103d200128020010290f0b200041086a280200417f6a220141014b0d040240024020010e020001000b200041106a280200450d052000410c6a28020010290f0b200041106a280200450d042000410c6a28020010290f0b200041086a280200450d03200028020410290f0b0240200041086a2d0000220141054b0d0002400240024020010e06060600010206060b200041106a280200450d052000410c6a28020010290f0b200041346a280200450d04200041306a28020010290f0b200041306a280200450d032000412c6a28020010290c030b200041d0006a280200450d02200041cc006a28020010290f0b20002802044101470d01200041086a2201280200103d200128020010290f0b0240200041146a280200450d00200041106a28020010290b0240200041246a2802002202450d002000411c6a28020021012002410c6c210203400240200141046a280200450d00200128020010290b2001410c6a2101200241746a22020d000b0b0240200041206a280200450d00200028021c10290b200041d4006a280200450d00200041d0006a28020010290f0b0b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420237020c200241a4d9c500360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41b4d9c5001057000bfa0702137f017e23004190056b22022400200241086a2001102e0240024002400240024020022802080d00200041003602000c010b02400240200228020c2203411720034117491b22040d00410821050c010b200441b0016c220610272205450d020b02402003450d00200241e0026a4104722107200241f0046a41186a2108200241f0046a41106a2109200241f0046a41086a210a4100210b4100210c4100210d0340200241003602e803200241e8036a2001280200220e20012802042206410420064104491b220f10ce041a20012006200f6b3602042001200e200f6a36020002400240200641034b0d004112210e0c010b20022802e8032110200241e8036a2001103c024020022802e8034112470d004112210e0c010b200241e0026a200241e8036a41880110ce041a2008420037030020094200370300200a4200370300200242003703f004200241f0046a2001280200220e20012802042206412020064120491b220f10ce041a20012006200f6b3602042001200e200f6a36020002402006411f4b0d00200241e0026a103d4112210e0c010b200241b8016a41186a2008290300370300200241b8016a41106a2009290300370300200241b8016a41086a200a290300370300200220022903f0043703b80120022802e002210e200241dc016a200741840110ce041a201021110b200241e8036a200241dc016a41840110ce041a200241e0026a41186a2206200241b8016a41186a290300370300200241e0026a41106a2210200241b8016a41106a290300370300200241e0026a41086a2212200241b8016a41086a290300370300200220022903b8013703e0020240200e4112470d00200041003602000240200d450d002005210603402006103d200641b0016a2106200c41d07e6a220c0d000b0b2004450d03200510290c030b200d41016a210f200241346a200241e8036a41840110ce041a200241106a41186a22132006290300370300200241106a41106a22142010290300370300200241106a41086a22102012290300370300200220022903e0023703100240200d2004470d00200b200f200f200b491b2204ad42b0017e2215422088a70d062015a722064100480d0602400240200d0d002006102721050c010b2005200c2006102821050b2005450d050b2005200c6a2206200e360200200641046a200241346a41840110ce041a20064188016a20113602002006418c016a200229031037020020064194016a20102903003702002006419c016a2014290300370200200641a4016a2013290300370200200b41026a210b200c41b0016a210c200f210d2003200f470d000b0b2000200436020420002005360200200041086a20033602000b20024190056a24000f0b20064108102a000b20064108102a000b102b000b8303020a7f017e230041106b2202240020022001102e0240024002400240024020022802000d00200041003602000c010b02400240200228020422034180042003418004491b22040d00410821050c010b2004410374220610272205450d020b02402003450d00410021074100210841002109034020024200370308200241086a2001280200220a20012802042206410820064108491b220b10ce041a20012006200b6b3602042001200a200b6a3602000240200641074b0d00200041003602002004450d03200510290c030b200941016a21062002290308210c024020092004470d002007200620062007491b220441ffffffff01712004470d062004410374220b4100480d060240024020090d00200b102721050c010b20052008200b102821050b2005450d050b200520086a200c370300200741026a2107200841086a21082006210920032006470d000b0b2000200436020420002005360200200041086a20033602000b200241106a24000f0b20064108102a000b200b4108102a000b102b000bb40502107f027e230041f0006b22022400200241086a2001102e0240024002400240024020022802080d00200041003602000c010b02400240200228020c220341e600200341e600491b22040d00410821050c010b200441286c220610272205450d020b02402003450d00200241d0006a41186a2107200241d0006a41106a2108200241d0006a41086a21094100210a4100210b4100210c034020074200370300200842003703002009420037030020024200370350200241d0006a2001280200220d2001280204220e4120200e4120491b220f10ce041a2001200e200f6b22063602042001200d200f6a220f36020002400240200e411f4d0d00200241306a41186a220d2007290300370300200241306a41106a22102008290300370300200241306a41086a221120092903003703002002200229035037033020024200370350200241d0006a200f2006410820064108491b220e10ce041a20012006200e6b3602042001200f200e6a360200200641074b0d010b200041003602002004450d03200510290c030b200c41016a210e200241106a41086a220f2011290300370300200241106a41106a22112010290300370300200241106a41186a2210200d29030037030020022002290330370310200229035021120240200c2004470d00200a200e200e200a491b2204ad42287e2213422088a70d062013a722064100480d0602400240200c0d002006102721050c010b2005200b2006102821050b2005450d050b2005200b6a22062002290310370300200641186a2010290300370300200641106a2011290300370300200641086a200f290300370300200641206a2012370300200a41026a210a200b41286a210b200e210c2003200e470d000b0b2000200436020420002005360200200041086a20033602000b200241f0006a24000f0b20064108102a000b20064108102a000b102b000be30201097f230041106b2202240020022001102e024002400240024020022802000d00200041003602000c010b02400240200228020422034180202003418020491b22040d00410121050c010b200410272205450d020b02402003450d0041002106410021070340200241003a000f2002410f6a2001280200220820012802042209410047220a10ce041a2009200a490d0420012009200a6b36020420012008200a6a360200024020090d00200041003602002004450d03200510290c030b200741016a210920022d000f210a024020072004470d0002402006200920092006491b22044100480d000240024020070d002004102721050c010b200520072004102821050b20050d0120044101102a000b102b000b200520076a200a3a0000200641026a21062009210720032009470d000b0b2000200436020420002005360200200041086a20033602000b200241106a24000f0b20044101102a000b200a2009103e000bf10b030e7f017e067f230041e0006b22022400200241086a2001102e0240024020022802080d00200041003602000c010b0240024002400240024002400240200228020c220341f100200341f100491b22040d00410421050c010b200441246c220610272205450d010b024020030d00410021070c050b2002412d6a2108200241d3006a220941056a210a4100210b410021070340200241003a0040200241c0006a2001280200220c20012802042206410047220d10ce041a2006200d490d0220012006200d6b220e3602042001200c200d6a220c3602000240024020060d004105210d0c010b4105210d20022d0040220641064b0d000240024002400240024020060e0704050005020301040b200241c0006a200e4120200e4120491b22066a41004100412020066b2006411f4b1b10cd041a200241c0006a200c200610ce041a2001200e20066b3602042001200c20066a360200200e411f4d0d04200220092900003703202002200a2900003700252002280047210f200229004b211020022f0140210620022d0042210d20022800432111200841026a200241306a41026a2d00003a0000200820022f00303b0000201141087621122006200d4110747221132010422088a721142010a721154100210d0c040b20024100360240200241c0006a200c200e4104200e4104491b220610ce041a2001200e20066b3602042001200c20066a360200200e41034d0d0320022d0043210620022f0140210e20022d0042210c200241c0006a2001104420022802402216450d03200e200c41107472211320022902442210422088a721142010a721154101210d200621112016210f0c030b20024100360240200241c0006a200c200e4104200e4104491b220610ce041a2001200e20066b3602042001200c20066a360200200e41034d0d0220022d0043210620022f0140210e20022d0042210c200241c0006a2001104420022802402216450d02200e200c41107472211320022902442210422088a721142010a721154102210d200621112016210f0c020b20024100360240200241c0006a200c200e4104200e4104491b220610ce041a2001200e20066b3602042001200c20066a360200200e41034d0d0120022d0043210620022f0140210e20022d0042210c200241c0006a2001104420022802402216450d01200e200c41107472211320022902442210422088a721142010a721154103210d200621112016210f0c010b200241306a2001104420022802302206450d00200241206a41086a200241c0006a41086a2902003703002002200229024037032020064108762112200228023821152002280234210f4104210d200621110b200241c0006a41086a2206200241206a41086a290300370300200220022903203703400240200d4105470d002000410036020002402007450d002005210603400240024020062d0000220141034b0d0002400240024020010e0404000102040b2006410c6a280200450d03200641086a28020010290c030b2006410c6a280200450d02200641086a28020010290c020b2006410c6a280200450d01200641086a28020010290c010b200641086a280200450d00200641046a28020010290b200641246a2106200b415c6a220b0d000b0b2004450d07200510290c070b200241106a41086a220e200629030037030020022002290340370310024020072004470d00200441016a22062004490d052004410174220c20062006200c491b2206ad42247e2210422088a70d052010a7220c4100480d050240024020040d00200c102721050c010b2005200441246c200c102821050b2005450d04200621040b2005200b6a2206200d3a0000200641106a20143602002006410c6a2015360200200641086a200f360200200641046a2012410874201141ff017172360200200641036a20134110763a0000200641016a20133b0000200641146a20022903103702002006411c6a200e290300370200200b41246a210b2003200741016a2207460d050c000b0b20064104102a000b200d2006103e000b200c4104102a000b102b000b2000200436020420002005360200200041086a20073602000b200241e0006a24000bbd04010a7f230041106b22022400200241086a2001102e0240024002400240024020022802080d00200041003602000c010b0240200228020c2203418020490d00418020107c2204450d044101210541002106410021070340200420012802002001280204220820034180202003418020491b220920082009491b220810ce04210a024002400240200128020422092008490d002001200920086b3602042001200128020020086a36020002402008450d0020084181204f0d020240200620076b2008490d00200820076a21090c040b0240200720086a22092007490d002006410174220b20092009200b491b220b4100480d000240024020060d00200b102721050c010b20052006200b102821050b02402005450d00200b21060c050b200b4101102a000b102b000b20004100360200200a10292006450d05200510290c050b20082009103e000b2008418020107f000b200520076a200a200810ce041a20092107200320086b22030d000b2000200636020420002005360200200041086a2009360200200a10290c010b0240024020030d0041012107410021080c010b2003107c2207450d032007200128020020012802042208200320082003491b220810ce041a200128020422092008490d022001200920086b3602042001200128020020086a3602000b024020082003470d002000200336020420002007360200200041086a20033602000c010b200041003602002003450d00200710290b200241106a24000f0b20082009103e000b20034101102a000b4180204101102a000b8103010a7f230041106b2202240020022001102e0240024002400240024020022802000d00200041003602000c010b02400240200228020422034180082003418008491b22040d00410421050c010b2004410274220610272205450d020b02402003450d0041002107410021084100210903402002410036020c2002410c6a2001280200220a20012802042206410420064104491b220b10ce041a20012006200b6b3602042001200a200b6a3602000240200641034b0d00200041003602002004450d03200510290c030b200941016a2106200228020c210b024020092004470d002007200620062007491b220441ffffffff03712004470d062004410274220a4100480d060240024020090d00200a102721050c010b20052008200a102821050b2005450d050b200520086a200b360200200741026a2107200841046a21082006210920032006470d000b0b2000200436020420002005360200200041086a20033602000b200241106a24000f0b20064104102a000b200a4104102a000b102b000bda0f040d7f017e077f017e23004180026b2202240020022001102e02400240024002400240024020022802000d00200041003602000c010b0240024020022802042203413820034138491b22040d00410821050c010b200441c8006c220610272205450d020b02402003450d00200241ef016a210741c2002108200241b8016a41036a21094100210a4100210b0340200241003a00e001200241e0016a2001280200220c2001280204220d410047220e10ce041a200d200e490d042001200d200e6b22063602042001200c200e6a220e360200024002400240200d450d0020022d00e001220d41014b0d00024002400240200d0e020001000b200242003703a001200241a0016a200e2006410820064108491b220d10ce041a20012006200d6b3602042001200e200d6a360200200641074d0d02200241f8006a41086a200241c0016a41086a290300370300200241f8006a41106a200241c0016a41106a2d00003a0000200241d8006a41086a200241e0016a41086a290100370300200241d8006a41106a200241e0016a41106a290100370300200241d8006a41186a200241e0016a41186a290100370300200220022800b80136029001200220022903c001370378200220022901e001370358200220092800003600930120022903a001210f200241d0006a41046a2002419a016a41046a2f01003b01002002200228019a013602504100210e0c010b200241e0016a2006412020064120491b220d6a410041004120200d6b200d411f4b1b10cd041a200241e0016a200e200d10ce041a20012006200d6b220c3602042001200e200d6a220d3602002006411f4d0d01200241a0016a41086a2210200741086a290000370300200241a0016a41106a2211200741106a2d00003a0000200220022800e0013602b801200220072900003703a0012002200241e0016a41036a2800003600bb0120022900e701210f200241003a00e001200241e0016a200d200c410047220610ce041a200c2006490d092001200c20066b220e3602042001200d20066a220d360200200c450d0120022d00e001220641014b0d014100210c0240024020060e020100010b200241e0016a200e4120200e4120491b22066a41004100412020066b2006411f4b1b10cd041a200241e0016a200d200610ce041a2001200e20066b3602042001200d20066a360200200e411f4d0d02200241c0016a41186a200241e0016a41186a290000370300200241c0016a41106a200241e0016a41106a290000370300200241c0016a41086a200241e0016a41086a290000370300200220022900e0013703c0014101210c0b200241d8006a41186a200241c0016a41186a290300370300200241d8006a41106a200241c0016a41106a290300370300200241d8006a41086a200241c0016a41086a290300370300200241f8006a41086a2010290300370300200241f8006a41106a20112d00003a0000200220022903c001370358200220022802b80136029001200220022800bb0136009301200220022903a001370378200241d0006a41046a2002419a016a41046a2f01003b01002002200228019a013602504101210e0b200b41016a210d200241c0016a41086a2206200241f8006a41086a290300370300200241c0016a41106a2210200241f8006a41106a2d00003a0000200241e0016a41086a2211200241d8006a41086a290300370300200241e0016a41106a2212200241d8006a41106a290300370300200241e0016a41186a2213200241d8006a41186a29030037030020022002280290013602a00120022002280093013600a301200220022903783703c001200220022903583703e001200241b8016a41046a2214200241d0006a41046a2f01003b0100200241306a41086a22152006290300370300200241306a41106a221620102d00003a0000200241106a41086a22102011290300370300200241106a41106a22112012290300370300200241106a41186a22122013290300370300200220022802503602b801200220022800a30136004b200220022802a001360248200220022903c001370330200220022903e001370310200241086a41046a221320142f01003b0100200220022802b801360208200b2004470d020240200a200d200d200a491b2204ad42c8007e2217422088a70d002017a7220641004e0d020b102b000b200241c0016a41086a200241f8006a41086a290300370300200241e0016a41086a200241d8006a41086a290300370300200241e0016a41106a200241d8006a41106a290300370300200220022903783703c001200220022903583703e001200041003602002004450d04200510290c040b02400240200b0d002006102721050c010b2005200841be7f6a2006102821050b2005450d070b200520086a220641be7f6a200e3a0000200641466a200f370000200641bf7f6a220e2002280248360000200e41036a200228004b3600002006414e6a220e2002290330370000200e41086a2015290300370000200e41106a20162d00003a00002006415f6a200c3a0000200641606a220e2002290310370000200e41086a2010290300370000200e41106a2011290300370000200e41186a201229030037000020062002280208360000200641046a20132f01003b0000200a41026a210a200841c8006a2108200d210b2003200d470d000b0b2000200436020420002005360200200041086a20033602000b20024180026a24000f0b20064108102a000b200e200d103e000b2006200c103e000b20064108102a000bff04040c7f027e017f017e230041d0006b22022400200241086a2001102e0240024002400240024020022802080d00200041003602000c010b02400240200228020c220341d500200341d500491b22040d00410821050c010b200441306c220610272205450d020b02402003450d00200241306a41086a210741002108410021094100210a03402002420037033820024200370330200241306a2001280200220b20012802042206411020064110491b220c10ce041a20012006200c6b220d3602042001200b200c6a220c360200024002402006410f4d0d002007290300210e2002290330210f200241306a200d4120200d4120491b22066a41004100412020066b2006411f4b1b10cd041a200241306a200c200610ce041a2001200d20066b3602042001200c20066a360200200d411f4b0d010b200041003602002004450d03200510290c030b200a41016a210d200241106a41186a220c200241306a41186a290000370300200241106a41106a220b200241306a41106a290000370300200241106a41086a22102007290000370300200220022900303703100240200a2004470d002008200d200d2008491b2204ad42307e2211422088a70d062011a722064100480d0602400240200a0d002006102721050c010b200520092006102821050b2005450d050b200520096a2206200e3703082006200f370300200641106a2002290310370300200641186a2010290300370300200641206a200b290300370300200641286a200c290300370300200841026a2108200941306a2109200d210a2003200d470d000b0b2000200436020420002005360200200041086a20033602000b200241d0006a24000f0b20064108102a000b20064108102a000b102b000bff0305087f017e017f017e017f230041e0066b22022400200241086a2001102e024002400240024020022802080d00200041003602000c010b02400240200228020c2203410e2003410e491b22040d00410821050c010b200441a0026c220610272205450d020b02402003450d00200241a8026a41f0006a21074100210841002106410021090340200241a8026a20011049200241f8056a200241a8026a41e80010ce041a200229039003210a200241c8046a200741b00110ce041a024002400240200a4203510d00200941016a210b200241c0016a200241f8056a41e80010ce041a200241106a200241c8046a41b00110ce041a20092004470d0202402008200b200b2008491b2204ad42a0027e220c422088a70d00200ca7220d41004e0d020b102b000b2000410036020002402009450d0020054198016a210b0340200b103d200b41a0026a210b200641e07d6a22060d000b0b2004450d04200510290c040b0240024020090d00200d102721050c010b20052006200d102821050b2005450d050b200520066a200241c0016a41e80010ce04220941e8006a200a370300200941f0006a200241106a41b00110ce041a200841026a2108200641a0026a2106200b21092003200b470d000b0b2000200436020420002005360200200041086a20033602000b200241e0066a24000f0b20064108102a000b200d4108102a000bae0b04047f017e087f057e230041c0056b22022400200241286a2001102e0240024020022802280d00200042033703680c010b200241003a00a002200241a0026a2001280200220320012802042204410047220510ce041a0240024020042005490d002001200420056b3602042001200320056a36020020040d01200042033703680c020b20052004103e000b02400240024020022d00a002220441ff00714102470d0020044118744118754100480d01420221060c020b200042033703680c020b200241d8046a200110500240024020022d00d8044102460d00200241b0046a41206a200241d8046a41206a280200360200200241b0046a41186a200241d8046a41186a290300370300200241b0046a41106a200241d8046a41106a290300370300200241b0046a41086a200241d8046a41086a290300370300200220022903d8043703b00420024198016a41386a2207420037030020024198016a41306a2208420037030020024198016a41286a2209420037030020024198016a41206a220a420037030020024198016a41186a220b420037030020024198016a41106a220c420037030020024198016a41086a220d4200370300200242003703980120024198016a2001280200220e2001280204220441c000200441c000491b220510ce041a2001200420056b22033602042001200e20056a22053602002004413f4d0d0020024180056a41386a200729030037030020024180056a41306a200829030037030020024180056a41286a200929030037030020024180056a41206a200a29030037030020024180056a41186a200b29030037030020024180056a41106a200c29030037030020024180056a41086a200d290300370300200220022903980137038005200241003a00980120024198016a20052003410047220410ce041a0240024020032004490d002001200320046b220e3602042001200520046a22043602002003450d0202400240200231009801220f50450d00420021060c010b200241003a00980120024198016a2004200e410047220510ce041a200e2005490d022001200e20056b3602042001200420056a360200200e450d034202200f420f838622104204540d0342012106200231009801420886200f844204882010420c88220f4201200f4201561b7e220f20105a0d030b200241186a200110522002290318a7450d02200229032021112002200110532002290300a7450d02200241106a290300211220022903082113200241a0026a41206a200241b0046a41206a280200360200200241a0026a41186a200241b0046a41186a290300370300200241a0026a41106a200241b0046a41106a290300370300200241a0026a41086a200241b0046a41086a290300370300200241cc026a20024180056a41086a290300370200200241d4026a20024180056a41106a290300370200200241dc026a20024180056a41186a290300370200200241e4026a20024180056a41206a290300370200200241ec026a200241a8056a290300370200200241f4026a200241b0056a290300370200200241fc026a200241b8056a290300370200200220022903b0043703a00220022002290380053702c402200241a8036a200241a0026a41e80010ce041a0c030b20042003103e000b2005200e103e000b420221060b200241a0026a200241a8036a41e80010ce041a024020064202520d00200042033703680c020b200241306a200241a0026a41e80010ce041a0b200241a0026a2001103c20022802a0022104200241a8036a200241a0026a41047241840110ce041a024020044112470d00200042033703680c010b20024198016a200241a8036a41840110ce041a2000200241306a41e80010ce0422014190016a201237030020014188016a201337030020014198016a200436020020014180016a2011370300200141f8006a200f37030020012010370370200120063703682001419c016a20024198016a41840110ce041a0b200241c0056a24000be20805077f047e087f017e017f230041a0016b22022400024002400240200141086a220328020022042001410c6a2802002205460d0020012802102106200241f8006a41186a2107034020032004220841286a2204360200200841086a2903002109200841106a290300210a200841186a290300210b2008290300210c200241f8006a41206a200841206a2903003703002007200b370300200241f8006a41106a200a370300200241f8006a41086a20093703002002200c3703780240200a2006290300580d002001280214220d2007460d002007290000200d290000520d030b20052004470d000b200521040b2000410036020820004208370200024020042005460d00200141086a200520046b41586a41286e41286c20046a41286a3602000b2001280204450d01200128020010290c010b200241286a41086a200241f8006a41086a290300220a370300200241086a2204200a370300200241106a2207200241f8006a41106a290300370300200241186a2203200241f8006a41186a290300370300200241206a220e200241f8006a41206a29030037030020022002290378220a3703282002200a37030002400240024041281027220f450d00200f2002290300370300200f41206a200e290300370300200f41186a2003290300370300200f41106a2007290300370300200f41086a200429030037030020012802042110200128020021114101210e02400240200541586a2008470d00410121120c010b0240200d200241f8006a41186a2204470d00410121120c010b200841286a2113200541586a21144101210e4101211203402013210802400340200241f8006a41206a2207200841206a2903003703002004200841186a290300370300200241f8006a41106a2203200841106a290300220a370300200241f8006a41086a2201200841086a290300370300200220082903003703780240200a2006290300580d002004290000200d290000520d020b2005200841286a2208470d000c030b0b200241d0006a41206a2007290300220a370300200241286a41086a20012903002209370300200241286a41106a2003290300220b370300200241286a41186a2004290300220c370300200241286a41206a200a3703002002200229037822153703282007200a3703002004200c3703002003200b370300200120093703002002201537037802402012200e470d00200e41016a2212200e490d05200e4101742213201220122013491b2212ad42287e220a422088a70d05200aa722134100480d0502400240200e0d0020131027210f0c010b200f200e41286c20131028210f0b200f450d040b200841286a2113200f200e41286c6a22162002290378370300201641206a2007290300370300201641186a2004290300370300201641106a2003290300370300201641086a2001290300370300200e41016a210e20142008470d000b0b02402010450d00201110290b2000200e360208200020123602042000200f3602000c030b41284108102a000b20134108102a000b102b000b200241a0016a24000bd408040c7f017e057f037e23004180016b22022400024002400240200141086a220328020022042001410c6a2802002205460d002001280210220628020021072006280208220841014b210903402003200441206a220a360200200241e0006a41186a200441186a290000370300200241e0006a41106a200441106a290000370300200241e0006a41086a200441086a29000037030020022004290000370360410021040240024020090d0020080e020401040b2008210b0340200b410176220c20046a220d20042007200d4105746a200241e0006a412010d0044101481b2104200b200c6b220b41014b0d000b0b200720044105746a200241e0006a412010d0040d02200a2104200a2005470d000b200521040b2000410036020820004201370200024020042005460d00200141086a200520046b41606a41607120046a41206a3602000b2001280204450d01200128020010290c010b200241c0006a41086a2204200241e0006a41086a290300370300200241c0006a41106a220b200241e0006a41106a290300370300200241c0006a41186a220c200241e0006a41186a29030037030020022002290360220e3703002002200e370340024041201027220f450d00200f2002290340370000200f41186a200c290300370000200f41106a200b290300370000200f41086a2004290300370000200128020421102001280200211102400240200a2005470d0041012112410121130c010b41012112410121130340200628020821032006280200210702400340200241e0006a41186a2208200a41186a290000370300200241e0006a41106a2209200a41106a290000370300200241e0006a41086a2201200a41086a2900003703002002200a290000370360200a41206a210a4100210402400240200341014b0d0020030e020301030b2003210b0340200b410176220c20046a220d20042007200d4105746a200241e0006a412010d0044101481b2104200b200c6b220b41014b0d000b0b200720044105746a200241e0006a412010d0040d01200a2005470d000c030b0b200241c0006a41086a2001290300220e370300200241c0006a41106a20092903002214370300200241c0006a41186a20082903002215370300200220022903602216370340200241186a220b2015370300200241106a220c2014370300200241086a220d200e37030020022016370300024020132012470d000240201241016a22042012490d0020124101742207200420042007491b221341ffffff3f712013470d00201341057422044100480d000240024020120d0020041027210f0c010b200f201241057420041028210f0b200f0d0120044101102a000b102b000b200f20124105746a22042002290300370000200441186a200b290300370000200441106a200c290300370000200441086a200d290300370000201241016a2112200a2005470d000b0b02402010450d00201110290b20002012360208200020133602042000200f3602000c010b41204101102a000b20024180016a24000b810c05047f037e017f037e0d7f230041e0016b22022400200241e8006a200128020022032001280204220428020c220511000002400240200228026822010d002000410036020820004208370200200320042802001101002004280204450d01200310290c010b200241e0006a20024184016a290200370300200241c8006a41106a200241fc006a290200370300200241c8006a41086a200241f4006a2902003703002002200229026c370348200241a0016a2001104d200241a0016a41086a290300210620022903a001210742002108200241d0016a41086a22014200370300200242003703d00141b18ac0004116200241d0016a100420024190016a41086a2001290300370300200220022903d00137039001200241003602d00120024190016a4110200241d0016a100521090240024020022802d0012201417f460d00200242003703d801200242003703d001200241d0016a20092001411020014110491b10ce041a02402001410f4d0d00200241d0016a41086a290300210a20022903d001210b200910294201210c42002108200b427d56200a420156200a4201511b450d02200241386a200b200a427f420010d404200241386a41086a29030021082002290338210c0c020b418f89c3004133104e000b4201210c0b200241286a20072006200c200810d404200229032821080240200241c4016a280200450d0020022802c00110290b200241a0016a20032004280210220d1100000240024002400240417f20022802a001220141016a220920092001491b220ead42287e220c422088a70d00200ca72201417f4c0d000240024020010d004108210f410821100c010b20011027220f450d02200f21100b200f2002290348370300200f41186a200241c8006a41186a2211290300370300200f41106a200241c8006a41106a2212290300370300200f41086a200241c8006a41086a29030037030020102008370320200241e8006a2003200511000002400240200228026822010d00410121090c010b200241e8006a410472211341022114412821154101210903402011201341186a2902003703002012201341106a290200370300200241c8006a41086a2216201341086a29020037030020022013290200370348200241a0016a2001104d200241a0016a41086a2217290300210a20022903a0012106200241d0016a41086a22184200370300200242003703d00141b18ac0004116200241d0016a100420024190016a41086a2018290300370300200220022903d00137039001200241003602d00120024190016a4110200241d0016a1005210102400240024020022802d0012219417f460d002001450d00200242003703d801200242003703d001200241d0016a20012019411020194110491b10ce041a2019410f4b0d01418f89c3004133104e000b420021084201210c0c010b2018290300210720022903d001210b200110294201210c42002108200b427e5420075020074201511b0d00200241186a200b2007427f420010d404200241186a41086a29030021082002290318210c0b200241086a2006200a200c200810d40420022903082108024020022802c401450d0020022802c00110290b200241a0016a41186a22182011290300370300200241a0016a41106a2219201229030037030020172016290300370300200220022903483703a00102402009200e470d00200241e8006a2003200d1100002009417f2002280268220141016a221620162001491b6a22012009490d062014200120012014491b220ead42287e220c422088a70d06200ca722014100480d060240024020090d0020011027210f0c010b200f201520011028210f0b200f450d05200f21100b201020156a220120022903a001370300200141186a2018290300370300200141106a2019290300370300200141086a2017290300370300200141206a2008370300200241e8006a20032005110000201441026a2114201541286a2115200941016a2109200228026822010d000b0b2003200428020011010002402004280204450d00200310290b200020093602082000200e360204200020103602000c040b1039000b20014108102a000b20014108102a000b102b000b200241e0016a24000ba70906067f047e077f027e027f017e230041e0016b22022400024002400240024002400240410f10272203450d00200341076a4100290091a3443700002003410029008aa3443700002003410f412f10282204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a290000370000200241f8006a41186a22014200370300200241f8006a41106a22034200370300200241f8006a41086a22054200370300200242003703782004412f200241f8006a1000200241d8006a41186a2001290300370300200241d8006a41106a2003290300370300200241d8006a41086a200529030037030020022002290378370358200241003602c001200241d8006a4120200241c0016a100521060240024020022802c0012207417f460d002002200736029c012002200636029801200241c0006a20024198016a10532002290340a7450d07200241c0006a41106a290300210820022903482109200241286a20024198016a10532002290328a7450d07200241386a290300210a2002290330210b200241206a20024198016a102e2002280220450d07024002402002280224220c41d500200c41d500491b220d0d004108210e0c010b200d41306c22011027220e450d050b0240200c450d004100210f410021104100210503402002280298012111200241f8006a200228029c012203412020034120491b22016a41004100412020016b2001411f4b1b10cd041a200241f8006a2011200110ce041a2002200320016b36029c012002201120016a36029801024002402003411f4d0d00200241c0016a41186a2201200241f8006a41186a290300370300200241c0016a41106a2211200241f8006a41106a290300370300200241c0016a41086a2212200241f8006a41086a290300370300200220022903783703c001200241086a20024198016a10532002290308a70d010b200d450d0a200e10290c0a0b200541016a2103200241086a41106a290300211320022903102114200241a0016a41186a22152001290300370300200241a0016a41106a22162011290300370300200241a0016a41086a22112012290300370300200220022903c0013703a00102402005200d470d00200f20032003200f491b220dad42307e2217422088a70d092017a722014100480d090240024020050d0020011027210e0c010b200e201020011028210e0b200e450d080b200e20106a2201201337030820012014370300200141106a20022903a001370300200141186a2011290300370300200141206a2016290300370300200141286a2015290300370300200f41026a210f201041306a211020032105200c2003470d000b0b200e450d07200cad422086200dad84211302402007450d00200610290b2000200b370310200020093703002000200e360220200041186a200a37030020002008370308200041246a20133702000c010b200041186a4200370300200041106a4200370300200041086a420037030020004200370300200041286a4100360200200042083703200b20041029200241e0016a24000f0b410f4101102a000b412f4101102a000b20014108102a000b20014108102a000b102b000b418f89c3004133104e000b5e01017f230041306b220224002002200136020c20022000360208200241246a4101360200200242013702142002419c81c6003602102002410236022c2002200241286a3602202002200241086a360228200241106a41a481c6001057000b950e01057f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e050003010204000b2002410036020820024201370300410110272203450d05200242818080801037020420022003360200200341023a00000240024020022802042204200228020822036b4120490d00200341206a2105200228020021040c010b200341206a22052003490d1320044101742206200520052006491b22064100480d130240024020040d002006102721040c010b200228020020042006102821040b2004450d0720022006360204200220043602000b20022005360208200420036a22032001290001370000200341086a200141096a290000370000200341106a200141116a290000370000200341186a200141196a2900003700000c040b2002410036020820024201370300410110272203450d06200242818080801037020420022003360200200341043a00000240024020022802042205200228020822036b4104490d00200228020021050c010b200341046a22042003490d1220054101742206200420042006491b22044100480d120240024020050d002004102721050c010b200228020020052004102821050b2005450d0820022004360204200220053602000b2002200341046a360208200520036a2001280001360000200128020821042002200141106a280200220136020c2002410c6a200210300240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d1220054101742203200620062003491b22034100480d120240024020050d002003102721050c010b200228020020052003102821050b2005450d092002200336020420022005360200200228020821030b2002200320016a360208200520036a2004200110ce041a0c030b2002410036020820024201370300410110272203450d08200242818080801037020420022003360200200341053a00000240024020022802042204200228020822036b4104490d00200341046a2105200228020021040c010b200341046a22052003490d1120044101742206200520052006491b22064100480d110240024020040d002006102721040c010b200228020020042006102821040b2004450d0a20022006360204200220043602000b20022005360208200420036a2001280001360000200128020821042002200141106a280200220136020c2002410c6a200210300240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d1120054101742203200620062003491b22034100480d110240024020050d002003102721050c010b200228020020052003102821050b2005450d0b2002200336020420022005360200200228020821030b2002200320016a360208200520036a2004200110ce041a0c020b2002410036020820024201370300410110272203450d0a200242818080801037020420022003360200200341063a00000240024020022802042205200228020822036b4104490d00200228020021050c010b200341046a22042003490d1020054101742206200420042006491b22044100480d100240024020050d002004102721050c010b200228020020052004102821050b2005450d0c20022004360204200220053602000b2002200341046a360208200520036a2001280001360000200128020821042002200141106a280200220136020c2002410c6a200210300240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d1020054101742203200620062003491b22034100480d100240024020050d002003102721050c010b200228020020052003102821050b2005450d0d2002200336020420022005360200200228020821030b2002200320016a360208200520036a2004200110ce041a0c010b2002410036020820024201370300410110272203450d0c200242818080801037020420022003360200200341003a0000200141046a280200210420022001410c6a280200220136020c2002410c6a200210300240024020022802042205200228020822036b2001490d00200228020021050c010b200320016a22062003490d0f20054101742203200620062003491b22034100480d0f0240024020050d002003102721050c010b200228020020052003102821050b2005450d0e2002200336020420022005360200200228020821030b2002200320016a360208200520036a2004200110ce041a0b200020022201290200370200200041086a200141086a280200360200200241106a24000f0b41014101102a000b20064101102a000b41014101102a000b20044101102a000b20034101102a000b41014101102a000b20064101102a000b20034101102a000b41014101102a000b20044101102a000b20034101102a000b41014101102a000b20034101102a000b102b000bf50601067f230041f0006b22022400200241003a0050200241d0006a2001280200220320012802042204410047220510ce041a02400240024002400240024020042005490d002001200420056b22063602042001200320056a22053602002004450d04024020022d0050220441ef014b0d00410121010c030b200441847e6a220441034b0d040240024020040e0400010503000b200241003b0150200241d0006a20052006410220064102491b220410ce041a2001200620046b3602042001200520046a360200200641014d0d0520022f0150220441f001490d05410121010c030b20024100360250200241d0006a20052006410420064104491b220410ce041a2001200620046b3602042001200520046a360200200641034d0d04410121012002280250220441808004490d040c020b20052004103e000b41002103200241d0006a20064120200641204922071b22046a41004100412020046b2004411f4b1b10cd041a200241d0006a2005200410ce041a2001200620046b3602042001200520046a360200024020070d002002412c6a41026a200241d0006a41026a2d00003a0000200241186a200241df006a290000370300200241206a200241e7006a290000370300200241286a200241d0006a411f6a2d00003a0000200220022f00503b012c2002200229005737031041012103200228005321040b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2205200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c200220022903103703302003450d022002410c6a41026a20012d00003a0000200241d0006a41086a2005290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010b200020013a0000200020022f010c3b0001200041046a2004360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a2802003602000c020b200120062006410420064104491b22046b3602042001200520046a3602000b200041023a00000b200241f0006a24000b880a01037f02400240024002400240024002400240024020002d00004101460d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0920024101742204200320032004491b22044100480d090240024020020d002004102721030c010b200128020020022004102821030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d0920034101742202200420042002491b22024100480d090240024020030d002002102721030c010b200128020020032002102821030b2003450d0320012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b0240024002400240200041046a280200220241ffff034b0d00200241ef014b0d03200141046a280200200141086a2802002200460d01200128020021030c020b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d0b20004101742204200320032004491b22044100480d0b0240024020000d002004102721030c010b200128020020002004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a000002400240200141046a2802002203200428020022006b4104490d00200128020021030c010b200041046a22042000490d0b20034101742200200420042000491b22004100480d0b0240024020030d002000102721030c010b200128020020032000102821030b2003450d0720012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000f0b200041016a22032000490d0920004101742204200320032004491b22044100480d090240024020000d002004102721030c010b200128020020002004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d0820004101742204200320032004491b22044100480d080240024020000d002004102721030c010b200128020020002004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a000002400240200141046a2802002203200428020022006b4102490d00200128020021030c010b200041026a22042000490d0820034101742200200420042000491b22004100480d080240024020030d002000102721030c010b200128020020032000102821030b2003450d0720012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b20044101102a000b20024101102a000b20044101102a000b20004101102a000b20044101102a000b20044101102a000b20004101102a000b102b000ba60503057f027e037f230041106b22022400200241003a000020022001280200220320012802042204410047220510ce04210202400240024002400240024020042005490d002001200420056b22063602042001200320056a22053602002004450d03024020022d0000220441037122034103460d002004ad210702400240024020030e03000102000b2004410276ad2107420121080c080b200241003a0000200220052006410047220410ce04210320062004490d032001200620046b3602042001200520046a3602002006450d0520033100004208862007844202882107420121080c070b200241003a000e200241003b010c2002410c6a200520064103200641034922031b220410ce041a2001200620046b3602042001200520046a36020020030d04200233010c200231000e421086844208862007844202882107420121080c060b02402004410276220441044b0d000240024020040e050002020201000b200241003602002002200520064104200641044922031b220410ce0421092001200620046b3602042001200520046a36020020030d0520093502002107420121080c070b42002108200242003703002002200520064108200641084922031b220410ce0421092001200620046b3602042001200520046a36020020030d0520092903002107420121080c060b200441046a220a41084b0d0342002107410021030340200241003a0000200220052006410047220410ce04210920062004490d032001200620046b220b3602042001200520046a22053602002006450d0420093100002003410374413871ad86200784210742012108200b2106200341016a22042103200441ff0171200a4f0d060c000b0b20052004103e000b20042006103e000b20042006103e000b420021080b0b2000200737030820002008370300200241106a24000bc10605057f017e017f027e027f230041306b22022400200241003a0018200241186a2001280200220320012802042204410047220510ce041a024002400240024002400240024020042005490d002001200420056b22063602042001200320056a22053602002004450d04024020022d0018220441037122034103460d0002400240024020030e03000102000b2004410276ad21070c060b200241003a0018200241186a20052006410047220310ce041a20062003490d032001200620036b3602042001200520036a3602002006450d0620022d001841087420047241fcff0371410276ad21070c050b200241003a002e200241003b012c2002412c6a200520064103200641034922081b220310ce041a2001200620036b3602042001200520036a36020020080d0520022f012c20022d002e41107472410874200472410276ad21070c040b024020044102762204410c4b0d0002400240024020040e0d00030303010303030303030302000b20024100360218200241186a200520064104200641044922031b220410ce041a2001200620046b3602042001200520046a36020020030d07200235021821070c060b4200210920024200370318200241186a200520064108200641084922031b220410ce041a2001200620046b3602042001200520046a36020020030d07200229031821070c050b420021092002420037032020024200370318200241186a200520064110200641104922031b220410ce041a2001200620046b3602042001200520046a36020020030d06200241206a290300210a20022903182107420121090c070b200441046a220b41104b0d04200241106a210c420021074200210a410021030340200241003a0018200241186a20052006410047220410ce041a20062004490d032001200620046b22083602042001200520046a22053602002006450d05200241086a20023100184200200341037441f8007110d104200c290300200a84210a200229030820078421074201210920082106200341016a22042103200441ff0171200b4f0d070c000b0b20052004103e000b20032006103e000b20042006103e000b4200210a420121090c020b420021090b0b2000200737030820002009370300200041106a200a370300200241306a24000bbd0903017f017e057f230041e0006b220224000240024002400240024002400240024002400240024020002903002203423f560d0002400240200141046a280200200141086a2802002200460d00200128020021040c010b200041016a22042000490d0b20004101742205200420042005491b22054100480d0b0240024020000d002005102721040c010b200128020020002005102821040b2004450d0220012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a00000c080b200342808001540d062003428080808004540d054108200379a741037622056b4104490d0402400240200141046a280200200141086a2802002204460d00200128020021060c010b200441016a22072004490d0a20044101742206200720072006491b22074100480d0a0240024020040d002007102721060c010b200128020020042007102821060b2006450d0220012006360200200141046a2007360200200141086a28020021040b200141086a2207200441016a360200200620046a411320054102746b3a0000200220002903002203370308200541786a2104200141046a2106034002400240200628020020072802002200460d00200128020021050c010b200041016a22052000490d0b20004101742208200520052008491b22084100480d0b0240024020000d002008102721050c010b200128020020002008102821050b2005450d042001200536020020062008360200200728020021000b2007200041016a360200200520006a2003a73a000020034208882103200441016a22002004492105200021042005450d000b20022003370308200350450d030c070b20054101102a000b20074101102a000b20084101102a000b200241286a41146a4103360200200241346a4104360200200241106a41146a41033602002002200241086a3602402002418883c000360244200241c8006a41146a41003602002002420337021420024190d1c5003602102002410436022c200241b8d6c5003602582002420137024c200241e081c0003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a419083c0001057000b41ec82c0001058000b024002400240200141046a2802002204200141086a28020022006b4104490d00200128020021040c010b200041046a22052000490d0520044101742200200520052000491b22004100480d050240024020040d002000102721040c010b200128020020042000102821040b2004450d0120012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a74102744102723600000c020b20004101102a000b02400240200141046a2802002204200141086a28020022006b4102490d00200128020021040c010b200041026a22052000490d0320044101742200200520052000491b22004100480d030240024020040d002000102721040c010b200128020020042000102821040b2004450d0220012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b00000b200241e0006a24000f0b20004101102a000b102b000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a1091042100200241206a240020000bc20202027f017e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d0120044101200110aa0121000c020b20002903002104410021000340200220006a41ff006a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021000340200220006a41ff006a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000b20024180016a240020000f0b2003418001103e000b2003418001103e000b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241b8d6c500360204200241b8d6c500360200200210ab04000b6802017f037e230041306b22012400200029020821022000290210210320002902002104200141146a4100360200200141b8d6c50036021020014201370204200120043703182001200141186a36020020012003370328200120023703202001200141206a1057000b910a03017f027e057f230041e0006b2202240002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d0002400240200141046a280200200141086a2802002200460d00200128020021050c010b200041016a22052000490d0b20004101742206200520052006491b22064100480d0b0240024020000d002006102721050c010b200128020020002006102821050b2005450d0220012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a00000c080b20034280800154410020051b0d06200342808080800454410020051b0d05411020047920037942c0007c20044200521ba741037622066b4104490d0402400240200141046a280200200141086a2802002205460d00200128020021070c010b200541016a22082005490d0a20054101742207200820082007491b22084100480d0a0240024020050d002008102721070c010b200128020020052008102821070b2007450d0220012007360200200141046a2008360200200141086a28020021050b200141086a2208200541016a360200200720056a413320064102746b3a0000200029030021032002200041086a290300220437030820022003370300200641706a2105200141046a2107034002400240200728020020082802002200460d00200128020021060c010b200041016a22062000490d0b20004101742209200620062009491b22094100480d0b0240024020000d002009102721060c010b200128020020002009102821060b2006450d042001200636020020072009360200200828020021000b2008200041016a360200200620006a2003a73a00002003420888200442388684210320044208882104200541016a22002005492106200021052006450d000b2002200337030020022004370308200320048450450d030c070b20064101102a000b20084101102a000b20094101102a000b200241286a41146a4103360200200241346a4105360200200241106a41146a410336020020022002360240200241d081c000360244200241c8006a41146a41003602002002420337021420024190d1c5003602102002410536022c200241b8d6c5003602582002420137024c200241e081c0003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a41e881c0001057000b41b881c0001058000b024002400240200141046a2802002205200141086a28020022006b4104490d00200128020021050c010b200041046a22062000490d0520054101742200200620062000491b22004100480d050240024020050d002000102721050c010b200128020020052000102821050b2005450d0120012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a74102744102723600000c020b20004101102a000b02400240200141046a2802002205200141086a28020022006b4102490d00200128020021050c010b200041026a22062000490d0320054101742200200620062000491b22004100480d030240024020050d002000102721050c010b200128020020052000102821050b2005450d0220012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b00000b200241e0006a24000f0b20004101102a000b102b000b840605027f027e017f027e027f230041a0016b220224002000280200210002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0220054290ce005441002004501b450d012005a72103412721000c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d022001410141e8d9c5004102200241206a20006a41800120006b10ab0121000c060b41272100200241186a21060340200241106a200520044290ce00420010d4042002200229031022072006290300220842f0b17f427f10d304200241206a20006a2203417c6a200520022903007ca7220941ffff037141e4006e220a41017441fad6c5006a2f00003b00002003417e6a200a419c7f6c20096a41ffff037141017441fad6c5006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000c040b0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d012001410141e8d9c5004102200241206a20006a41800120006b10ab0121000c040b2000418001103e000b2000418001103e000b2007a721030b02400240200341e3004a0d00200321090c010b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441fad6c5006a2f00003b00000b024002402009410a480d00200241206a2000417e6a22006a200941017441fad6c5006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141b8d6c5004100200241206a20006a412720006b10ab0121000b200241a0016a240020000ba80301067f230041106b220224002002410036020820024201370300200020021030200041046a20021030200041086a2002103020002d0018210302400240024002400240200228020420022802082204460d00200228020021050c010b200441016a22052004490d0320044101742206200520052006491b22064100480d030240024020040d002006102721050c010b200228020020042006102821050b2005450d0120022006360204200220053602000b2002200441016a360208200520046a20033a0000200028020c21062002200041146a280200220436020c2002410c6a200210300240024020022802042203200228020822056b2004490d00200228020021000c010b200520046a22002005490d0320034101742207200020002007491b22074100480d030240024020030d002007102721000c010b200228020020032007102821000b2000450d022002200736020420022000360200200721030b200020056a2006200410ce041a200128020020012802042000200520046a100302402003450d00200010290b200241106a24000f0b20064101102a000b20074101102a000b102b000be80201097f230041206b22022400200241003602082002420137030020002802002103200220002802082200360210200241106a20021030024002400240024020000d002002280208210420022802042105200228020021060c010b200041246c210720022802042105200228020821000340200241106a2003104f2002280210210802400240200520006b20022802182209490d00200020096a2104200228020021060c010b200020096a22042000490d0420054101742206200420042006491b220a4100480d040240024020050d00200a102721060c010b20022802002005200a102821060b2006450d032002200a36020420022006360200200a21050b20022004360208200620006a2008200910ce041a02402002280214450d00200810290b200341246a2103200421002007415c6a22070d000b0b2001280200200128020420062004100302402005450d00200610290b200241206a24000f0b200a4101102a000b102b000bcd0c02077f017e230041206b22022400200241003602102002420137030802400240024002400240024002400240024002400240024002402001280200220341044b0d0002400240024002400240024020030e050001020304000b410110272203450d06200242818080801037020c20022003360208200341013a0000200141106a28020021032002200141186a2802002204360218200241186a200241086a103002402004450d002003200441286c6a2105034002400240200228020c2206200228021022076b4120490d00200228020821040c010b200741206a22042007490d1420064101742207200420042007491b22084100480d140240024020060d002008102721040c010b200228020820062008102821040b2004450d0a2002200836020c2002200436020820022802102107200821060b200420076a220841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a2900003700002002200741206a220736021020082003290000370000200341206a29030021090240200620076b41074b0d00200741086a22082007490d1420064101742207200820082007491b22074100480d140240024020060d002007102721040c010b200420062007102821040b2004450d0b2002200736020c20022004360208200228021021070b2002200741086a360210200420076a20093700002005200341286a2203470d000b0b200220012903082209370318200241186a21070c040b410110272203450d08200242818080801037020c20022003360208200341023a00002001290308210902400240200228020c2207200228021022036b4108490d00200341086a2104200228020821070c010b200341086a22042003490d1120074101742206200420042006491b22064100480d110240024020070d002006102721070c010b200228020820072006102821070b2007450d0a2002200636020c200220073602080b20022004360210200720036a2009370000200141186a28020021032002200141206a2802002204360218200241186a200241086a103002402004450d002003200441286c6a2105034002400240200228020c2206200228021022076b4120490d00200228020821040c010b200741206a22042007490d1320064101742207200420042007491b22084100480d130240024020060d002008102721040c010b200228020820062008102821040b2004450d0d2002200836020c2002200436020820022802102107200821060b200420076a220841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a2900003700002002200741206a220736021020082003290000370000200341206a29030021090240200620076b41074b0d00200741086a22082007490d1320064101742207200820082007491b22074100480d130240024020060d002007102721040c010b200420062007102821040b2004450d0e2002200736020c20022004360208200228021021070b2002200741086a360210200420076a20093700002005200341286a2203470d000b0b200220012903102209370318200241186a21070c030b410110272203450d0b200242818080801037020c20022003360208200341033a0000200220012903082209370318200241186a21070c020b410110272203450d0b200242818080801037020c20022003360208200341043a0000200220012903082209370318200241186a21070c010b410110272203450d0b200242818080801037020c20022003360208200341053a0000200220012903082209370318200241186a21070b02400240200228020c2204200228021022036b4108490d00200228020821040c010b200341086a22062003490d0d20044101742203200620062003491b22034100480d0d0240024020040d002003102721040c010b200228020820042003102821040b2004450d0c2002200336020c2002200436020820072903002109200228021021030b2002200341086a360210200420036a20093700000b20002002290308370200200041086a200241086a41086a280200360200200241206a24000f0b41014101102a000b20084101102a000b20074101102a000b41014101102a000b20064101102a000b20084101102a000b20074101102a000b41014101102a000b41014101102a000b41014101102a000b20034101102a000b102b000bcd0a04037f037e027f017e230041c0006b220724002004a7210802400240024002400240024002400240024020014201510d0041012109024020084101460d00427f200320067c200220057c220a2002542208ad7c220b2008200b200354200b2003511b22081b210b427f200a20081b210a4200210c4100210d0c040b2002200556200320065620032006511b450d01200320067d2002200554ad7d210b200220057d210a4200210c0c020b4101210d024020084101470d00427f200320067c200220057c22012002542208ad7c22022008200220035420022003511b22081b210b427f200120081b210a410021094201210c0c040b200741086a200420052006420120022003105e200741186a290300210b2007290310210a2007290308210c0c070b200620037d2005200254ad7d210b200520027d210a4201210c0b410021094101210d0b2001500d0042002101200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a20082903003703002007200729033037032020074100360230200741206a4110200741306a1005210e0240024020072802302208417f470d004200210f0c010b2007420037033820074200370330200741306a200e2008411020084110491b10ce041a2008410f4d0d02200741386a290300210f20072903302101200e10290b200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a20082903003703002007200729033037032020074200200f20037d2001200254ad7d2203200120027d22022001562003200f562003200f511b22081b37033820074200200220081b370330200741206a4110200741306a411010030b2004500d020c010b418f89c3004133104e000b2009450d0142002103200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a20082903003703002007200729033037032020074100360230200741206a4110200741306a1005210902400240024020072802302208417f470d00420021020c010b2007420037033820074200370330200741306a20092008411020084110491b10ce041a2008410f4d0d01200741386a290300210220072903302103200910290b200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a20082903003703002007200729033037032020074200200220067d2003200554ad7d2204200320057d2205200356200420025620042002511b22081b37033820074200200520081b370330200741206a4110200741306a411010030c020b418f89c3004133104e000b200d450d0042002102200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a20082903003703002007200729033037032020074100360230200741206a4110200741306a1005210902400240024020072802302208417f470d00420021030c010b2007420037033820074200370330200741306a20092008411020084110491b10ce041a2008410f4d0d01200741386a290300210320072903302102200910290b200741306a41086a220842003703002007420037033041b18ac0004116200741306a1004200741206a41086a2008290300370300200720072903303703202007427f200320067c200220057c22052002542208ad7c22022008200220035420022003511b22081b3703382007427f200520081b370330200741206a4110200741306a411010030c010b418f89c3004133104e000b2000200a3703082000200c370300200041106a200b370300200741c0006a24000b890604077f017e017f047e230041e0006b220324002003200236021020032001280200220236020820032002200128020841246c22016a220436020c2003200341086a41086a360214024002400240200141ed00490d00200341386a41086a210103402003200241246a360208200341386a200341146a20021060200341186a41086a2202200141086a2204290300370300200341186a41106a2205200141106a2206290300370300200341186a41186a2207200141186a220829030037030020032001290300370318200341186a21092003290338220a4205520d0220032003280208220b41246a360208200341386a200341146a200b1060200220042903003703002005200629030037030020072008290300370300200320012903003703182003290338220a4205520d0220032003280208220b41246a360208200341386a200341146a200b1060200220042903003703002005200629030037030020072008290300370300200320012903003703182003290338220a4205520d0220032003280208220b41246a360208200341386a200341146a200b1060200220042903003703002005200629030037030020072008290300370300200320012903003703182003290338220a4205520d02200328020c2204200328020822026b41ec004b0d000b0b024020022004460d00200341386a41086a210103402003200241246a360208200341386a200341146a20021060200341186a41086a200141086a290300370300200341186a41106a200141106a290300370300200341186a41186a200141186a2903003703002003200129030037031802402003290338220a4205510d00200341186a21090c030b20032802082202200328020c470d000b0b200042053703000c010b200341386a41186a200941186a290300220c370300200341386a41106a200941106a290300220d370300200341386a41086a200941086a290300220e37030020032009290300220f3703382000200a3703002000200f370308200041106a200e370300200041186a200d370300200041206a200c3703000b200341e0006a24000be00802047f037e230041206b220324002001280200280200220128020421042001280200210102400240024002400240024002400240024002400240024020022d00000e050001020304000b200241016a21024100210520010e0406040507060b200241086a210641012105200241016a210220010e0405030406050b200241086a2106200241016a21024102210520010e0404020305040b200241086a2106200241016a21024103210520010e0403010204030b41042105200241046a210220010e0402000103020b20054102470d04024020022004470d00200621020c040b200228000021012006210220012004280000470d040c030b20054103470d03024020022004470d00200621020c030b200228000021012006210220012004280000460d020c030b20054101470d02024020022004470d00200621020c020b200228000021012006210220012004280000470d020c010b20054104470d010b2002280200210120032002280208220236020c20032001360208200341003a0010200341106a20012002410047220510ce041a024020022005490d002003200220056b220436020c2003200120056a22013602082002450d0120032d0010417f6a220241044b0d010240024002400240024002400240024020020e050001020304000b200341106a200341086a104120032802102202450d08200329021421074200210820034200370310200341106a20032802082204200328020c2205410820054108491b220110ce041a2003200520016b36020c2003200420016a3602082007a72101200541074b0d052001450d08200210290c080b20034200370310200341106a20012004410820044108491b220210ce041a2003200420026b36020c2003200120026a360208200441074d0d0720032903102107200341106a200341086a104120032802102205450d072003290214210820034200370310200341106a20032802082204200328020c2202410820024108491b220110ce041a2003200220016b36020c2003200420016a3602082008a72104200241074b0d032004450d07200510290c070b20034200370310200341106a20012004410820044108491b220210ce041a2003200420026b36020c2003200120026a360208200441074d0d0620032903102107420221080c040b20034200370310200341106a20012004410820044108491b220210ce041a2003200420026b36020c2003200120026a360208200441074d0d0520032903102107420321080c030b20034200370310200341106a20012004410820044108491b220210ce041a2003200420026b36020c2003200120026a360208200441074d0d0420032903102107420421080c020b2008422088210920032903102208422088a721012008a72102420121080c010b2007422088a72105200329031021070b2000200436021c200020013602142000200737030820002008370300200041206a2009370200200041186a2005360200200041106a20023602000c020b20052002103e000b200042053703000b200341206a24000bec0301097f230041106b2202240020002802002103200220002802082204360204200241046a2001103002400240024002400240200141046a2802002205200141086a28020022066b2004490d00200128020021050c010b200620046a22072006490d0320054101742206200720072006491b22064100480d030240024020050d002006102721050c010b200128020020052006102821050b2005450d0120012005360200200141046a2006360200200141086a28020021060b200141086a2207200620046a360200200520066a2003200410ce041a200028020c21062002200041146a2802002200360208200241086a2001103002402000450d0020062000410c6c6a2108200141046a21090340200628020021032002200641086a280200220036020c2002410c6a200110300240024020092802002205200728020022046b2000490d00200128020021050c010b200420006a220a2004490d0520054101742204200a200a2004491b22044100480d050240024020050d002004102721050c010b200128020020052004102821050b2005450d042001200536020020092004360200200728020021040b2007200420006a360200200520046a2003200010ce041a2006410c6a22062008470d000b0b200241106a24000f0b20064101102a000b20044101102a000b102b000be23101077f23004180016b22082400024002402002410c6a280200200241106a28020010062209417f460d00410c1027220a0d01410c4104102a000b1063000b200a2009360208200a4281808080103702000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002404101450d00200a410141016a3602004101417e460d00200a410141027236020041041027220b450d01200b200a360200200a280208210c41031027220d450d02200d41026a41002d009cb0453a0000200d41002f009ab0453b000041061027220e450d03200e41046a41002f00a0f4423b0000200e410028009cf442360000412010272209450d042009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a2802081007200a200a280204417f6a220d360204200d0d00200a10290b41031027220d450d05200d41026a41002d009cb0453a0000200d41002f009ab0453b000041031027220e450d06200e41026a41002d009fb0453a0000200e41002f009db0453b00002009412041c00010282209450d072009410636023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d36022041031027220d450d08200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410f1027220e450d09200e41076a41002900af8845370000200e41002900a88845370000200941c00041800110282209450d0a2009410736025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d36024041031027220d450d0b200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410f1027220e450d0c200e41076a41002900be8845370000200e41002900b788453700002009410836027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d36026041031027220d450d0d200d41026a41002d009cb0453a0000200d41002f009ab0453b000041081027220e450d0e200e42e5f0d1fbb5ac98b6ec00370000200941800141800210282209450d0f2009410936029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d3602800141031027220d450d10200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410a1027220e450d11200e41086a41002f00d688453b0000200e41002900ce88453700002009410a3602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a00141031027220d450d12200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410a1027220e450d13200e41086a41002f00e088453b0000200e41002900d888453700002009410b3602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c00141031027220d450d14200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410a1027220e450d15200e41086a41002f00ea88453b0000200e41002900e288453700002009410c3602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e00141031027220d450d16200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410b1027220e450d17200e41076a41002800f38845360000200e41002900ec8845370000200941800241800410282209450d182009410d36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d3602800241031027220d450d19200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410d1027220e450d1a200e41056a41002900fc8845370000200e41002900f788453700002009410e3602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a00241031027220d450d1b200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410c1027220e450d1c200e41086a410028008c8945360000200e410029008489453700002009410f3602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c00241031027220d450d1d200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410b1027220e450d1e200e41076a41002800978945360000200e41002900908945370000200941103602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e00241031027220e450d1f200e41026a41002d009cb0453a0000200e41002f009ab0453b000041151027220d450d20200d410d6a41002900a88945370000200d41086a41002900a38945370000200d410029009b89453700002009411136029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e3602800341031027220d450d21200d41026a41002d009cb0453a0000200d41002f009ab0453b0000410a1027220e450d22200e41086a41002f00b889453b0000200e41002900b08945370000200941123602bc03200941003602b8032009428a808080a0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a00341031027220d450d23200d41026a41002d009cb0453a0000200d41002f009ab0453b000041071027220e450d24200e41036a41002800bd8945360000200e41002800ba8945360000200941133602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c00341031027220e450d25200e41026a41002d009cb0453a0000200e41002f009ab0453b000041111027220d450d26200d41106a41002d00d189453a0000200d41086a41002900c98945370000200d41002900c18945370000200941143602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e00341031027220d450d27200d41026a41002d009cb0453a0000200d41002f009ab0453b000041101027220e450d28200e41086a41002900da8945370000200e41002900d2894537000020094180044180081028220c450d29200c411536029c04200c410036029804200c4290808080800237029004200c200e36028c04200c42838080803037028404200c200d36028004410310272209450d2a200941026a41002d009cb0453a0000200941002f009ab0453b000041101027220d450d2b200d41086a41002900ea8945370000200d41002900e28945370000200c41163602bc04200c41003602b804200c429080808080023702b004200c200d3602ac04200c4283808080303702a404200c20093602a00441031027220d450d2c200d41026a41002d009cb0453a0000200d41002f009ab0453b0000411110272209450d2d200941106a41002d00828a453a0000200941086a41002900fa8945370000200941002900f28945370000200c41173602dc04200c41003602d804200c429180808090023702d004200c20093602cc04200c4283808080303702c404200c200d3602c00441031027220d450d2e200d41026a41002d009cb0453a0000200d41002f009ab0453b0000411610272209450d2f2009410e6a41002900918a45370000200941086a410029008b8a45370000200941002900838a45370000200c41183602fc04200c41003602f804200c4296808080e0023702f004200c20093602ec04200c4283808080303702e404200c200d3602e00441031027220d450d30200d41026a41002d009cb0453a0000200d41002f009ab0453b0000411210272209450d31200941106a41002f00a98a453b0000200941086a41002900a18a45370000200941002900998a45370000200c411936029c05200c410036029805200c4292808080a00237029005200c200936028c05200c42838080803037028405200c200d36028005410310272209450d32200941026a41002d009cb0453a0000200941002f009ab0453b0000410b1027220d450d33200d41076a41002800b28a45360000200d41002900ab8a45370000200c411a3602bc05200c41003602b805200c428b808080b0013702b005200c200d3602ac05200c4283808080303702a405200c20093602a005410310272209450d34200941026a41002d009cb0453a0000200941002f009ab0453b000041101027220d450d35200d41086a41002900be8a45370000200d41002900b68a45370000200c411b3602dc05200c41003602d805200c429080808080023702d005200c200d3602cc05200c4283808080303702c405200c20093602c0052005417f4c0d364101210902402005450d00200510272209450d380b20092004200510ce042109200841086a41186a2005360200200841086a41146a2005360200200841086a410c6a200641086a28020036020020082003360208200841003602302008200736022c2008200a360228200820093602182008200629020037020c20082001280200360224200241146a28020021042002411c6a2802002107200841003602482008420137034020084117360278200841f8006a200841c0006a1030410021010340200c20016a2205280200210e2008200541086a2802002209360278200841f8006a200841c0006a1030024002402008280244220d2008280248220a6b2009490d002008280240210d0c010b200a20096a2206200a490d3f200d4101742203200620062003491b22064100480d3f02400240200d0d0020061027210d0c010b2008280240200d20061028210d0b200d450d3a200820063602442008200d3602400b2008200a20096a360248200d200a6a200e200910ce041a2005410c6a28020021032008200541146a280200220d360278200841f8006a200841c0006a1030024002402008280244220a2008280248220e6b200d490d00200828024021090c010b200e200d6a2209200e490d3f200a4101742206200920092006491b22064100480d3f02400240200a0d002006102721090c010b2008280240200a2006102821090b2009450d3b20082006360244200820093602402006210a0b2008200e200d6a22063602482009200e6a2003200d10ce041a02400240200541186a2802004101460d0002400240200a2006460d00200a210d0c010b200a41016a220d200a490d41200a410174220e200d200d200e491b220d4100480d4102400240200a0d00200d102721090c010b2009200a200d102821090b2009450d3e2008200d360244200820093602400b2008200641016a220a360248200920066a41013a000020082005411c6a2802002205360278200841f8006a210e0c010b02400240200a2006460d00200a210d0c010b200a41016a220d200a490d40200a410174220e200d200d200e491b220d4100480d4002400240200a0d00200d102721090c010b2009200a200d102821090b2009450d3e2008200d360244200820093602400b2008200641016a220a360248200920066a41023a000020082005411c6a2802002205360278200841f8006a210e0b0240200d200a6b41034b0d00200a41046a2205200a490d3f200d4101742206200520052006491b22054100480d3f02400240200d0d002005102721090c010b2009200d2005102821090b2009450d3e2008200536024420082009360240200e28020021050b2008200a41046a3602482009200a6a2005360000200141206a220141e005470d000b2008280244210a4102210902400240411c200420072008280240220e2008280248200841086a1008220541036a220d41024b0d0002400240200d0e03010200010b410021090b0240200a450d00200e10290b2009450d01200841c0006a41306a200841086a41306a280200360200200841c0006a41286a200841086a41286a290300370300200841c0006a41206a200841086a41206a290300370300200841c0006a41186a200841086a41186a290300370300200841c0006a41106a200841086a41106a290300370300200841c0006a41086a200841086a41086a290300370300200820082903083703402000200841c0006a2009107b4100210e410121060c420b41041027220d450d3f200b280200220928020041016a220641014d0d0120092006360200200d20093602000240200a450d00200e10290b2002280204210e20022802002106200841003602482008420137034020084100360278200841f8006a200841c0006a10302008280240210a2008280244210120082802482103410a107c2209450d4002400240024002400240024020052006200e200a20032009410a200841086a100941036a220e41034b0d0041012106200e0e0402000001020b41c0cdc1001058000b2008410936027c2008200941016a36027820092d0000220e41014b0d0102400240200e0e020100010b200841c0006a200841f8006a107d2008280240417e714104460d020b410021060b2009102902402001450d00200a10290b4103210920060d010c020b200910292001450d00200a10290b410221090b200841c0006a41306a200841086a41306a280200360200200841c0006a41286a200841086a41286a290300370300200841c0006a41206a200841086a41206a290300370300200841c0006a41186a200841086a41186a290300370300200841c0006a41106a200841086a41106a290300370300200841c0006a41086a200841086a41086a290300370300200820082903083703402000200841c0006a2009107b2005100a200d28020022092009280200417f6a3602000240200d28020022092802000d0020092802081007200d28020022092009280204417f6a360204200d28020022092802040d00200910290b200d10294101210e410021060c410b200041a083c00036020420004102360200200041086a41103602000240200828020c2209450d00200841086a41086a280200450d00200910290b0240200828021c450d00200828021810290b200828022822092009280200417f6a3602000240200828022822092802000d0020092802081007200828022822092009280204417f6a360204200828022822092802040d00200910290b024020082802302209450d00200841346a280200450d00200910290b4100210a03400240200c200a6a220941046a280200450d00200928020010290b0240200941106a280200450d002009410c6a28020010290b200a41206a220a41e005470d000b200c1029200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081007200b28020022092009280204417f6a360204200b28020022092802040d00200910290b200b10290c410b00000b41044104102a000b41034101102a000b41064101102a000b41204104102a000b41034101102a000b41034101102a000b41c0004104102a000b41034101102a000b410f4101102a000b4180014104102a000b41034101102a000b410f4101102a000b41034101102a000b41084101102a000b4180024104102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410b4101102a000b4180044104102a000b41034101102a000b410d4101102a000b41034101102a000b410c4101102a000b41034101102a000b410b4101102a000b41034101102a000b41154101102a000b41034101102a000b410a4101102a000b41034101102a000b41074101102a000b41034101102a000b41114101102a000b41034101102a000b41104101102a000b4180084104102a000b41034101102a000b41104101102a000b41034101102a000b41114101102a000b41034101102a000b41164101102a000b41034101102a000b41124101102a000b41034101102a000b410b4101102a000b41034101102a000b41104101102a000b1039000b20054101102a000b20064101102a000b20064101102a000b200d4101102a000b200d4101102a000b20054101102a000b102b000b41044104102a000b410a4101102a000b4100210a03400240200c200a6a220941046a280200450d00200928020010290b0240200941106a280200450d002009410c6a28020010290b200a41206a220a41e005470d000b200c1029200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081007200b28020022092009280204417f6a360204200b28020022092802040d00200910290b200b1029410021092006410047200e720d002005100a0340200d20096a220a28020022052005280200417f6a3602000240200a28020022052802000d0020052802081007200a28020022052005280204417f6a360204200a280200220a2802040d00200a10290b200941046a22094104470d000b200d10290b20084180016a24000b0a0041b083c0001058000b5101027e024002402003450d002002280200450d010b4182abc10041f403104e000b2001280224220342002003290308220420023502047d2205200520045622021b37030820004105410420021b3602000b9d0f05047f027e027f017e027f230041d00c6b2204240002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042105200241246a2802002106200241346a28020021030240200241146a2802002207450d004105210220012802002802202802502802bc012003490d070b200441306a4200370300200441286a4200370300200441206a420037030020012802242202420020022903082208427f200128021c2903482209420586200942ffffffffffffffff07832009521b7d22092009200856220a1b3703082004420037031841052102200a0d060240024020012802202802082005200441186a4120101241026a220a41024b0d00200a0e03080001080b4194c0c5001058000b024002400240024020070d004100210b0c010b200441086a200128021c29034842002003ad220c420010d3042001280224220a4200200a2903082209427f200429030820042903104200521b7d22082008200956220a1b370308200a0d090240024020030d00410021034101210b4200210c0c010b0240024020034100480d0020031027220b0d0120034101102a000b102b000b200b21054100210a024020034102490d00200b41002003417f6a220a10cd04200a6a21050b200541003a0000200a41016a21030b02400240024020012802202802082006200b2003101241026a220a41024b0d00200a0e03010002010b4194c0c5001058000b200c50450d020c0a0b200b450d09200c2003ad4220868421090b20012802002103200441386a41186a2201200441186a41186a290300370300200441386a41106a220a200441186a41106a290300370300200441386a41086a2205200441186a41086a2903003703002004200429031837033820032802202107200b450d0120072802502802bc012009422088a74f0d012009a7450d080b200b10290c070b200441d8006a41186a2001290300370300200441d8006a41106a200a290300370300200441d8006a41086a200529030037030020042004290338370358200728021c0d042007417f36021c200441b0016a200741f4006a290000370300200441a8016a200741ec006a290000370300200441a0016a200741e4006a2900003703002004200729005c3703980102400240200741206a220d280200220a418883c000460d00200741246a28020021060c010b41002106200441f0096a410041e00210cd041a200441d0016a410041a00810cd041a41880b1027220a450d06200a41003b0106200a4100360200200a41086a200441f0096a41e00210ce041a200a41e8026a200441d0016a41a00810ce041a200741246a41003602002007200a3602200b024002400340200a2f0106220e4105742105410021024100210302400240034020052002460d0120044198016a200a20026a41086a412010d0042201450d02200241206a2102200341016a21032001417f4a0d000b2003417f6a210e0b2006450d022006417f6a2106200a200e4102746a41880b6a280200210a0c010b0b200741286a2101410121020c010b200441f8006a41186a20044198016a41186a290300370300200441f8006a41106a20044198016a41106a290300370300200441f8006a41086a20044198016a41086a2903003703002004200429039801370378200741286a210141002106200e2103410021020b0240024020020d002004418c0a6a200441f8006a41086a290300370200200441940a6a200441f8006a41106a2903003702002004419c0a6a200441f8006a41186a290300370200200420013602800a200420033602fc092004200d3602f8092004200a3602f409200420063602f009200420042903783702840a200441f0016a20042903c001370300200441f8016a200441c0016a41086a29030037030020044184026a4200370200200442003703e801200442003703d0012004418883c00036028002200441003a008c022004418d026a20042900980137000020044195026a20044198016a41086a2900003700002004419d026a20044198016a41106a290000370000200441a5026a20044198016a41186a290000370000200441ac026a200441b7016a280000360000200441f0096a200441d0016a10de0121020c010b200441e8016a4200370300200441e4016a418883c000360200200441003602f001200441003602e001200442003703d8012004418883c0003602d401200441003602d001200a200341e0006c6a41e8026a2102200441d0016a10d6010b200441d0016a41186a200441d8006a41186a290300370300200441d0016a41106a200441d8006a41106a290300370300200441d0016a41086a200441d8006a41086a290300370300200420042903583703d0012004200937029c012004200b36029801200441f0096a200241306a200441d0016a20044198016a10df01024020042802f009450d0020042802f4092202450d00200441f8096a280200450d00200210290b2007200728021c41016a36021c410421020c060b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b41c8a8c1004110200441d0016a41f0a8c10010a201000b41880b4108102a000b20002002360200200441d00c6a24000b900302017f027e230041c0006b22042400024002402003450d0020022802000d0020022802042103200441186a4200370300200441106a4200370300200441086a420037030020012802242202420020022903082205427f200128021c2903482206420586200642ffffffffffffffff07832006521b7d2206200620055622021b3703082004420037030002400240024020020d00024002402001280220280208200320044120101241026a220241024b0d0020020e03020001020b4194c0c5001058000b200441206a20012802002802202202411c6a200241dc006a200241106a410020022802101b200410dd012004280220450d01200441306a41086a2203200441206a41086a28020036020020042004290320370330200141106a21020240200141146a280200450d00200228020010290b20022004290330370200200241086a2003280200360200410021010c020b200041053602000c030b200141186a4100360200410121010b20004100360200200020013602040c010b4182abc10041f403104e000b200441c0006a24000bb40d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a200128021c2903484200200241146a2802002202ad420010d3042001280224220342002003290308220b427f200429032020042903284200521b7d220c200c200b5622031b37030820030d0d0240024020020d0041002102410121034100210d0c010b20024100480d0b200210272203450d082003210e4100210d024020024102490d00200341002002417f6a220d10cd04200d6a210e0b200e41003a0000200d41016a210d0b024002400240200128022028020820052003200d101241026a220541024b0d0020050e03010002010b4194c0c5001058000b2002450d0e200310290c0e0b2003450d0d20044180016a200d4120200d412049220e1b22056a41004100412020056b2005411f4b1b10cd041a20044180016a2003200510ce041a02400240200e0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d00200310290b200441106a200128021c29034842002008ad420010d3042001280224220242002002290308220b427f200429031020042903184200521b7d220c200c200b5622021b37030820020d0f0240024020080d004100210841012102410021030c010b20084100480d0d200810272202450d0b2002210541002103024020084102490d00200241002008417f6a220310cd0420036a21050b200541003a0000200341016a21030b024002402001280220280208200720022003101241026a220541024b0d0020050e03010003010b4194c0c5001058000b2008450d0f200210290c0f0b2002450d0e200310290c0e0b20020d090c0d0b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b20024101102a000b20084101102a000b2004420037038801200442003703800120044180016a20022003411020034110491b10ce041a02402003410f4b0d002008450d04200210290c040b20044188016a290300210f200429038001211002402008450d00200210290b2004200128021c2903484200200aad420010d3042001280224220242002002290308220b427f200429030020042903084200521b7d220c200c200b5622021b37030820020d030240200a0d004100210a41012102410021030c030b200a4100480d00200a102722020d01200a4101102a000b102b000b41012103200221050240200a4102490d0020024100200a417f6a220310cd0420036a2105200a21030b200541003a00000b0240024002402001280220280208200920022003101241026a220541024b0d0020050e03010002010b4194c0c5001058000b200a450d01200210290c010b2002450d00200141186a4100360200200141146a280200210d200128021021082001420137021020012802242205290308220c210b0240024002402006500d002006210b200c2006540d010b2005200c200b7d3703082005290310210c200441d0006a41186a200541186a2903003703002004200b3703582004200b3703502004200c3703602001280200280220210720044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a8012004200d3602a401200420083602a001200441f0006a200720044180016a2010200f200441d0006a20022003200441a0016a10e101200441f0006a41086a290300210b2004280274210d200428027021082005200429035820052903087c3703084101210320084101460d01200d450d010240200141146a2203280200450d00200128021010290b2001200d3602102003200b370200410021030c010b41012103200d450d00200810290b0240200a450d00200210290b20004100360200200020033602040c010b200041053602000b200441b0016a24000bfe0f06027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a200128021c2903484200200241146a2802002202ad420010d3042001280224220342002003290308220b427f200429032820042903304200521b7d220c200c200b5622031b37030820030d0a0240024020020d0041002102410121034100210d0c010b20024100480d0f200210272203450d082003210e4100210d024020024102490d00200341002002417f6a220d10cd04200d6a210e0b200e41003a0000200d41016a210d0b024002400240200128022028020820052003200d101241026a220541024b0d0020050e03010002010b4194c0c5001058000b2002450d0b200310290c0b0b2003450d0a200441f8006a200d4120200d412049220e1b22056a41004100412020056b2005411f4b1b10cd041a200441f8006a2003200510ce041a02400240200e0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d00200310290b200441186a200128021c29034842002008ad420010d3042001280224220242002002290308220b427f200429031820042903204200521b7d220c200c200b5622021b37030820020d0c0240024020080d004100210841012102410021030c010b20084100480d11200810272202450d0b2002210541002103024020084102490d00200241002008417f6a220310cd0420036a21050b200541003a0000200341016a21030b024002402001280220280208200720022003101241026a220541024b0d0020050e03010003010b4194c0c5001058000b2008450d0c200210290c0c0b2002450d0b200310290c0b0b20020d090c0a0b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b20024101102a000b20084101102a000b200442003703c001200442003703b801200441b8016a20022003411020034110491b10ce041a02402003410f4b0d002008450d01200210290c010b200441c0016a290300210f20042903b801211002402008450d00200210290b200441086a200128021c2903484200200aad420010d3042001280224220242002002290308220b427f200429030820042903104200521b7d220c200c200b5622021b37030820020d0002400240200a0d004100210a41012102410021030c010b200a4100480d05200a10272202450d0641012103200221050240200a4102490d0020024100200a417f6a220310cd0420036a2105200a21030b200541003a00000b0240024002402001280220280208200920022003101241026a220541024b0d0020050e03010002010b4194c0c5001058000b200a450d01200210290c010b2002450d00200141186a410036020020012802242205290308220c210b02402006500d004101210d2006210b200c2006540d030b2005200c200b7d3703082005290310210c20044198016a41186a200541186a2903003703002004200b3703a0012004200b370398012004200c3703a801200441b8016a20012802002802202010200f20044198016a200441386a2002200310da014101210d20042d00b8014101460d01200441f8006a41186a200441d1016a290000220b370300200441f8006a41106a200441c9016a290000220c370300200441f8006a41086a200441c1016a2900002206370300200441d8006a41086a22032006370300200441d8006a41106a220d200c370300200441d8006a41186a2208200b370300200420042900b901220b370378200520042903a00120052903087c3703082004200b370358200441b8016a41186a2008290300370300200441b8016a41106a200d290300370300200441b8016a41086a2003290300370300200420042903583703b80102400240200141146a2802002205200141186a28020022036b4120490d00200128021021050c010b200341206a220d2003490d0520054101742203200d200d2003491b22034100480d050240024020050d002003102721050c010b200128021020052003102821050b2005450d0420012005360210200141146a2003360200200141186a28020021030b200141186a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210d0c020b200041053602000c050b200520042903a00120052903087c370308200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200420042903783703580b0240200a450d00200210290b200041003602002000200d3602040c030b20034101102a000b102b000b200a4101102a000b200441e0016a24000bc70403027f027e057f230041106b22042400024002400240024002402003450d0020022802000d0020034101460d0120022802100d01200228020421052004200128021c2903184200200241146a2802002203ad420010d30420012802242202420020022903082206427f200429030020042903084200521b7d2207200720065622021b370308024020020d0020012802042102200141003602042002450d0302400240200141086a290200220642ffffffff0f560d000240024020032006422088a722084b0d002003200820032008491b21030c010b024002402006a7220920086b200320086b220a490d00200821090c010b2008200a6a220b2008490d092009410174220c200b200b200c491b220b4100480d090240024020090d00200b102721020c010b20022009200b102821020b2002450d082006422088a72109200bad21060b200220096a210b0240200a4102490d00200b410020032008417f7322086a10cd041a2002200920036a20086a22096a210b0b200b41003a0000200941016a21030b024002402001280220280208200520022003101241026a220841024b0d0020080e03010003010b4194c0c5001058000b2006a7450d02200210290c020b41d08bc3001058000b2006a72108024020012802282205450d002001412c6a280200450d00200510290b20012002360228200141306a20033602002001412c6a20083602000b20004105360200200441106a24000f0b4182abc10041f403104e000b4182abc10041f403104e000b41f6aec10041fd00104e000b200b4101102a000b102b000bf00101037f41002104200141186a4100360200200128020021050240024002400240200141146a28020022064120490d00200128021021060c010b200641017422044120200441204b1b22044100480d020240024020060d002004102721060c010b200128021020062004102821060b2006450d0120012006360210200141146a2004360200200141186a28020021040b200141186a200441206a360200200620046a220141186a2005413c6a290000370000200141106a200541346a290000370000200141086a2005412c6a29000037000020012005290024370000200041043602000f0b20044101102a000b102b000bf60101037f41002104200141186a4100360200200128020028022021050240024002400240200141146a28020022064120490d00200128021021060c010b200641017422044120200441204b1b22044100480d020240024020060d002004102721060c010b200128021020062004102821060b2006450d0120012006360210200141146a2004360200200141186a28020021040b200141186a200441206a360200200620046a220141186a200541f4006a290000370000200141106a200541ec006a290000370000200141086a200541e4006a2900003700002001200529005c370000200041043602000f0b20044101102a000b102b000bd50102027f027e41002104200141186a41003602002001280224220541186a2903002106200529031021070240024002400240200141146a28020022054110490d00200128021021050c010b200541017422044110200441104b1b22044100480d020240024020050d002004102721050c010b200128021020052004102821050b2005450d0120012005360210200141146a2004360200200141186a28020021040b200141186a200441106a360200200520046a2201200637000820012007370000200041043602000f0b20044101102a000b102b000bc20103017f017e017f41002104200141186a4100360200200128022429030821050240024002400240200141146a28020022064108490d00200128021021060c010b200641017422044108200441084b1b22044100480d020240024020060d002004102721060c010b200128021020062004102821060b2006450d0120012006360210200141146a2004360200200141186a28020021040b200141186a200441086a360200200620046a2005370000200041043602000f0b20044101102a000b102b000b9d04020b7f027e230041206b22042400200141186a41003602000240024002402001280200280220220528021c41016a220641004c0d00200541dc006a21072005200636021c200541206a2108200541246a28020021090240024003402008280200220a41086a210b200a2f0106220c41057421084100210d0240024003402008450d012007200b412010d004220e450d02200841606a2108200d41016a210d200b41206a210b200e417f4a0d000b200d417f6a210c0b2009450d022009417f6a2109200a200c4102746a41880b6a21080c010b0b200a200d41e0006c6a220841e8026a280200450d00200841f8026a290300210f200841f0026a29030021100c010b200441086a2005412c6a2802002007200541306a28020028021c110200200441106a290300210f200528021c2106200429030821100b20052006417f6a36021c02400240200141146a280200220b200141186a28020022086b4110490d002001280210210b0c010b200841106a220d2008490d03200b4101742208200d200d2008491b22084100480d0302400240200b0d0020081027210b0c010b2001280210200b20081028210b0b200b450d022001200b360210200141146a2008360200200141186a28020021080b200141186a200841106a360200200b20086a2208200f3700082008201037000020004104360200200441206a24000f0b41d8a8c1004118200441186a4180a9c10010a201000b20084101102a000b102b000bd50102027f027e41002104200141186a41003602002001280200220541086a2903002106200529030021070240024002400240200141146a28020022054110490d00200128021021050c010b200541017422044110200441104b1b22044100480d020240024020050d002004102721050c010b200128021020052004102821050b2005450d0120012005360210200141146a2004360200200141186a28020021040b200141186a200441106a360200200520046a2201200637000820012007370000200041043602000f0b20044101102a000b102b000bf30403047f027e017f230041306b2204240002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0141052105200241146a2802002203200128021c220628026c4b0d06200228020421072004200629034842002003ad420010d30420012802242202420020022903082208427f200429030020042903084200521b7d2209200920085622021b37030820020d060240024020030d004100210341012102410021060c010b20034100480d04200310272202450d05410121062002210a024020034102490d00200241002003417f6a220610cd0420066a210a200321060b200a41003a00000b0240024002402001280220280208200720022006101241026a220741024b0d0020070e03010002010b4194c0c5001058000b2003450d070c060b2002450d06200141186a22054100360200200441106a2002200610db0102400240200141146a2802002206200528020022056b4120490d00200128021021060c010b200541206a22072005490d0420064101742205200720072005491b22054100480d040240024020060d002005102721060c010b200128021020062005102821060b2006450d0320012006360210200141146a2005360200200141186a28020021050b200141186a200541206a360200200620056a220141186a200441106a41186a290300370000200141106a200441106a41106a290300370000200141086a200441106a41086a290300370000200120042903103700004104210520030d050c060b4182abc10041f403104e000b4182abc10041f403104e000b20054101102a000b102b000b20034101102a000b200210290b20002005360200200441306a24000bc20103017f017e017f41002104200141186a4100360200200128020029031021050240024002400240200141146a28020022064108490d00200128021021060c010b200641017422044108200441084b1b22044100480d020240024020060d002004102721060c010b200128021020062004102821060b2006450d0120012006360210200141146a2004360200200141186a28020021040b200141186a200441086a360200200620046a2005370000200041043602000f0b20044101102a000b102b000bee0704027f027e037f027e230041f0036b2204240002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441206a200128021c2903484200200241146a2802002202ad420010d30420012802242203420020032903082206427f200429032020042903284200521b7d2207200720065622031b3703084105210820030d060240024020020d004100210241012103410021090c010b20024100480d05200210272203450d06410121092003210a024020024102490d00200341002002417f6a220910cd0420096a210a200221090b200a41003a00000b024002400240024002402001280220280208200520032009101241026a220541024b0d0020050e03010002010b4194c0c5001058000b20020d010c090b2003450d08200420093602bc01200420033602b801200441c8026a200441b8016a103c024020042802c80222054112460d00200441c0016a200441c8026a41047241840110ce041a20042005360230200441306a410472200441c0016a41840110ce041a02402002450d00200310290b200441003602d002200442013703c802200441306a200441c8026a103220042802d0022103024020042802cc02450d0020042802c80210290b200128022422022903102206200241186a2903002207844200510d05200441106a2003ad42004280c8afa025420010d30420042004290310220b4280a094a58d1d7c220c200441106a41086a290300200c200b54ad7c2006200710d40420024200200229030822062004290300427f200441086a290300501b7d220720072006561b37030820072006580d02200441306a103d0c090b2002450d080b200310290c070b20012802002102200441c0016a200441306a41880110ce041a200441e0026a2002280220220241f4006a290000370300200441d8026a200241ec006a290000370300200441c8026a41086a200241e4006a2900003703002004200229005c3703c802200441e8026a200441c0016a41880110ce041a0240200241cc006a2802002201200241c8006a280200470d00200141016a22032001490d0520014101742208200320032008491b2203ad42a8017e2206422088a70d052006a722084100480d050240024020010d002008102721010c010b2002280244200141a8016c2008102821010b2001450d0420022001360244200241c8006a2003360200200228024c21010b2002280244200141a8016c6a200441c8026a41a80110ce041a2002200228024c41016a36024c410421080c060b4182abc10041f403104e000b4182abc10041f403104e000b41fcecc2001058000b20084108102a000b102b000b20024101102a000b20002008360200200441f0036a24000b1600200041003602002000200141186a2802003602040bab0202057f027e230041106b220424000240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141186a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021021082004200128021c29035042002005ad420010d30420012802242202420020022903082209427f200429030020042903084200521b7d220a200a20095622021b37030820020d000240024020012802202802082007200820066a2005101341026a220241024b0d0020020e03020001020b41fcc0c5001058000b410421030b20002003360200200441106a24000f0b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000bd30b05047f027e037f017e047f23004190016b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d03200241246a2802002105200241346a280200210602400240024002400240200241146a2802002203450d0020022802042107200441306a200128021c29034842002003ad420010d30420012802242202420020022903082208427f200429033020042903384200521b7d22092009200856220a1b37030841052102200a0d0e20034100480d0a20031027220a450d0b200a210b4100210c024020034102490d00200a41002003417f6a220c10cd04200c6a210b0b200b41003a0000024020012802202802082007200a200c41016a220c101241026a220341024b0d0020030e03040002040b4194c0c5001058000b4101210c410021074100210b0c010b2004200c3602742004200a360270200441c0006a200441f0006a102d2004280240220c450d01200441c8006a28020021072004280244210b200a10292007200128021c28025c4b0d0b0b200c2007410041202007676b10e001024020074102490d00200c21022007210303402002200241206a220a412010d004450d0c200a21022003417f6a220341024f0d000b0b200441206a200128021c29034842002006ad220d420010d30420012802242202420020022903082208427f200429032020042903284200521b7d2209200920085622021b37030820020d0a0240024020060d0041002106410121024100210a0c010b20064100480d08200610272202450d0a4101210a20022103024020064102490d00200241002006417f6a220310cd0420036a21032006210a0b200341003a00000b024002400240200128022028020820052002200a101241026a220341024b0d0020030e03010002010b4194c0c5001058000b2006450d0b200210290c0b0b2002450d0a2004200128021c220529032842002007ad420010d304200441106a20052903204200200d420010d30420012802242103427f2109024020042903184200520d0020042903084200520d002004290310220820042903007c220d2008540d00427f200d20052903307c22082008200d541b21090b200342002003290308220820097d220920092008561b37030820092008580d012006450d0a200210290c0a0b200a10290c0a0b200441f0006a41086a22052001280200280220220141e4006a290000370300200441f0006a41106a220e200141ec006a290000370300200441f0006a41186a220f200141f4006a2900003703002004200129005c3703700240200141c0006a28020022032001413c6a280200470d00200341016a22102003490d0620034101742211201020102011491b2210ad42e8007e2208422088a70d062008a722114100480d060240024020030d002011102721030c010b2001280238200341e8006c2011102821030b2003450d05200120033602382001413c6a2010360200200128024021030b2001280238200341e8006c6a220341053a000020032004290370370001200341096a2005290300370000200341116a200e290300370000200341196a200f290300370000200341216a20042f006d3b0000200341236a200441ef006a2d00003a00002003412c6a200a360000200341286a2006360000200341246a2002360000200341306a2004290340370300200341386a200441c0006a41086a290300370300200341c0006a200441c0006a41106a290300370300200341c8006a200441c0006a41186a290300370300200341d0006a200441e0006a290300370300200341e0006a2007360200200341dc006a200b3602002003200c3602582001200128024041016a360240410421020c090b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b4182abc10041f403104e000b20114108102a000b102b000b20034101102a000b20064101102a000b41052102200b450d00200c10290b2000200236020020044190016a24000bef0a03027f027e057f230041f00b6b22042400024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441086a200128021c2903484200200241146a2802002202ad420010d30420012802242203420020032903082206427f200429030820042903104200521b7d2207200720065622031b3703084105210820030d040240024020020d004100210241012103410021090c010b0240024020024100480d002002102722030d0120024101102a000b102b000b410121092003210a024020024102490d00200341002002417f6a220910cd0420096a210a200221090b200a41003a00000b024002400240024002402001280220280208200520032009101241026a220541024b0d0020050e03010002010b4194c0c5001058000b20020d010c070b2003450d062004420037037820044200370370200441f0006a20032009411020094110491b10ce041a2009410f4b0d012002450d060b200310290c050b200441f8006a29030021062004290370210702402002450d00200310290b2001280200280220220528021c0d022005417f36021c200441d0006a200541f4006a290000370300200441c8006a200541ec006a290000370300200441c0006a200541e4006a2900003703002004200529005c37033802400240200541206a220b2802002208418883c000460d00200541246a280200210a0c010b4100210a20044190096a410041e00210cd041a200441f0006a410041a00810cd041a41880b10272208450d04200841003b010620084100360200200841086a20044190096a41e00210ce041a200841e8026a200441f0006a41a00810ce041a200541246a4100360200200520083602200b02400240034020082f0106220c4105742109410021024100210102400240034020092002460d01200441386a200820026a41086a412010d0042203450d02200241206a2102200141016a21012003417f4a0d000b2001417f6a210c0b200a450d02200a417f6a210a2008200c4102746a41880b6a28020021080c010b0b200541286a2103410121020c010b200441186a41186a200441386a41186a290300370300200441186a41106a200441386a41106a290300370300200441186a41086a200441386a41086a29030037030020042004290338370318200541286a21034100210a200c2101410021020b0240024020020d00200441ac096a200441186a41086a290300370200200441b4096a200441186a41106a290300370200200441bc096a200441186a41186a290300370200200420033602a0092004200136029c092004200b3602980920042008360294092004200a36029009200420042903183702a40920044190016a200429036037030020044198016a200441e0006a41086a290300370300200441a4016a42003702002004420037038801200442003703702004418883c0003602a001200441003a00ac01200441ad016a2004290038370000200441b5016a200441386a41086a290000370000200441bd016a200441386a41106a290000370000200441c5016a200441386a41186a290000370000200441cc016a200441d7006a28000036000020044190096a200441f0006a10de0121020c010b20044188016a420037030020044184016a418883c00036020020044100360290012004410036028001200442003703782004418883c000360274200441003602702008200141e0006c6a41e8026a2102200441f0006a10d6010b200241286a2006370300200241206a2007370300200242013703182005200528021c41016a36021c410421080c040b4182abc10041f403104e000b4182abc10041f403104e000b41c8a8c1004110200441f0006a41f0a8c10010a201000b41880b4108102a000b20002008360200200441f00b6a24000bad04020b7f027e230041206b22042400200141186a41003602000240024002402001280200280220220528021c41016a220641004c0d00200541dc006a21072005200636021c200541206a2108200541246a28020021090240024003402008280200220a41086a210b200a2f0106220c41057421084100210d0240024003402008450d012007200b412010d004220e450d02200841606a2108200d41016a210d200b41206a210b200e417f4a0d000b200d417f6a210c0b2009450d022009417f6a2109200a200c4102746a41880b6a21080c010b0b200a200d41e0006c6a22084180036a280200220b450d0020084190036a290300210f20084188036a29030021100c010b20042005412c6a2802002007200541306a280200280214110200200441106a290300210f200528021c2106200429030821102004280200210b0b20052006417f6a36021c02400240200141146a280200220d200141186a28020022086b4110490d002001280210210d0c010b200841106a220e2008490d03200d4101742208200e200e2008491b22084100480d0302400240200d0d0020081027210d0c010b2001280210200d20081028210d0b200d450d022001200d360210200141146a2008360200200141186a28020021080b200141186a200841106a360200200d20086a2208200f427f200b1b37000820082010427f200b1b37000020004104360200200441206a24000f0b41d8a8c1004118200441186a4180a9c10010a201000b20084101102a000b102b000b8d0303027f027e037f230041206b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d01200228020421052004200128021c2903484200200241146a2802002202ad420010d30420012802242203420020032903082206427f200429030020042903084200521b7d2207200720065622081b3703084105210320080d030240024020020d004100210241012108410021090c010b0240024020024100480d002002102722080d0120024101102a000b102b000b410121092008210a024020024102490d00200841002002417f6a220910cd0420096a210a200221090b200a41003a00000b0240024002402001280220280208200520082009101241026a220141024b0d0020010e03010002010b4194c0c5001058000b2002450d040c030b2008450d03200441106a2008200910dc01024020042802100d002004280214200441186a28020010100b4104210320020d020c030b4182abc10041f403104e000b4182abc10041f403104e000b200810290b20002003360200200441206a24000bc20103017f017e017f41002104200141186a4100360200200128020029031821050240024002400240200141146a28020022064108490d00200128021021060c010b200641017422044108200441084b1b22044100480d020240024020060d002004102721060c010b200128021020062004102821060b2006450d0120012006360210200141146a2004360200200141186a28020021040b200141186a200441086a360200200620046a2005370000200041043602000f0b20044101102a000b102b000bdf05020a7f017e230041c0006b220424002004200136020c2004200041b8d6c50020011b3602082004200441086a102e02402004280200450d00024002400240024002400240024002400240200428020422054180022005418002491b22060d00410821070c010b2006410474220110272207450d010b02402005450d00200441206a4104722108410021094100210a410021000340200441206a200441086a107d200441306a41086a220b200841086a2802003602002004200829020037033002402004280220220c4104470d002006450d0a200710290c0a0b200041016a2101200441106a41086a220d200b28020036020020042004290330370310024020002006470d002009200120012009491b220641ffffffff00712006470d052006410474220b4100480d050240024020000d00200b102721070c010b2007200a200b102821070b2007450d040b2007200a6a2200200c360200200041046a20042903103702002000410c6a200d280200360200200941026a2109200a41106a210a2001210020052001470d000b0b2007450d07200441206a20022007200520031103002004410036023820044201370330200428022021004101102721010240024020004105460d002001450d05200141003a000020044281808080103702342004200136023020014101410210282101024020004104470d002001450d07200141003a00012004428280808020370234200420013602304202210e0c020b2001450d07200141013a0001200442828080802037023420042001360230200441206a200441306a10fe012004350238210e200428023021010c010b2001450d07200141013a00002004428180808010370234200420013602304201210e0b2001ad422086200e84210e02402006450d00200710290b200441c0006a2400200e0f0b20014108102a000b200b4108102a000b102b000b41014101102a000b41024101102a000b41024101102a000b41014101102a000b41cdccc10041f000104e000b920201027f20012802282103024002400240200241ff017122024103470d0020030d01200041003602000c020b2001412c6a2802002104024020024102470d002003450d00200141306a280200210220002003360204200041013602002000410c6a2002360200200041086a20043602000c020b200041a1a6c10036020420004102360200200041086a41103602002003450d012004450d01200310290c010b41b4a6c1001058000b024020012802042200450d00200141086a280200450d00200010290b0240200141146a280200450d00200128021010290b200128022022012001280200417f6a2200360200024020000d002001280208100720012001280204417f6a220036020420000d00200110290b0b0700200010b4040b890401057f230041106b22022400200241003a0008200241086a2001280200220320012802042204410047220510ce041a0240024020042005490d002001200420056b22063602042001200320056a2205360200024020040d00200041043602000c020b024020022d0008417f6a220441034b0d00024002400240024020040e0400010203000b20024100360208200241086a20052006410420064104491b220410ce041a2001200620046b3602042001200520046a3602000240200641034b0d00200041043602000c060b20002002280208360204200041003602000c050b20024200370308200241086a20052006410820064108491b220410ce041a2001200620046b3602042001200520046a3602000240200641074b0d00200041043602000c050b200041086a2002290308370300200041013602000c040b20024100360208200241086a20052006410420064104491b220410ce041a2001200620046b3602042001200520046a3602000240200641034b0d00200041043602000c040b20002002280208360204200041023602000c030b20024200370308200241086a20052006410820064108491b220410ce041a2001200620046b3602042001200520046a3602000240200641074b0d00200041043602000c030b200041086a2002290308370300200041033602000c020b200041043602000c010b20052004103e000b200241106a24000be40301027f230041e0006b22032400200341003a0005024002402000413f4b0d00200320004102743a0000410121040c010b02400240200041808001490d0020004180808080044f0d01200341033a0005200320004106763a000120032000410e763a0002200320004116763a0003200320004102744102723a0000410421040c020b200320004106763a000141022104200341013a0005200320004102744101723a00000c010b200341043a0005200341033a0000200320003a0001200320004108763a0002200320004110763a0003200320004118763a0004410521040b200320043a0005024002402001280200220028020822012002490d0020002802002100200320023602082003200436020c20042002470d0120002003200210ce041a200341e0006a24000f0b20022001107f000b200341286a41146a4103360200200341346a411d360200200341106a41146a41033602002003200341086a36024020032003410c6a360244200341c8006a41146a41003602002003420337021420034190d1c5003602102003411d36022c200341b8d6c5003602582003420137024c200341e4d1c5003602482003200341286a3602202003200341c8006a3602382003200341c4006a3602302003200341c0006a360228200341106a41a0d2c5001057000b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420237020c200241c4d8c500360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41d4d8c5001057000bb90201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110aa0121000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000b20024180016a240020000f0b2004418001103e000b2004418001103e000b11002000280200200028020420011082010bbe0f020d7f017e230041206b220324004101210402400240200228021841222002411c6a2802002802101104000d000240024020010d00410021050c010b200020016a21062000210741002105410021080240034020072109200741016a210a02400240024020072c0000220b417f4a0d0002400240200a2006470d004100210c200621070c010b20072d0001413f71210c200741026a220a21070b200b411f7121040240200b41ff0171220b41df014b0d00200c200441067472210b0c020b0240024020072006470d004100210d2006210e0c010b20072d0000413f71210d200741016a220a210e0b200d200c41067472210c0240200b41f0014f0d00200c2004410c7472210b0c020b02400240200e2006470d004100210b200a21070c010b200e41016a2107200e2d0000413f71210b0b200c4106742004411274418080f0007172200b72220b418080c400470d020c040b200b41ff0171210b0b200a21070b4102210a024002400240024002400240200b41776a220c411e4d0d00200b41dc00470d010c020b41f400210e02400240200c0e1f05010202000202020202020202020202020202020202020202030202020203050b41f200210e0c040b41ee00210e0c030b02400240200b10bd040d0002400240200b41808004490d00024002400240200b418080084f0d00200b4180fe0371410876210f41e1edc500210c410021040340200c41026a210d2004200c2d0001220a6a210e0240200c2d0000220c200f460d00200c200f4b0d06200e2104200d210c200d41a7eec500470d010c060b200e2004490d02200e41a6014b0d03200441a7eec5006a210c02400340200a450d01200a417f6a210a200c2d00002104200c41016a210c2004200b41ff0171470d000c080b0b200e2104200d210c200d41a7eec500470d000c050b0b200b41ef83384b0d04200b41e28b746a41e28d2c490d04200b419fa8746a419f18490d04200b41dee2746a410e490d04200b41feffff0071419ef00a460d04200b41a9b2756a4129490d04200b41cb91756a410a4b0d090c040b2004200e103e000b200e41a601107f000b200b4180fe0371410876210f41b0e8c500210c41002104024002400340200c41026a210d2004200c2d0001220a6a210e0240200c2d0000220c200f460d00200c200f4b0d03200e2104200d210c200d4182e9c500470d010c030b0240200e2004490d00200e41a5024b0d0220044182e9c5006a210c02400340200a450d01200a417f6a210a200c2d00002104200c41016a210c2004200b41ff0171470d000c070b0b200e2104200d210c200d4182e9c500470d010c030b0b2004200e103e000b200e41a502107f000b200b41ffff0371210441a7ebc500210a4101210e02400340200a41016a210d02400240200a2d0000220c411874411875220f4100480d00200d210a0c010b200d41e1edc500460d02200f41ff0071410874200a2d000172210c200a41026a210a0b02402004200c6b22044100480d00200e410173210e200a41e1edc500470d010b0b200e410171450d020c070b41c8dac5001058000b200b41ffff0371210441cdefc500210a4101210e0340200a41016a210d02400240200a2d0000220c411874411875220f4100480d00200d210a0c010b200d41e5f2c500460d03200f41ff0071410874200a2d000172210c200a41026a210a0b02402004200c6b22044100480d00200e410173210e200a41e5f2c500470d010b0b200e4101710d050b200b41017267410276410773ad4280808080d0008421104103210a0c020b41c8dac5001058000b0b200b210e0b2003200136020420032000360200200320053602082003200836020c0240024020082005490d0002402005450d0020052001460d00200520014f0d01200020056a2c000041bf7f4c0d010b02402008450d0020082001460d00200820014f0d01200020086a2c000041bf7f4c0d010b2002280218200020056a200820056b200228021c28020c110500450d01410121040c060b20032003410c6a3602182003200341086a36021420032003360210200341106a10c404000b0340200a210c4101210441dc0021054101210a024002400240024002400240200c0e0402010500020b02400240024002402010422088a741ff01710e06050302010006050b201042ffffffff8f60834280808080308421104103210a41f50021050c070b201042ffffffff8f60834280808080208421104103210a41fb0021050c060b200e2010a7220c410274411c7176410f71220a413072200a41d7006a200a410a491b21050240200c450d002010427f7c42ffffffff0f832010428080808070838421100c050b201042ffffffff8f60834280808080108421100c040b201042ffffffff8f608321104103210a41fd0021050c040b4100210a200e21050c030b4101210a0240200b418001490d004102210a200b418010490d0041034104200b41808004491b210a0b200a20086a21050c040b201042ffffffff8f60834280808080c0008421100b4103210a0b20022802182005200228021c2802101104000d050c000b0b200820096b20076a210820062007470d000b0b2005450d0020052001460d00200520014f0d02200020056a2c000041bf7f4c0d020b410121042002280218200020056a200120056b200228021c28020c1105000d0020022802184122200228021c28021011040021040b200341206a240020040f0b200020012005200110ba04000bfb0304027f027e017f017e230041e0006b22042400024002400240411410272205450d00200541106a41002800bb8c40360000200541086a41002900b38c40370000200541002900ab8c4037000020054114413410282205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441186a20054134108401200441186a41106a290300210620042903202107200428021821082005102942002109200441306a20012007420020081b220720027c22022006420020081b20037c2002200754ad7c108501200441306a41106a290300210220042903382103024020042903304200520d00200321090c030b200441b18ac0004116108601200441106a29030021062004290308210720042802002105200441306a41086a220142003703002004420037033041b18ac0004116200441306a1004200441d0006a41086a200129030037030020042004290330370350200442002006420020051b220620027d2007420020051b2202200354ad7d2207200220037d2203200256200720065620072006511b22051b37033820044200200320051b370330200441d0006a4110200441306a41101003420021020c020b41144101102a000b41344101102a000b2000200937030020002002370308200441e0006a24000ba10204017f017e037f027e230041c0006b2203240042002104200341206a41186a22054200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020012002200341206a1000200341186a2005290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703002003410036022020034120200341206a1005210202400240024020032802202201417f470d000c010b2003420037032820034200370320200341206a20022001411020014110491b10ce041a2001410f4d0d01200341286a29030021082003290320210920021029420121040b2000200937030820002004370300200041106a2008370300200341c0006a24000f0b418f89c3004133104e000bdb0605027f027e017f017e047f230041b0016b220424000240024002400240411410272205450d00200541106a41002800bb8c40360000200541086a41002900b38c40370000200541002900ab8c4037000020054114413410282205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441086a20054134108401200441086a41106a29030021062004290310210720042802082108200510292006420020081b21092007420020081b2106024002400240200242ffffe883b1de1656200342005220035022051b0d002006200984500d010b4101210802402002428080e983b1de1654410020051b0d00411410272205450d0541002108200541106a41002800bb8c40360000200541086a41002900b38c40370000200541002900ab8c4037000020054114413410282205450d06200520012900003700142005412c6a200141186a220a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a220b4200370300200441206a41106a220c4200370300200441206a41086a220d42003703002004420037032020054134200441206a100020044190016a41186a200b29030037030020044190016a41106a200c29030037030020044190016a41086a200d290300370300200420042903203703900120044190016a412041b8d6c50041004100100b210b20051029200b417f470d002001108701200441d8006a2003370300200441d0006a200237030041002108200441206a41086a41003a0000200441296a2001290000370000200441316a200141086a290000370000200441396a200141106a290000370000200441c1006a200a290000370000200441023a002041b8d6c5004100200441206a1088010b200120022003108901200041106a200920037d2006200254ad7d200320097d2002200654ad7d2006200256200920035620092003511b22051b3703002000200620027d200220067d20051b370308200020083a001820002005ad3703000c010b20004200370300200041013a0018200041106a4200370300200041086a42003703000b200441b0016a24000f0b41144101102a000b41344101102a000b41144101102a000b41344101102a000be70104017f017e017f027e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1004200341086a2005290300370300200320032903103703002003410036021020034110200341106a1005210202400240024020032802102201417f470d000c010b2003420037031820034200370310200341106a20022001411020014110491b10ce041a2001410f4d0d01200341186a29030021062003290310210720021029420121040b2000200737030820002004370300200041106a2006370300200341206a24000f0b418f89c3004133104e000ba10703047f017e067f230041a0016b22012400200141186a41f8f3c200411310b50120012802182102200128021c210302400240412010272204450d00200420002900002205370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a29000037000020042d000121062004102920014190016a20064108742005a7220441c0017172410676220610cc0102402004413f7122042001280298014f0d00200141086a20012802900120044105746a22041095012001290308200141086a41086a290300844200520d0020042000290000370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a290000370000200141206a41086a20014190016a41086a28020036020020012001290390013703202006200141206a10fe020c020b2003410020021b21040240200128029401450d0020012802900110290b200141206a200410cc01024020012802282206413f4d0d000340200441016a210402402001280224450d00200128022010290b200141206a200410cc0120012802282206413f4b0d000b0b2001280220210220012802242107200141206a41186a2208200041186a290000370300200141206a41106a2209200041106a290000370300200141206a41086a220a200041086a29000037030020012000290000370320200641016a2103024020072006470d00024020064101742207200320032007491b2207410574220b4100480d000240024020060d00200b102721020c010b20022006410574200b102821020b20020d01200b4101102a000b102b000b200620044106746a210b200220064105746a22062001290320370000200641186a2008290300370000200641106a2009290300370000200641086a200a2903003700000240200341c000470d00200141206a41086a220642003703002001420037032041f8f3c2004113200141206a100420014190016a41086a200629030037030020012001290320370390012001200441016a36022020014190016a4110200141206a410410030b2001200336022820012007360224200120023602202004200141206a10fe02200141206a41086a2000290000370300200141206a41106a200041086a290000370300200141206a41186a200041106a290000370300200141c0006a200041186a2900003703002001200b360224200141013a002041b8d6c5004100200141206a1088010c010b41204101102a000b200141a0016a24000b942603087f047e037f230041c0036b22032400200341003602b80141ff88c3004110200341b8016a100521040240024020032802b8012205417f460d002004450d0041002106200341003602b801200341b8016a20042005410420054104491b10ce041a0240200541034d0d0020032802b8012107200410290c020b418f89c3004133104e000b410121060b4101210841002104410021050240024002400240024002400240024002400240024002400240024002402001450d00200141057422044100480d09200410272208450d012001410574220941606a410576210a410021040340200341b8016a41186a200020046a220541186a290000220b370300200341b8016a41106a200541106a290000220c370300200341b8016a41086a200541086a290000220d37030020032005290000220e3703b801200820046a220541186a200b370000200541106a200c370000200541086a200d3700002005200e3700002009200441206a2204470d000b200a41016a2105200121040b200341a4016a2007360200200320063602a001200341306a200241f00010ce041a200341b0016a2005360200200341ac016a2004360200200320083602a801200341286a4187cec500411110b501024002400240024002400240200328022c410020032802281b220f41016a2205200f490d00200341d0026a41086a22044200370300200342003703d0024187cec5004111200341d0026a100420034188036a41086a22082004290300370300200320032903d00237038803200320053602b80120034188036a4110200341b8016a41041003200341b8016a200341306a41880110ce041a20044200370300200342003703d002418890c300410d200341d0026a100420082004290300370300200320032903d00237038803200341003602d00220034188036a4110200341d0026a100521050240024020032802d0022204417f460d0020050d010b200341003602c802200342013703c0020c090b200320043602c802200320043602c402200320053602c0022004450d08200320043602d402200320053602d002200341206a200341d0026a102e2003280220450d07410121052003280224220841016a22092008490d070240200841c000490d0041022105200841808001490d00410441052008418080808004491b21050b410121080240200941c000490d0041022108200941808001490d00410441052009418080808004491b21080b024020082005460d002004200820056b6a2204417f4c0d100240024020040d00410121020c010b200410272202450d030b200320043602a803200320043602a403200320023602a0032003200341a0036a3602d0022009200341d0026a2008107e20042008490d0320032802a80322092004490d0420032802c80222092005490d0520032802a003210220032802c00221062003200420086b22043602b0032003200920056b22093602b40320042009470d06200220086a200620056a200410ce041a200341b8016a200341a0036a10980320032802a803210820032802a403210520032802a003210420032802c402450d0b20032802c00210290c0b0b2003200341c0026a3602d0022009200341d0026a2005107e200341b8016a200341c0026a10980320032802c802210820032802c402210520032802c00221040c0a0b200341306a1099030c0a0b20044101102a000b20082004103e000b20042009107f000b20052009103e000b20034188036a41146a410336020020034194036a411d360200200341f0026a41146a41033602002003200341b0036a3602b8032003200341b4036a3602bc03200341d0026a41146a4100360200200342033702f40220034190d1c5003602f0022003411d36028c03200341b8d6c5003602e002200342013702d402200341e4d1c5003602d002200320034188036a360280032003200341d0026a360298032003200341bc036a360290032003200341b8036a36028803200341f0026a41a0d2c5001057000b20044101102a000b410021040c010b200341003602d802200342013703d002200341013602880320034188036a200341d0026a10300240024020032802a8024101460d000240024020032802d40220032802d8022204460d0020032802d00221050c010b200441016a22052004490d0820044101742208200520052008491b22084100480d080240024020040d002008102721050c010b20032802d00220042008102821050b2005450d0d200320083602d402200320053602d00220032802d80221040b2003200441016a3602d802200520046a41003a000020032802ac0221080240024020032802d402220520032802d80222046b4104490d0020032802d00221050c010b200441046a22092004490d0820054101742204200920092004491b22044100480d080240024020050d002004102721050c010b20032802d00220052004102821050b2005450d0c200320043602d402200320053602d00220032802d80221040b2003200441046a3602d802200520046a20083600000c010b0240024020032802d40220032802d8022204460d0020032802d00221050c010b200441016a22052004490d0720044101742208200520052008491b22084100480d070240024020040d002008102721050c010b20032802d00220042008102821050b2005450d0a200320083602d402200320053602d00220032802d80221040b2003200441016a3602d802200520046a41013a00000b200341b8016a200341d0026a109d0220032802b0022104200320032802b80222053602880320034188036a200341d0026a103002402005450d002005410574210220032802d402210920032802d8022105034002400240200920056b4120490d0020032802d00221080c010b200541206a22082005490d0820094101742205200820082005491b22064100480d080240024020090d002006102721080c010b20032802d00220092006102821080b2008450d0a200320063602d402200320083602d00220032802d8022105200621090b200820056a220841086a200441086a290000370000200841106a200441106a290000370000200841186a200441186a2900003700002003200541206a22053602d80220082004290000370000200441206a2104200241606a22020d000b0b20032802d802210820032802d402210520032802d002210420032802c402450d010b20032802c00210290b024020040d00200341b8016a1099030c010b200341d0026a41086a22094200370300200342003703d002418890c300410d200341d0026a100420034188036a41086a2009290300370300200320032903d0023703880320034188036a411020042008100302402005450d00200410290b200341b8016a109903200341106a41888dc300410d1094012001450d002003290318420020032802101b210c2001410574211003402003200f3602f8022003200c3703f002024002400240024002400240024002400240024002400240024002400240411210272204450d00200441106a41002f00a590433b0000200441086a410029009d9043370000200441002900959043370000200341b8016a41186a22084200370300200341b8016a41106a22094200370300200341b8016a41086a22024200370300200342003703b80120044112200341b8016a1000200341d0026a41186a22062008290300370300200341d0026a41106a22012009290300370300200341d0026a41086a22072002290300370300200320032903b8013703d002412010272205450d01200520032903d002370000200541186a2006290300370000200541106a2001290300370000200541086a200729030037000020041029200842003703002009420037030020024200370300200342003703b80120004120200341b8016a1000200620082903003703002001200929030037030020072002290300370300200320032903b8013703d0022005412041c00010282204450d02200420032903d002370020200441386a2006290300370000200441306a2001290300370000200441286a2007290300370000200341003602b801200441c000200341b8016a10052105024020032802b8012208417f470d00200341003602c802200342013703c0020c0d0b200320083602c802200320083602c402200320053602c0022008450d0c200320083602bc01200320053602b801200341086a200341b8016a102e024020032802080d00410021050c0e0b41002105200328020c220941016a22062009490d0d41012105410121020240200941c000490d0041022102200941808001490d00410441052009418080808004491b21020b0240200641c000490d0041022105200641808001490d00410441052006418080808004491b21050b024020052002460d002008200520026b6a2208417f4c0d150240024020080d00410121090c010b200810272209450d050b200320083602a803200320083602a403200320093602a0032003200341a0036a3602b8012006200341b8016a2005107e20082005490d0520032802a80322092008490d0620032802c80222092002490d0720032802a003210620032802c00221012003200820056b22083602b0032003200920026b22093602b40320082009470d08200620056a200120026a200810ce041a20032903f002210b0240024020032802a403220820032802a80322056b4108490d0020032802a00321080c010b200541086a22092005490d1520084101742205200920092005491b22054100480d150240024020080d002005102721080c010b20032802a00320082005102821080b2008450d0a200320053602a403200320083602a00320032802a80321050b2003200541086a3602a803200820056a200b37000020032802f80221090240024020032802a403220820032802a80322056b4104490d0020032802a00321080c010b200541046a22022005490d1520084101742205200220022005491b22054100480d150240024020080d002005102721080c010b20032802a00320082005102821080b2008450d0b200320053602a403200320083602a00320032802a80321050b2003200541046a3602a803200820056a200936000020032802a803211120032802a403210a20032802a003210520032802c402450d0f20032802c00210290c0f0b2003200341c0026a3602b8012006200341b8016a2002107e20032903f002210b0240024020032802c402220820032802c80222056b4108490d0020032802c00221080c010b200541086a22092005490d1420084101742205200920092005491b22054100480d140240024020080d002005102721080c010b20032802c00220082005102821080b2008450d0b200320053602c402200320083602c00220032802c80221050b2003200541086a3602c802200820056a200b37000020032802f80221090240024020032802c402220820032802c80222056b4104490d0020032802c00221080c010b200541046a22022005490d1420084101742205200220022005491b22054100480d140240024020080d002005102721080c010b20032802c00220082005102821080b2008450d0c200320053602c402200320083602c00220032802c80221050b2003200541046a3602c802200820056a200936000020032802c802211120032802c402210a20032802c00221050c0e0b41124101102a000b41204101102a000b41c0004101102a000b20084101102a000b20052008103e000b20082009107f000b20022009103e000b20034188036a41146a410336020020034194036a411d360200200341d0026a41146a41033602002003200341b0036a3602b8032003200341b4036a3602bc03200341b8016a41146a4100360200200342033702d40220034190d1c5003602d0022003411d36028c03200341b8d6c5003602c801200342013702bc01200341e4d1c5003602b801200320034188036a3602e0022003200341b8016a360298032003200341bc036a360290032003200341b8036a36028803200341d0026a41a0d2c5001057000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b200341003602c001200342013703b801200341013602d002200341d0026a200341b8016a103020032903f002210b0240024020032802bc01220820032802c00122096b4108490d0020032802b80121050c010b200941086a22052009490d0720084101742202200520052002491b22024100480d070240024020080d002002102721050c010b20032802b80120082002102821050b2005450d05200320023602bc01200320053602b801200221080b2003200941086a22023602c001200520096a200b37000020032802f802210602400240200820026b41034d0d002008210a0c010b200241046a22012002490d0720084101742207200120012007491b220a4100480d070240024020080d00200a102721050c010b20052008200a102821050b2005450d062003200a3602bc01200320053602b8010b20032009410c6a22113602c001200520026a20063600000b20032802c402450d0020032802c00210290b024020050d00200410290c020b200441c0002005201110030240200a450d00200510290b200041206a210020041029201041606a22100d000b0b200341c0036a24000f0b20024101102a000b200a4101102a000b102b000b1039000b20064101102a000b20084101102a000b20044101102a000b20084101102a000bfb1603067f027e037f230041a0026b22032400024002400240024002400240024002400240024002400240411410272204450d00200441106a41002800bb8c40360000200441086a41002900b38c40370000200441002900ab8c4037000020044114413410282204450d01200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a290000370000200341c8016a41186a22054200370300200341c8016a41106a22064200370300200341c8016a41086a22074200370300200342003703c80120044134200341c8016a1000200341c8006a41186a2005290300370300200341c8006a41106a2006290300370300200341c8006a41086a2007290300370300200320032903c801370348200320013703c801200320023703d001200341c8006a4120200341c8016a4110100320041029200142ffffe883b1de165620024200522002501b0d07411410272204450d02200441106a41002800bb8c40360000200441086a41002900b38c40370000200441002900ab8c4037000020044114413410282204450d03200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a290000370000200341c8016a41186a22054200370300200341c8016a41106a22064200370300200341c8016a41086a22074200370300200342003703c80120044134200341c8016a1000200341c8006a41186a2005290300370300200341c8006a41106a2006290300370300200341c8006a41086a2007290300370300200320032903c801370348200341306a200341c8006a108a01200341306a41106a2903002101200329033821022003280230210820041029410e10272204450d04200441066a41002900dd8c40370000200441002900d78c403700002004410e412e10282204450d052004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200341c8016a41186a22054200370300200341c8016a41106a22064200370300200341c8016a41086a22074200370300200342003703c8012004412e200341c8016a1000200341c8006a41186a2005290300370300200341c8006a41106a2006290300370300200341c8006a41086a2007290300370300200320032903c801370348200341c8006a4120100c2004102902402002200184500d002008450d00200341186a41b18ac0004116108601200341186a41106a29030021092003290320210a20032802182104200341b8016a41086a22054200370300200342003703b80141b18ac0004116200341b8016a1004200341c8016a41086a2005290300370300200320032903b8013703c801200342002009420020041b220920017d200a420020041b2201200254ad7d220a200120027d2202200156200a200956200a2009511b22041b37035020034200200220041b370348200341c8016a4110200341c8006a411010030b2000108b01200341c8006a2000108c0102400240024020032d004822044103714103460d0020040e03020001020b20040d08200341fc006a280200450d08200341f8006a28020010290c080b20040d07200341fc006a280200450d07200341f8006a28020010290c070b200341fc006a2802002104200341f8006a280200220520034180016a280200100d2004450d06200510290c060b41144101102a000b41344101102a000b41144101102a000b41344101102a000b410e4101102a000b412e4101102a000b02400240024002400240411710272204450d002004410f6a41002900af9342370000200441086a41002900a89342370000200441002900a0934237000020044117413710282204450d01200420002900003700172004412f6a200041186a290000370000200441276a200041106a2900003700002004411f6a200041086a290000370000200341c8016a41186a22054200370300200341c8016a41106a22064200370300200341c8016a41086a22074200370300200342003703c80120044137200341c8016a1000200341c8006a41186a2005290300370300200341c8006a41106a2006290300370300200341c8006a41086a2007290300370300200320032903c801370348200341c8006a4120100c2004102920034190026a2000108d01200341c8006a20032802900222042003280298022207108e0120032d00484101470d0320042007100c200341c8016a41386a220720034181016a290000370300200341c8016a41306a2208200341f9006a290000370300200341c8016a41286a220b200341f1006a290000370300200341c8016a41206a200341e9006a2900003703002005200341e1006a2900003703002006200341d9006a290000370300200341c8016a41086a2205200341d1006a290000370300200320032900493703c8010240200328029402450d00200410290b200341c8006a41386a2007290300370300200341c8006a41306a2008290300370300200341c8006a41286a200b290300370300200341c8006a41206a220c200341c8016a41206a290300370300200341c8006a41186a200341c8016a41186a290300370300200341c8006a41106a200341c8016a41106a290300370300200341c8006a41086a2005290300370300200320032903c801370348200341c8006a210b4120417f4a210d41042105410a2106034002400240200641766a2204410a4b0d00200b21070240024020040e0b0102020202020202020200010b200c21070b200d450d05024041200d0041012108410021040c020b0240412010272208450d00412021040c020b41204101102a000b410121084100210441b8d6c50021070b20082007200410ce0421072003200436029c02200320043602980220032007360294022003200636029002200341b8016a20034190026a108f0120032802b801220620032802c001100c024020032802bc01450d00200610290b02402004450d00200710290b024020054108460d00200541d0e3c1006a2802002106200541046a21050c010b0b200341013a008f02200341b8016a41086a22044200370300200342003703b80141a7c8c500410f200341b8016a100420034190026a41086a2004290300370300200320032903b8013703900220034190026a41102003418f026a410110030c040b41174101102a000b41374101102a000b1039000b200328029402450d00200410290b411810272204450d01200441106a41002900cf8c40370000200441086a41002900c78c40370000200441002900bf8c4037000020044118413810282204450d0220042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a290000370000200320044138108401200341106a290300210220032802002105200329030821012004102902402001200284500d0020050d010b411310272204450d032004410f6a41002800d68d43360000200441086a41002900cf8d43370000200441002900c78d4337000020044113413310282204450d04200420002900003700132004412b6a200041186a2206290000370000200441236a200041106a22072900003700002004411b6a200041086a2208290000370000200341c8006a41186a220b4200370300200341c8006a41106a220d4200370300200341c8006a41086a220542003703002003420037034820044133200341c8006a1000200341c8016a41186a200b290300370300200341c8016a41106a200d290300370300200341c8016a41086a2005290300370300200320032903483703c801200341c8016a4120100c20041029200541013a0000200341d1006a2000290000370000200341d9006a2008290000370000200341e1006a2007290000370000200341e9006a2006290000370000200341023a004841b8d6c5004100200341c8006a1088010b200341a0026a24000f0b41184101102a000b41384101102a000b41134101102a000b41334101102a000bb00104037f017e017f027e230041106b22022400200241003602002001412020021005210302400240024020022802002204417f470d00420021050c010b2002420037030820024200370300200220032004411020044110491b10ce0421062004410f4d0d01200641086a2903002107200629030021082003102920014120100c420121050b2000200537030020002008370308200041106a2007370300200241106a24000f0b418f89c3004133104e000b930b01087f23004180016b22012400024002400240024002400240024002400240410e10272202450d00200241066a41002900c7a244370000200241002900c1a2443700002002410e412e10282202450d012002200029000037000e200241266a200041186a2900003700002002411e6a200041106a290000370000200241166a200041086a290000370000200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002412e200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a20052903003703002001200129034037032020014100360260200141206a4120200141e0006a100521050240024020012802602203417f460d00200141c0006a2003412020034120491b22046a41004100412020046b2004411f4b1b10cd041a200141c0006a2005200410ce041a2003411f4d0d04200141e0006a41186a2203200141c0006a41186a290300370300200141e0006a41106a2204200141c0006a41106a290300370300200141e0006a41086a2206200141c0006a41086a2903003703002001200129034037036020051029200141186a22052003290300370300200141106a22072004290300370300200141086a2208200629030037030020012001290360370300200141206a4120100c2002102920032005290300370300200420072903003703002006200829030037030020012001290300370360410e10272202450d05200241066a410029009fa34437000020024100290099a3443700002002410e412e10282202450d062002200129036037000e200241266a200141e0006a41186a2903003700002002411e6a200141e0006a41106a290300370000200241166a200141e0006a41086a290300370000200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002412e200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100c200210290c010b200210290b410d10272202450d05200241056a41002900aca344370000200241002900a7a3443700002002410d412d10282202450d062002200029000037000d200241256a200041186a2900003700002002411d6a200041106a290000370000200241156a200041086a290000370000200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002412d200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100c20021029411210272202450d07200241106a41002f00c4a3443b0000200241086a41002900bca344370000200241002900b4a34437000020024112413210282202450d08200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a220542003703002001420037034020024132200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100c20021029200010c903200010ca0320014180016a24000f0b410e4101102a000b412e4101102a000b418f89c3004133104e000b410e4101102a000b412e4101102a000b410d4101102a000b412d4101102a000b41124101102a000b41324101102a000bce0d04067f017e037f087e230041f0006b22022400024002400240024002400240411710272203450d002003410f6a41002900af9342370000200341086a41002900a89342370000200341002900a0934237000020034117413710282203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241286a41186a22014200370300200241286a41106a22044200370300200241286a41086a220542003703002002420037032820034137200241286a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903283703002002410036022820024120200241286a100521010240024020022802282204417f460d002001450d002002200136022020022004360224200241003a0028200241286a20012004410047220510ce041a20042005490d042002200420056b22063602242002200120056a22053602202004450d0720022d0028220441014b0d0702400240024020040e020001000b200241286a200241206a104420022802282207450d09200229022c210820024100360228200241286a2002280220220920022802242204410420044104491b220610ce041a2002200420066b22053602242002200920066a220a3602200240200441034b0d002008a7450d0a0c090b20022802282109200241286a2005412020054120491b22046a41004100412020046b2004411f4b1b10cd041a200241286a200a200410ce041a2002200520046b22063602242002200a20046a220b360220024002402005411f4b0d00410021040c010b2002200228002b36006b20022002280228360268200220022802683602602002200228006b360063200241376a290000210c200229002f210d200229003f210e20022d0047210a410121040b2002200228006336002b20022002280260360228024020040d002008a70d090c0a0b2002200228002b36005b200220022802283602582002420037033020024200370328200241286a200b2006411020064110491b220510ce041a2002200620056b22043602242002200b20056a220b36022002402006410f4b0d002008a70d090c0a0b200241286a41086a290300210f2002290328211020024200370328200241286a200b2004410820044108491b220610ce041a2002200420066b22053602242002200b20066a22063602200240200441074d0d0020022903282111200241003a0028200241286a20062005410047220410ce041a20052004490d082002200520046b220b3602242002200620046a220436022002402005450d0020022d0028220541014b0d00420021120240024020050e020100010b20024200370328200241286a2004200b4108200b41084922061b220510ce041a2002200b20056b3602242002200420056a36022020060d0120022903282113420121120b2002200228005b36005320022002280258360250200220022802503602282002200228005336002b200220022800493602682002200241cc006a28000036006b410021040c030b2008a70d090c0a0b2008a70d080c090b41002107200241286a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241286a2005200410ce041a2002200620046b3602242002200520046a360220024002402006411f4b0d00420021120c010b2002200228002b36006b20022002280228360268200220022802683602602002200228006b360063200241376a290000210f200229002f2110200229003f211120023100472112410121070b2002200228006336002b200220022802603602282007450d082002200228002b36005b200220022802283602582002200228005b36005320022002280258360250200220022802503602682002200228005336006b2002200241cc006a28000036002b20022002280049360228410121040b2002200228006b36006320022002280268360260200220022802283602582002200228002b36005b20011029200041106a200f370000200041086a2010370000200041cf006a200c370000200041c7006a200d370000200020043a000020002002280260360001200041046a20022800633600002000413c6a2009360000200041346a2008370000200041306a2007360000200041286a2013370000200041206a2012370000200041186a2011370000200041c0006a2002280258360000200041c3006a200228005b360000200041df006a200a3a0000200041d7006a200e3700000c010b200041023a00000b20031029200241f0006a24000f0b41174101102a000b41374101102a000b20052004103e000b20042005103e000b200710290b418f89c3004133104e000be80501067f230041c0006b2202240002400240024002400240411010272203450d00200341086a41002900c5cc41370000200341002900bdcc41370000200242908080808002370204200220033602002002410d360220200241206a20021030024002400240024020022802042204200228020822056b410d490d002005410d6a2103200228020021060c010b2005410d6a22032005490d0120044101742206200320032006491b22074100480d010240024020040d002007102721060c010b200228020020042007102821060b2006450d042002200736020420022006360200200721040b20022003360208200620056a2205410029009ecc41370000200541056a41002900a3cc41370000200241206a2006200310830220022802282203417f4c0d04200228022021050240024020030d00410121070c010b200310272207450d0620072005200310ce041a0b02402004450d00200610290b02402002280224450d00200510290b412010272206450d0620062001290000370000200641186a200141186a290000370000200641106a200141106a290000370000200641086a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020064120200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020034101742201200341206a220420042001491b22054100480d000240024020030d002005102721010c010b200720032005102821010b20010d0120054101102a000b102b000b200120036a22032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a29030037000020061029200020043602082000200536020420002001360200200241c0006a24000f0b41104101102a000b20074101102a000b1039000b20034101102a000b41204101102a000bd60503097f017e027f23004180026b220324002003410036024020012002200341c0006a10052102024002400240024020032802402204417f460d0020020d010b200041003a00000c010b20032004412020044120491b22056a41004100412020056b2005411f4b1b10cd041a20032002200510ce0421012004411f4d0d0120014180016a41086a2206200141086a220729000037030020014180016a41106a2208200141106a220929000037030020014180016a41186a220a200141186a220b29000037030020012001290000220c3703c0012001200c370380012001200420056b220d4120200d4120491b22046a41004100412020046b2004411f4b1b10cd041a2001200220056a200410ce042101200d411f4d0d01200141a0016a41086a22042007290000370300200141a0016a41106a22052009290000370300200141a0016a41186a220d200b290000370300200141c0006a41186a220e200a290300370300200141c0006a41106a220a2008290300370300200141c0006a41086a2208200629030037030020012001290000220c3703c0012001200c3703a0012001200129038001370340200141c0006a41386a2206200d290300370300200141c0006a41306a220d2005290300370300200141c0006a41286a22052004290300370300200120012903a001370360200141386a22042006290300370300200141306a2206200d290300370300200141286a220d2005290300370300200141206a22052001290360370300200b200e2903003703002009200a290300370300200720082903003703002001200129034037030020021029200041013a0000200041396a2004290300370000200041316a2006290300370000200041296a200d290300370000200041216a2005290300370000200041196a200b290300370000200041116a2009290300370000200041096a2007290300370000200020012903003700010b20034180026a24000f0b418f89c3004133104e000ba00701097f230041c0006b22022400024002400240024002400240411010272203450d00200341086a4100290081e241370000200341002900f9e141370000200242908080808002370204200220033602002002410d360220200241206a20021030024002400240024020022802042204200228020822056b410d490d002005410d6a2103200228020021060c010b2005410d6a22032005490d0120044101742206200320032006491b22074100480d010240024020040d002007102721060c010b200228020020042007102821060b2006450d042002200736020420022006360200200721040b20022003360208200620056a2205410029009ecc41370000200541056a41002900a3cc41370000200241206a2006200310830220022802282203417f4c0d04200228022021050240024020030d00410121080c010b200310272208450d0620082005200310ce041a0b02402004450d00200610290b02402002280224450d00200510290b200241003602282002420137032020012802002104410410272206450d062006200436000020024284808080c000370224200220063602202001280204210720022001410c6a28020022013602002002200241206a10300240024020022802242205200228022822046b2001490d00200228022021060c010b200420016a22062004490d0120054101742209200620062009491b22094100480d010240024020050d002009102721060c010b200228022020052009102821060b2006450d082002200936022420022006360220200921050b200620046a2007200110ce041a200241206a41186a22074200370300200241206a41106a22094200370300200241206a41086a220a4200370300200242003703202006200420016a200241206a1000200241186a2007290300370300200241106a2009290300370300200241086a200a29030037030020022002290320370300200341206a22012003490d0020034101742204200120012004491b22074100480d000240024020030d002007102721040c010b200820032007102821040b20040d0120074101102a000b102b000b200420036a22032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a29030037000002402005450d00200610290b200020013602082000200736020420002004360200200241c0006a24000f0b41104101102a000b20074101102a000b1039000b20034101102a000b41044101102a000b20094101102a000bb80304027f027e017f017e230041206b22052400024002400240411410272206450d00200641106a41002800bb8c40360000200641086a41002900b38c40370000200641002900ab8c4037000020064114413410282206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a290000370000200541086a20064134108401200541086a41106a29030021072005290310210820052802082109200610294101210602402008420020091b220820027d220a2008562007420020091b220720037d2008200254ad7d220820075620082007511b4101470d00200041bf88c000360204200041086a411d3602000c030b024002400240200a428080e983b1de165441002008501b0d00200520012004200a200810910120052802002206450d022005280204210120002006360204200041086a20013602000c010b200041dc88c000360204200041086a411a3602000b410121060c030b2001200a2008108901200041106a2003370300200041086a2002370300410021060c020b41144101102a000b41344101102a000b20002006360200200541206a24000b8d0304027f017e027f017e230041c0006b22052400024002400240200241ff0171417e6a220641024b0d000240024020060e03000201000b200541106a20011092012005290310200358200541186a290300220720045820072004511b0d010c020b200541206a20011092012005290320200356200541286a290300220720045620072004511b0d010b200541306a20011093010240200528023822010d0002402005280234450d00200528023010290b410021010c020b200541888dc300410d1094012005290308420020052802001b2107200141286c210620052802342108200528023022092101024002400240034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d020b200141286a2101200641586a22060d000b4100210120080d010c020b41ec87c00021012008450d010b200910290b413121060c010b41c687c0002101412621060b2000200636020420002001360200200541c0006a24000b820804067f027e017f077e230041a0016b220224000240024002400240411010272203450d00200341086a41002900ab8d40370000200341002900a38d4037000020034110413010282203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000020024180016a41186a2204420037030020024180016a41106a2205420037030020024180016a41086a2206420037030020024200370380012003413020024180016a1000200241e0006a41186a2004290300370300200241e0006a41106a2005290300370300200241e0006a41086a200629030037030020022002290380013703602002410036028001200241e0006a412020024180016a100521040240024002402002280280012205417f460d002004450d002002420037038801200242003703800120024180016a20042005411020054110491b220610ce041a02402005410f4d0d0020024180016a41086a2207290300210820022903800121092002420037038801200242003703800120024180016a200420066a220a200520066b2205411020054110491b220610ce041a2005410f4d0d002007290300210b200229038001210c200242003703800120024180016a200a20066a200520066b2205410820054108491b10ce041a200541074b0d020b418f89c3004133104e000b200310294200210c4200210b0c010b200229038001210d2004102920031029411410272203450d03200341106a41002800bb8c40360000200341086a41002900b38c40370000200341002900ab8c4037000020034114413410282203450d04200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a290000370000200241c8006a20034134108401200241c8006a41106a290300210e2002290350210f2002280248210120031029200241386a41888dc300410d10940142002110200241186a200b420042002002290340420020022802381b2211200d7d220d200d2011561b220d420010d304200241286a200d4200200c420010d304200241086a42004200200c420010d304200e420020011b210b200f420020011b210d4200210c02402002290310200229032084420052200241286a41086a290300220f200229030820022903187c7c220e200f54720d002008200e20022903282210200954200e200854200e2008511b22031b200e7d2009201020031b220e201054ad7d210c200e20107d21100b200c200b200d201056200b200c56200b200c511b22031b210b2010200d20031b210c0b2000200c3703002000200b370308200241a0016a24000f0b41104101102a000b41304101102a000b41144101102a000b41344101102a000bd408040e7f047e017f017e230041f0006b220224000240024002400240024002400240410e10272203450d00200341066a41002900dd8c40370000200341002900d78c403700002003410e412e10282204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241386a41186a22014200370300200241386a41106a22034200370300200241386a41086a22054200370300200242003703382004412e200241386a1000200241106a41186a2001290300370300200241106a41106a2003290300370300200241106a41086a20052903003703002002200229033837031020024100360238200241106a4120200241386a100521060240024020022802382207417f460d002002200736023420022006360230200241086a200241306a102e2002280208450d0802400240200228020c220841e600200841e600491b22090d004108210a0c010b200941286c22011027220a450d050b02402008450d002002280230210b20022802342103200241ec006a210c4100210d4100210e4100210f034020024200370338200241386a200b2003410820034108491b220510ce041a2002200320056b22013602342002200b20056a220536023002400240200341074d0d00200229033821102002420037034020024200370338200241386a20052001411020014110491b220b10ce041a20022001200b6b220336023420022005200b6a22053602302001410f4d0d00200241386a41086a29030021112002290338211220024200370338200241386a20052003410820034108491b220b10ce041a20022003200b6b220136023420022005200b6a220b360230200341074d0d0020022903382113200241003a0038200241386a200b2001410047220510ce041a20012005490d092002200120056b22033602342002200b20056a220b36023020010d010b2009450d0b200a10290c0b0b200f41016a2105200220022800693602602002200c28000036006320022d003821142002200228006336003b20022002280260360238200220022802383602582002200228003b36005b0240200f2009470d00200d20052005200d491b2209ad42287e2215422088a70d0a2015a722014100480d0a02400240200f0d0020011027210a0c010b200a200e20011028210a0b200a450d090b200a200e6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141216a2002280258360000200141246a200228005b360000200d41026a210d200e41286a210e2005210f20082005470d000b0b200a450d082008ad4220862009ad84211002402007450d00200610290b200020103702042000200a3602000c010b20004100360208200042083702000b20041029200241f0006a24000f0b410e4101102a000b412e4101102a000b20014108102a000b20052001103e000b20014108102a000b102b000b418f89c3004133104e000bcc0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1004200341086a2005290300370300200320032903103703002003410036021020034110200341106a1005210202400240024020032802102201417f470d000c010b20034200370310200341106a20022001410820014108491b10ce041a200141074d0d012003290310210620021029420121040b2000200637030820002004370300200341206a24000f0b418f89c3004133104e000bba0304027f027e017f027e230041306b220224000240024002400240411410272203450d00200341106a41002800bb8c40360000200341086a41002900b38c40370000200341002900ab8c4037000020034114413410282203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a290000370000200241186a20034134108401200241186a41106a2903002104200229032021052002280218210620031029411810272203450d02200341106a41002900cf8c40370000200341086a41002900c78c40370000200341002900bf8c4037000020034118413810282203450d0320032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a290000370000200220034138108401200241106a290300210720022903082108200228020021012003102920002008420020011b22082005420020061b7c220537030020002007420020011b2004420020061b7c2005200854ad7c370308200241306a24000f0b41144101102a000b41344101102a000b41184101102a000b41384101102a000bef0e06017f037e017f017e017f067e230041e0016b220724004200210842002109024020050d0020074190016a2006ad42004280c8afa025420010d30420074198016a290300200729039001220a4280a094a58d1d7c2208200a54ad7c21090b200741c0016a41086a22054200370300200742003703c00141d8cdc500411b200741c0016a1004200741a0016a41086a2005290300370300200720072903c0013703a00141002106200741003602d001200741a0016a4110200741d0016a1005210b024002400240024020072802d0012205417f470d004200210a0c010b200742003703d001200741d0016a200b2005410820054108491b10ce041a200541074d0d0120072903d001210c200b1029200c200c423f87220a7c200a85210a200c42005521060b2007418094ebdc033602a4012007200a200a428094ebdc037f220c4280ec94a37c7e7ca722053602a00120074180016a417f2004418094ebdc032004418094ebdc03491b2204417f417f2004ad200ca7417f200c428080808010541bad7e220aa7200a422088a71b220b200741a0016a2005418094ebdc034b4102746a28020022052004418094ebdc036e220d6c2005ad2004200d4180ec94a37c6c6aad7e428094ebdc0380a76a6a22052005200b491b22056a220b200b2004491b4100200420056b2205200520044b1b20061bad420042e807420010d30441012104200741a0016a2003427f20082007290380017c220a20017c220c200c200a542205200920074180016a41086a2903007c200a200854ad7c220820027c2005ad7c220a200854200a2008511b22051b220e427f200a20051b220f4101109001024020072802a0014101470d00200041003a00010c020b200741a0016a41106a290300210a200741386a200741a0016a41086a290300220242004204420010d304200741286a420042002002420010d304200741c8006a2007290338200741386a41086a2903002208200a42028620072903287c7c220c4205420010d40420072903302109200741c8006a41086a290300210120072903482110200741a0016a109701200741f0006a200741a0016a42b3e6cc99b3e6cc99332010200a200a42ffffffffffffffff3f8352200942005272200c2008547222041b22082002200820025442b3e6cc99b3e6cc9933200120041b220c200a54200c200a511b22041b2208200c200a20041b220c108301200741f0006a41086a290300211020072903702109200741d8006a41b18ac0004116108601200820097d200920087d20092008582010200c582010200c5122041b22051b2111200c20107d2008200954ad7d2010200c7d2009200854ad7d20051b2112200a200c7d2002200854ad7d2101200220087d210a200741d8006a41106a2903004200200728025822051b21022007290360420020051b21130240024020092008562010200c5620041b0d00200741d0016a41086a22044200370300200742003703d00141b18ac0004116200741d0016a1004200741c0016a41086a2004290300370300200720072903d0013703c00120074200200220127d2013201154ad7d2208201320117d220c201356200820025620082002511b22041b3703d80120074200200c20041b3703d001200741d0016a21040c010b200741d0016a41086a22044200370300200742003703d00141b18ac0004116200741d0016a1004200741c0016a41086a2004290300370300200720072903d0013703c0012007427f200220127c201320117c220c2013542204ad7c22082004200820025420082002511b22041b3703d8012007427f200c20041b3703d001200741d0016a21040b200741c0016a4110200441101003200741a0016a109801200741186a200741a0016a200a2001108301200741186a41086a290300210c20072903182108200741b18ac0004116108601200a20087d2008200a7d2008200a58200c200158200c20015122041b22051b21102001200c7d200a200854ad7d200c20017d2008200a54ad7d20051b2113200741106a2903004200200728020022051b21092007290308420020051b2102024002402008200a56200c20015620041b0d00200741d0016a41086a22044200370300200742003703d00141b18ac0004116200741d0016a1004200741c0016a41086a2004290300370300200720072903d0013703c00120074200200920137d2002201054ad7d2208200220107d220a200256200820095620082009511b22041b3703d80120074200200a20041b3703d001200741d0016a21040c010b200741d0016a41086a22044200370300200742003703d00141b18ac0004116200741d0016a1004200741c0016a41086a2004290300370300200720072903d0013703c0012007427f200920137c200220107c220a2002542204ad7c22082004200820095420082009511b22041b3703d8012007427f200a20041b3703d001200741d0016a21040b200741c0016a4110200441101003200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a200e427f200f501b370300410021040c010b418f89c3004133104e000b200020043a0000200741e0016a24000b840201067f230041c0006b2201240002400240410410272202450d00200241edde91e30636000020024104410c10282202450d01200242f0f2bda1a7ee9cb9f900370004200141346a42003702002001413c6a4100360200200141206a41086a2203200241086a2800003602002001420037022c200141106a2204200141206a41106a290300370300200141186a2205200141206a41186a290300370300200141086a220620032903003703002001200229000037030020021029200041186a2005290300370000200041106a2004290300370000200041086a200629030037000020002001290300370000200141c0006a24000f0b41044101102a000b410c4101102a000bc60502057f017e230041d0006b22012400200141306a41086a220242003703002001420037033041dbecc2004111200141306a1004200141086a22032002290300370300200120012903303703002001410036023020014110200141306a10052104024002400240024020012802302205417f460d00200141306a2005412020054120491b22026a41004100412020026b2002411f4b1b10cd041a200141306a2004200210ce041a2005411f4d0d01200141106a41186a2205200141306a41186a290000370300200141106a41106a2202200141306a41106a290000370300200141106a41086a2203200141306a41086a2900003703002001200129003037031020041029200041186a2005290300370000200041106a2002290300370000200041086a2003290300370000200020012903103700000c030b200242003703002001420037033041aa8dc300410d200141306a100420032002290300370300200120012903303703002001410036023020014110200141306a100521020240024020012802302205417f460d002001200536021420012002360210200141306a200141106a104320012802302204450d03200129023421062005450d01200210290c010b41042104420021060b20004200370000200041186a4200370000200041106a4200370000200041086a420037000002402006422088a72200450d00200041246c21052004210003400240024020002d0000220241034b0d0002400240024020020e0404000102040b2000410c6a280200450d03200041086a28020010290c030b2000410c6a280200450d02200041086a28020010290c020b2000410c6a280200450d01200041086a28020010290c010b200041086a280200450d00200041046a28020010290b200041246a21002005415c6a22050d000b0b2006a7450d02200410290c020b418f89c3004133104e000b418f89c3004133104e000b200141d0006a24000b130020004102360204200041b48dc0003602000b3400200041f8f3c10036020420004100360200200041146a4105360200200041106a41b49cc000360200200041086a42083702000b3701017f02404110102722020d0041104101102a000b2002420037000820024200370000200042908080808002370204200020023602000bbd0b03057f027e037f230041e0016b2203240002400240024002400240024002400240411810272204450d00200441106a41002900cf8c40370000200441086a41002900c78c40370000200441002900bf8c4037000020044118413810282204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a290000370000200341c0016a41186a22054200370300200341c0016a41106a22064200370300200341c0016a41086a22074200370300200342003703c00120044138200341c0016a1000200341d0006a41186a2005290300370300200341d0006a41106a2006290300370300200341d0006a41086a2007290300370300200320032903c001370350200320013703c001200320023703c801200341d0006a4120200341c0016a41101003200410290240200142ffffe883b1de165620024200522002501b0d00411810272204450d03200441106a41002900cf8c40370000200441086a41002900c78c40370000200441002900bf8c4037000020044118413810282204450d0420042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a290000370000200341c0016a41186a22054200370300200341c0016a41106a22064200370300200341c0016a41086a22074200370300200342003703c00120044138200341c0016a1000200341d0006a41186a2005290300370300200341d0006a41106a2006290300370300200341d0006a41086a2007290300370300200320032903c001370350200341386a200341d0006a108a01200341386a41106a290300210120032802382105200329034021022004102902402002200184500d002005450d00200341206a41b18ac0004116108601200341206a41106a29030021082003290328210920032802202104200341d0006a41086a220542003703002003420037035041b18ac0004116200341d0006a1004200341c0016a41086a2005290300370300200320032903503703c001200342002008420020041b220820017d2009420020041b2201200254ad7d2209200120027d2202200156200920085620092008511b22041b37035820034200200220041b370350200341c0016a4110200341d0006a411010030b411410272204450d05200441106a41002800bb8c40360000200441086a41002900b38c40370000200441002900ab8c4037000020044114413410282204450d06200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a290000370000200341086a20044134108401200341086a41106a290300210220032802082105200329031021012004102902402001200284500d0020050d010b411310272204450d072004410f6a41002800d68d43360000200441086a41002900cf8d43370000200441002900c78d4337000020044113413310282204450d08200420002900003700132004412b6a200041186a2206290000370000200441236a200041106a22072900003700002004411b6a200041086a220a290000370000200341d0006a41186a220b4200370300200341d0006a41106a220c4200370300200341d0006a41086a220542003703002003420037035020044133200341d0006a1000200341c0016a41186a200b290300370300200341c0016a41106a200c290300370300200341c0016a41086a2005290300370300200320032903503703c001200341c0016a4120100c20041029200541013a0000200341d9006a2000290000370000200341e1006a200a290000370000200341e9006a2007290000370000200341f1006a2006290000370000200341023a005041b8d6c5004100200341d0006a1088010b200341e0016a24000f0b41184101102a000b41384101102a000b41184101102a000b41384101102a000b41144101102a000b41344101102a000b41134101102a000b41334101102a000b130020004105360204200041c0adc0003602000bcb0201057f230041c0006b22012400024002400240411b10272202450d00200241176a4100280081b140360000200241106a41002900fab040370000200241086a41002900f2b040370000200241002900eab0403700002002411b413610282203450d012003200036001b200141206a41186a22024200370300200141206a41106a22004200370300200141206a41086a22044200370300200142003703202003411f200141206a1000200141186a22052002290300370300200141106a2000290300370300200141086a200429030037030020012001290320370300412010272202450d0220022001290300370000200241186a2005290300370000200241106a200141106a290300370000200241086a200141086a2903003700002003102920024120100e20021029200141c0006a24000f0b411b4101102a000b41364101102a000b41204101102a000bd50204037f027e017f017e230041306b22042400200441206a200110950102400240024002402004290320200441206a41086a29030084500d00411410272205450d0241002106200541106a41002800bb8c40360000200541086a41002900b38c40370000200541002900ab8c4037000020054114413410282205450d03200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441086a20054134108401200441086a41106a290300210720042903102108200428020821092005102920012008420020091b220820027c220a2007420020091b20037c200a200854ad7c108901200041106a2003370300200041086a20023703000c010b2000419d88c000360204200041086a4122360200410121060b20002006360200200441306a24000f0b41144101102a000b41344101102a000be61805057f027e047f0a7e027f23004190036b22042400200441f0006a2001108c010240024020042d00702205417f6a41ff017141024f0d00200041003a0000200041086a200441f0006a41e00010ce041a0c010b200441d0016a41086a2206200441f0006a41c8006a290300370300200441d0016a41106a2207200441f0006a41d0006a290300370300200441d0016a41186a2208200441f0006a41d8006a2903003703002004200441f0006a41c0006a2903003703d001200441f0006a41106a2903002109200441f0006a41086a290300210a200441f0006a413c6a280200210b200441f0006a41386a280200210c200441a4016a280200210d200441f0006a41306a280200210e200441f0006a41286a290300210f200441f0006a41206a2903002110200441f0006a41186a2903002111200441e0006a41888dc300410d1094010240024002400240024002400240024002400240024002400240420042002004290368420020042802601b221220027d220220022012561b220220117d221320132002561b2214500d00411410272206450d02200641106a41002800bb8c40360000200641086a41002900b38c40370000200641002900ab8c4037000020064114413410282206450d03200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a290000370000200441c8006a20064134108401200441386a20042903504200200428024822071b2202200441c8006a41106a290300420020071b221542e807420010d404200610294200200bad2213200429033822167d221720172013564200200441386a41086a2903002013201654ad7c7d22134200522013501b22061b22164200201320061b221384500d0402400240024002402002429080e983b1de165441002015501b0d00200441206a201642028620134202862016423e8884201442ffffffff0f8342ffffffff0f2014428080808010541b420010d304200441306a2001410842002002200242f0ff96fccea1697c2213200a200a201356200920152013200254ad7c427f7c22135620092013511b22061b22142004290320221620142016542013200920061b2214200441206a41086a29030022135420142013511b22061b22177d2218201820025620152014201320061b22147d2002201754ad7d220220155620022015511b22071b4200200220071b10910120042802300d010240024020060d002003450d010b20044190026a20012017201441081090012004280290024101460d0c20044190026a41106a290300211420044190026a41086a22072903002102200441086a41b18ac0004116108601200441086a41106a2903002115200429031021172004280208210820074200370300200442003703900241b18ac000411620044190026a1004200441f0026a41086a200729030037030020042004290390023703f002200442002015420020081b221520147d2017420020081b2214200254ad7d2217201420027d2202201456201720155620172015511b22071b3703980220044200200220071b37039002200441f0026a411020044190026a411010030b20060d0120030d03200041003a0008200041023a0000200041186a2009370000200041106a200a370000200041c4006a200b360000200041c0006a200c3600002000413c6a200d360000200041386a200e360000200041306a200f370000200041286a2010370000200041206a2011370000200041c8006a20042903d001370000200041d0006a200441d8016a290300370000200041d8006a200441d0016a41106a290300370000200041e0006a200441d0016a41186a290300370000200541037122004103460d0520000e03110505110b411710272206450d082006410f6a41002900af9342370000200641086a41002900a89342370000200641002900a0934237000020064117413710282206450d09200620012900003700172006412f6a200141186a290000370000200641276a200141106a2900003700002006411f6a200141086a29000037000020044190026a41186a2201420037030020044190026a41106a220b420037030020044190026a41086a2203420037030020044200370390022006413720044190026a1000200441f0026a41186a2001290300370300200441f0026a41106a200b290300370300200441f0026a41086a200329030037030020042004290390023703f002200441f0026a4120100c20061029200e200c100d200041023a0008200041013a00000c010b2004410036029002200e200c20044190026a100f2108200428029002220b417f460d0a200441f0026a41186a200441d0016a41186a290300370300200441f0026a41106a200441d0016a41106a290300370300200441f0026a41086a200441d0016a41086a290300370300200420042903d0013703f002200441003602980220044201370390022004200b3602f001200441f0016a20044190026a10300240024002400240200428029402220720042802980222066b200b490d0020042802900221030c010b2006200b6a22032006490d0120074101742219200320032019491b22194100480d010240024020070d002019102721030c010b20042802900220072019102821030b2003450d0e20042019360294022004200336029002201921070b200320066a2008200b10ce041a024002402006200b6a22060d00410121190c010b20064100480d01200610272219450d0f20192003200610ce041a0b02402007450d00200310290b20064101742203200641206a220720072003491b221a4100480d000240024020060d00201a102721030c010b20192006201a102821030b20030d01201a4101102a000b102b000b200320066a220620042903f002370000200641186a200441f0026a41186a290300370000200641106a200441f0026a41106a290300370000200641086a200441f0026a41086a29030037000020044190026a41186a2206420037030020044190026a41106a2219420037030020044190026a41086a221a420037030020044200370390022003200720044190026a1000200441f0016a41186a22072006290300370300200441f0016a41106a22062019290300370300200441f0016a41086a2219201a29030037030020042004290390023703f00120031029200441a9026a2007290300370000200441a1026a200629030037000020044199026a2019290300370000200420042903f00137009102200441013a009002200120044190026a10a101200e200c100d200041013a0000200041086a20044190026a41e00010ce041a200b450d00200810290b200d450d0c200e10290c0c0b200441cc026a200b360200200441c8026a200c360200200441c4026a200d360200200441c0026a200e360200200441b8026a200f370300200441b0026a201037030020044190026a41186a2012370300200441d0026a20042903d001370300200441d8026a200441d0016a41086a290300370300200441e0026a200441d0016a41106a290300370300200441e8026a200441d0016a41186a29030037030020044190026a41106a200920137d200a201654ad7d370300200441003a0090022004200a20167d37039802200120044190026a10a101200041023a0000200041086a20044190026a41e00010ce041a0c0b0b200041003a0008200041003a0000200041186a2009370000200041106a200a370000200041c4006a200b360000200041c0006a200c3600002000413c6a200d360000200041386a200e360000200041306a200f370000200041286a2010370000200041206a2011370000200041c8006a20042903d001370000200041d0006a2006290300370000200041d8006a2007290300370000200041e0006a20082903003700000c0a0b200d450d0b0c0a0b41144101102a000b41344101102a000b200041003a0008200041003a0000200041186a2009370000200041106a200a370000200041c4006a200b360000200041c0006a200c3600002000413c6a200d360000200041386a200e360000200041306a200f370000200041286a2010370000200041206a2011370000200041c8006a20042903d001370000200041d0006a200441d8016a290300370000200041d8006a200441d0016a41106a290300370000200041e0006a200441d0016a41186a2903003700000c060b41174101102a000b41374101102a000b20042004290294023703f00241a1b1c00041fe00200441f0026a41e88cc00010a201000b41b0cfc5004138104e000b20194101102a000b20064101102a000b0240200541037122004103460d0020000e03020000020b200d450d010b200e10290b20044190036a24000bb10201047f230041c0006b2202240002400240411710272203450d002003410f6a41002900af9342370000200341086a41002900a89342370000200341002900a0934237000020034117413710282203450d01200320002900003700172003412f6a200041186a290000370000200341276a200041106a2900003700002003411f6a200041086a290000370000200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a10dc0220031029200241c0006a24000f0b41174101102a000b41374101102a000b810101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004412c6a41023602002004413c6a411e3602002004420237021c200441b481c600360218200441023602342004200441306a3602282004200441106a3602382004200441086a360230200441186a41c881c6001057000b130020004101360204200041a0b2c0003602000b3400200041d4f4c10036020420004100360200200041146a4103360200200041106a41bcb3c000360200200041086a42083702000b130020004101360204200041c0b6c0003602000bf51007017f017e047f017e037f067e057f23004190016b22032400200341086a41888dc300410d1094012003290310210420032802082105200341286a427f370300200341186a41286a41023a0000200341186a41186a2002370300200341386a20002900003703002003427f3703204201210220034201370318200341e8006a200110930120032802682106200328026c2107024002400240024002400240024020032802702208450d002004420020051b210902400240200341e8006a41186a220a2000460d0020034189016a210b200841286c210c42012102200621050340200541086a2903002104200541106a290300210d200541186a290300210e2005290300210f200341e8006a41206a200541206a290300370300200341e8006a41186a200e370300200341e8006a41106a200d370300200341e8006a41086a20043703002003200f37036802400240200a2900002000290000510d00200329037822042009580d012003200b2800003602602003200b41036a280000360063200541286a2105200341f0006a290300210d2003290368210e20032d008801210c0c060b20032903182104420021022003420037031820044201520d00200341186a41186a29030021102003290328211120032903202112200541286a21050c030b200541286a2105200c41586a220c0d000c030b0b200841286c210c200341186a41186a29030021102003290328211120032903202112200329031821022006210502400340200541086a2903002104200541106a290300210d200541186a290300210e2005290300210f200341e8006a41206a200541206a290300370300200341e8006a41186a200e370300200341e8006a41106a200d370300200341e8006a41086a2004370300200342003703182003200f37036820024201510d01200541286a210542002102200c41586a220c0d000c030b0b200541286a21050b200341f0006a2903002202201120122003290368220454201120025420112002511b220c1b210d20042012200c1b210e20032903782202201020102002541b210420032d008801410272210c420021020c010b41002108024020070d00410021134108210b410821050c020b200610294108210b41002113410821050c010b200329038001210f2003200328006336005b200320032802603602582003200328005b36005320032003280258360250200320032802503602482003200328005336004b41281027220b450d03200b200e370300200b200c3a0020200b200f370318200b2004370310200b2003280248360021200b200d370308200b41246a200328004b3600000240024020052006200841286c6a220a470d0041012108410121130c010b200341e8006a41186a210c20034189016a221441036a211541012108410121130340024002400240200c2000470d00200341186a41186a290300210d200329032821042003290320210e200329031821020340200341e8006a41206a200541206a290300370300200c200541186a290300370300200341e8006a41106a200541106a290300370300200341e8006a41086a200541086a290300370300200320052903003703682003420037031820024201510d0242002102200a200541286a2205470d000c050b0b02400340200341e8006a41206a200541206a290300370300200c200541186a290300370300200341e8006a41106a200541106a290300370300200341e8006a41086a2216200541086a2903003703002003200529030037036802400240200c2900002000290000510d00200329037822042009580d012003201428000036026020032015280000360063200541286a21052016290300210f2003290368210e20032d00880121170c050b20032903182104420021022003420037031820044201510d020b200a200541286a2205460d050c000b0b200341186a41186a290300210d200329032821042003290320210e0b200541286a2105200341e8006a41086a29030022022004200e2003290368221154200420025420042002511b22161b210f2011200e20161b210e20032903782202200d200d2002541b210420032d0088014102722117420021020b200329038001210d2003200328006336005b20032003280260360258200320032802583602502003200328005b3600532003200328005336006b20032003280250360268024020132008470d00200841016a22162008490d0720084101742213201620162013491b2213ad42287e2211422088a70d072011a722164100480d070240024020080d0020161027210b0c010b200b200841286c20161028210b0b200b450d040b200b200841286c6a221620173a00202016200f3703082016200e3703002016200d3703182016200437031020162003280268360021201641246a200328006b360000200841016a21082005200a470d000b0b02402007450d00200610290b200b21050b024020024201520d00200341e8006a41206a200341206a220041206a290300370300200341e8006a41186a200041186a290300370300200341e8006a41106a200041106a290300370300200341e8006a41086a200041086a29030037030020032000290300370368024020132008470d00200841016a22052008490d0520084101742200200520052000491b2213ad42287e2202422088a70d052002a722004100480d050240024020080d002000102721050c010b200b200841286c2000102821050b2005450d030b2005200841286c6a22002003290368370300200041206a200341e8006a41206a290300370300200041186a200341e8006a41186a290300370300200041106a200341e8006a41106a290300370300200041086a200341e8006a41086a290300370300200841016a21080b200320083602702003201336026c200320053602682001200341e8006a10a70120034190016a24000f0b20164108102a000b20004108102a000b41284108102a000b102b000b9c0802087f027e230041d0006b220224000240024002400240024002400240410e10272203450d00200341066a41002900dd8c40370000200341002900d78c403700002003410e412e10282204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241286a41186a22004200370300200241286a41106a22034200370300200241286a41086a22054200370300200242003703282004412e200241286a1000200241086a41186a2000290300370300200241086a41106a2003290300370300200241086a41086a20052903003703002002200229032837030820024100360230200242013703282001280200210520022001280208220036024c200241cc006a200241286a10300240024020000d0020022802302106200228022c2100200228022821070c010b200041286c2108200228022c210020022802302106034002400240200020066b4108490d00200641086a2107200228022821030c010b200641086a22072006490d0920004101742203200720072003491b22094100480d090240024020000d002009102721030c010b200228022820002009102821030b2003450d052002200936022c20022003360228200921000b20022007360230200320066a200541186a290000370000200541086a290300210a2005290300210b02400240200020076b4110490d00200741106a21060c010b200741106a22062007490d0920004101742209200620062009491b22094100480d090240024020000d002009102721030c010b200320002009102821030b2003450d062002200936022c20022003360228200921000b200320076a2207200a3700082007200b37000020022006360230200541106a290300210a0240200020066b41074b0d00200641086a22072006490d0920004101742209200720072009491b22074100480d090240024020000d002007102721030c010b200320002007102821030b2003450d072002200736022c200220033602280b2002200641086a360230200320066a200a37000002400240200228022c220020022802302203460d00200228022821070c010b200341016a22002003490d0920034101742206200020002006491b22004100480d090240024020030d002000102721070c010b200228022820032000102821070b2007450d082002200036022c200220073602280b2002200341016a2206360230200720036a200541206a2d00003a0000200541286a2105200841586a22080d000b0b200241086a412020072006100302402000450d00200710290b200410290240200141046a280200450d00200128020010290b200241d0006a24000f0b410e4101102a000b412e4101102a000b20094101102a000b20094101102a000b20074101102a000b20004101102a000b102b000bc10f07017f017e057f047e017f057e047f230041b0016b22062400200641086a41888dc300410d1094012006290310210720062802082108200641286a2003370300200641186a41286a20053a0000200641186a41186a22052004370300200641386a2209200029000037030020062002370320420121032006420137031820064188016a2001109301200628028801210a200628028c01210b024002400240024002400240024002400240200628029001220c450d002007420020081b210d2005290300210e2006290328210f2006290320211020062903182103024020064188016a41186a22112000470d00200c41286c2108200a41286a21050340200641f8006a41086a200941086a2903003703002006200929030037037820034201510d03200541286a210542002103200841586a22080d000b42002103200642003703180c010b200c41286c21082003210220102112200f2113200e2114200a21050340200541086a2903002104200541106a2903002107200541186a29030021152005290300211620064188016a41206a200541206a29030037030020064188016a41186a201537030020064188016a41106a2217200737030020064188016a41086a2004370300200620163703880102400240024020112900002000290000510d00200629039801200d560d0120022104420021020c020b200641f8006a41086a200941086a2903003703002006200929030037037842002103420021104200210f4200210e420021042012210720132115201421160c010b200641f8006a41086a201141086a29030037030020062011290300370378201729030021162006290390012115200629038801210720022104420121020b20024201510d03200541286a210520042102200841586a22080d000b200641306a200e37030020062003370318200620103703202006200f3703280b410021170240200b0d004100211841082119410821050c040b200a10294108211941002118410821050c030b42002104200642003703180c010b200641306a2014370300200620043703182006201237032020062013370328200541286a2105200721102015210f2016210e0b200641c8006a41086a2208200641f8006a41086a29030037030020062006290378370348412810272219450d0420192006290348370318201920103703002019200f370308201941206a2008290300370300201941106a200e370300024002402005200a200c41286c6a2211470d0041012117410121180c010b20064188016a41186a210820042102410121174101211803400240024020082000460d0020022103034020064188016a41206a200541206a2903003703002008200541186a29030037030020064188016a41106a220c200541106a29030037030020064188016a41086a200541086a290300370300200620052903003703880102400240024020082900002000290000510d00200629039801200d560d0120032102420021030c020b200641f8006a41086a200941086a290300370300420021042006420037031820062009290300370378420021022012210720132115201421160c010b200641f8006a41086a200841086a29030037030020062008290300370378200c29030021162006290390012115200629038801210720032102420121030b024020034201510d00200221032011200541286a2205470d010c050b0b200541286a21050c010b02400340200641f8006a41086a200941086a290300370300200642003703182006200929030037037820024201510d01420021022011200541286a2205470d000b420021040c030b200541286a210542002104420021022012210720132115201421160b200641d8006a41086a200641f8006a41086a290300220337030020062006290378220e37035820064188016a41086a221a20033703002006200e37038801024020182017470d00201741016a220c2017490d0620174101742218200c200c2018491b2218ad42287e2203422088a70d062003a7220c4100480d060240024020170d00200c102721190c010b2019201741286c200c102821190b2019450d040b2019201741286c6a220c2015370308200c2007370300200c200629038801370318200c41106a2016370300200c41206a201a290300370300201741016a211720052011470d000b0b0240200b450d00200a10290b20042103201921050b024020034201520d0020064188016a41206a200641206a220941206a29030037030020064188016a41186a200941186a29030037030020064188016a41106a200941106a29030037030020064188016a41086a200941086a2903003703002006200929030037038801024020182017470d00201741016a22052017490d0420174101742209200520052009491b2218ad42287e2202422088a70d042002a722094100480d040240024020170d002009102721050c010b2019201741286c2009102821050b2005450d030b2005201741286c6a2209200629038801370300200941206a20064188016a41206a290300370300200941186a20064188016a41186a290300370300200941106a20064188016a41106a290300370300200941086a20064188016a41086a290300370300201741016a21170b20062017360290012006201836028c012006200536028801200120064188016a10a701200641b0016a24000f0b200c4108102a000b20094108102a000b102b000b41284108102a000bb20201037f23004180016b2202240002400240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110aa0121000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000b20024180016a240020000f0b2004418001103e000b2004418001103e000bd50203027f017e037f230041306b22032400412721040240024020004290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a200020004290ce0080220542f0b17f7e7ca7220741ffff037141e4006e220841017441fad6c5006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441fad6c5006a2f00003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b02402005a7220641e3004c0d00200341096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141017441fad6c5006a2f00003b00000b024002402006410a480d00200341096a2004417e6a22046a200641017441fad6c5006a2f00003b00000c010b200341096a2004417f6a22046a200641306a3a00000b2002200141b8d6c5004100200341096a20046a412720046b10ab012104200341306a240020040be40501057f024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21080c010b200541016a210820002802002106412d21070b0240024020064104710d00410021020c010b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21080b410121010240024020002802084101460d00200020072002200310b9040d012000280218200420052000411c6a28020028020c1105000f0b02402000410c6a280200220920084b0d00200020072002200310b9040d012000280218200420052000411c6a28020028020c1105000f0b0240024020064108710d00200920086b210941002101024002400240410120002d0030220a200a4103461b0e0402000100020b20092101410021090c010b20094101762101200941016a41017621090b200141016a210103402001417f6a2201450d0220002802182000280204200028021c280210110400450d000b41010f0b41012101200041013a003020004130360204200020072002200310b9040d01200920086b210941002101024002400240410120002d0030220a200a4103461b0e0402000100020b20092101410021090c010b20094101762101200941016a41017621090b200141016a2101024003402001417f6a2201450d0120002802182000280204200028021c280210110400450d000b41010f0b2000280204210a41012101200028021820042005200028021c28020c1105000d01200941016a2109200028021c210320002802182100034002402009417f6a22090d0041000f0b410121012000200a2003280210110400450d000c020b0b2000280204210a41012101200020072002200310b9040d00200028021820042005200028021c28020c1105000d00200941016a2109200028021c210320002802182100034002402009417f6a22090d0041000f0b410121012000200a2003280210110400450d000b0b20010bb80405027f027e017f027e017f230041c0006b22042400024002400240024002400240411410272205450d00200541106a41002800bb8c40360000200541086a41002900b38c40370000200541002900ab8c4037000020054114413410282205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441286a20054134108401200441286a41106a290300210620042903302107200428022821082005102902402007420020081b220720025422052006420020081b220620035420062003511b450d0041cbb9c0002105411521010c060b200441206a20014104200720027d2207200620037d2005ad7d2206109101200428022022050d04411810272208450d0241002105200841106a41002900cf8c40370000200841086a41002900c78c40370000200841002900bf8c4037000020084118413810282208450d0320082001290000370018200841306a200141186a290000370000200841286a200141106a290000370000200841206a200141086a290000370000200441086a20084138108401200441086a41106a29030021092004290310210a2004280208210b200810292001200a4200200b1b220a20027c220220094200200b1b20037c2002200a54ad7c109c012001200720061089010c050b41144101102a000b41344101102a000b41184101102a000b41384101102a000b200428022421010b2000200136020420002005360200200441c0006a24000bf10306027f027e017f027e017f017e230041306b220324000240024002400240411810272204450d00200441106a41002900cf8c40370000200441086a41002900c78c40370000200441002900bf8c4037000020044118413810282204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a290000370000200341186a20044138108401200341186a41106a2903002105200329032021062003280218210720041029411410272204450d02200441106a41002800bb8c40360000200441086a41002900b38c40370000200441002900ab8c4037000020044114413410282204450d03200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a290000370000200320044134108401200341106a2903002108200329030821092003280200210a20041029200020094200200a1b220920012006420020071b220620062001562005420020071b220520025620052002511b22041b22017c220b20084200200a1b2002200520041b22027c200b200954ad7c1089012000200620017d200520027d2006200154ad7d109c01200341306a24000f0b41184101102a000b41384101102a000b41144101102a000b41344101102a000b130020004101360204200041e0b9c0003602000b13002000410236020420004198bbc0003602000b3101017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242e5003700000bfa0405037f017e037f017e067f230041206b2202240002400240024002400240200141106a2802002203417f4c0d0020012802082104200129030021050240024020030d00410121060c010b200310272206450d020b20062004200310ce0421072001411c6a2802002208ad420c7e2209422088a70d002009a72204417f4c0d002001280214210a0240024020040d004104210b0c010b20041027220b450d030b0240024020080d004100210c0c010b200a2008410c6c6a210d4100210c200b21060340200a41086a2802002204417f4c0d02200a280200210e0240024020040d004101210f0c010b20041027220f450d060b200f200e200410ce04210e200641086a2004360200200641046a20043602002006200e3602002006410c6a2106200c41016a210c200a410c6a220a200d470d000b0b200241086a2001412c6a290200370300200241106a200141346a290200370300200241186a2001413c6a29020037030020022001290224370300200141d0006a2802002204417f4c0d00200128024821062001280220210a0240024020040d004101210e0c010b20041027220e450d050b200e2006200410ce0421062000200a3602202000411c6a200c360200200041186a2008360200200041146a200b360200200041106a20033602002000410c6a20033602002000200736020820002005370300200041d0006a2004360200200041cc006a200436020020002006360248200020022903003702242000412c6a200241086a290300370200200041346a200241106a2903003702002000413c6a200241186a290300370200200241206a24000f0b1039000b20034101102a000b20044104102a000b20044101102a000b20044101102a000bdf0401077f230041c0006b2203240002400240024002400240411b10272204450d00200441176a4100280081b140360000200441106a41002900fab040370000200441086a41002900f2b040370000200441002900eab0403700002004411b413610282204450d012004200136001b200341186a22014200370300200341106a22054200370300200341086a22064200370300200342003703002004411f20031000200341206a41186a22072001290300370300200341206a41106a2005290300370300200341206a41086a200629030037030020032003290300370320412010272201450d0220012003290320370000200141186a2007290300370000200141106a200341206a41106a2205290300370000200141086a200341206a41086a220629030037000020041029412010272204450d0320042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200341186a22024200370300200341106a22074200370300200341086a22084200370300200342003703002004412020031000200341206a41186a220920022903003703002005200729030037030020062008290300370300200320032903003703202001412041c00010282201450d0420012003290320370020200141386a2009290300370000200141306a200341306a290300370000200141286a200341286a29030037000020041029200042c0808080800837020420002001360200200341c0006a24000f0b411b4101102a000b41364101102a000b41204101102a000b41204101102a000b41c0004101102a000bd30102027f027e200028022021020240024002400240410410272203450d00200320023600002000280224210220034104410810282203450d0120032002360004200041086a29030021042000290300210520034108411810282203450d0220032005370008200341106a2004370000200041186a29030021042000290310210520034118413010282200450d0320002005370018200041206a200437000020012802002001280204200041281003200010290f0b41044101102a000b41084101102a000b41184101102a000b41304101102a000bb6750b097f027e087f017e047f017e017f027e027f017e127f230041b0036b22012400024002400240024020004280e101824200520d00200141f8006a4194c1c500411410b5012001280278450d00200128027c2202450d0020014180026a41086a22034200370300200142003703800241d1c2c000410f20014180026a100420014190036a41086a2003290300370300200120012903800237039003200141003602800220014190036a411020014180026a1005210302400240024002400240024002400240024002402001280280022204417f460d002003450d00200120043602f402200120033602f00220014180026a200141f0026a10412001280280022205450d0220014188026a280200210620012802840221072004450d01200310290c010b4108210541002106410021070b20014180026a41086a22034200370300200142003703800241e0c2c000411420014180026a100420014190036a41086a2003290300370300200120012903800237039003200141003602800220014190036a411020014180026a10052103024002402001280280022204417f460d002003450d00200120033602f002200120043602f402200142003703800220014180026a20032004410820044108491b220810ce041a2001200420086b22093602f4022001200320086a22083602f002200441074d0d03200129038002210a200141003602800220014180026a20082009410420094104491b220410ce041a2001200920046b3602f4022001200820046a3602f002200941034d0d03200128028002210420014180026a200141f0026a102d2001280280022209450d03200129028402210b200310292004200b422088a76b20066a2103200ba7450d01200910290c010b200141e8006a41888dc300410d1094012001290370420020012802681b210a41002104200621030b200320024f0d020c030b418f89c3004133104e000b418f89c3004133104e000b0240200420024f0d00200420026b220220066a220320024f0d022005200341286c6a290320210a0c010b200141d8006a4184c3c00041141094012001290360420020012802581b200a7c210a0b200a42ffe0017c220a200a4280e101827d210a02402007450d00200510290b200a2000520d0420014180026a41086a22024200370300200142003703800241d1c2c000410f20014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a100521020240024002402001280280022203417f460d002002450d00200120033602f402200120023602f00220014180026a200141f0026a1041200128028002220c450d0220014188026a280200210d200128028402210e2003450d01200210290c010b4108210c4100210d4100210e0b200141d0006a4194c1c500411410b5012001280254210f20012802502110200141c0006a41888dc300410d1094012001290348420020012802401b210a0240024002400240200d41286c2202450d00200c41206a290300200a580d010b4101211141002108410021120c010b20014180026a41186a2203200c41186a29030037030020014180026a41106a2204200c41106a29030037030020014180026a41086a2206200c41086a2903003703002001200c29030037038002412010272211450d012011200129038002370000201141186a2003290300370000201141106a2004290300370000201141086a20062903003700000240200c20026a200c41286a2202470d0041012108410121120c010b200d41286c41586a210641202104410121034101210803400240200241206a290300200a580d00200321120c020b200141f0026a41186a2207200241186a290300370300200141f0026a41106a2209200241106a290300370300200141f0026a41086a2205200241086a290300370300200120022903003703f0020240024020082003460d00200321120c010b200341016a22122003490d0a20034101742213201220122013491b221241ffffff3f712012470d0a201241057422134100480d0a0240024020030d002013102721110c010b201120034105742013102821110b20110d0020134101102a000b200241286a2102201120046a220320012903f002370000200341186a2007290300370000200341106a2009290300370000200341086a2005290300370000200441206a2104200841016a210820122103200641586a22060d000b0b02400240024002400240200f410020101b220f200d20086b22034d0d00200141306a4198c3c000411c1094012001290338210b2001290330211420014180026a41086a22024200370300200142003703800241e0c2c000411420014180026a100420014190036a41086a200229030037030020012001290380023703900320014100360288022001420137038002410810272202450d012001428880808080013702840220012002360280022002200b42002014a71b200a7c37000020024108411010282202450d0220014290808080c001370284022002200f20036b22103600082001200236028002200120083602f002200141f0026a20014180026a1030024002400240024020080d002001280288022103200128028402210720012802800221090c010b20084105742105410020012802880222036b2106200128028002210920012802840221072011210203400240200720066a411f4b0d00200341206a22042003490d1120074101742213200420042013491b22044100480d110240024020070d002004102721090c010b200920072004102821090b2009450d03200421070b200920036a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200641606a2106200341206a2103200241206a2102200541606a22050d000b2001200736028402200120033602880220012009360280020b20014190036a411020092003100302402007450d00200910290b02402012450d00201110290b200141a8036a4200370300200141a0036a420037030020014198036a42003703002001420037039003201041066a2212ad42307e220a422088a7450d010c100b20044101102a000b200aa72202417f4c0d0e0240024020020d0041082111410821020c010b200210272211450d04201121020b20014180026a41186a220920014190036a41186a29030037030020014180026a41106a220520014190036a41106a29030037030020014180026a41086a20014190036a41086a29030037030020012001290390033703800220124102490d04200f20086a200d6b41056a21030340200141f0026a41186a22042009290300370300200141f0026a41106a22062005290300370300200141f0026a41086a220720014180026a41086a29030037030020012001290380023703f0022002420037030820024200370300200241106a20012903f002370300200241186a2007290300370300200241206a2006290300370300200241286a2004290300370300200241306a21022003417f6a22030d000b201041056a21030c080b2012450d09201110290c090b41084101102a000b41104101102a000b20024108102a000b4100210320120d030c040b41204101102a000b418f89c3004133104e000b41f4c2c000200320061037000b20024200370308200242003703002002200129038002370310200241186a20014188026a290300370300200241206a20014190026a290300370300200241286a20014180026a41186a290300370300200341016a21030b200120033602f802200120123602f402200120113602f00220014180026a41086a22024200370300200142003703800241b4c3c000411320014180026a100420014190036a41086a20022903003703002001200129038002370390032001411036028402200120014190036a36028002200141f0026a20014180026a103402402012450d00201110290b200141083a00800220022010360200200141023a00840241b8d6c500410020014180026a1088010b200e450d00200c10290b20014180026a41086a22024200370300200142003703800241e0c2c000411420014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a100521022001280280022203417f460d012002450d01200120023602f002200120033602f402200142003703800220014180026a20022003410820034108491b220610ce041a2001200320066b22043602f4022001200220066a22063602f0020240024002400240024002400240200341074d0d002001200420044104200441044922031b22076b3602f4022001200620076a3602f00220030d00200129038002210a20014180026a200141f0026a102d2001280280022215450d00200128028402211620021029200a2000520d0520014180026a41086a22024200370300200142003703800241e0c2c000411420014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a10052102024002400240024002400240024002400240024002402001280280022203417f460d002002450d00200120023602d001200120033602d401200142003703800220014180026a20022003410820034108491b220610ce041a2001200320066b22043602d4012001200220066a22063602d00102400240200341074d0d00200141003602800220014180026a20062004410420044104491b220310ce041a2001200420036b3602d4012001200620036a3602d001200441034d0d00200128028002211720014180026a200141d0016a102d20012802800222180d010b418f89c3004133104e000b20012902840221192002102920014190036a4110100c20014180026a41086a22024200370300200142003703800241b4c3c000411320014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a10052102024002402001280280022203417f460d002002450d00200120033602f402200120023602f00220014180026a200141f0026a1047200128028002221a450d03200129028402211b02402003450d00200210290b20014190036a4110100c0c010b4200211b4108211a0b200141206a41888dc300410d1094012001290328211c2001280220211d200141106a4184c3c00041141094012001280210211e2001290318211f201a201b422088a7222041306c6a21030240024020170d004100210941002106410021040c010b2017417f6a2106410021040240201a2003460d000240201a202041306c6a220241506a2203290300200341086a2903008450450d00410121090c020b20014190036a41186a200241606a220241186a29000037030020014190036a41106a200241106a29000037030020014190036a41086a200241086a2900003703002001200229000037039003410121040b410021090b20014189026a20014190036a41086a29030037000020014191026a20014190036a41106a29030037000020014199026a20014190036a41186a290300370000200120043a0080022001200129039003370081024101210f20014180026a41017221020240024020040d00200141f0026a41186a200241186a290000370300200141f0026a41106a200241106a2900003703004100212141012122410021230c010b20024280809aa6eaafe301420010ad01200141f0026a41186a200241186a290000370300200141f0026a41106a200241106a290000370300200141f0026a41086a200241086a290000370300200120022900003703f002412010272222450d03202220012903f002370000202241186a200141f0026a41186a2211290300370000202241106a200141f0026a41106a2213290300370000202241086a200141f0026a41086a220c290300370000410020066b211220014180026a41017221024102210641202104410121234101212102400340201220236a4101460d01200941ff01710d01201a2003460d01200341506a2207290300200741086a29030084500d012011200341606a220341186a29000022003703002013200341106a290000220a370300200c200341086a290000220b3703002001200329000022143703f00220022014370000200241086a2203200b370000200241106a2209200a370000200241186a22052000370000200141013a00800220024280809aa6eaafe301420010ad0120014190036a41186a2005290000220037030020014190036a41106a2009290000220a37030020014190036a41086a2003290000220b3703002001200229000022143703900320014180026a41186a2209200037030020014180026a41106a2205200a37030020014180026a41086a2208200b3703002001201437038002024020232021470d00202341016a22032023490d162006200320032006491b222141ffffff3f712021470d16202141057422034100480d160240024020230d002003102721220c010b202220042003102821220b2022450d100b202220046a2203200129038002370000200341186a2009290300370000200341106a2005290300370000200341086a2008290300370000200641026a2106200441206a2104202341016a212341002109200721030c000b0b202220046a210f2023450d0020014180026a41086a21052022210c034020014190016a200c10b60102402001280290014101470d002001280298012104200141b0016a10b70120012802b0012110024020012802b8012202450d00200241216c2103201041016a21022004410876210841012004411f7174210d20044105764107712212417f73210e034002402002417f6a2d00004101470d0020014180026a41186a200241186a220629000037030020014180026a41106a200241106a22072900003703002005200241086a22092900003703002001200229000037038002200120083602a00220014190036a20014180026a10b8010240201220012802980322044f0d002004200e6a221120044f0d0a200128029003221320114102746a280200200d7121040240200128029403450d00201310290b2004450d0120014180026a200210b90102402001290380024201510d00411310272204450d0c2004410f6a41002800f9c340360000200441086a41002900f2c340370000200441002900eac34037000020044113413310282204450d0d200420022900003700132004412b6a2006290000370000200441236a20072900003700002004411b6a2009290000370000200141f0026a41186a22064200370300200141f0026a41106a22074200370300200141f0026a41086a22094200370300200142003703f00220044133200141f0026a1000200141d0016a41186a2006290300370300200141d0016a41106a2007290300370300200141d0016a41086a2009290300370300200120012903f0023703d001200141d0016a4120100c200410290c020b200141086a41a8c1c500411110b5012001200128020c41016a410120012802081b3602ac02411310272204450d0d2004410f6a41002800f9c340360000200441086a41002900f2c340370000200441002900eac34037000020044113413310282204450d0e200420022900003700132004412b6a2006290000370000200441236a20072900003700002004411b6a2009290000370000200141f0026a41186a22064200370300200141f0026a41106a22074200370300200141f0026a41086a22094200370300200142003703f00220044133200141f0026a1000200141d0016a41186a2006290300370300200141d0016a41106a2007290300370300200141d0016a41086a2009290300370300200120012903f0023703d00120014120360294032001200141d0016a36029003200520014190036a10b301200410290c010b200128029403450d0020012802900310290b200241216a21022003415f6a22030d000b0b20012802b401450d00201010290b200f200c41206a220c470d000b0b20014180026a41086a22024200370300200142003703800241d1c2c000410f20014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a10052102024002402001280280022203417f460d002002450d00200120033602f402200120023602f00220014180026a200141f0026a10412001280280022224450d0a20014188026a280200210920012802840221252003450d01200210290c010b4100212541082124410021090b20014101360280022019422088a72207450d0a4100212641002127024020072024200941286c6a220620246b41286e2202200220074b1b2202450d00200241057422034100480d13200310272204450d0a2001200436028002200221270b20242102200721042001280280022228210303400240200620026b41f8004b0d0020062002460d112024200941286c6a2108410121060240034020032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200420062205460d01200541016a2106200341206a21032008200241286a2202470d000b0b202620056a21260c110b20032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000024020044101470d00202641017221260c110b20032002290028370020200341386a200241c0006a290000370000200341306a200241386a290000370000200341286a200241306a29000037000020044102460d0f20032002290050370040200341d8006a200241e8006a290000370000200341d0006a200241e0006a290000370000200341c8006a200241d8006a29000037000020044103460d0e20032002290078370060200341f8006a20024190016a290000370000200341f0006a20024188016a290000370000200341e8006a20024180016a290000370000202641046a212620034180016a2103200241a0016a21022004417c6a22040d000c100b0b02402016450d00201510290b41fdc3c000410f1010418cc4c000413510100c120b418f89c3004133104e000b41204101102a000b41f4c2c000201120041037000b41134101102a000b41334101102a000b41134101102a000b41334101102a000b418f89c3004133104e000b20034101102a000b410021272001280280022128410021260c040b418f89c3004133104e000b20034101102a000b202641037221260c010b202641027221260b201f4200201e1b201c4200201d1b7c21142024200941286c6a21100240024002400240024002400240024002402007450d0020102024460d01200741016a2103200941286c2104202421020340200141f0026a41186a200241186a290300370300200141f0026a41106a200241106a290300370300200141f0026a41086a200241086a290300370300200120022903003703f0022003417f6a2203450d04200241286a2102200441586a22040d000b201021020c020b20102024470d040b202421020b2022200f460d01202241086a2900002100202241106a290000210a2022290000210b20014190036a41186a202241186a29000037030020014190036a41106a200a37030020014190036a41086a20003703002001200b37039003202241206a210441022106201421000c040b200241206a290300210020014180026a41186a200141f0026a41186a29030037030020014180026a41106a200141f0026a41106a29030037030020014180026a41086a200141f0026a41086a290300370300200120012903f00237038002200241286a21020c020b200141003602880120014208370380012025450d03202410290c030b20014180026a41186a202441186a29030037030020014180026a41106a202441106a29030037030020014180026a41086a202441086a2903003703002001202429030037038002202441286a2102202429032021000b20014190036a41186a20014180026a41186a29030037030020014190036a41106a20014180026a41106a29030037030020014190036a41086a20014180026a41086a29030037030020012001290380023703900341002106202221040b417f417f201020026b41286d2203200f20046b4105766a220720072003491b220341016a220720072003491b220ead42287e220a422088a70d05200aa72203417f4c0d050240024002400240024002400240024020030d00410821124108211e0c010b200310272212450d012012211e0b2012200129039003370300201241186a20014190036a41186a290300370300201241106a20014190036a41106a290300370300201241086a20014190036a41086a290300370300201e200037032002402006450d0002402004200f470d00410121290c050b200441086a2900002100200441106a290000210a2004290000210b20014190036a41186a200441186a29000037030020014190036a41106a200a37030020014190036a41086a20003703002001200b37039003200441206a21040c020b024020022010470d0002402004200f460d00200441086a2900002100200441106a290000210a2004290000210b20014190036a41186a200441186a29000037030020014190036a41106a200a37030020014190036a41086a20003703002001200b37039003200441206a21040c030b410121290c040b20014180026a41186a200241186a220329030037030020014180026a41106a200241106a220629030037030020014180026a41086a200241086a2207290300370300200120022903003703800220014190036a41086a200729030037030020014190036a41106a200629030037030020014190036a41186a200329030037030020012002290300370390032002290320210041002111200241286a21020c020b20034108102a000b41022111201421000b410221074102210341282106034020014180026a41186a220920014190036a41186a221329030037030020014180026a41106a220520014190036a41106a220c29030037030020014180026a41086a220820014190036a41086a220d290300370300200120012903900337038002024020032229417f6a2203200e470d002003417f417f201020026b41286d220e200f20046b4105766a221d201d200e491b220e41016a221d201d200e491b6a220e2003490d082007200e200e2007491b220ead42287e220a422088a70d08200aa722034100480d080240024020294101470d002003102721120c010b201220062003102821120b2012450d032012211e0b201e20066a2203200129038002370300200341186a2009290300370300200341106a2005290300370300200341086a2008290300370300200341206a20003703000240024002400240201141ff01710e03010200010b2004200f460d04200441086a2900002100200441106a290000210a2004290000210b2013200441186a290000370300200c200a370300200d20003703002001200b37039003200441206a21044201210a41022111201421000c020b024020102002470d004102211102402004200f470d004200210a0c030b200441086a2900002100200441106a290000210a2004290000210b2013200441186a290000370300200c200a370300200d20003703002001200b37039003200441206a21044201210a201421000c020b2009200241186a22032903003703002005200241106a22092903003703002008200241086a22052903003703002001200229030037038002200529030021002009290300210a2002290300210b20132003290300370300200c200a370300200d20003703002001200b37039003200229032021004201210a41002111200241286a21020c010b20102002460d022013200241186a290300370300200c200241106a290300370300200d200241086a2903003703002001200229030037039003200229032021004201210a41012111200241286a21020b200741026a2107202941016a2103200641286a2106200a4200520d000b0b02402025450d00202410290b2001200e360284012001201e36028001200120293602880120294115490d012029410176222aad42287e2200422088a70d072000a72202417f4c0d0702400240024020020d004108212b410821050c010b20021027222b450d01202b21050b201e41586a212c201e41a87f6a212d4104210c4100212e410021092029211d0340201d21064100211d4101210702402006417f6a222f450d00024002400240024002400240201e202f41286c6a41206a290300200641286c2202201e6a41506a2903002200540d002006417e6a2107202d20026a21034100211d410021020340024020072002470d00200621070c080b200241016a210220002003290300220a5a2104200341586a2103200a210020040d000b200241016a21072002417f7320066a21040c010b202d200641056c41037422126a2102202f210402400340024020044101470d00410021040c020b2004417f6a210420002002290300220a542103200241586a2102200a210020030d000b0b20062004490d01200620294b0d03200620046b22074101762208450d00202c20126a2102201e200441286c6a2103034020014180026a41206a2212200341206a221129030037030020014180026a41186a2213200341186a220d29030037030020014180026a41106a220e200341106a220f29030037030020014180026a41086a2210200341086a221d2903003703002001200329030037038002200241206a22242903002100200241186a2225290300210a200241106a2230290300210b200241086a2231290300211420032002290300370300201d2014370300200f200b370300200d200a3703002011200037030020242012290300370300202520132903003703002030200e290300370300203120102903003703002002200129038002370300200241586a2102200341286a21032008417f6a22080d000b0b024020040d002004211d0c050b0240200741094d0d002004211d0c050b200620294b0d01201e200441286c6a2112034020062004417f6a221d490d0402402006201d6b22074102490d00201e200441286c6a220241206a2203290300201e201d41286c6a221141206a220829030022005a0d00200141f0026a41186a2213201141186a220d290300370300200141f0026a41106a220e201141106a220f290300370300200141f0026a41086a2210201141086a2224290300370300200120112903003703f002201120022903003703002024200241086a290300370300200f200241106a290300370300200d200241186a29030037030020082003290300370300024020074103490d00202f210320122108201141f0006a29030020005a0d00024003402008220241206a200241c8006a290300370300200241186a200241c0006a290300370300200241106a200241386a290300370300200241086a200241306a2903003703002002200241286a220829030037030020042003417f6a2203460d01200241f0006a2903002000540d000b0b200241286a21020b200220012903f00237030020022000370320200241186a2013290300370300200241106a200e290300370300200241086a20102903003703000b201d450d05201241586a2112201d21042007410a4f0d050c000b0b20042006103e000b20062004417f6a221d490d010b20062029107f000b201d2006103e000b024002400240202e2009470d00202e41016a2202202e490d0a202e4101742203200220022003491b220241ffffffff01712002470d0a200241037422034100480d0a02400240202e0d0020031027210c0c010b200c202e41037420031028210c0b200c450d012002212e0b200c20094103746a220220073602042002201d360200200941016a220d2109200d4102490d0103400240024002400240200c200d2211417f6a220d4103746a2202280200450d002011410374200c6a220741746a2802002206200228020422034d0d0041022109201141024d0d06200c2011417d6a22024103746a2802042204200320066a4d0d0141032109201141034d0d06200741646a280200200420066a4d0d01201121090c060b20114103490d0120022802042103200c2011417d6a22024103746a28020421040b20042003490d010b2011417e6a21020b0240024002400240024002402011200241016a22244d0d00201120024d0d01200c20024103746a220e2802042225200e2802006a2202200c20244103746a220f2802002210490d02200220294b0d03200e41046a2130201e201041286c6a2212200f280204221341286c22036a2107200241286c2104200220106b220920136b220220134f0d04202b2007200241286c220310ce041a200520036a21060240024020134101480d00200241014e0d010b20072102200521030c060b202c20046a21042007210203402004200241586a2209200641586a2208200641786a290300200241786a2903005422071b2203290300370300200441206a200341206a290300370300200441186a200341186a290300370300200441106a200341106a290300370300200441086a200341086a2903003703002006200820071b2106024020122009200220071b2202490d00200521030c070b200441586a21042005210320052006490d000c060b0b41d8e3c100202420111037000b41d8e3c100200220111037000b20102002103e000b20022029107f000b202b2012200310ce041a200520036a21060240024020134101480d00200920134a0d010b20122102200521030c010b201e20046a210820052103201221020340200220072003200741206a290300200341206a2903005422091b2204290300370300200241206a200441206a290300370300200241186a200441186a290300370300200241106a200441106a290300370300200241086a200441086a2903003703002003200341286a20091b2103200241286a2102200741286a200720091b220720084f0d01200620034b0d000b0b20022003200620036b220420044128706b10ce041a2030202520136a360200200e2010360200200f200f41086a2024417f7320116a41037410cf041a200d2109200d41014d0d020c000b0b20034104102a000b201d0d000b0240202e450d00200c10290b202a450d03202b10290c030b20024108102a000b20034108102a000b20294102490d002029417f6a2104201e202941286c6a2107410021090340024002400240202920042202417f6a2204490d00202920046b22034102490d02201e200241286c6a220241206a2206290300201e200441286c6a220541206a220829030022005a0d02200141f0026a41186a2212200541186a2211290300370300200141f0026a41106a2213200541106a220c290300370300200141f0026a41086a220d200541086a220e290300370300200120052903003703f00220052002290300370300200e200241086a290300370300200c200241106a2903003703002011200241186a2903003703002008200629030037030020034103490d012009210620072103200541f0006a29030020005a0d0103402003220241586a22032002290300370300200341206a200241206a290300370300200341186a200241186a290300370300200341106a200241106a290300370300200341086a200241086a2903003703002006417f6a2206450d02200241286a2103200241c8006a29030020005a0d020c000b0b20042029103e000b200220012903f00237030020022000370320200241186a2012290300370300200241106a2013290300370300200241086a200d2903003703000b200941016a2109200741586a210720040d000b0b20014180026a41086a22024200370300200142003703800241d1c2c000410f20014180026a100420014190036a41086a20022903003703002001200129038002370390032001411036028402200120014190036a3602800220014180016a20014180026a102f410021042001280284012109200128028001210702400240200128028801220241286c22030d004101210e4100210f0c010b200341286d220f41ffffff3f71200f470d03200f41057422034100480d0320031027220e0d0020034101102a000b02402002450d00200241286c210641002104200e2102200721030340200341086a2900002100200341106a290000210a2003290000210b200241186a200341186a290000370000200241106a200a370000200241086a20003700002002200b370000200441016a2104200241206a2102200341286a2103200641586a22060d000b0b02402009450d00200710290b20282026200e200410ba0120014180026a41086a22024200370300200142003703800241d8c3c000411220014180026a100420014190036a41086a2002290300370300200120012903800237039003200141003602800220014190036a411020014180026a1005210202400240024002400240024002402001280280022203417f460d002002450d00200120033602f402200120023602f00220014180026a200141f0026a102d200128028002221d450d0220014188026a280200211320012802840221242003450d01200210290c010b410021244101211d410021130b200141e8016a4200370300200141e0016a4200370300200141d8016a4200370300200142003703d001201341ffffff3f712013470d0920134105742202417f4c0d090240024020020d00410121120c010b200210272212450d020b20014180026a41186a2204200141d0016a41186a29030037030020014180026a41106a2206200141d0016a41106a29030037030020014180026a41086a2207200141d0016a41086a290300370300200120012903d0013703800220134102490d022013417f6a21032012210203402002200129038002370000200241186a2004290300370000200241106a2006290300370000200241086a2007290300370000200241206a21022003417f6a22030d000b2013417f6a21110c030b418f89c3004133104e000b20024101102a000b41002111201221022013450d010b2002200129038002370000200241186a20014180026a41186a290300370000200241106a20014180026a41106a290300370000200241086a20014180026a41086a290300370000201141016a21110b201a202041306c6a2102201ba7210d410021100240024002400240024002400240034002402017450d002002201a460d02200241506a2202290300200241086a29030084500d0203402017417f6a2217450d01201a2002460d03200241506a2103200241506a21022003290300200341086a2903008450450d000c030b0b2002201a460d0102400340200241506a22042903002100200441086a290300210a20014190036a41186a2206200241606a220341186a29030037030020014190036a41106a2207200341106a29030037030020014190036a41086a2209200341086a29030037030020012003290300370390032000200a84500d0120014180026a41186a2203200629030037030020014180026a41106a2205200729030037030020014180026a41086a22082009290300370300200120012903900337038002200141f0016a20014180026a10b601200141d0016a41186a220c2006290300370300200141d0016a41106a22062007290300370300200141d0016a41086a2207200929030037030020012001290390033703d001024020012802f0014101460d0020042102201a2004470d010c040b0b20014190016a41086a2209200729030037030020014190016a41106a2207200629030037030020014190016a41186a2206200c290300370300200120012903d00122003703b001200120003703900120012802f8012104200320062903003703002005200729030037030020082009290300370300200120012903900137038002201120044d0d03200241506a2102201220044105746a2204200129038002370000200441186a2003290300370000200441106a2005290300370000200441086a2008290300370000201041016a2110410021170c010b0b200141b0016a41086a200141f0026a41086a290300370300200141b0016a41106a200141f0026a41106a290300370300200141b0016a41186a200141f0026a41186a290300370300200120012903f0023703b0010b0240200d450d00201a10290b02402011201341ffffff3f712202200220114b1b2207450d00201d210220122103410021060340024020022003460d0020022003412010d004450d00411610272204450d042004410e6a41002900c9c240370000200441086a41002900c3c240370000200441002900bbc24037000020044116413610282204450d05200420022900003700162004412e6a200241186a290000370000200441266a200241106a2900003700002004411e6a200241086a290000370000200141f0026a41186a22094200370300200141f0026a41106a22054200370300200141f0026a41086a22084200370300200142003703f00220044136200141f0026a1000200141d0016a41186a2009290300370300200141d0016a41106a2005290300370300200141d0016a41086a2008290300370300200120012903f0023703d001200141d0016a4120100c200410290b200241206a2102200341206a2103200641016a22062007490d000b0b201220114105746a21022011210920114104490d0320014180026a41206a2105200141c0026a210820014180026a41e0006a210c20014180036a210d20014198026a210420014190026a210620014188026a2107200221032011210903402004420037030020064200370300200742003703002001420037038002024020052003460d00200341606a20014180026a412010d004450d002009417f6a21030c060b2004420037030020064200370300200742003703002001420037038002024020082003460d00200341406a20014180026a412010d004450d002009417e6a21030c060b20044200370300200642003703002007420037030020014200370380020240200c2003460d00200341a07f6a20014180026a412010d004450d002009417d6a21030c060b2004420037030020064200370300200742003703002001420037038002200341807f6a210202400240200d2003460d00200220014180026a412010d0040d010b2009417c6a210920022103200220126b41e0004b0d010c050b0b2009417c6a21030c040b41c8c3c000200420111037000b41164101102a000b41364101102a000b20022012460d012009417f6a210320014180026a41206a210420014198026a210620014190026a210720014188026a210903402006420037030020074200370300200942003703002001420037038002024020042002460d00200241606a20014180026a412010d0040d020b2003417f6a21032012200241606a2202470d000c020b0b200341016a22022011201120024b1b21110b2001419c026a202636020020014180026a41186a202736020020014194026a202836020020014180026a41106a20233602002001418c026a2021360200200141083a00800220014180026a41086a22022022360200200141033a00840241b8d6c500410020014180026a10880120024200370300200142003703800241d8c3c000411220014180026a100420014190036a41086a200229030037030020012001290380023703900320014100360288022001420137038002200120113602f002200141f0026a20014180026a10300240024020110d002001280288022103200128028402210720012802800221090c010b20114105742105410020012802880222036b2106200128028002210920012802840221072012210203400240200720066a411f4b0d00200341206a22042003490d0520074101742208200420042008491b22044100480d050240024020070d002004102721090c010b200920072004102821090b2009450d04200421070b200920036a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200641606a2106200341206a2103200241206a2102200541606a22050d000b2001200736028402200120033602880220012009360280020b20014190036a411020092003100302402007450d00200910290b02402013450d00201210290b20014180026a41086a22024200370300200142003703800241dfc1c500411620014180026a100420014190036a41086a22032002290300370300200120012903800237039003200120103602800220014190036a411020014180026a41041003200141a8c1c500411110b501200128020021042001280204210620024200370300200142003703800241a8c1c500411120014180026a1004200320022903003703002001200129038002370390032001200641016a410120041b3602800220014190036a411020014180026a4104100302402024450d00201d10290b0240200f450d00200e10290b2019a7450d00201810290b2016450d02201510290c020b20044101102a000b102b000b200141b0036a24000f0b1039000bc60101027f230041206b22032400200341106a41086a220442003703002003420037031020012002200341106a1004200341086a200429030037030020032003290310370300410021022003410036021020034110200341106a1005210402400240024020032802102201417f470d000c010b20034100360210200341106a20042001410420014104491b10ce041a200141034d0d012003280210210120041029410121020b2000200136020420002002360200200341206a24000f0b418f89c3004133104e000bdb0201047f230041c0006b2202240002400240411610272203450d002003410e6a41002900c9c240370000200341086a41002900c3c240370000200341002900bbc24037000020034116413610282203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034136200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290320370300200241206a2002412010bb010240024020022802204101460d00200041003602000c010b20002002290320370200200041086a200241206a41086a2802003602000b20031029200241c0006a24000f0b41164101102a000b41364101102a000bed02030a7f017e017f230041206b220124002001410010bc01200141106a410110bc0102400240024020012802182202450d004102210320012802042104200128020821050340200128021421062001280210210702400240200420056b200241216c220841216d2209490d00200520096a2109200128020021020c010b200520096a22092005490d0420044101742202200920092002491b220aad42217e220b422088a70d04200ba7220c4100480d040240024020040d00200c102721020c010b2001280200200441216c200c102821020b2002450d0320012002360200200a21040b2002200541216c6a2007200810ce041a02402006450d00200710290b200141106a200310bc01200341016a210320092105200128021822020d000b20012004360204200120093602080b02402001280214450d00200128021010290b20002001290300370200200041086a200141086a280200360200200141206a24000f0b200c4101102a000b102b000bd60302047f017e230041d0006b220224000240024002400240411310272203450d002003410f6a41002800d0c440360000200341086a41002900c9c440370000200341002900c1c44037000020034113413310282203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200128022021042003413341e60010282201450d0220012004360033200241306a41186a22034200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020014137200241306a1000200241086a41186a2003290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033037030820024100360230200241086a4120200241306a100521040240024020022802302203417f460d002002200336022c20022004360228200241306a200241286a104520022802302205450d052002290234210602402003450d00200410290b20002006370204200020053602000c010b20004100360208200042043702000b20011029200241d0006a24000f0b41134101102a000b41334101102a000b41e6004101102a000b418f89c3004133104e000b8f0502087f047e230041c0006b2202240002400240411310272203450d002003410f6a41002800f9c340360000200341086a41002900f2c340370000200341002900eac34037000020034113413310282203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034133200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002410036022020024120200241206a1005210102400240024020022802202204417f460d002001450d0020024100360220200241206a20012004410420044104491b220510ce041a0240200441034d0d002002280220210620024100360220200241206a200120056a2207200420056b2204410420044104491b220510ce041a200441034d0d00200228022021082002420037032820024200370320200241206a200720056a2207200420056b2204411020044110491b220510ce041a2004410f4d0d00200241286a2209290300210a2002290320210b2002420037032820024200370320200241206a200720056a200420056b2204411020044110491b10ce041a2004410f4b0d020b418f89c3004133104e000b4200210a0c010b2009290300210c2002290320210d20011029200041206a200c370300200041186a200d370300200041106a200a3703002000200b3703082000412c6a2008360200200041286a20063602004201210a0b2000200a37030020031029200241c0006a24000f0b41134101102a000b41334101102a000b9411030e7f077e017f230022042105200441c0016b4160712204240002400240024002400240024002400240200141ffffff3f712001470d0020014105742206417f4c0d000240024020060d00410121070c010b200610272207450d020b410021084100210602402001450d0020014105742109416020006b210a2007210620002108034020062008290000370000200641186a200841186a290000370000200641106a200841106a290000370000200641086a200841086a290000370000200641206a2106200841206a2108200941606a22090d000b200020014105746a200a6a41057641016a2106200121080b20042006360218200420083602142004200736021020072006410041202006676b10e00120044180016a41086a220642003703002004420037038001419acec200411d20044180016a1004200441a0016a41086a200629030037030020042004290380013703a0012004410036028001200441a0016a411020044180016a10052108024002402004280280012206417f460d00200420063602442004200836024020044180016a200441c0006a102d200428028001220b450d0420044188016a2802002109200428028401210c2006450d01200810290c010b4101210b410021094100210c0b2009410574220a450d07200441a0016a411472210d200441a0016a410872210e200b21080340200441206a41186a220f200841186a290000370300200441206a41106a2210200841106a290000370300200441206a41086a2211200841086a29000037030020042008290000370320200441c0006a200441206a10f202200441003602a80120042903582112200420042903b801221337035820042903502114200420042903b001221537035020042903402116200420042903a00137034020042903482117200420042903a80122183703482015422088a721002018422088a721012013a721072018a7210902402017a72206450d00200420163703a001200420173703a801200420143703b001200420123703b801200420062014a74105746a36028c01200420063602880120042017422088a73602840120042006360280012004200441106a36029001200441f0006a20044180016a104b200e41086a200441f0006a41086a2219280200360200200e200429037037020020042014422088a722062012422088a74105746a36028c01200420063602880120042012a73602840120042006360280012004200441106a36029001200441f0006a20044180016a104b200d41086a2019280200360200200d200429037037020020042903a801211720042903a001211420042903b801211820042903b001211202402009450d0002402001450d00200910290b2007450d00200010290b20042014370340200420173703482017422088a72101200420123703502012422088a72100200420183703582017a721092018a721070b411a102721060240024020090d002006450d06200641186a41002f00cfce423b0000200641106a41002900c7ce42370000200641086a41002900bfce42370000200641002900b7ce423700002006411a413a10282206450d072006200429032037001a200641326a200f2903003700002006412a6a2010290300370000200641226a2011290300370000200441a0016a41186a22094200370300200441a0016a41106a22014200370300200441a0016a41086a22074200370300200442003703a0012006413a200441a0016a100020044180016a41186a200929030037030020044180016a41106a200129030037030020044180016a41086a2007290300370300200420042903a0013703800120044180016a4120100c200610290c010b2006450d07200641186a41002f00cfce423b0000200641106a41002900c7ce42370000200641086a41002900bfce42370000200641002900b7ce423700002006411a413a10282206450d082006200429032037001a200641326a200f2903003700002006412a6a2010290300370000200641226a2011290300370000200441a0016a41186a220f4200370300200441a0016a41106a22104200370300200441a0016a41086a22114200370300200442003703a0012006413a200441a0016a100020044180016a41186a200f29030037030020044180016a41106a201029030037030020044180016a41086a2011290300370300200420042903a00137038001200441203602a401200420044180016a3602a001200441c0006a200441a0016a10db022006102902402001450d00200910290b2007450d00200010290b200841206a2108200a41606a220a0d000c080b0b1039000b20064101102a000b418f89c3004133104e000b411a4101102a000b413a4101102a000b411a4101102a000b413a4101102a000b0240200c450d00200b10290b200441003602a801200442013703a001200420033602800120044180016a200441a0016a1030024002400240024020030d0020042802a801210620042802a401210120042802a00121070c010b20034105742100410020042802a80122066b210920042802a001210720042802a401210103400240200120096a411f4b0d00200641206a22082006490d042001410174220a20082008200a491b22084100480d040240024020010d002008102721070c010b200720012008102821070b2007450d03200821010b200720066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200941606a2109200641206a2106200241206a2102200041606a22000d000b200420013602a401200420063602a801200420073602a0010b20044180016a41086a22024200370300200442003703800141d692c200411b20044180016a1004200441a0016a41086a200229030037030020042004290380013703a001200441a0016a411020072006100302402001450d00200710290b02402004280214450d00200428021010290b200524000f0b20084101102a000b102b000bcb0101037f230041106b22032400410021042003410036020c200120022003410c6a1005210102400240200328020c2202417f460d002001450d0020034100360204200341046a200120024104200241044922051b220410ce041a20050d012003280204210520034100360208200341086a200120046a200220046b2204410420044104491b10ce041a200441034d0d012003280208210420011029200041086a200436020020002005360204410121040b20002004360200200341106a24000f0b418f89c3004133104e000b830802117f017e23004190016b22022400024002400240024002400240410e10272203450d00200341066a41002900dac440370000200341002900d4c4403700002003410e411c10282204450d012004200136000e200241306a41186a22034200370300200241306a41106a22014200370300200241306a41086a220542003703002002420037033020044112200241306a1000200241086a41186a2003290300370300200241086a41106a2001290300370300200241086a41086a20052903003703002002200229033037030820024100360270200241086a4120200241f0006a100521060240024020022802702207417f460d002002200736022c200220063602282002200241286a102e2002280200450d07024002402002280204220841fc00200841fc00491b22090d004101210a0c010b200941216c22031027220a450d050b02402008450d0020022802282105200228022c21034100210b4100210c4100210d0340200241003a0030200241306a20052003410047220110ce041a20032001490d072002200320016b220e36022c2002200520016a22053602280240024002402003450d0020022d0030220141014b0d004100210f200e21030240024020010e020100010b200241306a200e4120200e4120491b22016a41004100412020016b2001411f4b1b10cd041a200241306a2005200110ce041a2002200e20016b220336022c2002200520016a2205360228200e411f4d0d01200241f0006a41186a200241306a41186a290300370300200241f0006a41106a200241306a41106a290300370300200241f0006a41086a200241306a41086a290300370300200220022903303703704101210f0b200d41016a210e200241d0006a41186a2210200241f0006a41186a290300370300200241d0006a41106a2211200241f0006a41106a290300370300200241d0006a41086a2212200241f0006a41086a29030037030020022002290370370350200d2009470d020240200b200e200e200b491b2209ad42217e2213422088a70d002013a7220141004e0d020b102b000b2009450d0b200a10290c0b0b02400240200d0d0020011027210a0c010b200a200c20011028210a0b200a450d090b200a200c6a2201200f3a0000200141016a2002290350370000200141096a2012290300370000200141116a2011290300370000200141196a2010290300370000200b41026a210b200c41216a210c200e210d2008200e470d000b0b200a450d072008ad4220862009ad84211302402007450d00200610290b200020133702042000200a3602000c010b20004100360208200042013702000b2004102920024190016a24000f0b410e4101102a000b411c4101102a000b20034101102a000b20012003103e000b20014101102a000b418f89c3004133104e000b13002000410a360204200041b8c5c0003602000b340020004187f4c10036020420004100360200200041146a4110360200200041106a41d4ebc000360200200041086a42073702000b3001017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241003600000b13002000410a360204200041a487c1003602000b3101017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241c0003600000b3201017f02404108102722020d0041084101102a000b2000428880808080013702042000200236020020024280e1013700000b3001017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241013600000b3001017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241063600000b3d01017f02404110102722020d0041104101102a000b200242003700082002428080d287e2bc2d370000200042908080808002370204200020023602000b3d01017f02404110102722020d0041104101102a000b200242003700082002428080e983b1de16370000200042908080808002370204200020023602000b3e01017f02404110102722020d0041104101102a000b2002420037000820024280809aa6eaafe301370000200042908080808002370204200020023602000bf10901047f230041206b220224000240024002400240024002400240024002400240024002400240024002402001280200417f6a220341094b0d0020030e0a0102030405060708090a010b419498c1001058000b2001410c6a2802002203417f4c0d0a200128020421044101210502402003450d00200310272205450d0c0b20052004200310ce0421052000410c6a2003360200200041086a20033602002000200536020420004101360200200041106a20012902103703000c090b2001410c6a2802002203417f4c0d09200128020421050240024020030d00410121040c010b200310272204450d0c0b20042005200310ce0421052000410c6a2003360200200041086a20033602002000200536020420004102360200200041106a20012902103703000c080b200128020421054101210302400240200141086a22042d00004101460d002002411e6a200441036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220042f00013b011c2002200141106a2902003703002001410c6a2802002104410021030c010b2001410c6a28020021040b20002005360204200020022f011c3b0009200041086a20033a00002000410c6a2004360200200041106a20022903003702002000412c6a200129022c3702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a280200360200200041033602000c070b20004104360200200020012802043602040c060b20004105360200200020012802043602040c050b410121030240024020012d00044101460d002002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002105410021030c010b200141086a28020021050b200020033a0004200020022f011c3b0005200041306a2001290330370300200041086a20053602002000410c6a2002290300370200200041386a200141386a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602002001280228210120004106360200200041286a20013602000c040b20004107360200200020012802043602040c030b410121030240024020012d00044101460d002002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030c010b200141086a28020021010b200020033a0004200020022f011c3b000520004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602000c020b20004109360200200041086a200141086a2903003703000c010b2000410a360200200041086a200141086a2903003703000b200241206a24000f0b1039000b20034101102a000b20034101102a000bd8a60104197f037e0b7f0a7e230041d0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e0b000102030405060708090a000b200341fc026a4101360200200342013702ec02200341ccfdc4003602e802200341023602ac04200341c4fdc4003602a8042003200341a8046a3602f802200341e8026a41f098c1001057000b200141086a2802002104200128020421050240024020022d00000d004101210620022d00014101460d010b41d588c3002107412a210841002109410121062004450d32200510290c320b200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241086a2d00002114200241066a2f01002115200241056a2d00002116200241046a2d00002117200241026a2f010021182001410c6a2802002119200141146a280200211a200141106a280200211b20032002411a6a29010037038003200320073a00ff02200320083a00fe02200320093b01fc022003200a3a00fb022003200b3a00fa022003200c3b01f8022003200d3a00f7022003200e3a00f6022003200f3b01f402200320103a00f302200320173a00ea02200320183b01e802200320132012410874201141187472723600ef02200320162015410874722014411874723600eb02200320193602b004200320043602ac04200320053602a804200341086a200341e8026a200341a8046a201b201a10cb01200328020c210820032802082107410021090c310b200141086a28020021042001280204210541d588c3002107412a210820022d00000d2f20022d00014101470d2f2002411a6a290100211c200241196a2d00002107200241186a2d00002108200241166a2f01002106200241156a2d00002109200241146a2d0000210a200241126a2f0100210b200241116a2d0000210c200241106a2d0000210d2002410e6a2f0100210e2002410d6a2d0000210f2002410c6a2d000021102002410a6a2f01002111200241096a2d00002112200241086a2d00002113200241066a2f01002114200241056a2d00002115200241046a2d00002116200241026a2f010021172001410c6a2802002118200141146a2802002119200141106a280200211a410d10272202450d08200241056a410029008599413700002002410029008099413700002002410d412d10282202450d092002201c370025200220073a0024200220083a0023200220063b0021200220093a00202002200a3a001f2002200b3b001d2002200c3a001c2002200d3a001b2002200e3b00192002200f3a00182002201141087420104118747220127236001420022014410874201572201341187472360010200220163a000f200220173b000d200341e8026a41186a22074200370300200341e8026a41106a22084200370300200341e8026a41086a22064200370300200342003703e8022002412d200341e8026a1000200341a8046a41186a2007290300370300200341a8046a41106a2008290300370300200341a8046a41086a2006290300370300200320032903e8023703a804200341003602e802200341a8046a4120200341e8026a100521090240024020032802e8022207417f460d0041002106200341e8026a2007412020074120491b22086a41004100412020086b2008411f4b1b10cd041a200341e8026a2009200810ce041a2007411f4b0d01418f89c3004133104e000b2002102941959bc4002107410b21080c300b20032f01e802210720032d00ea02210820032900eb02211c20032d00f302210a20032902f402211d20032802fc02210b200329038003211e20091029200210292003201e370380032003200b3602fc022003201d3702f4022003200a3a00f3022003201c3700eb02200320083a00ea02200320073b01e802200320183602b004200320043602ac04200320053602a804200341106a200341e8026a200341a8046a201a201910cb012003280214210820032802102107410121090c300b200141216a290000211c200141206a2d0000210a2001411d6a2f0000210b2001411c6a2d0000210c200141196a2f0000210d200141186a2d0000210e200141156a2f0000210f200141146a2d00002110200141106a28020021112001410c6a2802002105200141086a2d00002117200141306a280200211f2001412c6a280200212020012d001f211220012d001b211320012d0017211420012d000b211520012f00092116200128020421212002411a6a290100211d200241196a2d00002118200241186a2d00002119200241166a2f0100211a200241156a2d0000211b200241146a2d00002122200241126a2f01002123200241116a2d00002124200241106a2d000021252002410e6a2f010021262002410d6a2d00002127200241046a2d00002128200241026a2f01002129412a210441d588c30021070240024020022d0000450d004101210641002108410021090c010b41012106410021084100210920022d00014101470d002002410c6a2d000021082002410a6a2f01002109200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722107410021060b200941ffff0371410874200841187472200441ff017172210820060d2d2003201d3703d002200320183a00cf02200320193a00ce022003201a3b01cc022003201b3a00cb02200320223a00ca02200320233b01c802200320243a00c702200320253a00c602200320263b01c402200320273a00c302200320083600bf02200320073600bb02200320283a00ba02200320293b01b8020240201741ff01714101470d00200341e8026a200541067610cc0120032802e80221070240024020032802f0022005413f7122024b0d00410021020c010b200720024105746a2202290018211c20022d0017210a20022d0016211220022f0014210b20022d0013210c20022d0012211320022f0010210d20022d000f210e20022d000e211420022f000c210f20022d000b2110200228000721112002280003210520022d0002211520022f00002116410121020b024020032802ec02450d00200710290b2002450d2d0b2003201c3703f0032003200a3a00ef03200320123a00ee032003200b3b01ec032003200c3a00eb03200320133a00ea032003200d3b01e8032003200e3a00e703200320143a00e6032003200f3b01e403200320103a00e303200320113600df03200320053600db03200320153a00da03200320163b01d803200341e8026a41086a22024200370300200342003703e80241e0c2c0004114200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d8020240200341d8026a411041b8d6c50041004100100b417f460d00418d99c1002107412621080c2e0b200341e8026a200341b8026a10b901024020032903e8024201510d0041b399c1002107411821080c2e0b200341e8026a200341d8036a10b901024020032903e8024201510d0041969ac1002107412c21080c2e0b20034190036a280200210c20034180016a41a8c1c500411110b50141e199c10021074116210820032802840141002003280280011b201f470d2d0240200c41016a201f490d0041f799c1002107411f21080c2e0b200341e8026a202141067610bc01410021072021413f71220220032802f0024f0d2020032802e802200241216c6a22022d00004101470d2020022f00012106200241196a290000211c200241186a2d00002109200241176a2d00002104200241156a2f00002105200241146a2d0000210a200241136a2d0000210b200241116a2f0000210d200241106a2d0000210e2002410f6a2d0000210f2002410d6a2f000021102002410c6a2d00002111200241086a2800002113200241046a2800002112200241036a2d00002102410121070c210b41d588c3002107412a210820022d00000d2c20022d00014101470d2c20012802042116200241196a2d00002107200241186a2d00002108200241166a2f01002106200241156a2d00002109200241146a2d00002104200241126a2f01002105200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002114200241026a2f0100211520032002411a6a29010037039804200320073a009704200320083a009604200320063b019404200320093a009304200320043a009204200320053b0190042003200a3a008f042003200b3a008e042003200c3b018c042003200d3a008b04200320143a008204200320153b01800420032010200f41087472200e41187472360087042003201320124108747220114118747236008304200341e8026a41086a22024200370300200342003703e80241e0c2c0004114200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d8020240200341d8026a411041b8d6c50041004100100b417f460d0041a99bc1002107411e21080c2d0b411310272202450d082002410f6a41002800f9c340360000200241086a41002900f2c340370000200241002900eac34037000020024113413310282202450d092002200329038004370013411821082002412b6a20034180046a41186a290300370000200241236a20034180046a41106a2903003700002002411b6a20034180046a41086a290300370000200341e8026a41186a22074200370300200341e8026a41106a22064200370300200341e8026a41086a22094200370300200342003703e80220024133200341e8026a1000200341a8046a41186a2007290300370300200341a8046a41106a2006290300370300200341a8046a41086a2009290300370300200320032903e8023703a804200341a8046a412041b8d6c50041004100100b21072002102902402007417f470d0041c79bc10021070c2d0b200341a8046a201641067610bc01410021072016413f71220220032802b0044f0d1d20032802a804200241216c6a22022d00004101470d1d20022f00012106200241196a290000211c200241186a2d00002109200241176a2d00002104200241156a2f00002105200241146a2d0000210a200241136a2d0000210b200241116a2f0000210c200241106a2d0000210d2002410f6a2d0000210e2002410d6a2f0000210f2002410c6a2d00002110200241086a2800002112200241046a2800002111200241036a2d00002102410121070c1e0b200128020421052002411a6a290100211c200241196a2d0000210a200241186a2d0000210b200241166a2f0100210c200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d00002113200241046a2d00002114200241026a2f0100211541d588c3002107412a21040240024020022d0000450d004101210641002108410021090c010b41012106410021084100210920022d00014101470d002002410c6a2d000021092002410a6a2f01002108200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722107410021060b200841ffff0371410874200441ff017172200941187472210820060d2b2003201c370398042003200a3a0097042003200b3a0096042003200c3b0194042003200d3a0093042003200e3a0092042003200f3b019004200320103a008f04200320113a008e04200320123b018c04200320133a008b0420032008360087042003200736008304200320143a008204200320153b018004411610272202450d092002410e6a41002900c9c240370000200241086a41002900c3c240370000200241002900bbc24037000020024116413610282202450d0a20022003290380043700162002412e6a20034180046a41186a290300370000200241266a20034180046a41106a290300370000411e21082002411e6a20034180046a41086a290300370000200341e8026a41186a22074200370300200341e8026a41106a22064200370300200341e8026a41086a22094200370300200342003703e80220024136200341e8026a1000200341a8046a41186a2007290300370300200341a8046a41106a2006290300370300200341a8046a41086a2009290300370300200320032903e8023703a804200341a8046a412041b8d6c50041004100100b21062002102941df9bc10021072006417f470d2b200341a8016a41dfc1c500411610b50120032802ac01210820032802a8012106200341e8026a41086a22024200370300200342003703e80241d8c3c0004112200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521070240024020032802e8022209417f460d002007450d00200320093602ac04200320073602a804200341e8026a200341a8046a102d20032802e802220b450d0d200341f0026a280200210220032802ec02210c2009450d01200710290c010b4100210c4101210b410021020b02400240024002402008410020061b220d2005470d0020022005460d010b41fd9bc100210741162108200220054d0d0120034180036a4200370300200341f8026a4200370300200341f0026a4200370300200342003703e802200b20054105746a2206200341e8026a460d002006200341e8026a412010d0040d010b200341a0016a20034180046a4280809aa6eaafe301420010ac0120032802a001450d0141939cc1002107411e21080b200c450d2c200b10290c2c0b20034198016a41a8c1c500411110b501200328029c0121062003280298012109411610272207450d0c2007410e6a41002900c9c240370000200741086a41002900c3c240370000200741002900bbc24037000020074116413610282207450d0d20072003290380043700162007412e6a20034180046a41186a290300370000200741266a20034180046a41106a2903003700002007411e6a20034180046a41086a290300370000200341e8026a41186a22084200370300200341e8026a41106a22044200370300200341e8026a41086a220a4200370300200342003703e80220074136200341e8026a1000200341a8046a41186a2008290300370300200341a8046a41106a2004290300370300200341a8046a41086a200a290300370300200320032903e8023703a804410410272208450d0e20082006410020091b36000020084104410810282208450d0f20082005360004200341a8046a412020084108100320081029200710290240024020022005460d00200341e8026a41186a220820034180046a41186a290300370300200341e8026a41106a220620034180046a41106a290300370300200341e8026a41086a220920034180046a41086a29030037030020032003290380043703e802200220054d0d12200b20054105746a220720032903e802370000200741186a2008290300370000200741106a2006290300370000200741086a20092903003700000c010b200341e8026a41186a220720034180046a41186a290300370300200341e8026a41106a220820034180046a41106a290300370300200341e8026a41086a220620034180046a41086a29030037030020032003290380043703e8020240200c2005470d00200541016a22022005490d2b20054101742209200220022009491b220c41ffffff3f71200c470d2b200c41057422024100480d2b0240024020050d0020021027210b0c010b200b200541057420021028210b0b200b450d180b200b20054105746a220220032903e802370000200241186a2007290300370000200241106a2008290300370000200241086a2006290300370000200541016a21020b200341e8026a41086a22074200370300200342003703e80241d8c3c0004112200341e8026a1004200341d8026a41086a2007290300370300200320032903e8023703d802200341003602f002200342013703e802200320023602a804200341a8046a200341e8026a103002400240024020020d0020032802f002210720032802ec02210920032802e80221040c010b20024105742105410020032802f00222076b210620032802e802210420032802ec022109200b210203400240200920066a411f4b0d00200741206a22082007490d2d2009410174220a20082008200a491b22084100480d2d0240024020090d002008102721040c010b200420092008102821040b2004450d03200821090b200420076a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200641606a2106200741206a2107200241206a2102200541606a22050d000b200320093602ec02200320073602f002200320043602e8020b200341d8026a411020042007100302402009450d00200410290b0240200c450d00200b10290b200341e8026a41086a22024200370300200342003703e80241dfc1c5004116200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802410121062003200d41016a3602e802200341d8026a4110200341e8026a410410030c190b20084101102a000b200141386a290300211c200141306a290300211d2001411d6a290000212a2001411c6a2d00002116200141196a2f00002117200141186a2d00002118200141156a2f00002119200141146a2d0000211a200141116a2f0000211b200141106a2d000021222001410c6a2802002123200141086a2802002105200141286a280200211f20012d001b212420012d0017212520012d0013212620012d0007212720012f0005212820012d000421292002411a6a290100211e200241196a2d0000210a200241186a2d0000210b200241166a2f0100210c200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d00002113200241046a2d00002114200241026a2f0100211541d588c3002107412a21040240024020022d0000450d004101210641002108410021090c010b41012106410021084100210920022d00014101470d002002410c6a2d000021092002410a6a2f01002108200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722107410021060b200841ffff0371410874200441ff017172200941187472210820060d2a2003201e3703f0032003200a3a00ef032003200b3a00ee032003200c3b01ec032003200d3a00eb032003200e3a00ea032003200f3b01e803200320103a00e703200320113a00e603200320123b01e403200320133a00e303200320083600df03200320073600db03200320143a00da03200320153b01d8030240201d201c8450450d0041ef9cc100210741d00021080c2b0b0240202941ff01714101470d00200341e8026a200541067610cc0120032802e80221070240024020032802f0022005413f7122024b0d00410021020c010b200720024105746a2202290018212a20022d0017211620022d0016212420022f0014211720022d0013211820022d0012212520022f0010211920022d000f211a20022d000e212620022f000c211b20022d000b2122200228000721232002280003210520022d0002212720022f00002128410121020b024020032802ec02450d00200710290b2002450d2a0b2003202a37039804200320163a009704200320243a009604200320173b019404200320183a009304200320253a009204200320193b0190042003201a3a008f04200320263a008e042003201b3b018c04200320223a008b0420032023360087042003200536008304200320273a008204200320283b0180044111210820034198026a41a8c1c500411110b50141de9cc1002107200328029c0241002003280298021b201f470d2a200341e8026a41086a22024200370300200342003703e80241e0c2c0004114200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521020240024020032802e8022207417f460d002002450d002003200720074108200741084922081b22066b22073602ac042003200220066a22063602a804024020080d002003200720074104200741044922081b22096b3602ac042003200620096a3602a80420080d00200341e8026a200341a8046a102d20032802e802220a0d020b418f89c3004133104e000b41b19cc1002107412d21080c2b0b20032902ec02212b2002102920034190026a41cdc1c500411210b50120034180026a20032802940241002003280290021bad42004280a094a58d1d420010d304411410272202450d1020034180026a41086a290300211e200329038002212a200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d11200220032903d8033700142002412c6a200341f0036a290300370000200241246a200341d8036a41106a2903003700002002411c6a200341d8036a41086a290300370000200341e8016a20024134108401200341e8016a41106a290300212c20032903f001212d20032802e801210720021029202d420020071b202a54202c420020071b222c201e54202c201e511b450d1941f09dc1002107412e21080c1a0b4101210620022d000120022d0000720d1720012802042102200341e8026a41086a22074200370300200342003703e8024194c1c5004114200341e8026a1004200341d8026a41086a2007290300370300200320032903e8023703d802200320023602e802200341d8026a4110200341e8026a410410030c160b024020022d000120022d000072450d0041ad88c3002107412821080c290b200141086a28020021070240024020012d00044101460d00200141106a2d00002108200141146a2d00002106200141186a2d000021092001411c6a2d0000210420012f0005210220012d00072105200128020c210a20012f0011210b20012d0013210c20012f0015210d20012d0017210e20012f0019210f20012d001b2110200129001d211c0c010b200341e8026a200741067610cc0120032802e80221110240024020032802f0022007413f7122024b0d00410021120c010b201120024105746a2202290018211c20022d0017210420022d0016211020022f0014210f20022d0013210920022d0012210e20022f0010210d20022d000f210620022d000e210c20022f000c210b20022d000b21082002280007210a2002280003210720022d0002210520022f00002102410121120b024020032802ec02450d00201110290b2012450d280b2003201c3703d002200320043a00cf02200320103a00ce022003200f3b01cc02200320093a00cb022003200e3a00ca022003200d3b01c802200320063a00c7022003200c3a00c6022003200b3b01c402200320083a00c3022003200a3600bf02200320073600bb02200320053a00ba02200320023b01b802200341e8026a41086a22024200370300200342003703e80241d1c2c000410f200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521020240024020032802e8022207417f460d002002450d00200320073602ac04200320023602a804200341e8026a200341a8046a104120032802e8022208450d12200341f0026a280200210920032802ec02210d2007450d01200210290c010b4100210d41082108410021090b024002400240200941286c2206450d00410021070340200341e8026a41206a200820076a220241206a290300370300200341e8026a41186a200241186a290300370300200341e8026a41106a200241106a290300370300200341e8026a41086a200241086a290300370300200320022903003703e802200341e8026a200341b8026a412010d0040d022006200741286a2207470d000b0b4100210a200341003602b004200342083703a8044108210b0240200d0d004100210c0c020b200810294100210c0c010b20034180046a41086a200341e8026a41086a290300221c370300200341d8036a41086a2206201c370300200341d8036a41106a2204200341e8026a41106a290300370300200341d8036a41186a2205200341e8026a41186a290300370300200341d8036a41206a220a200341e8026a41206a290300370300200320032903e802221c370380042003201c3703d80341281027220b450d12200b20032903d803370300200b41206a200a290300370300200b41186a2005290300370300200b41106a2004290300370300200b41086a200629030037030002400240200941286c41586a2007470d004101210a4101210c0c010b200241286a210f2008200941286c6a220541586a21104101210a4101210c0340200f210202400340200341e8026a41206a2207200241206a290300370300200341e8026a41186a2206200241186a290300370300200341e8026a41106a2209200241106a290300370300200341e8026a41086a2204200241086a290300370300200320022903003703e802200341e8026a200341b8026a412010d0040d012005200241286a2202470d000c030b0b200341a8046a41206a2007290300221c37030020034180046a41086a2004290300221d37030020034180046a41106a2009290300221e37030020034180046a41186a2006290300222a37030020034180046a41206a201c370300200320032903e802222b370380042007201c3703002006202a3703002009201e3703002004201d3703002003202b3703e8020240200c200a470d00200a41016a220c200a490d2a200a410174220e200c200c200e491b220cad42287e221c422088a70d2a201ca7220e4100480d2a02400240200a0d00200e1027210b0c010b200b200a41286c200e1028210b0b200b450d160b200241286a210f200b200a41286c6a220e20032903e802370300200e41206a2007290300370300200e41186a2006290300370300200e41106a2009290300370300200e41086a2004290300370300200a41016a210a20102002470d000b0b0240200d450d00200810290b2003200a3602b0042003200c3602ac042003200b3602a8040b200341e8026a41086a22024200370300200342003703e80241d1c2c000410f200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341103602ec022003200341d8026a3602e802200341a8046a200341e8026a102f410021080240200a41286c22020d0041012104410021090c150b200241286d220941ffffff3f712009470d26200941057422024100480d262002102722040d1420024101102a000b4101210620022d000120022d0000720d15200141086a290300211c200341e8026a41086a22024200370300200342003703e8024198c3c000411c200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d8022003201c3703e802200341d8026a4110200341e8026a410810030c140b4101210620022d000120022d0000720d14200141086a290300211c200341e8026a41086a22024200370300200342003703e8024184c3c0004114200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d8022003201c3703e802200341d8026a4110200341e8026a410810030c130b410d4101102a000b412d4101102a000b41134101102a000b41334101102a000b41164101102a000b41364101102a000b418f89c3004133104e000b41164101102a000b41364101102a000b41044101102a000b41084101102a000b41c8c3c000200520021037000b41144101102a000b41344101102a000b418f89c3004133104e000b41284108102a000b200e4108102a000b20024101102a000b0240200a450d00200a41286c21064100210820042102200b21070340200741086a290000211c200741106a290000211d2007290000211e200241186a200741186a290000370000200241106a201d370000200241086a201c3700002002201e370000200841016a2108200241206a2102200741286a2107200641586a22060d000b0b0240200c450d00200b10290b200341e8026a41186a200341b8026a41186a290300370300200341e8026a41106a200341b8026a41106a290300370300200341e8026a41086a200341b8026a41086a290300370300200320032903b8023703e80241012106200341e8026a41012004200810ba012009450d00200410290b410021070c070b41ad88c300210741282108410121090c130b200341e8026a41086a22024200370300200342003703e80241b4c3c0004113200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a1005210202400240024002400240024002400240024020032802e8022207417f460d002002450d00200320073602ac04200320023602a804200341e8026a200341a8046a104720032802e802220c450d03200341f0026a280200210f20032802ec02211102402007450d00200210290b200f450d0541c19ec100210741232108200c290300201d54200c41086a290300222c201c54202c201c511b450d07200341e8026a41086a22024200370300200342003703e80241d1c2c000410f200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a1005210220032802e8022207417f460d012002450d01200320073602ac04200320023602a804200341e8026a200341a8046a104120032802e8022204450d04200341f0026a280200210520032802ec02210b2007450d02200210290c020b41bf9dc1002107413121080c080b4100210b41082104410021050b2004200541286c6a21092004210241002107024003400240200920026b41f8004b0d0020092002460d062004200541286c6a2109034020034180046a2002460d032007200220034180046a412010d00422064100476a21072006450d032009200241286a2202470d000c070b0b200220034180046a460d012007200220034180046a412010d00422064100476a21072006450d01200241286a220620034180046a460d012007200620034180046a412010d00422064100476a21072006450d01200241d0006a220620034180046a460d012007200620034180046a412010d00422064100476a21072006450d01200241f8006a220620034180046a460d01200241a0016a21022007200620034180046a412010d00422064100476a210720060d000b0b2007202b422088a7490d0341e49ec100210741362108200b450d04200410290c040b418f89c3004133104e000b418f89c3004133104e000b41f4c2c000410041001037000b0240200b450d00200410290b200341a8026a10b701200341e8026a20034180046a10b60120032802e8024101460d01024020032802ac02450d0020032802a80210290b419e9ec10021070b2011450d01200c10290c010b20032802a802212602400240024002400240024020032802b00222020d004200212e4200212f0c010b20032802ec022106200241216c2107202641016a2102200341f0026a2802002208410876210941012008411f7174210d20084105764107712204417f73210e20034188036a21054200212e4200212f034002402002417f6a2d00004101470d00200341e8026a200210b90120032903e8024201520d002003280290032006490d0020052903002130200341e8026a41106a2903002131200329038003213220032903f0022133200341e0016a41a8c1c500411110b501200341a8046a41186a200241186a290000370300200341a8046a41106a200241106a290000370300200341a8046a41086a200241086a290000370300200320022900003703a804200320093602c804200341b8026a200341a8046a10b8014200212c4200212d0240200420032802c00222084f0d002008200e6a220b20084f0d04203020317c203220337c222c203254ad7c420020032802b802200b4102746a280200200d7122081b212d202c420020081b212c0b024020032802bc02450d0020032802b80210290b202d202f7c202c202e7c222e202c54ad7c212f0b200241216a21022007415f6a22070d000b0b200c200f41306c6a2106200c210202400240024002400240024002400240024003400240200620026b4190014b0d00024020022006460d00034041012108200241106a220220034180046a460d04200220034180046a412010d004450d04200241206a22022006470d000b0b41002108202e201d85202f201c858450450d0220034180046a41186a290300211e20034190046a290300212a20034188046a290300212c200329038004212d200c201c370308200c201d370300200c202d370310200c41186a202c370300200c41206a202a370300200c41286a201e370300200f4115490d0c200f4101762221ad42307e221c422088a70d1c201ca72202417f4c0d1c20020d03410821254108210b0c040b41012108200241106a220720034180046a460d01200720034180046a412010d004450d01200241c0006a220720034180046a460d01200720034180046a412010d004450d01200241f0006a220720034180046a460d01200720034180046a412010d004450d01200241a0016a220720034180046a460d01200241c0016a2102200720034180046a412010d0040d000b0b411410272202450d07200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d06200220032903d8033700142002412c6a200341d8036a41186a290300370000200241246a200341d8036a41106a2903003700002002411c6a200341d8036a41086a290300370000200341c8016a20024134108401200341c8016a41106a290300211c20032903d001211d20032802c801210720021029200341d8036a201d420020071b221d202a201d201d202a56201c420020071b222c201e56202c201e511b22021b221c7d202c201e202c20021b222d7d201d201c54ad7d1089010240202a201c7d222c201e202d7d202a201c54ad7d221d84500d00411810272202450d06200241106a41002900cf8c40370000200241086a41002900c78c40370000200241002900bf8c4037000020024118413810282202450d05200220032903d803370018200241306a200341d8036a41186a290300370000200241286a200341d8036a41106a290300370000200241206a200341d8036a41086a290300370000200341b0016a20024138108401200341b0016a41106a290300212a20032903b801211e20032802b001210720021029200341d8036a201e420020071b221e202c201e201e202c56202a420020071b222a201d56202a201d511b22021b222c7d202a201d202a20021b221d7d201e202c54ad7d109c01201d202d7c202c201c7c222a202c54ad7c211e0b200341e8026a41086a22024200370300200342003703e80241b18ac0004116200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521070240024020032802e8022202417f470d004200211c4200211d0c010b200342003703f002200342003703e802200341e8026a20072002411020024110491b10ce041a2002410f4d0d04200341f0026a290300211d20032903e802211c200710290b200341e8026a41086a22024200370300200342003703e80241b18ac0004116200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d80220034200201d201e7d201c202a54ad7d221e201c202a7d222a201c56201e201d56201e201d511b22021b3703f00220034200202a20021b3703e802200341d8026a4110200341e8026a41101003419a9fc10041b09fc10020081b21074116410f20081b2108410121020c0b0b200210272225450d012025210b0b200c41506a2128200c41306a211f200c41f07e6a2129410421124100212741002105200f2117034020172104410021174101210902402004417f6a2208450d00024002400240024002400240200c200841306c6a2202290300200441306c220e200c6a41a07f6a2207290300221d54200241086a290300221e200741086a290300221c54201e201c511b0d002004417e6a210d2029200e6a2102410021174100210703400240200d2007470d00200421090c080b201d2002290300222a5a2108201c200241086a290300221e512106201c201e5a2109200241506a2102200741016a2107202a211d201e211c2008200920061b0d000b200741016a21092007417f7320046a21080c010b2029200e6a210202400340024020084101470d00410021080c020b201d2002290300222a542107201c200241086a290300221e512106201c201e542109200241506a21022008417f6a2108202a211d201e211c2007200920061b0d000b0b20042008490d012004200f4b0d03200420086b22094101762206450d002028200e6a2102200c200841306c6a21070340200341e8026a41286a220d200741286a220e290300370300200341e8026a41206a2210200741206a2213290300370300200341e8026a41186a2214200741186a2215290300370300200341e8026a41106a2216200741106a2217290300370300200341e8026a41086a2218200741086a2219290300370300200320072903003703e802200241086a221a290300211c200241106a221b290300211d200241186a2222290300211e200241206a2223290300212a200241286a2224290300212c20072002290300370300200e202c3703002013202a3703002015201e3703002017201d3703002019201c3703002024200d2903003703002023201029030037030020222014290300370300201b2016290300370300201a2018290300370300200220032903e802370300200741306a2107200241506a21022006417f6a22060d000b0b024020080d00200821170c050b0240200941094d0d00200821170c050b2004200f4b0d01200420086b2106201f200841306c6a210d034020042008417f6a2217490d040240200420176b22094102490d00200c200841306c6a2202290300200c201741306c6a2208290300221e5a200241086a2207290300221d200841086a220e290300221c5a201d201c511b0d00200341e8026a41186a2213200841286a2210290300370300200341e8026a41106a2214200841206a2215290300370300200341e8026a41086a2216200841186a2218290300370300200320082903103703e80220082002290300370300200e2007290300370300200841106a200241106a2903003703002018200241186a2903003703002015200241206a2903003703002010200241286a29030037030041012107024020094103490d002008290360201e5a200841e8006a290300221d201c5a201d201c511b0d004102210e200d211003402010220241506a22072002290300370300200741286a200241286a290300370300200741206a200241206a290300370300200741186a200241186a290300370300200741106a200241106a290300370300200741086a200241086a2903003703002006200e2207460d01200741016a210e200241306a2210290300201e5a200241386a290300221d201c5a201d201c511b450d000b0b2002201e3703002002201c3703082008200741306c6a220241286a2013290300370300200241206a2014290300370300200241186a2016290300370300200220032903e8023703100b2017450d05200d41506a210d200641016a2106201721082009410a4f0d050c000b0b20082004103e000b20042008417f6a2217490d010b2004200f107f000b20172004103e000b02400240024020272005470d00202741016a22022027490d1c20274101742207200220022007491b220241ffffffff01712002470d1c200241037422074100480d1c0240024020270d002007102721120c010b201220274103742007102821120b2012450d01200221270b201220054103746a2202200936020420022017360200200541016a2213210520134102490d010340024002400240024020122013220e417f6a22134103746a2202280200450d00200e41037420126a220941746a2802002206200228020422074d0d0041022105200e41024d0d062012200e417d6a22024103746a2802042208200720066a4d0d0141032105200e41034d0d06200941646a280200200820066a4d0d01200e21050c060b200e4103490d01200228020421072012200e417d6a22024103746a28020421080b20082007490d010b200e417e6a21020b024002400240024002400240200e200241016a22184d0d00200e20024d0d01201220024103746a2214280204221920142802006a2202201220184103746a22152802002216490d022002200f4b0d03201441046a211a200c201641306c6a220d2015280204221041306c22076a2106200241306c2108200220166b220420106b220220104f0d0420252006200241306c220710ce041a200b20076a21090240024020104101480d00200241014e0d010b20062102200b21070c060b202820086a21082006210203402008200241506a2206200941506a22042004290300200629030054200441086a290300221c200641086a290300221d54201c201d511b22051b2207290300370300200841086a200741086a290300370300200841106a200741106a290300370300200841186a200741186a290300370300200841206a200741206a290300370300200841286a200741286a2903003703002009200420051b21090240200d2006200220051b2202490d00200b21070c070b200841506a2108200b2107200b2009490d000c060b0b41d8e3c1002018200e1037000b41d8e3c1002002200e1037000b20162002103e000b2002200f107f000b2025200d200710ce041a200b20076a21090240024020104101480d00200420104a0d010b200d2102200b21070c010b200c20086a2105200b2107200d210203402002200620072006290300200729030054200641086a290300221c200741086a290300221d54201c201d511b22041b2208290300370300200241086a200841086a290300370300200241106a200841106a290300370300200241186a200841186a290300370300200241206a200841206a290300370300200241286a200841286a2903003703002007200741306a20041b2107200241306a2102200641306a200620041b220620054f0d01200920074b0d000b0b20022007200920076b220820084130706b10ce041a201a201920106a360200201420163602002015201541086a2018417f73200e6a41037410cf041a20132105201341014d0d020c000b0b20074104102a000b20170d000b02402027450d00201210290b2021450d08202510290c080b20024108102a000b418f89c3004133104e000b41384101102a000b41184101102a000b41344101102a000b41144101102a000b41f4c2c000200b20081037000b200f4102490d00200f417f6a2108200c200f41306c6a21044101210603400240024002400240200f20082202417f6a2208490d00200f20086b22074102490d03200c200241306c6a2202290300200c200841306c6a2209290300221e5a200241086a2205290300221d200941086a220b290300221c5a201d201c511b0d03200341e8026a41186a220d200941286a220e290300370300200341e8026a41106a2210200941206a2212290300370300200341e8026a41086a2213200941186a2214290300370300200320092903103703e80220092002290300370300200b2005290300370300200941106a200241106a2903003703002014200241186a2903003703002012200241206a290300370300200e200241286a2903003703004101210520074103490d022009290360201e5a200941e8006a290300221d201c5a201d201c511b0d02410021052004210703402007220241506a22072002290300370300200741286a200241286a290300370300200741206a200241206a290300370300200741186a200241186a290300370300200741106a200241106a290300370300200741086a200241086a29030037030020062005220b460d02200b417f6a2105200241306a2207290300201e5a200241386a290300221d201c5a201d201c511b0d020c000b0b2008200f103e000b4102200b6b21050b2002201e3703002002201c3703082009200541306c6a220241286a200d290300370300200241206a2010290300370300200241186a2013290300370300200220032903e8023703100b200441506a21042006417f6a210620080d000b0b2003200f3602b004200320113602ac042003200c3602a804200341e8026a41086a22024200370300200342003703e80241b4c3c0004113200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341103602ec022003200341d8026a3602e802200341a8046a200341e8026a103402402011450d00200c10290b41002102410021070b024020032802ac02450d00202610290b0240024020020d00202ba7450d120c010b02402011450d00200c10290b202ba7450d110b200a10290c100b202ba7450d0f200a10290c0f0b0b024020032802ac04450d0020032802a80410290b024020070d0041919bc10021070c0e0b2003201c37038003200320093a00ff02200320043a00fe02200320053b01fc022003200a3a00fb022003200b3a00fa022003200c3b01f8022003200d3a00f7022003200e3a00f6022003200f3b01f402200320103a00f302200320123600ef02200320113600eb02200320023a00ea02200320063b01e8020240200341e8026a20034180046a412010d0040d0020034180046a201610cd0120034180046a428080e983b1de16420010ad01200342f0f2bda9c6add9b1f4003703d80220034188016a41888dc300410d109401200320032903900142002003280288011b3703b802200341a8046a20034180046a10930120032802ac04210720032802a804210220032802b0042108200341bc046a200341d8026a36020020032002200841286c6a3602b404200320023602b004200320073602ac04200320023602a8042003200341b8026a3602b804200341d8036a200341a8046a104a200341a8046a41086a200341d8036a41086a280200360200200320032903d8033703a80420034180046a200341a8046a10a701410021070c0e0b41f89ac1002107411921080c0d0b0b024020032802ec02450d0020032802e80210290b024020070d0041cb99c10021070c0c0b2003201c37039804200320093a009704200320043a009604200320053b0194042003200a3a0093042003200b3a0092042003200d3b0190042003200e3a008f042003200f3a008e04200320103b018c04200320113a008b0420032013360087042003201236008304200320023a008204200320063b018004200341e8026a202041067610bc0141002107024002402020413f71220220032802f0024f0d0020032802e802200241216c6a22022d00004101470d0020022f00012108200241196a290000211c200241186a2d00002106200241176a2d00002109200241156a2f00002104200241146a2d00002105200241136a2d0000210a200241116a2f0000210b200241106a2d0000210d2002410f6a2d0000210e2002410d6a2f0000210f2002410c6a2d00002110200241086a2800002112200241046a2800002111200241036a2d00002102410121070c010b0b024020032802ec02450d0020032802e80210290b024020070d0041e49ac1002107411421080c0c0b2003201c3703c004200320063a00bf04200320093a00be04200320043b01bc04200320053a00bb042003200a3a00ba042003200b3b01b8042003200d3a00b7042003200e3a00b6042003200f3b01b404200320103a00b304200320123600af04200320113600ab04200320023a00aa04200320083b01a804024020034180046a200341b8026a412010d004450d0041c29ac1002107411221080c0c0b0240200341a8046a200341d8036a412010d004450d0041d49ac1002107411021080c0c0b200341e8026a41186a2213200341d8036a41186a2214290300370300200341e8026a41106a2215200341d8036a41106a2216290300370300200341e8026a41086a2217200341d8036a41086a2218290300370300200320032903d8033703e802410021022003410036028803200341d8026a200341e8026a10b8010240024020032802e00222050d004101210e4100210f0c010b4100210d4100210f4101210e4100211103402005417f4c0d0a20032802dc02211220032802d80221100240024020051027220a450d00024002400240200541027422020d00410021040c010b201020026a210b410021042010210903402009280200210702404120102722020d0041204101102a000b200941046a210920022007411f763a001f200220074101713a000020022007411e764101713a001e20022007411d764101713a001d20022007411c764101713a001c20022007411b764101713a001b20022007411a764101713a001a200220074119764101713a0019200220074118764101713a0018200220074117764101713a0017200220074116764101713a0016200220074115764101713a0015200220074114764101713a0014200220074113764101713a0013200220074112764101713a0012200220074111764101713a0011200220074110764101713a001020022007410f764101713a000f20022007410e764101713a000e20022007410d764101713a000d20022007410c764101713a000c20022007410b764101713a000b20022007410a764101713a000a200220074109764101713a0009200220074108764101713a00082002200741ff017122074107763a0007200220074106764101713a0006200220074105764101713a0005200220074104764101713a0004200220074103764101713a0003200220074102764101713a0002200220074101764101713a00014100210702400240024002400340200741206a220841034d0d010240200220076a2208411f6a2d0000450d002007411f6a21060c040b02402008411e6a2d0000450d002007411e6a21060c040b02402008411d6a2d00000d002007417c6a21072008411c6a2d00000d030c010b0b2007411d6a21060c020b03402008450d03200220086a21072008417f6a220621082007417f6a2d0000450d000c020b0b200741206a21060b200641016a22082006490d000240200520046b2008412020084120491b22074f0d00200420076a22072004490d1220054101742206200720072006491b22074100480d120240024020050d0020071027210a0c010b200a200520071028210a0b200a450d04200721050b200a20046a2106410021070240034020074120460d01200620076a200220076a2d00004101713a00002008200741016a2207470d000b0b200420076a21040b200210292009200b470d000b0b02402012450d00201010290b0240200f200d6b2004490d00200d20046a21020c030b200d20046a2202200d490d0e200f4101742207200220022007491b22074100480d0e02400240200f0d0020071027210e0c010b200e200f20071028210e0b0240200e450d002007210f0c030b20074101102a000b20074101102a000b20054101102a000b200e200d6a200a200410ce041a02402005450d00200a10290b201320142903003703002015201629030037030020172018290300370300200320032903d8033703e8022003201141016a221136028803200341d8026a200341e8026a10b8012002210d20032802e00222050d000b0b024020032802dc02450d0020032802d80210290b200341e8026a41086a22074200370300200342003703e80241d8c3c0004112200341e8026a1004200341d8026a41086a2007290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521070240024020032802e8022206417f460d002007450d00200320063602ac02200320073602a802200341e8026a200341a8026a102d20032802e802220a450d03200341f0026a280200210820032802ec02210b2006450d01200710290c010b4101210a410021084100210b0b02400240200841ffffff3f7122072002200220074b1b2208450d004100210720034180036a2106200341f8026a2109200341f0026a2104200a210203400240200e20076a2d0000450d00200642003703002009420037030020044200370300200342003703e802200341e8026a2002460d002002200341e8026a412010d004450d00200341e8026a200210b6014101210520032802e8024101470d0020032802ec02200c4d0d030b200241206a2102200741016a22072008490d000b0b410021050b0240200b450d00200a10290b0240200f450d00200e10290b200341b8026a200341d8036a20051b22072021202020051b10cd01200342f0f2bda9c6add9b1f4003703a002200341f0006a41888dc300410d10940120032003290378420020032802701b3703a802200341e8026a200710930120032802ec02210820032802e802210220032802f0022106200341fc026a200341a0026a36020020032002200641286c6a3602f402200320023602f002200320083602ec02200320023602e8022003200341a8026a3602f802200341d8026a200341e8026a104a200341e8026a41086a200341d8026a41086a280200360200200320032903d8023703e8022007200341e8026a10a701024002402005450d00411810272202450d04200241106a41002900cf8c40370000200241086a41002900c78c40370000200241002900bf8c4037000020024118413810282202450d05200220032903b802370018200241306a200341d0026a290300370000200241286a200341b8026a41106a290300370000200241206a200341b8026a41086a290300370000200341186a20024138108401200341186a41106a290300211e2003290320211d20032802182107200210294200211c200341b8026a201d420020071b221d201d428080e983b1de16201d428080e983b1de16544100201e420020071b222a501b22021b221e7d202a202a420020021b222b7d201d201e54ad7d109c01200341e8026a41086a22024200370300200342003703e80241b18ac0004116200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d802200341003602e802200341d8026a4110200341e8026a100521070240024020032802e8022202417f470d004200211d0c010b200342003703f002200342003703e802200341e8026a20072002411020024110491b10ce041a2002410f4d0d07200341f0026a290300211d20032903e802211c200710290b200341e8026a41086a22024200370300200342003703e80241b18ac0004116200341e8026a1004200341d8026a41086a2002290300370300200320032903e8023703d80220034200201d202b7d201c201e54ad7d222a201c201e7d221e201c56202a201d56202a201d511b22021b3703f00220034200201e20021b3703e802200341d8026a4110200341e8026a41101003200341013a00ec02200341083a00e802200341e8026a4105722102200341e8026a21080c010b200341e0006a200341b8026a109501024002402003290360200341e0006a41086a29030084500d00411810272202450d08200241106a41002900cf8c40370000200241086a41002900c78c40370000200241002900bf8c4037000020024118413810282202450d09200220032903d803370018200241306a200341f0036a290300370000200241286a200341d8036a41106a290300370000200241206a200341d8036a41086a290300370000200341c8006a20024138108401200341c8006a41106a290300211d2003290350211c2003280248210720021029411410272202450d0a200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c40370000200241144134102822020d0141344101102a000b419d88c0002107412221080c0d0b200220032903b8023700142002412c6a200341b8026a41186a290300370000200241246a200341b8026a41106a2903003700002002411c6a200341b8026a41086a290300370000200341306a20024134108401200341306a41106a290300212a2003290338211e2003280230210820021029200341b8026a201e420020081b222b201c420020071b221c428080e983b1de16201c428080e983b1de16544100201d420020071b221d501b22021b221e7c222c202a420020081b201d420020021b222a7c202c202b54ad7c108901200341d8036a201c201e7d201d202a7d201c201e54ad7d109c01200341f5026a200341d8036a41086a290300370000200341fd026a200341d8036a41106a29030037000020034185036a200341d8036a41186a290300370000200341003a00ec02200341083a00e802200320032903d8033700ed022003418d036a2102200341e8026a21080b200220032903b802370000200241186a200341b8026a41186a290300370000200241106a200341b8026a41106a290300370000200241086a200341b8026a41086a2903003700004100210741b8d6c50041002008108801410121060b410121090c0c0b418f89c3004133104e000b41184101102a000b41384101102a000b418f89c3004133104e000b41184101102a000b41384101102a000b41144101102a000b1039000b102b000b4184efc2002107411521080b41012106410121090c010b41012109410021062004450d00200510290b02402001280200417f6a220241014b0d000240024020020e020001000b2009450d01200141086a280200450d01200128020410290c010b2006450d00200141086a280200450d00200128020410290b2000200836020420002007360200200341d0046a24000b110020012000280200200028020410e9030bae2505077f047e037f027e067f23004180026b22052400200541e0016a41086a22064200370300200542003703e00141d8c3c0004112200541e0016a1004200541f8006a41086a2006290300370300200520052903e00137037820054100360248200541f8006a4110200541c8006a1005210602400240024002400240024002400240024002400240024002400240024002400240024002400240024020052802482207417f460d002006450d00200520073602e401200520063602e001200541c8006a200541e0016a102d20052802482208450d02200541d0006a2802002109200528024c210a2007450d01200610290c010b41012108410021094100210a0b200541e0016a41086a22074200370300200542003703e0014114210641e0c2c0004114200541e0016a1004200541f8006a41086a2007290300370300200520052903e0013703780240200541f8006a411041b8d6c50041004100100b417f460d0041bf9fc1002107412e21060c120b200541c0006a41a8c1c500411110b50141ed9fc10021072005280244410020052802401b2003470d11024020090d004181a0c100210741c10021060c120b02402009200241086a280200220b4f0d0041c2a0c1002107413c21060c120b200541306a2001109501200541306a41086a290300210c2005290330210d200541c8006a200110b9010240024020052903484201510d00411410272207450d03200741106a41002800bb8c40360000200741086a41002900b38c40370000200741002900ab8c403700004134210620074114413410282207450d04200720012900003700142007412c6a200141186a290000370000200741246a200141106a2900003700002007411c6a200141086a290000370000200541186a20074134108401200541186a41106a290300210e200528021821092005290320210f2007102941a2a1c1002107200f428180e983b1de16544100200e501b0d132009450d13200541e0016a2004410676220910bc0141002106024020052802e8012004413f7122074d0d004101410220052802e001200741216c6a2d00001b21060b024020052802e401450d0020052802e00110290b20064102490d01200541f8006a200910bc01200541e0016a41186a2204200141186a290000370300200541e0016a41106a2210200141106a290000370300200541e0016a41086a2211200141086a290000370300200520012900003703e001200528028001220620074d0d0520052802782212200741216c6a220641013a0000200620052903e001370001200641096a2011290300370000200641116a2010290300370000200641196a2004290300370000410e10272206450d06200641066a41002900dac440370000200641002900d4c4403700002006410e411c10282206450d072006200936000e200541e0016a41186a22074200370300200541e0016a41106a22094200370300200541e0016a41086a22044200370300200542003703e00120064112200541e0016a1000200541c0016a41186a2007290300370300200541c0016a41106a2009290300370300200541c0016a41086a2004290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541f8006a200541e0016a103520061029200528027c450d0d201210290c0d0b200541d8006a290300210f2005290350210e200541c0016a200441067610bc01410021092004413f71220620052802c8014f0d0e20052802c001200641216c6a22072d00004101470d0e200541b2016a200741036a2d00003a000020054198016a41086a200741146a290000370300200541a5016a200741196a290000370000200520072f00013b01b00120052007410c6a29000037039801200741086a2800002106200741046a2800002107410121090c0f0b200541106a41b9c1c500411410b50120054198016a2005280214410020052802101b220910bc010240024020052802a00122060d00200541e0016a2001428080d287e2bc2d4200410810900120052802e0014101470d0120052802e801210620052802e4012107200528029c01450d1320052802980110290c130b200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200541c0016a2107200d210e200641c000460d0b0c0a0b200541e0016a41106a290300211320052903e8012114200541e0016a41086a22074200370300200542003703e00141b18ac0004116200541e0016a1004200541f8006a41086a2007290300370300200520052903e001370378200541003602e001200541f8006a4110200541e0016a1005210720052802e0012204417f460d072007450d07200542003703e801200542003703e001200541e0016a20072004411020044110491b10ce041a2004410f4d0d06200541e8016a290300210f20052903e001210e200710290c080b418f89c3004133104e000b41144101102a000b41344101102a000b41c8c3c000200720061037000b410e4101102a000b411c4101102a000b418f89c3004133104e000b4200210e4200210f0b200541e0016a41086a22074200370300200542003703e00141b18ac0004116200541e0016a1004200541f8006a41086a2007290300370300200520052903e00137037820054200200f20137d200e201454ad7d2213200e20147d2214200e562013200f562013200f511b22071b3703e80120054200201420071b3703e001200541f8006a4110200541e0016a41101003200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200c200d428080aef89dc3527c220e200d54ad7c427f7c210c200541c0016a21070b200541e0016a41186a200741186a290000370300200541e0016a41106a200741106a290000370300200541e0016a41086a200741086a290000370300200520072900003703e00102400240200528029c012006460d0020052802980121070c010b200641016a22072006490d0720064101742204200720072004491b2204ad42217e220d422088a70d07200da722104100480d070240024020060d002010102721070c010b200528029801200641216c2010102821070b2007450d032005200436029c0120052007360298010b2007200641216c6a220741013a0000200720052903e001370001200741096a200541e0016a41086a2204290300370000200741116a200541e0016a41106a290300370000200741196a200541f8016a2903003700002005200641016a3602a00102402006413f470d0020044200370300200542003703e00141b9c1c5004114200541e0016a1004200541f8006a41086a2004290300370300200520052903e0013703782005200941016a3602e001200541f8006a4110200541e0016a410410030b200e210d0b200541e0016a41086a20054198016a41086a28020036020020052005290398013703e0012009200541e0016a10ce010b4200210e200541086a2001428080e983b1de16420010ac01024020052802082207450d00200528020c21060c060b200541cdc1c500411210b5012005280200210620052802042107200541e0016a41086a22094200370300200542003703e00141cdc1c5004112200541e0016a1004200541f8006a41086a2009290300370300200520052903e0013703782005200741016a410120061b3602e001200541f8006a4110200541e0016a410410034200210f0c030b20104101102a000b0b024020052802c401450d0020052802c00110290b0240024020090d00410121094113210641fea0c10021070c010b20054194016a41026a200541b0016a41026a2d00003a0000200541c0016a41086a20054198016a41086a290300370300200541c0016a410d6a20054198016a410d6a290000370000200520052f01b0013b01940120052005290398013703c001410021090b20054190016a41026a220420054194016a41026a2d00003a0000200541f8006a41086a2210200541c0016a41086a290300370300200541f8006a41106a200541c0016a41106a290300370300200520052f0194013b019001200520052903c00137037820090d02200541f3016a2010290300370000200541f8016a20054185016a290000370000200520052f0190013b01e001200520063600e701200520073600e301200520052903783700eb01200520042d00003a00e201200541e0016a2001460d00200541e0016a2001412010d004450d004191a1c1002107411121060c020b200542f0f2bda9c6add9b1f4003703b801200541b8016a2001200d200c427f410e10a801200541e0006a200c3703002005200d3703582005200f3703502005200e3703482005200336026c20052003360268024002400240411310272206450d002006410f6a41002800f9c340360000200641086a41002900f2c340370000200641002900eac340370000024020064113413310282206450d00200620012900003700132006412b6a200141186a290000370000200641236a200141106a2900003700002006411b6a200141086a290000370000200541e0016a41186a22074200370300200541e0016a41106a22034200370300200541e0016a41086a22094200370300200542003703e00120064133200541e0016a1000200541c0016a41186a2007290300370300200541c0016a41106a2003290300370300200541c0016a41086a2009290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541c8006a200541e0016a10b301200610292002280204211020022802002103024002400240200b41057622150d0041042116410421170c010b2015410274220610272216450d01201621170b200b450d030240024020150d00410410272216450d0141012115201621170b20174100360200200b417f6a210941012118410021024100210602400340024002400240024002400240024002400240201820024d0d00201720024102746a22072007280200200320066a2d00002006411f71746a360200024020092006460d00200641016a2206411f710d0920152018470d08201541016a22072015490d1220154101742204200720072004491b220741ffffffff03712007470d122007410274220441004e0d070c120b02402010450d00200310290b410021190340200541c8006a41186a2207200141186a290000370300200541c8006a41106a2203200141106a290000370300200541c8006a41086a2209200141086a290000370300200520012900003703482018410820184108491b2202410274221110272206450d0220062017201110ce042112411310272206450d032006410f6a41002800d0c440360000200641086a41002900c9c440370000200641002900c1c44037000020064113413310282206450d04200620052903483700132006412b6a2007290300370000200641236a20032903003700002006411b6a20092903003700002006413341e6001028221a450d05201820026b2118201720116a2117201a2019360033200541e0016a41186a22064200370300200541e0016a41106a22074200370300200541e0016a41086a22034200370300200542003703e001201a4137200541e0016a1000200541c0016a41186a2006290300370300200541c0016a41106a2007290300370300200541c0016a41086a2003290300370300200520052903e0013703c00141002106200541003602e801200542013703e00120052002360278200541f8006a200541e0016a1030410020052802e80122046b210720052802e40121090340200420066a2103201220066a280200210b02400240200920076a4104490d0020052802e00121020c010b200341046a22022003490d1420094101742210200220022010491b22104100480d140240024020090d002010102721020c010b20052802e00120092010102821020b2002450d08200520103602e401200520023602e001201021090b2005200341046a3602e801200220046a20066a200b3600002007417c6a21072011200641046a2206470d000b200541c0016a41202002200420066a100302402009450d00200210290b201a102920121029201941016a211920180d000b2015450d10201610290c100b41c8c3c000200220181037000b20114104102a000b41134101102a000b41334101102a000b41e6004101102a000b20104101102a000b0240024020150d002004102721160c010b201620154102742004102821160b2016450d0320162117200721150b201720184102746a4100360200200241016a2102201841016a21180b200b20064b0d000b41f4c2c0002006200b1037000b20044104102a000b41044104102a000b20064104102a000b41334101102a000b41134101102a000b2010450d00200310290b410021070240200a450d00200810290b0c020b102b000b0240200a450d00200810290b200241046a280200450d00200228020010290b200020063602042000200736020020054180026a24000bed0202047f017e230041d0006b22022400024002400240410f10272203450d00200341076a41002900f3ec42370000200341002900ecec423700002003410f411e10282203450d012003200136000f200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034113200241306a1000200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033037030820024100360230200241086a4120200241306a100521040240024020022802302201417f460d002002200136022c20022004360228200241306a200241286a102d20022802302205450d042002290234210602402001450d00200410290b20002006370204200020053602000c010b20004100360208200042013702000b20031029200241d0006a24000f0b410f4101102a000b411e4101102a000b418f89c3004133104e000bee08010c7f23004190016b22022400200241086a2001410676220310bc01024002400240024002400240200228021022042001413f7122014d0d002002280208200141216c6a220141003a000020012002290028370001200141096a200241286a41086a2204290000370000200141116a200241286a41106a2205290000370000200141196a200241286a41186a22062900003700002004200241086a41086a280200360200200220022903083703282003200241286a10ce01200241cdc1c500411210b5012002280200210120022802042103200442003703002002420037032841cdc1c5004112200241286a1004200241f0006a41086a220720042903003703002002200229032837037020022003417f6a417f20011b360228200241f0006a4110200241286a410410032006200041186a22082900003703002005200041106a22092900003703002004200041086a220a2900003703002002410036024820022000290000370328200241186a200241286a10b80102402002280220450d00410021030340200241d0006a41186a220b2008290000370300200241d0006a41106a220c2009290000370300200241d0006a41086a220d200a29000037030020022000290000370350411310272201450d032001410f6a41002800d0c440360000200141086a41002900c9c440370000200141002900c1c44037000020014113413310282201450d04200120022903503700132001412b6a200b290300370000200141236a200c2903003700002001411b6a200d2903003700002001413341e60010282201450d05200120033600332006420037030020054200370300200442003703002002420037032820014137200241286a1000200241f0006a41186a2006290300370300200241f0006a41106a20052903003703002007200429030037030020022002290328370370200241f0006a4120100c20011029200341016a21030240200228021c450d00200228021810290b20062008290000370300200520092900003703002004200a2900003703002002200336024820022000290000370328200241186a200241286a10b80120022802200d000b0b0240200228021c450d00200228021810290b411310272201450d042001410f6a41002800f9c340360000200141086a41002900f2c340370000200141002900eac34037000020014113413310282201450d05200120002900003700132001412b6a200041186a290000370000200141236a200041106a2900003700002001411b6a200041086a290000370000200241286a41186a22034200370300200241286a41106a22044200370300200241286a41086a220542003703002002420037032820014133200241286a1000200241f0006a41186a2003290300370300200241f0006a41106a2004290300370300200241f0006a41086a200529030037030020022002290328370370200241f0006a4120100c2001102920024190016a24000f0b41c8c3c000200120041037000b41134101102a000b41334101102a000b41e6004101102a000b41134101102a000b41334101102a000b830201047f230041c0006b2202240002400240410e10272203450d00200341066a41002900dac440370000200341002900d4c4403700002003410e411c10282203450d012003200036000e200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034112200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a1035200310290240200141046a280200450d00200128020010290b200241c0006a24000f0b410e4101102a000b411c4101102a000be80102027f027e230041206b2203240002400240411410272204450d00200441106a41002800bb8c40360000200441086a41002900b38c40370000200441002900ab8c4037000020044114413410282204450d01200420022900003700142004412c6a200241186a290000370000200441246a200241106a2900003700002004411c6a200241086a290000370000200341086a20044134108401200341086a41106a290300210520032903102106200328020821022004102920002005420020021b37030820002006420020021b370300200341206a24000f0b41144101102a000b41344101102a000bef0101057f230041c0006b220524000240024020030d00200041003602000c010b2003280208210620032802002103200541206a41186a22074200370300200541206a41106a22084200370300200541206a41086a220942003703002005420037032020044120200541206a1000200541186a2007290300370300200541106a2008290300370300200541086a200929030037030020052005290320370300200541003602202003200620054120200541206a10012104024020052802202203417f460d002000200336020420002004360200200041086a20033602000c010b200041003602000b200541c0006a24000bfd0101057f23004190016b22032400200341086a2002108c010240024020032d000822024102470d00200041003a00000c010b200341f0006a200341c8006a290300370300200341f8006a2204200341d0006a29030037030020034180016a2205200341d8006a29030037030020034188016a2206200341e0006a2903003703002003200341c0006a29030037036802402002450d00200041003a00000c010b2003413c6a2802002102200341386a280200210720002003290370370001200041013a0000200041196a2006290300370000200041116a2005290300370000200041096a20042903003700002002450d00200710290b20034190016a24000baf0201047f230041c0006b2202240002400240411710272203450d002003410f6a41002900af9342370000200341086a41002900a89342370000200341002900a0934237000020034117413710282203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002412041b8d6c50041004100100b210120031029200241c0006a24002001417f470f0b41174101102a000b41374101102a000b840102017f037e230041e0006b2203240020032002108c010240024020032d000022024102470d00420021040c010b2002410173ad2104200341106a2903002105200341086a290300210620020d00200341346a280200450d00200341306a28020010290b2000200637030820002004370300200041106a2005370300200341e0006a24000be6230a057f047e0c7f067e057f027e047f037e017f037e230041f0046b22022400200128020821032001280200210402400240200128020422050d00200421010c010b2005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000b0b200241e4006a20042f0106360200200241c8006a41186a4100360200200241dc006a2004360200200220033602682002410036025842002107200242003703502002200136024c20024100360248200241b0016a200241c8006a10d5010240024020022903d00122084202520d00420021094200210a0c010b200241b0016a41c0006a210b200241b0016a41386a210c200241b0016a410472210d2002418d026a210e200241b0016a41086a210320024190036a41386a210f200241e0016a2110200241f8016a211141808bc20041f88ac2006b200241e8036a6b200241e8036a41206a6a410f6a211242002107420021094200210a034020024190016a41186a2205200241b0016a41186a220129030037030020024190016a41106a2206200241b0016a41106a220429030037030020024190016a41086a22132003290300370300200241f0006a41086a2214200e41086a290000370300200241f0006a41106a2215200e41106a290000370300200241f0006a41186a2216200e41186a290000370300200220022903b001370390012002200e290000370370201029030021172011290300211820022903d801211920022903f001211a20022903e801211b200229038002211c200228028802211d20022d008c02211e200241b0026a41186a221f2005290300370300200241b0026a41106a22202006290300370300200241b0026a41086a2206201329030037030020022002290390013703b002200241d0026a41186a22052016290300370300200241d0026a41106a22132015290300370300200241d0026a41086a22152014290300370300200220022903703703d002024002400240024002400240024002400240024020084201520d00200241b0016a200241b0026a2019201710850120022d00c8012114200241306a200a2007200920022903b00120022903b8012004290300105e200241306a41106a2903002109200229033821072002290330210a20140d010b02400240024002400240201d0d00201b4201510d00201e41ff01714101470d010b200241b0016a200241b0026a108c010240024020022d00b0012214417f6a221641014b0d00024020160e020002000b20140d0620022802e401450d0620022802e00110290c060b200241f0026a41086a2214200b41086a290300370300200241f0026a41106a2216200b41106a290300370300200241f0026a41186a2221200b41186a2903003703002002200b2903003703f0022004290300212220022903b801212320022802ec01212420022802e801212520022802e401212620022802e001212720022903d801212820022903c801212920022903d00122174202510d042025417f4c0d020240024020250d00410121060c010b202510272206450d0420062027202510ce041a0b200f20022903f002370300200f41086a2014290300370300200f41106a2016290300370300200f41186a20212903003703002002202337039003200220243602c403200220253602c003200220253602bc03200220063602b803200220283703b003200220293703a003200220223703980320022017420151ad222a3703a8032025212b2025211f2029212c2023212d2022212e202421140c070b024020140d0020022802e401450d0020022802e00110290b420221170c030b201ca7210402400240201c422088a722050d00200421010c010b2005210620042101034020012802ec0321012006417f6a22060d000b0340200420042f01064102746a41ec036a28020021042005417f6a22050d000b0b200241003602d001200241003602c801200241003602c001200242003703b801200220013602b401200241003602b001200220043602c401200220042f01063602cc01200241b0016a10d6010c0b0b1039000b20254101102a000b201e41ff01710d010b201ca7210402400240201c422088a722050d00200421010c010b2005210620042101034020012802ec0321012006417f6a22060d000b0340200420042f01064102746a41ec036a28020021042005417f6a22050d000b0b2002201d3602d001200241003602c801200241003602c001200242003703b801200220013602b401200241003602b001200220043602c401200220042f01063602cc01200241b0016a10d6010c070b200241206a419188c5004117109401200228022021142002290328210820034200370300200242003703b001419188c5004117200241b0016a1004200241e8036a41086a22162003290300370300200220022903b0013703e8032002200842017c420120141b22083703b001200241e8036a4110200241b0016a41081003412010272214450d03201420022903b002370000201441186a201f290300370000201441106a2020290300370000201441086a20062903003700002014412041c00010282214450d0220142008370020200142003703002004420037030020034200370300200242003703b00120144128200241b0016a1000200241e8036a41186a2001290300370300200241e8036a41106a200429030037030020162003290300370300200220022903b0013703e803413710272206450d01200642bac6a1cbc68dd9aff300370000200642f4dec98bf6ac999de400370008200641e5cc85ab073600102006413a3a0016200641ece8013b0014200620022903e803370017200620022f01f0033b001f200620022801f203360021200620022f01f6033b0025200620022d00f8033a0027200620022d00f9033a0028200620022d00fa033a0029200620022d00fb033a002a200620022d00fc033a002b200620022d00fd033a002c200620022d00fe033a002d200620022d00ff033a002e200620022d0080043a002f200620022d0081043a0030200620022d0082043a0031200620022d0083043a0032200620022d0084043a0033200620022d0085043a0034200620022d0086043a0035200620022d0087043a003620141029200241106a41888dc300410d1094012002290318210820022802102116200f20022903d00237000041082114200f41086a200241d0026a41086a290300370000200f41106a2013290300370000200f41186a2005290300370000427f212d2002427f370398032002427f37039003200241083602c403200220123602c0034137212b200241373602bc03200220063602b8034200212a200242003703a80320022008420020161b222c3703a0032012211f427f212e0b0240201b4201520d002002201a370390032002201837039803201a212d2018212e0b0240201e41ff0171450d00200f20022903d002370000200f41186a2005290300370000200f41106a2013290300370000200f41086a20152903003700000b0240201d450d00200241888dc300410d1094014201212a200242013703a80320022002290308420020022802001b3703b0030b201ca7210502400240201c422088a722150d00200521130c010b2015211620052113034020132802ec0321132016417f6a22160d000b0340200520052f01064102746a41ec036a28020021052015417f6a22150d000b0b20052f010621152002201d3602880420022015360284042002410036028004200220053602fc03200241003602f803200242003703f003200220133602ec03200241003602e803200241b0016a200241e8036a10d70120022802b0014101470d04034020024190046a41186a200d41186a290200221c37030020024190046a41106a200d41106a290200220837030020024190046a41086a200d41086a290200221b3703002002200d29020022193703900420022802d401210520022802d801212020022802dc012113200241b0046a41186a201c370300200241b0046a41106a2008370300200241b0046a41086a201b370300200220193703b004200142003703002004420037030020034200370300200242003703b001200241b0046a4120200241b0016a1000200241d0046a41186a22162001290300370300200241d0046a41106a221d2004290300370300200241d0046a41086a221e2003290300370300200220022903b0013703d004200241003602b0012006201f200241d0046a4120200241b0016a10012121024020022802b0012215417f460d00201420156b21142015450d00202110290b024002402005450d00200142003703002004420037030020034200370300200242003703b001200241b0046a4120200241b0016a100020162001290300370300201d2004290300370300201e2003290300370300200220022903b0013703d0042006201f200241d0046a4120200520131011201420136a21142020450d01200510290c010b200142003703002004420037030020034200370300200242003703b001200241b0046a4120200241b0016a100020162001290300370300201d2004290300370300201e2003290300370300200220022903b0013703d0042006201f200241d0046a412010020b200241b0016a200241e8036a10d70120022802b0014101470d040c000b0b41374101102a000b41c0004101102a000b41204101102a000b200220143602c4030b200241e8036a10d601200241e8036a41186a2204200241f0026a41186a290300370300200241e8036a41106a2201200241f0026a41106a290300370300200241e8036a41086a2205200241f0026a41086a290300370300200220022903f0023703e8030240024020174202510d00200c20022903e803370300200c41086a2005290300370300200c41106a2001290300370300200c41186a2004290300370300200220233703b001200220243602e401200220263602dc01200220273602d801200220283703d001200220173703c801200220293703c001200220223703b801200220253602e0014101210402402025201f470d000240024020272006460d0020272006202510d0040d0220242014470d020c010b20242014470d010b200c200f412010d0040d002023202d852022202e85844200520d002029202c520d002017a72201202aa7470d002001410146202820022903b003527121040b02402026450d00202710290b20044102460d002004450d010b200320024190036a41d80010ce041a200241003a00b001200241b0026a200241b0016a10d8010c010b202b450d00200610290b200241b0016a200241c8006a10d50120022903d00122084202520d000b0b200241c8006a10d90102400240024002400240200a500d004200211c200241b0016a41086a22044200370300200242003703b00141b18ac0004116200241b0016a100420024190036a41086a2004290300370300200220022903b00137039003200241003602b00120024190036a4110200241b0016a100521010240024020022802b0012204417f470d00420021080c010b200242003703b801200242003703b001200241b0016a20012004411020044110491b10ce041a2004410f4d0d02200241b8016a290300210820022903b001211c200110290b200241b0016a41086a22044200370300200242003703b00141b18ac0004116200241b0016a100420024190036a41086a2004290300370300200220022903b0013703900320024200200820097d201c200754ad7d221b201c20077d2219201c56201b200856201b2008511b22041b3703b80120024200201920041b3703b001200241b0016a21040c030b2007200984500d0141eca9c1001058000b418f89c3004133104e000b4200211c200241b0016a41086a22044200370300200242003703b00141b18ac0004116200241b0016a100420024190036a41086a2004290300370300200220022903b00137039003200241003602b00120024190036a4110200241b0016a100521010240024020022802b0012204417f470d00420021080c010b200242003703b801200242003703b001200241b0016a20012004411020044110491b10ce041a2004410f4d0d02200241b8016a290300210820022903b001211c200110290b200241b0016a41086a22044200370300200242003703b00141b18ac0004116200241b0016a100420024190036a41086a2004290300370300200220022903b00137039003200220083703b8012002201c3703b001200241b0016a21040b20024190036a4110200441101003200241f0046a24000f0b418f89c3004133104e000bf90503087f017e017f23004180026b2202240002400240024020012802202203450d0020012003417f6a36022020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341e0006c6a41e8026a41e00010ce041a2001200341016a36020c200120043602082001200536020420024180016a41186a200629030037030020024180016a41106a200829030037030020024180016a41086a2009290300370300200220022903003703800120024180016a41206a200241206a41e00010ce041a200020024180016a41800110ce041a0c020b200042023703200c010b2001280200210702400240200528020022030d002004ad210a410021030c010b200741016a210720053301044220862004ad84210a0b20051029200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b034002400240200328020022050d002004ad210a410021050c010b200741016a210720033301044220862004ad84210a0b20031029200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641e0006c6a41e8026a41e00010ce041a200641027420056a418c0b6a280200210302402007417f6a2205450d00034020032802880b21032005417f6a22050d000b0b2001410036020c20012004360208200120033602042001410036020020024180016a41186a200829030037030020024180016a41106a200929030037030020024180016a41086a200b290300370300200220022903003703800120024180016a41206a200241206a41e00010ce041a200020024180016a41800110ce041a0b20024180026a24000bb00101037f230041306b220124002001200010d701024020012802004101470d000340024020012802242202450d002001280228450d00200210290b2001200010d70120012802004101460d000b0b024020002802042202418883c000460d0020022802002103200210292003450d0020032802002100200310292000450d00024020002802002202450d000340200010292002210020022802002203210220030d000b0b200010290b200141306a24000bdd0605057f047e017f017e047f23004190016b2202240002400240024020012802202203450d0020012003417f6a36022020012802082104200128020c2203200128020422052f01064f0d01200241e0006a41186a200520034105746a220641206a2900002207370300200241e0006a41106a200641186a2900002208370300200241e0006a41086a200641106a29000022093703002002200641086a290000220a370360200241306a41086a20052003410c6c6a220641f0026a280200220b360200200641e8026a290200210c2001200341016a36020c20012004360208200120053602042002200c3703302000200a3702042000410c6a2009370200200041146a20083702002000411c6a2007370200200041246a200c3702002000412c6a200b360200200041013602000c020b200041003602000c010b2001280200210602400240200528020022030d002004ad210c410021030c010b200641016a210620053301044220862004ad84210c0b20051029200ca7210402400240200c422088a7220b20032f01064f0d00200321050c010b034002400240200328020022050d002004ad210c410021050c010b200641016a210620033301044220862004ad84210c0b20031029200ca7210420052103200c422088a7220b20052f01064f0d000b0b200241306a41186a220d2005200b4105746a220341206a290000370300200241306a41106a220e200341186a290000370300200241306a41086a220f200341106a2900003703002002200341086a290000370330200241d0006a41086a22102005200b410c6c6a220341f0026a2802003602002002200341e8026a290200370350200b41027420056a41f0036a280200210302402006417f6a2205450d00034020032802ec0321032005417f6a22050d000b0b2001410036020c200120043602082001200336020420014100360200200241e0006a41186a200d290300220c370300200241e0006a41106a200e2903002207370300200241e0006a41086a200f290300220837030020024188016a201028020022033602002000200229033022093702042000410c6a2008370200200041146a20073702002000411c6a200c370200200041246a2002290350220c3702002000412c6a2003360200200220093703602002200c37038001200041013602000b20024190016a24000bd00201047f230041c0006b2202240002400240411710272203450d002003410f6a41002900af9342370000200341086a41002900a89342370000200341002900a0934237000020034117413710282203450d01200320002900003700172003412f6a200041186a290000370000200341276a200041106a2900003700002003411f6a200041086a290000370000200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a10dc0220031029024020012d00000d00200141346a280200450d00200141306a28020010290b200241c0006a24000f0b41174101102a000b41374101102a000bca0201067f230041b0016b22012400200141086a200010d501024020012903284202510d000340200128026021022001280258210302400240200128025c22040d00200321050c010b2004210620032105034020052802ec0321052006417f6a22060d000b0340200320032f01064102746a41ec036a28020021032004417f6a22040d000b0b200120023602a801200141003602a001200141003602980120014200370390012001200536028c0120014100360288012001200336029c01200120032f01063602a40120014188016a10d601200141086a200010d50120012903284202520d000b0b024020002802042203418883c000460d0020032802002104200310292004450d0020042802002105200410292005450d00024020052802002203450d000340200510292003210520032802002204210320040d000b0b200510290b200141b0016a24000b821e04027f027e097f027e230041c00d6b220824000240024002402001280234200128025022092802b801460d00200442002004290308220a200941c0006a2903007d220b200b200a5622091b3703082009450d01200041013a0000200041086a412a360200200041046a419cb5c3003602000c020b200041013a0000200041086a4124360200200041046a41d3b4c3003602000c010b200841106a41186a200141f4006a290000370300200841106a41106a200141ec006a290000370300200841106a41086a200141e4006a2900003703002008200129005c370310200841c0026a41186a22094200370300200841c0026a41106a220c4200370300200841c0026a41086a220d4200370300200842003703c00220062007200841c0026a1000200841e00a6a41186a2009290300370300200841e00a6a41106a200c290300370300200841e00a6a41086a200d290300370300200820082903c0023703e00a024002400240024002400240024002400240412010272209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c00010282209450d01200920082903e00a370020200941386a200841e00a6a41186a290300370000200941306a200841e00a6a41106a290300370000200941286a200841e00a6a41086a290300370000200941c00041800110282209450d0220092008290310370040200941d8006a200841106a41186a290300370000200941d0006a200841106a41106a290300370000200941c8006a200841106a41086a290300370000200841c0026a41186a220c4200370300200841c0026a41106a220d4200370300200841c0026a41086a220e4200370300200842003703c002200941e000200841c0026a1000200841306a41186a220f200c290300370300200841306a41106a220c200d290300370300200841306a41086a220d200e290300370300200820082903c00237033020091029200841c4016a200d290300370200200841cc016a200c290300370200200841d4016a200f290300370200200841e0006a41c8006a4200370300200841a0016a42808080808001370300200841e0006a41306a41f8b4c3003602002008418c016a2001411c6a221036020020084184016a420037020020084180016a2211418883c000360200200820082903303702bc0120084208370398012008410036027c20084100360270200820012802583602b801200820012903503703b0012008200128023441016a360294012001290300210a200820012903083703682008200a370360200841e0016a41186a200541186a290000370300200841e0016a41106a200541106a290000370300200841e0016a41086a200541086a2900003703002008410136027c200820052900003703e0012010200841306a10e40121092008200828027c417f6a220c36027c024020090d00200c0d042008417f36027c200841a0026a41186a200841306a41186a290300370300200841a0026a41106a200841306a41106a290300370300200841a0026a41086a200841306a41086a290300370300200820082903303703a00202400240200828028001220f418883c000460d0020082802840121120c010b41002112200841e00a6a410041e00210cd041a200841c0026a410041a00810cd041a41880b1027220f450d06200f41003b0106200f4100360200200f41086a200841e00a6a41e00210ce041a200f41e8026a200841c0026a41a00810ce041a20084100360284012008200f360280010b200841e0006a411c6a2113024002400340200f41086a210c200f2f0106221441057421094100210d024003402009450d01200841a0026a200c412010d004220e450d03200941606a2109200d41016a210d200c41206a210c200e417f4a0d000b200d417f6a21140b02402012450d002012417f6a2112200f20144102746a41880b6a280200210f0c010b0b20084180026a41186a200841a0026a41186a290300220a37030020084180026a41106a200841a0026a41106a290300220b37030020084180026a41086a200841a0026a41086a2903002215370300200820082903a002221637038002200841fc0a6a2015370200200841840b6a200b3702002008418c0b6a200a370200200820084188016a3602f00a200820143602ec0a200820113602e80a2008200f3602e40a200841003602e00a200820163702f40a200841f4026a4200370200200841003a00fc02200842003703c0022008418883c0003602f002200842003703d802200841e00a6a200841c0026a10de0121090c010b200f200d41e0006c6a41e8026a21090b200841f8016a290300210a20094201370318200941013a003c200941286a427f370300200941206a427f3703002009413d6a20082903e001370000200941d5006a200a370000200941cd006a200841f0016a290300370000200941c5006a200841e8016a2903003700002008200828027c41016a36027c200841086a20044101200841106a200841306a20022003200841e0006a10a20302402008280208220f450d00200828020c21010c0a0b200841c0026a200520082802b801280200108402024020082802c0024101470d00200841c8026a280200210120082802c402210f0c0a0b200841a0026a41186a200841c0026a410472220941186a280200220c360200200841e00a6a41106a200941086a290200370300200841e00a6a41186a220d200941106a290200370300200841800b6a200c360200200841063602e40a200841bd8fc5003602e00a200820092902003703e80a20082802b40121092008200841e0006a3602e0022008290360210a2008290368210b200841ec026a200841106a41086a290300370200200841f4026a200841106a41106a290300370200200841fc026a200841106a41186a290300370200200820033703c802200820023703c0022008200b3703d8022008200a3703d002200820082903103702e40220084100360288022008420137038002200841a0026a2009200841e00a6a200841c0026a2006200720084180026a2004106220082802a0020e03070608070b41f7a5c100210f412a21010c080b41204101102a000b41c0004101102a000b4180014101102a000b41c8a8c1004110200841c0026a41f0a8c10010a201000b41880b4108102a000b200841a0026a41086a280200450d0020082802a40210290b200841c0026a41086a200841106a41086a290300370300200841c0026a41106a200841106a41106a290300370300200841c0026a41186a200841106a41186a290300370300200841a0026a41086a200841306a41086a290300370300200841a0026a41106a200841306a41106a290300370300200841a0026a41186a200841306a41186a290300370300200820082903103703c002200820082903303703a0020240024020082802a0012209200828029c01460d00200828029801210c0c010b02400240200941016a220c2009490d002009410174220d200c200c200d491b220dad42e8007e2202422088a70d002002a7220e4100480d000240024020090d00200e1027210c0c010b200828029801200941e8006c200e1028210c0b200c450d012008200d36029c012008200c3602980120082802a00121090c020b102b000b200e4108102a000b200c200941e8006c6a220941013a0000200920082903c002370001200941096a200841c0026a41086a220c290300370000200941116a200841c0026a41106a290300370000200941196a200841c0026a41186a290300370000200941216a20082903a002370000200941296a200841a0026a41086a290300370000200941316a200841a0026a41106a290300370000200941396a200841a0026a41186a290300370000200941d0006a2008418f026a290000370000200941c9006a20084180026a41086a290000370000200941c1006a200829008002370000200941e0006a410036020020094201370358200820082802a00141016a220d3602a0010240200841e00a6a41186a280200450d00200841f40a6a280200102920082802a001210d0b200c201341086a290200370300200841d0006a41086a200841cc026a280200360200200820132902003703c002200820082902c40237035020082802ac01210e20082802a801210520082802a4012109200828029c012104200828029801210c02402008280270220f450d00200841f4006a280200450d00200f10290b200841e00a6a41086a200841d0006a41086a280200220f3602002008200829035022023703e00a200841c0026a41086a200f360200200820023703c0022010200841c0026a10e6012008200c200d41e8006c6a3602cc022008200c3602c802200820043602c4022008200c3602c002200141386a200841c0026a102c20082009200e41a8016c6a3602cc02200820093602c802200820053602c402200820093602c002200141c4006a200841c0026a1026200041196a200841c8006a290300370000200041116a200841c0006a290300370000200041096a200841306a41086a29030037000020002008290330370001200041003a00000c020b200841a0026a41086a280200210120082802a402210f200d280200450d00200841f40a6a28020010290b024020082802702209450d00200841f4006a280200450d00200910290b2008280288012105200828028001210902400240200828028401220d0d002009210c0c010b200d210e2009210c0340200c2802880b210c200e417f6a220e0d000b0340200920092f01064102746a41880b6a2802002109200d417f6a220d0d000b0b200841dc026a20092f0106360200200841d8026a4100360200200841d4026a2009360200200820053602e002200841003602d002200842003703c8022008200c3602c402200841003602c002200841c0026a10d901024020082802a001220c450d002008280298012109200c41e8006c210c03400240200941dc006a280200450d00200941d8006a28020010290b024020092d00004105490d00200941286a280200450d00200941246a28020010290b200941e8006a2109200c41987f6a220c0d000b0b0240200828029c01450d0020082802980110290b024020082802ac012209450d00200941a8016c210c20082802a40141206a210903402009103d200941a8016a2109200c41d87e6a220c0d000b0b024020082802a801450d0020082802a40110290b200041086a2001360200200041046a200f360200200041013a00000b200841c00d6a24000bff18012e7f230041b00d6b220324002003200236020420032001360200200341086a41086a220142003703002003420037030841e28fc3004115200341086a1004200341900d6a41086a2001290300370300200320032903083703900d200341e80c6a200341900d6a10ba02024002400240024020032802ec0c22040d0041012104410021050c010b20032802f00c2105200341e80c6a410c6a28020022020d010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b20032c00e80c2101200341086a410041e00c10cd041a200441206a21064100210741002108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f41002120410021214100212241002123410021244100212541002126200420024105746a22272128200421294100212a41d100212b02400340202a212c0240024002402001450d00024020042027460d00200141016a212d20282102202921010340202720022001200246222e1b210220272028202e1b212820042001202e1b222e41206a2101202d417f6a222d0d000c030b0b200141016a2101034020282029460d05202941206a21292001417f6a22010d000b202941606a212e202921010c010b024020292028460d00202941206a21012029212e0c020b20042027460d0320272128200621012004212e0b202e450d020b200121292003280204212d2003280200212f200341003602980d200342013703900d02400240024002400240410110272201450d002001202c3a000020034281808080103702940d200320013602900d2003202d36028c0d2003418c0d6a200341900d6a10300240024020032802940d220220032802980d22306b202d490d0020032802900d21010c010b2030202d6a22012030490d042002410174222a20012001202a491b222a4100480d040240024020020d00202a102721010c010b20032802900d2002202a102821010b2001450d022003202a3602940d200320013602900d202a21020b20032030202d6a222a3602980d200120306a202f202d10ce041a024002402002202a6b4120490d00202a41206a21300c010b202a41206a2230202a490d042002410174222d20302030202d491b222d4100480d040240024020020d00202d102721010c010b20012002202d102821010b2001450d032003202d3602940d200320013602900d202d21020b2001202a6a222d202e290000370000202d41186a202e41186a290000370000202d41106a202e41106a290000370000202d41086a202e41086a290000370000200341900d6a41186a222e4200370300200341900d6a41106a222d4200370300200341900d6a41086a222a4200370300200342003703900d20012030200341900d6a1000200341e80c6a41186a2230202e290300370300200341e80c6a41106a222e202d290300370300200341e80c6a41086a222d202a290300370300200320032903900d3703e80c02402002450d00200110290b202b417f6a212b202c41016a212a200341086a202c4103704105746a220120032903e80c370000200141186a2030290300370000200141106a202e290300370000200141086a202d290300370000410021020340202c202c41036e222e417d6c6a4102470d05200341086a20026a220141df006a2d0000222d2001411f6a2d0000220771202d2007722001413f6a2d00007172211e200141de006a2d0000222d2001411e6a2d0000220771202d2007722001413e6a2d00007172211d200141dd006a2d0000222d2001411d6a2d0000220771202d2007722001413d6a2d00007172211c200141dc006a2d0000222d2001411c6a2d0000220771202d2007722001413c6a2d00007172211b200141db006a2d0000222d2001411b6a2d0000220771202d2007722001413b6a2d00007172211a200141da006a2d0000222d2001411a6a2d0000220771202d2007722001413a6a2d000071722119200141d9006a2d0000222d200141196a2d0000220771202d200772200141396a2d000071722118200141d8006a2d0000222d200141186a2d0000220771202d200772200141386a2d000071722117200141d7006a2d0000222d200141176a2d0000220771202d200772200141376a2d000071722116200141d6006a2d0000222d200141166a2d0000220771202d200772200141366a2d000071722115200141d5006a2d0000222d200141156a2d0000220771202d200772200141356a2d000071722114200141d4006a2d0000222d200141146a2d0000220771202d200772200141346a2d000071722113200141d3006a2d0000222d200141136a2d0000220771202d200772200141336a2d000071722112200141d2006a2d0000222d200141126a2d0000220771202d200772200141326a2d000071722111200141d1006a2d0000222d200141116a2d0000220771202d200772200141316a2d000071722110200141d0006a2d0000222d200141106a2d0000220771202d200772200141306a2d00007172210f200141cf006a2d0000222d2001410f6a2d0000220771202d2007722001412f6a2d00007172210e200141ce006a2d0000222d2001410e6a2d0000220771202d2007722001412e6a2d00007172210d200141cd006a2d0000222d2001410d6a2d0000220771202d2007722001412d6a2d00007172210c200141cc006a2d0000222d2001410c6a2d0000220771202d2007722001412c6a2d00007172210b200141cb006a2d0000222d2001410b6a2d0000220771202d2007722001412b6a2d00007172210a200141ca006a2d0000222d2001410a6a2d0000220771202d2007722001412a6a2d000071722109200141c9006a2d0000222d200141096a2d0000220771202d200772200141296a2d000071722108200141c8006a2d0000222d200141086a2d0000220771202d200772200141286a2d000071722107200141c7006a2d0000222d200141076a2d0000221f71202d201f72200141276a2d00007172211f200141c6006a2d0000222d200141066a2d0000222071202d202072200141266a2d000071722120200141c5006a2d0000222d200141056a2d0000222171202d202172200141256a2d000071722121200141c4006a2d0000222d200141046a2d0000222271202d202272200141246a2d000071722122200141c3006a2d0000222d200141036a2d0000222371202d202372200141236a2d000071722123200141c2006a2d0000222d200141026a2d0000222471202d202472200141226a2d000071722124200141c1006a2d0000222d200141016a2d0000222571202d202572200141216a2d000071722125200141c0006a2d0000222d20012d0000222671202d202672200141206a2d000071722126200241800c460d05200341086a2002202e410574202c41096e41e0006c6b6a6a220141ff006a201e3a0000200141fe006a201d3a0000200141fd006a201c3a0000200141fc006a201b3a0000200141fb006a201a3a0000200141fa006a20193a0000200141f9006a20183a0000200141f8006a20173a0000200141f7006a20163a0000200141f6006a20153a0000200141f5006a20143a0000200141f4006a20133a0000200141f3006a20123a0000200141f2006a20113a0000200141f1006a20103a0000200141f0006a200f3a0000200141ef006a200e3a0000200141ee006a200d3a0000200141ed006a200c3a0000200141ec006a200b3a0000200141eb006a200a3a0000200141ea006a20093a0000200141e9006a20083a0000200141e8006a20073a0000200141e7006a201f3a0000200141e6006a20203a0000200141e5006a20213a0000200141e4006a20223a0000200141e3006a20233a0000200141e2006a20243a0000200141e1006a20253a0000200141e0006a20263a0000202e212c200241e0006a220241e00c470d000c050b0b41014101102a000b202a4101102a000b202d4101102a000b102b000b41002101202b0d000b0b2000201e3a001f2000201d3a001e2000201c3a001d2000201b3a001c2000201a3a001b200020193a001a200020183a0019200020173a0018200020163a0017200020153a0016200020143a0015200020133a0014200020123a0013200020113a0012200020103a00112000200f3a00102000200e3a000f2000200d3a000e2000200c3a000d2000200b3a000c2000200a3a000b200020093a000a200020083a0009200020073a00082000201f3a0007200020203a0006200020213a0005200020223a0004200020233a0003200020243a0002200020253a0001200020263a00000b02402005450d00200410290b200341b00d6a24000b850804057f017e017f017e02400240024002402002450d00410020016b410020014103711b2103200241796a4100200241074b1b210441002105034002400240200120056a2d000022064118744118752207417f4a0d0042808080801021080240200641a6d4c5006a2d0000417e6a220941024d0d0042808080808020210a0c070b0240024002400240024020090e03000102000b200541016a22062002490d024200210a0c090b4200210a200541016a220920024f0d08200120096a2d0000210902400240200641a07e6a2206410d4b0d000240024020060e0e0002020202020202020202020201000b200941e0017141a001460d0242808080808020210a0c0c0b02402009411874411875417f4c0d0042808080808020210a0c0c0b200941ff017141a001490d0142808080808020210a0c0b0b02402007411f6a41ff0171410b4b0d0002402009411874411875417f4c0d0042808080808020210a0c0c0b200941ff017141c001490d0142808080808020210a0c0b0b0240200941ff017141bf014d0d0042808080808020210a0c0b0b0240200741fe017141ee01460d0042808080808020210a0c0b0b2009411874411875417f4c0d0042808080808020210a0c0a0b42002108200541026a220620024f0d09200120066a2d000041c00171418001460d020c070b4200210a200541016a220920024f0d07200120096a2d0000210902400240200641907e6a220641044b0d000240024020060e050002020201000b200941f0006a41ff01714130490d0242808080808020210a0c0b0b02402009411874411875417f4c0d0042808080808020210a0c0b0b200941ff0171419001490d0142808080808020210a0c0a0b0240200941ff017141bf014d0d0042808080808020210a0c0a0b02402007410f6a41ff017141024d0d0042808080808020210a0c0a0b2009411874411875417f4c0d0042808080808020210a0c090b200541026a220620024f0d07200120066a2d000041c00171418001470d0642002108200541036a220620024f0d08200120066a2d000041c00171418001460d01428080808080e000210a42808080801021080c080b42808080808020210a4280808080102108200120066a2d000041c00171418001470d070b200641016a21050c010b0240200320056b4103710d000240200520044f0d000340200120056a220641046a280200200628020072418081828478710d01200541086a22052004490d000b0b200520024f0d010340200120056a2c00004100480d022002200541016a2205470d000c040b0b200541016a21050b20052002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210a42808080801021080c010b420021080b2000200a2008842005ad84370204200041013602000ba00501097f230041206b22052400024002400240200128020041016a220641004c0d0020012006360200200141086a2802002107200141046a220821060340200628020022092f0106220a410574210b410021064100210c0240024002400340200b2006460d0102402002200920066a41086a412010d004220d0d00410021060c030b200641206a2106200c41016a210c200d417f4a0d000b200c417f6a210a0b20070d014101210641002107200a210c0b200541186a200c360200200541146a2008360200200541086a41086a20093602002005200736020c2005200636020820060d032009200c41e0006c6a2206419c036a280200210720064198036a2208210602400340200628020022092f0106220a410574210b410021064100210c02400240024002400340200b2006460d0102402004200920066a41086a412010d004220d0d00410021060c030b200641206a2106200c41016a210c200d417f4a0d000b200c417f6a210a0b20070d014101210641002107200a210c0b200541186a200c360200200541086a410c6a2008360200200541106a20093602002005200736020c2005200636020820060d0702400240200941e8026a2206200c410c6c6a280200220d0d004100210c0c010b2006200c410c6c6a2802082206417f4c0d02024020060d004101210c0c010b20061027220c450d04200c200d200610ce041a0b200020063602042000200c360200200041086a20063602000c080b2007417f6a21072009200a4102746a41ec036a21060c010b0b1039000b20064101102a000b2007417f6a21072009200a4102746a41880b6a21060c000b0b41d8a8c1004118200541086a4180a9c10010a201000b20002001280210200220032004200141146a28020028020c1106000b20012001280200417f6a360200200541206a24000b8f1901187f230041d0116b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241206a41186a22062000412c6a290000370300200241206a41106a2207200041246a290000370300200241206a41086a22082000411c6a29000037030020022000290014370320200241a0026a200141e00010ce041a024002400240024020032f01062201410b490d00200241b0036a410041e00210cd041a20024198066a410041a00810cd041a0240024041880b10272209450d00200941003b010620094100360200200941086a200241b0036a41e00210ce042101200941e8026a20024198066a41a00810ce042106200220032f00c8013b01ac032002200341ca016a2d00003a00ae03200220032900db01370398032002200341e0016a29000037009d03200341cb016a280000210a200341cf016a280000210b200341d3016a280000210c200341d7016a280000210d20024198066a200341a8076a41e00010ce041a2001200341e8016a20032f010641796a220041057410ce042101200620034188086a200041e0006c10ce042106200341063b0106200920003b0106200220022f01ac033b019403200220022d00ae033a0096032002200229039803370380032002200229009d0337008503200241b0036a20024198066a41e00010ce041a0240024020044107490d00200441057420016a41c07e6a2001200441796a22074105746a2201200041ffff037120076b41057410cf041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200441e0006c20066a220041c07b6a200041e07a6a220e200941066a22002f010020076b41e0006c10cf041a200e200241a0026a41e00010ce041a0c010b200341086a20044105746a220141206a2001200341066a22002f010020046b41057410cf041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200341e8026a200441e0006c6a220e41e0006a200e20002f010020046b41e0006c10cf041a200e200241a0026a41e00010ce041a0b20024188026a41026a220420022d0096033a0000200020002f010041016a3b0100200220022f0194033b01880220022002290380033703800120022002290085033700850120024190016a200241b0036a41e00010ce041a2002411c6a41026a220f20042d00003a0000200220022f0188023b011c2002200229038001370308200220022900850137000d200241206a20024190016a41e00010ce041a20032802002206450d0320032f0104211020024198066a410272211103402002419c026a41026a2212200f2d00003a0000200220022f011c3b019c0220022002290308370388022002200229000d37008d02200241a0026a200241206a41e00010ce041a201041ffff0371210702400240024020062f01062203410b490d002011410041b20b10cd041a41b80b10272201450d0520014100360200200141046a20024198066a41b40b10ce041a200220062f00c8013b01ac032002200641ca016a2d00003a00ae03200220062900db01370398032002200641e0016a29000037009d03200641cb016a2800002113200641cf016a2800002114200641d3016a2800002115200641d7016a280000211620024198066a200641a8076a41e00010ce041a200141086a200641e8016a20062f0106220041796a220341057410ce042117200141e8026a20064188086a200341e0006c10ce042118200141880b6a200641a40b6a2000417a6a220841027410ce042119200641063b0106200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241b0036a20024198066a41e00010ce041a200220022d00ae0322033a009603200220022f01ac0322003b0194032002200229009d033700850320022002290398033703800320024194066a41026a220820033a0000200220003b01940620022002290380033703800120022002290085033700850120024198066a200241b0036a41e00010ce041a201041ffff037122004107490d0120172007417a6a22044105746a2017200741796a22034105746a220020012f010620036b41057410cf041a200041186a200229008d023700002000200d36000f2000200c36000b2000200b3600072000200a360003200041026a20122d00003a0000200020022f019c023b00002000200229038802370013200741e0006c20186a220041c07b6a200041e07a6a220020012f010620036b41e0006c10cf041a2000200241a0026a41e00010ce041a200120012f010641016a22003b01062007410274220a20196a416c6a201920044102746a2210200041ffff0371220720046b41027410cf041a2010200936020020072004490d022001200a6a41f00a6a2100034020002802002204200341016a22033b010420042001360200200041046a210020032007490d000c030b0b200641086a2200200741016a22044105746a200020074105746a2200200320076b220141057410cf041a2000200d36000f2000200c36000b2000200b3600072000200a360003200041026a2002419c026a41026a2d00003a0000200020022f019c023b00002000200229038802370013200041186a200229008d023700002006200741e0006c6a220041c8036a200041e8026a2200200141e0006c10cf041a2000200241a0026a41e00010ce041a2006200341016a22033b01062007410274200641880b6a22006a41086a200020044102746a2200200341ffff037120046b41027410cf041a20002009360200201041ffff037120062f010622034f0d07200920043b010420092006360200200420034f0d072003417f6a210120062004417f6a22034102746a41900b6a2100034020002802002204200341026a3b010420042006360200200041046a21002001200341016a2203470d000c080b0b200641086a2203200741016a22044105746a200320074105746a220320062f0106221020076b221941057410cf041a2003200d36000f2003200c36000b2003200b3600072003200a360003200341026a20122d00003a0000200320022f019c023b00002003200229038802370013200341186a200229008d02370000200641e8026a200741e0006c6a220341e0006a2003201941e0006c10cf041a2003200241a0026a41e00010ce041a2006201041016a22033b010620074102742219200641880b6a22106a41086a201020044102746a2210200341ffff037120046b41027410cf041a20102009360200200020062f010622044f0d00200620196a418c0b6a2103034020032802002200200741016a22073b010420002006360200200341046a210320042007470d000b0b20024184026a41026a220320082d00003a0000200220022f0194063b01840220022002290380013703f00120022002290085013700f50120024190016a20024198066a41e00010ce041a200f20032d00003a0000200220022f0184023b011c200220022903f001370308200220022900f50137000d200241206a20024190016a41e00010ce041a0240200628020022030d002013210a2016210d2015210c2014210b200121090c050b20062f010421102013210a2016210d2015210c2014210b20032106200121090c000b0b41880b4108102a000b41b80b4108102a000b200320044105746a220041286a200041086a2210200120046b41057410cf041a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000201020022903203700002003200441e0006c6a220041c8036a200041e8026a220e20032f010620046b41e0006c10cf041a200e200241a0026a41e00010ce041a200320032f010641016a3b01060c010b20024198066a410272410041b20b10cd041a41b80b10272203450d0120034100360200200341046a20024198066a41b40b10ce041a2003200528020022003602880b200520033602002005200528020441016a360204200041003b010420002003360200200320032f010622044105746a220041086a20022f011c3b00002000410a6a2002411c6a41026a2d00003a0000200041176a200d360000200041136a200c3600002000410f6a200b3600002000410b6a200a3600002000411b6a2002290308370000200041206a200229000d3700002003200441e0006c6a41e8026a200241206a41e00010ce041a200341880b6a200441016a22004102746a2009360200200320003b0106200920003b0104200920033602000b200241d0116a2400200e0f0b41b80b4108102a000bc31e03087f037e127f23004180076b22042400200441e0006a41186a200241186a290000370300200441e0006a41106a200241106a290000370300200441e0006a41086a200241086a2900003703002004200229000037036002400240024002400240024002400240024020012802002205418883c000460d00200128020421060c010b41002106200441e8026a410041e00210cd041a200441c0016a410041840110cd041a41ec0310272205450d01200541003b010620054100360200200541086a200441e8026a41e00210ce041a200541e8026a200441c0016a41840110ce041a20014100360204200120053602000b02400340200541086a2107200541066a210820052f0106220941057421024100210a0240024003402002450d01200441e0006a2007412010d004220b450d02200241606a2102200a41016a210a200741206a2107200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200520094102746a41ec036a28020021050c010b0b200441e8026a41086a22022005200a410c6c6a220741f0026a220a2802003602002004200741e8026a22072902003703e80220072003290200370200200a200341086a280200360200200441c0016a41086a20022802002202360200200420042903e802220c3703c0012000410c6a20023602002000200c370204200041013602000c060b200441086a41186a220b200441e0006a41186a2202290300370300200441086a41106a200441e0006a41106a2207290300220c370300200441086a41086a200441e0006a41086a220a290300220d37030020042004290360220e3703082001200128020841016a3602082007200c370300200a200d3703002002200b2903003703002004200e370360200441d8026a41086a2206200341086a280200360200200420032902003703d802024020082f01002203410b490d00200441e8026a410041e00210cd041a200441c0016a410041840110cd041a41ec031027220f450d02200f41003b0106200f4100360200200f41086a200441e8026a41e00210ce042107200f41e8026a200441c0016a41840110ce04210a200441e8026a41086a220b200541b8036a280200360200200420052900db013703a8012004200541e0016a2900003700ad01200420052902b0033703e802200420052f00c8013b01bc012004200541ca016a2d00003a00be01200541cb016a2800002110200541cf016a2800002111200541d3016a2800002112200541d7016a28000021132007200541e8016a20052f010641796a220241057410ce042107200a200541bc036a2002410c6c10ce04210a200541063b0106200f20023b0106200420042f01bc013b01a401200420042d00be013a00a601200420042903a8013703c001200420042900ad013700c501200441286a41086a200b280200360200200420042903e8023703280240024020094107490d00200941057420076a41c07e6a2007200941796a220b4105746a2207200241ffff0371200b6b41057410cf041a200741186a200441e0006a41186a290300370000200741106a200441e0006a41106a290300370000200741086a200441e0006a41086a290300370000200720042903603700002009410c6c200a6a220241b87f6a200241ac7f6a2202200f41066a22082f0100200b6b410c6c10cf041a200241086a200441d8026a41086a280200360200200220042903d8023702000c010b200541086a20094105746a220241206a200220082f010020096b41057410cf041a200241186a200441e0006a41186a290300370000200241106a200441e0006a41106a290300370000200241086a200441e0006a41086a29030037000020022004290360370000200541e8026a2009410c6c6a2202410c6a200220082f010020096b410c6c10cf041a200241086a200441d8026a41086a280200360200200220042903d8023702000b200820082f010041016a3b010020044198016a41026a220220042d00a6013a0000200441c8026a41086a2214200441286a41086a280200360200200420042f01a4013b019801200420042903c001370350200420042900c501370055200420042903283703c8022004413c6a41026a221520022d00003a0000200420042f0198013b013c2004200429005537002d20042004290350370328200441c0006a41086a22162014280200360200200420042903c80237034020052802002206450d0420052f01042103200441e8026a4102722117034020044194016a41026a221820152d00003a0000200420042f013c3b019401200420042903283703602004200429002d37006520044198016a41086a221920162802003602002004200429034037039801200341ffff0371210502400240024020062f01062202410b490d002017410041960410cd041a419c041027220b450d07200b4100360200200b41046a200441e8026a41980410ce041a200420062f00c8013b01bc012004200641ca016a2d00003a00be012004200641db016a2900003703a8012004200641e0016a2900003700ad01200641cb016a280000211a200641cf016a280000211b200641d3016a280000211c200641d7016a280000211d200441e8026a41086a221e200641b8036a2802003602002004200641b0036a2902003703e802200b41086a200641e8016a20062f0106220741796a220241057410ce04211f200b41e8026a200641bc036a2002410c6c10ce042120200b41ec036a20064188046a2007417a6a220941027410ce042108200641063b0106200b20023b010602402009450d00410021022008210703402007280200220a20023b0104200a200b360200200741046a21072009200241016a2202470d000b0b200441d8026a41086a2202201e280200360200200420042d00be0122073a00a601200420042f01bc01220a3b01a401200420042903a8013703c001200420042900ad013700c501200420042903e8023703d802200441c4026a41026a220920073a00002004200a3b01c402200420042903c0013703e802200420042900c5013700ed0220142002280200360200200420042903d8023703c802200341ffff037122074107490d01201f2005417a6a220a4105746a201f200541796a22024105746a2207200b2f010620026b41057410cf041a200741186a20042900653700002007201336000f2007201236000b2007201136000720072010360003200741026a20182d00003a0000200720042f0194013b0000200720042903603700132005410c6c20206a220741b87f6a200741ac7f6a2207200b2f0106220320026b410c6c10cf041a200741086a20192802003602002007200429039801370200200b200341016a22073b01062005410274221020086a416c6a2008200a4102746a2203200741ffff03712205200a6b41027410cf041a2003200f3602002005200a490d02200b20106a41d4036a210703402007280200220a200241016a22023b0104200a200b360200200741046a210720022005490d000c030b0b200641086a2207200541016a220a4105746a200720054105746a2207200220056b41057410cf041a200741186a20042900653700002007201336000f2007201236000b2007201136000720072010360003200741026a20044194016a41026a2d00003a0000200720042f0194013b00002007200429036037001320062005410c6c6a220241f4026a200241e8026a220720062f0106220b20056b410c6c10cf041a200241f0026a20044198016a41086a28020036020020072004290398013702002006200b41016a22023b01062005410274200641ec036a22076a41086a2007200a4102746a2207200241ffff0371220b200a6b41027410cf041a2007200f360200200341ffff0371200b4f0d082006200a417f6a22024102746a41f0036a210703402007280200220a200241016a22023b0104200a2006360200200741046a21072002200b490d000c090b0b200641086a2202200541016a22034105746a200220054105746a220220062f010620056b41057410cf041a200241186a20042900653700002002201336000f2002201236000b2002201136000720022010360003200241026a20182d00003a0000200220042f0194013b000020022004290360370013200641e8026a2005410c6c6a2202410c6a200220062f0106220a20056b410c6c10cf041a200241086a201928020036020020022004290398013702002006200a41016a22023b010620054102742210200641ec036a220a6a41086a200a20034102746a2208200241ffff0371220a20036b41027410cf041a2008200f3602002007200a4f0d00200620106a41f0036a2102034020022802002207200541016a22053b010420072006360200200241046a2102200a2005470d000b0b20044190016a41026a220220092d00003a000020044180016a41086a22072014280200360200200420042f01c402220a3b019001200420042903e802370350200420042900ed02370055200420042903c80237038001201520022d00003a00002004200a3b013c2004200429005537002d200420042903503703282016200728020036020020042004290380013703400240200628020022020d00201a2110201d2113201c2112201b2111200b210f0c060b20062f01042103201a2110201d2113201c2112201b211120022106200b210f0c000b0b200520094105746a220b41286a200b41086a2201200320096b41057410cf041a200b41206a2002290300370000200b41186a2007290300370000200b41106a200a2903003700002001200429036037000020052009410c6c6a220241f4026a200241e8026a220720052f010620096b410c6c10cf041a200241f0026a2006280200360200200720042903d802370200200520052f010641016a3b01060c040b41ec034104102a000b41ec034104102a000b419c044104102a000b200441e8026a410272410041960410cd041a419c0410272202450d0220024100360200200241046a200441e8026a41980410ce041a2002200128020022073602ec03200120023602002001200128020441016a360204200741003b010420072002360200200220022f0106220a4105746a220741086a20042f013c3b00002007410a6a2004413c6a41026a2d00003a0000200741176a2013360000200741136a20123600002007410f6a20113600002007410b6a20103600002007411b6a2004290328370000200741206a200429002d3700002002200a410c6c6a220741f0026a200441c0006a41086a280200360200200741e8026a2004290340370200200241ec036a200a41016a22074102746a200f360200200220073b0106200f20073b0104200f20023602000b200041003602000b20044180076a24000f0b419c044104102a000bde2003167f037e067f230041c0026b220424000240024020014115490d0041012105410121060240024002400340200121072000210820052006712109024002400240024002400240034002400240024002402003450d00024020054101710d002000200110db032003417f6a21030b2001410276220a41036c210b200a410174210c4100210d024020014132490d00200a200a417f6a220d2000200a4105746a2000200d4105746a412010d004220e410048220f1b2210200a41016a2211200d200a200f1b220a200020114105746a2000200a4105746a412010d00441004822111b220a2000200a4105746a200020104105746a412010d00422104100481b210a200c200c417f6a220d2000200c4105746a2000200d4105746a412010d004221241004822131b2214200c4101722215200d200c20131b220c200020154105746a2000200c4105746a412010d00422134100481b220c2000200c4105746a200020144105746a412010d00422144100481b210c200b200b417f6a220d2000200b4105746a2000200d4105746a412010d004221541004822161b2217200b41016a2218200d200b20161b220b200020184105746a2000200b4105746a412010d004220d4100481b220b2000200b4105746a200020174105746a412010d00422164100481b210b41024101200f1b200e411f7620111b2010411f766a2012411f766a2013411f766a2014411f766a2015411f766a200d411f766a2016411f766a210d0b2000200c4105746a2000200a4105746a412010d004220f411f76200d6a2000200b4105746a2000200a200c200f410048220f1b220e4105746a412010d0042210411f766a210d2000200b200e20104100481b220b4105746a2000200c200a200f1b22194105746a412010d004417f4c0d01200b21190c020b2000200110dc030c0f0b200d41016a220d410c490d0002402001410176220b450d00200020014105746a41606a210a2000210c0340200441206a41186a220d200c41186a220f290000370300200441206a41106a220e200c41106a2210290000370300200441206a41086a2211200c41086a22122900003703002004200c290000370320200a41086a2213290000211a200a41106a2214290000211b200a41186a2215290000211c200c200a290000370000200f201c3700002010201b3700002012201a3700002015200d2903003700002014200e29030037000020132011290300370000200a2004290320370000200a41606a210a200c41206a210c200b417f6a220b0d000b0b20012019417f736a21194101210a0c010b200d45210a0b02402009417f73200a45724101710d002000200110dd030d0d0b2002450d02201920014f0d0102402002200020194105746a220a412010d00441004e0d0020002108200121070c040b200441206a41186a2212200041186a220e290000370300200441206a41106a2213200041106a2210290000370300200441206a41086a2214200041086a221129000037030020042000290000370320200a41086a220c290000211a200a41106a220b290000211b200a41186a220d290000211c2000200a290000370000200e201c3700002010201b3700002011201a370000200d2012290300370000200b2013290300370000200c2014290300370000200a2004290320370000200441c0016a41186a2217200e290000370300200441c0016a41106a22182010290000370300200441c0016a41086a22192011290000370300200420002900003703c001200041606a2115200041206a21164100210c2001210b03400240200c200b417f6a220d4f0d002016200c4105746a210a0340200441c0016a200a412010d004417f4c0d01200a41206a210a200d200c41016a220c470d000b200d210c0b2015200b4105746a210a02400340200c200b417f6a220b4f0d01200441c0016a200a412010d004210d200a41606a220f210a200d4100480d000b20122016200c4105746a220a41186a220d2900003703002013200a41106a221d2900003703002014200a41086a22062900003703002004200a290000370320200f41286a221e290000211a200f41306a221f290000211b200f41386a2220290000211c200a200f41206a220f290000370000200d201c370000201d201b3700002006201a37000020202012290300370000201f2013290300370000201e2014290300370000200f2004290320370000200c41016a210c0c010b0b200020042903c001370000200e2017290300370000201020182903003700002011201929030037000002402001200c41016a220a490d002000200a4105746a21002001200a6b220141154f0d010c0c0b0b200a2001103e000b41ec81c500201920011037000b2007450d010b201920074f0d01200441206a41186a2216200841186a221e290000370300200441206a41106a2217200841106a221f290000370300200441206a41086a2218200841086a222029000037030020042008290000370320200820194105746a220a41086a220c290000211a200a41106a220b290000211b200a41186a220d290000211c2008200a290000370000201e201c370000201f201b3700002020201a370000200d2016290300370000200b2017290300370000200c2018290300370000200a2004290320370000200441186a2205201e290000370300200441106a2209201f290000370300200441086a2221202029000037030020042008290000370300200841206a21014100211d2007417f6a220d450d022001210a0340200a2004412010d00441004e0d03200a41206a210a200d201d41016a221d470d000b200d211d0c020b41b481c500410041001037000b41c481c500201920071037000b200820074105746a210c200d210b02400340200c2100200b220a201d4d22060d01200a417f6a210b200041606a220c2004412010d004417f4a0d000b0b0240200a201d490d00200d200a490d0241800121144100210f410021124100210d4100211141800121152001201d4105746a2222210103400240200020016b220a419fc0004b22190d00200a410576220a41807f6a200a2012200f492011200d49220c72220b1b210a0240200b450d002015200a200c1b2115200a2014200c1b21140c010b200a200a41017622156b21140b02402011200d470d00024020150d00200441c0006a220d21110c010b4100210a200441c0006a2211210d2001210c0340200d200a3a0000200d200c2004412010d004417f73411f766a210d200c41206a210c2015200a41016a220a470d000b0b02402012200f470d00024020140d00200441c0016a220f21120c010b200041606a210a4100210c200441c0016a2212210f0340200f200c3a0000200f200a2004412010d004411f766a210f200a41606a210a2014200c41016a220c470d000b0b0240200f20126b220a200d20116b220c200c200a4b1b2213450d002016200120112d00004105746a220a41186a2900003703002017200a41106a2900003703002018200a41086a2900003703002004200a290000370320200120112d00004105746a220a200020122d0000417f734105746a220c290000370000200a41186a200c41186a290000370000200a41106a200c41106a290000370000200a41086a200c41086a290000370000024020134101460d004100210a034020002012200a6a220e2d0000417f734105746a220c20012011200a6a41016a22102d00004105746a220b290000370000200c41186a200b41186a290000370000200c41106a200b41106a290000370000200c41086a200b41086a290000370000200120102d00004105746a220c2000200e41016a2d0000417f734105746a220b290000370000200c41186a200b41186a290000370000200c41106a200b41106a290000370000200c41086a200b41086a290000370000200a41026a210c200a41016a220b210a200c2013490d000b2012200b6a21122011200b6a21110b200020122d0000417f734105746a220a2004290320370000200a41186a2016290300370000200a41106a2017290300370000200a41086a2018290300370000201241016a2112201141016a21110b200020144105746b20002012200f461b2100200120154105746a20012011200d461b210120190d000b024002402011200d4f0d002000210a034020162001200d417f6a220d2d00004105746a220c41186a220b2900003703002017200c41106a220f2900003703002018200c41086a22002900003703002004200c290000370320200a41606a220a41086a220e290000211a200a41106a2210290000211b200a41186a2212290000211c200c200a290000370000200b201c370000200f201b3700002000201a3700002012201629030037000020102017290300370000200e2018290300370000200a20042903203700002011200d490d000c020b0b2001210a2012200f4f0d000340200f417f6a220f2d0000210c2016200a41186a220b2900003703002017200a41106a220d2900003703002018200a41086a22012900003703002004200a2900003703202000200c417f734105746a220c41086a220e290000211a200c41106a2210290000211b200c41186a2211290000211c200a200c290000370000200b201c370000200d201b3700002001201a3700002011201629030037000020102017290300370000200e2018290300370000200c2004290320370000200a41206a210a2012200f490d000b0b20082004290300370000201e2005290300370000201f2009290300370000202020212903003700002007200a20226b410576201d6a22014d0d032016201e2900003703002017201f2900003703002018202029000037030020042008290000370320200820014105746a220a41086a220c290000211a200a41106a220b290000211b200a41186a220d290000211c2008200a290000370000201e201c370000201f201b3700002020201a370000200d2016290300370000200b2017290300370000200c2018290300370000200a2004290320370000200720016b220c450d04200c20012001200c4b1b210b2007410376210d200a41206a2100024002402001200c417f6a220c490d002000200c200a200310e001200821000c010b200820012002200310e001200a2102200c21010b200b200d4f2105200141154f0d010c050b0b201d200a103e000b200a200d107f000b41c481c500200120071037000b41d481c5001058000b20014102490d00200041606a210f4101210b0340200b410574210a200b417f6a210c200b41016a210b02402000200a6a220a2000200c4105746a220d412010d004417f4a0d00200441c0016a41186a220e200a41186a2210290000370300200441c0016a41106a2211200a41106a2212290000370300200441c0016a41086a2213200a41086a22142900003703002004200a2900003703c001200a200d2900003700002014200d41086a2900003700002012200d41106a2900003700002010200d41186a2900003700004100210d0240200c450d00200f210a03400240200441c0016a200a412010d0044100480d00200c210d0c020b200a41206a200a290000370000200a41386a200a41186a290000370000200a41306a200a41106a290000370000200a41286a200a41086a290000370000200a41606a210a200c417f6a220c0d000b0b2000200d4105746a220a20042903c001370000200a41186a200e290300370000200a41106a2011290300370000200a41086a20132903003700000b200f41206a210f200b2001470d000b0b200441c0026a24000bf51602097f027e23004180046b2209240020092004370310200920033703082009200536021c2009200736022420092006360220024002400240024002400240024002400240024002402001280234200128025022062802b801460d002005420020052903082203200641386a2903007d2204200420035622061b37030802400240024020060d00200941d8006a20024200410110a00120094194016a280200210a200941d8006a41386a280200210b20092d0060220641037122054103460d0120050e03020102020b200041fab6c30036020420004101360200200041086a41233602000c030b2000419db7c30036020420004101360200200041086a411936020020060d02200a450d02200b10290c020b20094198016a2802002105200941286a41186a220c200141f4006a290000370300200941286a41106a220d200141ec006a290000370300200941286a41086a220e200141e4006a2900003703002009200129005c3703284100210f41002107024020060d002005417f4c0d030240024020050d00410121070c010b200510272207450d052007200b200510ce041a0b200a450d00200b10290b200941a0016a420037030020094198016a4280808080800137030020094188016a41f8b4c300360200200941d8006a412c6a2001411c6a2210360200200941d8006a41246a4200370200200941f8006a418883c000360200200941d8006a41186a2005360200200941ec006a2005360200200941d8006a41e4006a200241086a290000370200200941d8006a41ec006a200241106a290000370200200941d8006a41f4006a200241186a29000037020020094208370390012009410036027420092007360268200920022900003702b401200920012802583602b001200920012903503703a8012009200128023441016a36028c01200129030021032009200129030837036020092003370358200941d8016a41246a200e290300370200200941d8016a412c6a200d2903003702002009418c026a200c290300370200200941d8016a41186a200841086a280200360200200920023602e001200920092903283702f401200920082902003703e8012009200941206a3602e40120092009411c6a3602dc012009200941086a3602d801200941d8016a411c6a210d0240024002400240024020092903082203200941086a41086a290300220484500d002009200928021c4100200d200220032004200941d8006a10a203200928020022020d012009280274210f20092802e00121020b200f41016a220541004c0d08200941d8016a41106a2111200941d8006a411c6a210e20092005360274200941d8006a41206a2105200941fc006a280200210b0240024003402005280200220a41086a2108200a2f0106220c4105742105410021060240024003402005450d0120022008412010d0042207450d02200541606a2105200641016a2106200841206a21082007417f4a0d000b2006417f6a210c0b200b450d02200b417f6a210b200a200c4102746a41880b6a21050c010b0b200941a0036a2208200a200641e0006c6a220541ad036a290000370300200941a8036a2206200541b5036a290000370300200941b0036a2207200541bd036a2900003703002009200541a5036a29000037039803200541a4036a2d00004101470d00200941a1026a2008290300370000200941a9026a2006290300370000200941b1026a2007290300370000200941013a0098022009200929039803370099022009200f3602740c010b20094198026a200928028401200220092802880128021011020020092009280274417f6a3602744101210620092d0098024101470d040b200941c0026a41186a200941b1026a290000370300200941c0026a41106a200941a9026a290000370300200941c0026a41086a200941a1026a29000037030020092009290099023703c00220094198036a200941c0026a20092802b001280200108402410121062009280298034101470d0220094198036a41086a2802002101200928029c0321020c010b200928020421010b200941ec016a280200450d0b20092802e80110290c0b0b200941e0036a41186a220820094198036a410472220541186a2802002207360200200941e0026a41106a200541086a290200370300200941e0026a41186a200541106a29020037030020094180036a2007360200200941043602e402200941b98fc5003602e002200920052902003703e80220092802ac0121052008200d41186a2900002203370300200941e0036a41106a200d41106a2900002204370300200941e0036a41086a2208200d41086a2900002212370300200941c4036a2012370200200941cc036a2004370200200941d4036a20033702002009200d29000022033703e003200920033702bc0320092802d801220741086a29030021032009200941d8006a3602b803200729030021042009290358211220092903602113200920033703a0032009200437039803200920133703b003200920123703a80320092802e40122072802042102200728020021072008201141086a280200360200200920112902003703e00320094188036a2005200941e0026a20094198036a20072002200941e0036a20092802dc01280200106241002102410021072009280288030e03070609070b410021070240200941ec016a280200450d0020092802e80110290b410021020c070b200041d1b6c30036020420004101360200200041086a41293602000b200841046a280200450d08200828020010290c080b1039000b20054101102a000b41d8a8c1004118200941e0026a4180a9c10010a201000b20094194036a280200210720094190036a2802002102200928028c0321060b200941f8026a280200450d00200941f4026a28020010290b20094198036a41086a220a200e41086a290200370300200941c8006a41086a220b20094198036a410c6a2802003602002009200e290200370398032009200929029c0337034820092802a401210c20092802a001210d200928029c012105200928029801210f200928029401210e2009280290012108024020092802682211450d00200928026c450d00201110290b200a200b280200220b36020020092009290348220337039803200941d8006a41086a200b360200200920033703582010200941d8006a10e60120092008200f41e8006c6a360264200920083602602009200e36025c20092008360258200141386a200941d8006a102c20092005200c41a8016c6a360264200920053602602009200d36025c20092005360258200141c4006a200941d8006a10262000410c6a2007360200200041086a200236020020002006360204200041003602000c020b20094190036a2802002101200928028c032102200941f8026a280200450d00200941f4026a28020010290b024020092802682205450d00200928026c450d00200510290b200941f8006a2802002105200928028001210a02400240200928027c22060d00200521080c010b2006210720052108034020082802880b21082007417f6a22070d000b0340200520052f01064102746a41880b6a28020021052006417f6a22060d000b0b200941b4036a20052f0106360200200941b0036a4100360200200941ac036a20053602002009200a3602b803200941003602a803200942003703a0032009200836029c03200941003602980320094198036a10d90102402009280298012208450d002009280290012105200841e8006c210803400240200541dc006a280200450d00200541d8006a28020010290b024020052d00004105490d00200541286a280200450d00200541246a28020010290b200541e8006a2105200841987f6a22080d000b0b0240200928029401450d0020092802900110290b024020092802a4012205450d00200541a8016c2108200928029c0141206a210503402005103d200541a8016a2105200841d87e6a22080d000b0b024020092802a001450d00200928029c0110290b200041086a200136020020002002360204200041013602000b20094180046a24000bcd0202097f027e230041206b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a28020021060240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d0120022008412010d004220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b2007200a41e0006c6a220541e8026a280200450d00200541f8026a290300210c200541f0026a290300210d0c010b200341086a20012802102002200141146a28020028021c110200200341106a290300210c200128020021042003290308210d0b20012004417f6a3602002000200c3703082000200d370300200341206a24000f0b41d8a8c1004118200341186a4180a9c10010a201000b940301097f230041206b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a280200210602400240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d0120022008412010d004220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b200341086a22082007200a41e0006c6a220541ad036a290000370300200341106a220a200541b5036a290000370300200341186a220b200541bd036a2900003703002003200541a5036a290000370300200541a4036a2d00004101460d010b200020012802102002200141146a280200280210110200200128020021040c010b200041013a000020002003290300370001200041096a2008290300370000200041116a200a290300370000200041196a200b2903003700000b20012004417f6a360200200341206a24000f0b41d8a8c100411820034180a9c10010a201000b950201097f230041106b220224000240200028020041016a220341004c0d0020002003360200200041046a2104200041086a28020021050240024003402004280200220641086a210720062f01062208410574210441002109024003402004450d0120012007412010d004220a450d03200441606a2104200941016a2109200741206a2107200a417f4a0d000b2009417f6a21080b02402005450d002005417f6a2105200620084102746a41880b6a21040c010b0b20002802102001200041146a2802002802181104002104200028020021030c010b2006200941e0006c6a41a4036a2d000041014621040b20002003417f6a360200200241106a240020040f0b41d8a8c1004118200241086a4180a9c10010a201000bde0202097f037e230041206b220324000240200128020041016a220441004c0d0020012004360200200141046a2105200141086a28020021060240024003402005280200220741086a210820072f0106220941057421054100210a0240024003402005450d0120022008412010d004220b450d02200541606a2105200a41016a210a200841206a2108200b417f4a0d000b200a417f6a21090b2006450d022006417f6a2106200720094102746a41880b6a21050c010b0b2007200a41e0006c6a22054180036a290300220ca7450d0020054190036a290300210d20054188036a290300210e0c010b200320012802102002200141146a280200280214110200200341106a290300210d200128020021042003290308210e2003290300210c0b20012004417f6a360200200041106a200d3703002000200e3703082000200c370300200341206a24000f0b41d8a8c1004118200341186a4180a9c10010a201000b961208057f017e107f047e017f017e0a7f047e230041800d6b22022400024020002802000d002000417f360200200128020821032001280200210402400240200128020422050d00200421010c010b2005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000b0b200241246a20042f0106360200200241086a41186a4100360200200241086a41146a20043602002002200336022820024100360218200242003703102002200136020c2002410036020820024180026a200241086a10d501024020022903a00222074202510d002000410c6a2108200041046a2109200241a00a6a41146a210a200241a00a6a41206a210b20024180026a4104722104200241dd026a210c200241bd026a210d200241fd026a210e200241c8026a210f200241b0026a211020024180026a41286a21110340200241d0006a41086a220120024180026a41086a2212290300370300200241d0006a41106a220520024180026a41106a2213290300370300200241d0006a41186a220620024180026a41186a2214290300370300200241306a41086a2215200c41086a290000370300200241306a41106a2216200c41106a290000370300200241306a41186a2217200c41186a29000037030020022002290380023703502002200c290000370330200f29030021182010290300211920022903c002211a20022903a802211b20022d00dc02211c20022903b802211d20022802d002210320022802d402211e20022802d802211f2002412c6a41026a200e41026a2d000022203a00002002200e2f000022213b012c200241f8006a41086a22222015290300370300200241f8006a41106a22232016290300370300200241f8006a41186a22242017290300370300200241f4006a41026a222520203a000020022002290330370378200220213b017420024198016a41186a2221200629030037030020024198016a41106a2226200529030037030020024198016a41086a2227200129030037030020022002290350370398010240024002400240024020092802002216418883c000460d00200028020821170c010b200241a00a6a410041e00210cd041a20024180026a410041a00810cd041a41880b10272216450d0141002117201641003b010620164100360200201641086a200241a00a6a41e00210ce041a201641e8026a20024180026a41a00810ce041a20004100360208200020163602040b0340201641086a210520162f01062220410574210141002106024003402001450d0120024198016a2005412010d0042215450d04200141606a2101200641016a2106200541206a21052015417f4a0d000b2006417f6a21200b02402017450d002017417f6a2117201620204102746a41880b6a28020021160c010b0b200241d0016a41186a20212903002228370300200241d0016a41106a20262903002229370300200241d0016a41086a2027290300222a3703002002200229039801222b3703d001200a202b370200200a41086a202a370200200a41106a2029370200200a41186a2028370200200220083602b00a200220203602ac0a200220093602a80a200220163602a40a200241003602a00a20112018370300201320193703002002201a3703a0022002201b370388022002201c3a00bc022002201f3602b8022002201e3602b402200220033602b0022002201d370398022002200737038002200d2002290378370000200d41086a2022290300370000200d41106a2023290300370000200d41186a2024290300370000200c20022f01743b0000200c41026a20252d00003a0000200241a00a6a20024180026a10de011a0c020b41880b4108102a000b2016200641e0006c6a220641f0026a22012001290300201b20075022011b370300200641f8026a22052005290300201920011b370300200641e8026a22052005290300200720011b370300200241a00a6a41186a22152024290300370300200241a00a6a41106a22162023290300370300200241a00a6a41086a22172022290300370300200220022903783703a00a200641a4036a22052d000021202014200641bd036a22222900003703002013200641b5036a22232900003703002012200641ad036a22132900003703002002200641a5036a2224290000370380022027200241a00a6a20024180026a201c41ff0171410146221c1b220141086a2900003703002026200141106a2900003703002021200141186a2900003703002002200129000037039801200541012020201c1b3a0000202420022903980137000020132027290300370000202320262903003700002022202129030037000020064188036a2201201a2001290300201da722011b37030020064190036a22052018200529030020011b37030020064180036a2205201d200529030020011b37030002400240201e0d00200321010c010b201e210520032101034020012802ec0321012005417f6a22050d000b0340200320032f01064102746a41ec036a2802002103201e417f6a221e0d000b0b20032f010621052002201f3602b801200220053602b401200241003602b001200220033602ac01200241003602a801200242003703a0012002200136029c01200241003602980120024180026a20024198016a10d70102402002280280024101470d0020064198036a21030340200241a00a6a41286a200441286a280200360200200b200441206a2902003703002015200441186a22012902003703002016200441106a22052902003703002017200441086a2206290200370300200220042902003703a00a200241d0016a41186a2001290000370300200241d0016a41106a2005290000370300200241d0016a41086a2006290000370300200220042900003703d001200241f0016a41086a200b41086a2802003602002002200b2902003703f001200241c0016a2003200241d0016a200241f0016a10df01024020022802c001450d0020022802c4012201450d0020022802c801450d00200110290b20024180026a20024198016a10d7012002280280024101460d000b0b20024198016a10d6010b20024180026a200241086a10d50120022903a00222074202520d000b0b200241086a10d9012000200028020041016a360200200241800d6a24000f0b41c8a8c100411020024180026a41f0a8c10010a201000bd80202027f017e0240024002400240024002400240024002400240024002400240024020012802000e0400010203000b41012102410110272201450d05200141003a0000410121030c040b410110272202450d05200241013a00002001290308210420024101410910282202450d0620022004370001200129031021044112210320024109411210282201450d07200120043700090c020b41012102410110272201450d07200141023a0000410121030c020b410110272202450d07200241033a00002001290308210420024101410910282202450d0820022004370001200129031021044112210320024109411210282201450d09200120043700090b411121020b2000200236020820002003360204200020013602000f0b41014101102a000b41014101102a000b41094101102a000b41124101102a000b41014101102a000b41014101102a000b41094101102a000b41124101102a000b130020004101360204200041f4afc1003602000b3400200041f4b0c10036020420004100360200200041146a4105360200200041106a4184b1c100360200200041086a420f3702000b2501017f230041206b22022400200242003703082000200241086a10e701200241206a24000b820603037f027e017f230041206b220424004101210502402001a722064101470d002000427f2000290300220720027c220820082007542205200041086a2209290300220720037c2005ad7c220820075420082007511b22051b3703002009427f200820051b370300410021050b024002400240024020014201560d00024020060e020400040b2005450d0342002107200441106a41086a220042003703002004420037031041b18ac0004116200441106a1004200441086a2000290300370300200420042903103703002004410036021020044110200441106a100521050240024020042802102200417f470d00420021010c010b2004420037031820044200370310200441106a20052000411020004110491b10ce041a2000410f4d0d02200441186a290300210120042903102107200510290b200441106a41086a220042003703002004420037031041b18ac0004116200441106a1004200441086a2000290300370300200420042903103703002004427f200120037c200720027c22032007542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a411010030c030b42002107200441106a41086a220042003703002004420037031041b18ac0004116200441106a1004200441086a2000290300370300200420042903103703002004410036021020044110200441106a100521050240024020042802102200417f470d00420021010c010b2004420037031820044200370310200441106a20052000411020004110491b10ce041a2000410f4d0d02200441186a290300210120042903102107200510290b200441106a41086a220042003703002004420037031041b18ac0004116200441106a1004200441086a2000290300370300200420042903103703002004427f200120037c200720027c22032007542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a411010030c020b418f89c3004133104e000b418f89c3004133104e000b200441206a24000b130020004103360204200041f0b7c1003602000b3400200041bff4c10036020420004100360200200041146a4103360200200041106a41d8bec100360200200041086a42083702000b130020004104360204200041f0c2c1003602000b3201017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241a0c21e3600000b3201017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242c0f0003700000b3201017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241d086033600000ba70201047f23004190016b2202240002400240411210272203450d00200341106a41002f00c0a7413b0000200341086a41002900b8a741370000200341002900b0a74137000020034112412410282203450d0120032001360012200241086a41186a22014200370300200241086a41106a22044200370300200241086a41086a220542003703002002420037030820034116200241086a1000200241f0006a41186a2001290300370300200241f0006a41106a2004290300370300200241f0006a41086a200529030037030020022002290308370370200241086a200241f0006a10f3010240024020022903084201510d00200042003703000c010b2000200241086a41e80010ce041a0b2003102920024190016a24000f0b41124101102a000b41244101102a000bcb0706047f017e027f017e047f027e230041c0016b22022400200241003602a00120014120200241a0016a10052101024002400240024020022802a0012203417f460d0020010d010b200042003703000c010b200241a0016a2003412020034120491b22046a41004100412020046b2004411f4b1b10cd041a200241a0016a2001200410ce041a2003411f4d0d01200241206a41086a200241a0016a41086a2205290000370300200241206a41106a200241a0016a41106a290000370300200241206a41186a200241a0016a41186a290000370300200220022900a001220637036020022006370320200242003703a801200242003703a001200241a0016a200120046a2207200320046b2203411020034110491b220810ce041a2003410f4d0d012005290300210620022903a0012109200241a0016a200320086b2204412020044120491b22036a41004100412020036b2003411f4b1b10cd041a200241a0016a200720086a220a200310ce041a2004411f4d0d01200241c0006a41086a220b200241a0016a41086a2208290000370300200241c0006a41106a220c200241a0016a41106a2205290000370300200241c0006a41186a220d200241a0016a41186a2207290000370300200220022900a001220e3703602002200e3703402002420037036820024200370360200241e0006a200a20036a200420036b2203411020034110491b10ce041a2003410f4d0d012008200241206a41086a2903003703002005200241206a41106a2903003703002007200241206a41186a29030037030020024180016a41086a2204200b29030037030020024180016a41106a220a200c29030037030020024180016a41186a220b200d290300370300200220022903203703a0012002200229034037038001200241e0006a41086a2203290300210e2002290360210f20032008290300370300200241e0006a41106a22082005290300370300200241e0006a41186a22052007290300370300200241086a22072004290300370300200241106a2204200a290300370300200241186a220a200b290300370300200220022903a001370360200220022903800137030020011029200041206a200e370300200041186a200f370300200041106a20063703002000200937030820004201370300200041286a2002290360370300200041306a2003290300370300200041386a2008290300370300200041c0006a2005290300370300200041c8006a2002290300370300200041d0006a2007290300370300200041d8006a2004290300370300200041e0006a200a2903003703000b200241c0016a24000f0b418f89c3004133104e000bc30701087f230041e00b6b220424000240024020002802000d002000417f360200200441286a41186a200141186a290000370300200441286a41106a200141106a290000370300200441286a41086a200141086a290000370300200420012900003703280240024020002802042205418883c000460d00200041086a28020021060c010b4100210620044180096a410041e00210cd041a200441e0006a410041a00810cd041a41880b10272205450d02200541003b010620054100360200200541086a20044180096a41e00210ce041a200541e8026a200441e0006a41a00810ce041a200041086a4100360200200020053602040b200041046a210702400240034020052f010622084105742109410021014100210a02400240034020092001460d01200441286a200520016a41086a412010d004220b450d02200141206a2101200a41016a210a200b417f4a0d000b200a417f6a21080b2006450d022006417f6a2106200520084102746a41880b6a28020021050c010b0b2000410c6a210b410121010c010b200441086a41186a200441286a41186a290300370300200441086a41106a200441286a41106a290300370300200441086a41086a200441286a41086a290300370300200420042903283703082000410c6a210b410021062008210a410021010b0240024020010d002004419c096a200441086a41086a290300370200200441a4096a200441086a41106a290300370200200441ac096a200441086a41186a2903003702002004200b360290092004200a36028c09200420073602880920042005360284092004200636028009200420042903083702940920044180016a200429035037030020044188016a200441d0006a41086a29030037030020044194016a420037020020044200370378200442003703602004418883c00036029001200441003a009c012004419d016a2004290028370000200441a5016a200441286a41086a290000370000200441ad016a200441286a41106a290000370000200441b5016a200441286a41186a290000370000200441bc016a200441c7006a28000036000020044180096a200441e0006a10de0121010c010b200441f8006a4200370300200441f4006a418883c000360200200441003602800120044100360270200442003703682004418883c000360264200441003602602005200a41e0006c6a41e8026a2101200441e0006a10d6010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441e00b6a24000f0b41c8a8c1004110200441e0006a41f0a8c10010a201000b41880b4108102a000bad2304017f027e147f047e230041a0056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e0400010203000b200341c4046a4101360200200342013702b404200341ccfdc4003602b0042003410236028c01200341c4fdc40036028801200320034188016a3602c004200341b0046a41c0c9c1001057000b200141306a2903002104200141286a2903002105200341fc006a41026a200141076a2d00003a0000200341e0006a41086a200141186a290200370300200341e0006a410d6a2001411d6a290000370000200320012f00053b017c2003200141106a29020037036041d588c3002106412a210720022d00000d1520022d00014101470d15200141086a28020021062001410c6a280200210720012d00042101200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d000021112002410c6a2d000021122002410a6a2f01002113200241096a2d00002114200241086a2d00002115200241066a2f01002116200241056a2d00002117200241046a2d00002118200241026a2f0100211920032002411a6a2901003703c003200320083a00bf03200320093a00be032003200a3b01bc032003200b3a00bb032003200c3a00ba032003200d3b01b8032003200e3a00b7032003200f3a00b603200320103b01b403200320113a00b303200320183a00aa03200320193b01a803200320142013410874722012411874723600af03200320172016410874722015411874723600ab0320034188046a41026a2202200341fc006a41026a2d00003a0000200320032f017c3b018804200341b0046a41086a2208200341e0006a41086a290300370300200341b0046a410d6a2209200341e0006a410d6a290000370000200320032903603703b0040240200141ff01714101460d0020034184046a41026a20022d00003a0000200341c8026a41086a2008290300370300200341c8026a410d6a2009290000370000200320032f0188043b018404200320032903b0043703c8020c130b20034190046a200641067610cc012003280290042102024002402003280298042006413f7122014b0d00410021010c010b20034184046a41026a200220014105746a220141026a2d00003a0000200341d0026a200141136a290000370300200341d5026a200141186a290000370000200320012f00003b0184042003200129000b3703c8022001280007210720012800032106410121010b0240200328029404450d00200210290b20010d1241012101411521074184efc20021060c130b41a584c2002106410e210720022d00004101470d14200241086a2802004102490d14200241046a28020041ff01710d1420012802042102411210272201450d01200141106a41002f00c0a7413b0000200141086a41002900b8a741370000200141002900b0a74137000020014112412410282201450d0220012002360012200341b0046a41186a22024200370300200341b0046a41106a22064200370300200341b0046a41086a22074200370300200342003703b00420014116200341b0046a100020034190046a41186a200229030037030020034190046a41106a200629030037030020034190046a41086a2007290300370300200320032903b00437039004200341b0046a20034190046a10f301024020032903b00442015222020d0020034190046a4120100c0b20032802b8042106200341a8036a200341bc046a41dc0010ce041a20020d03200341c8026a200341a8036a41dc0010ce041a20011029200341e8016a200341c8026a41dc0010ce041a200320063602880120034188016a410472200341e8016a41dc0010ce041a20034188016a41186a2903002104200329039801211a411810272201450d04200141106a41002900cf8c40370000200141086a41002900c78c40370000200141002900bf8c4037000020014118413810282201450d052001200341a8016a2202290000370018200141306a200241186a290000370000200141286a200241106a290000370000200141206a200241086a290000370000200341c8006a20014138108401200341c8006a41106a290300211b2003290350211c2003280248210620011029420021052002201c420020061b221c201a201c201c201a56201b420020061b221b200456201b2004511b22011b221a7d201b2004201b20011b221d7d201c201a54ad7d109c01200341b0046a41086a22014200370300200342003703b00441b18ac0004116200341b0046a1004200341c8026a41086a2001290300370300200320032903b0043703c802200341003602b004200341c8026a4110200341b0046a100521020240024020032802b0042201417f470d00420021040c010b200342003703b804200342003703b004200341b0046a20022001411020014110491b10ce041a2001410f4d0d07200341b8046a290300210420032903b0042105200210290b200341b0046a41086a22014200370300200342003703b00441b18ac0004116200341b0046a1004200341c8026a41086a2001290300370300200320032903b0043703c802200342002004201d7d2005201a54ad7d221c2005201a7d221b200556201c200456201c2004511b22011b3703b80420034200201b20011b3703b004200341c8026a4110200341b0046a41101003410021060c130b41a584c2002106410e210720022d00004101470d13200241086a2802004104490d13200241046a28020041ff01710d1320012802042106411210272201450d06200141106a41002f00c0a7413b0000200141086a41002900b8a741370000200141002900b0a74137000020014112412410282201450d0720012006360012200341b0046a41186a22024200370300200341b0046a41106a22074200370300200341b0046a41086a22084200370300200342003703b00420014116200341b0046a100020034190046a41186a200229030037030020034190046a41106a200729030037030020034190046a41086a2008290300370300200320032903b0043703900420034190046a412041b8d6c50041004100100b2102200110292002417f460d0f200341b0046a41086a22014200370300200342003703b004418486c5004112200341b0046a1004200341c8026a41086a2001290300370300200320032903b0043703c80241002102200341003602b004200341c8026a4110200341b0046a1005210720032802b0042201417f460d092003200136028c012003200736028801200341b0046a20034188016a104520032802b004220c450d08200341b8046a280200210220032902b404210520032802b404210d02402001450d00200710290b2005a72005422088a72201470d0b0c0a0b41124101102a000b41244101102a000b200110290c0c0b41184101102a000b41384101102a000b418f89c3004133104e000b41124101102a000b41244101102a000b418f89c3004133104e000b4104210c410021010b200141016a22072001490d0320014101742208200720072008491b220d41ffffffff0371200d470d03200d41027422074100480d030240024020010d0020071027210c0c010b200c200141027420071028210c0b200c450d01200221010b200c20014102746a2006360200200341b0046a41086a22014200370300200342003703b004418486c5004112200341b0046a1004200341c8026a41086a2001290300370300200320032903b0043703c802200341003602b804200342013703b0042003200241016a22013602880120034188016a200341b0046a103002400240200120024f0d0020032802b804210920032802b404210820032802b00421020c010b410020032802b80422016b2106200241027441046a210a20032802b4042108200c210703402007280200210b02400240200820066a4104490d0020032802b00421020c010b200141046a22022001490d0520084101742209200220022009491b22094100480d050240024020080d002009102721020c010b20032802b00420082009102821020b2002450d04200320093602b404200320023602b004200921080b200741046a21072003200141046a22093602b804200220016a200b3600002006417c6a210620092101200a417c6a220a0d000b0b200341c8026a411020022009100302402008450d00200210290b41002106200d450d06200c10290c060b20074104102a000b20094101102a000b102b000b41eac9c1002106411921070c030b20034190046a41026a20034184046a41026a2d00003a0000200341b0046a41086a200341c8026a41086a290300370300200341b0046a410d6a200341c8026a410d6a290000370000200320032f0184043b019004200320032903c8023703b004410021010b20034184016a41026a220220034190046a41026a2d00003a000020034188016a41086a2208200341b0046a41086a29030037030020034188016a41106a200341b0046a41106a290300370300200320032f0190043b018401200320032903b0043703880120010d01200341306a2005200442c0843d420010d404200341206a2003290330221c200341306a41086a290300221b42c0fb42427f10d304200341106a201c201b42d08603420010d30420034180016a41026a20022d00003a0000200341e8016a41086a2008290300370300200341e8016a410d6a220220034188016a410d6a290000370000200320032f0184013b01800120032003290388013703e801200341c0006a200341a8036a2003290310221b200520032903207c42148042ffffffff0f837c221c428080e983b1de16201c428080e983b1de1656200341106a41086a290300201c201b54ad7c221c420052201c501b22011b221b201c420020011b221c10ac0102402003280240450d0041d0c9c1002106411a21070c020b200341086a41ee85c500411610b501200328020c210120032802082108200341b0046a41086a22094200370300200342003703b00441ee85c5004116200341b0046a1004200341c8026a41086a220a2009290300370300200320032903b0043703c80220032001410020081b220841016a3602b004200341c8026a4110200341b0046a4104100320034188016a41086a200341a8036a41086a29030037030020034188016a41106a200341a8036a41106a29030037030020034188016a41186a200341a8036a41186a290300370300200a200341e8016a41086a290300370300200341c8026a410d6a2002290000370000200320032903a80337038801200320032f0180013b018804200320034182016a2d00003a008a04200320032903e8013703c802411210272201450d02200141106a41002f00c0a7413b0000200141086a41002900b8a741370000200141002900b0a74137000020014112412410282202450d0320022008360012200341b0046a41186a22014200370300200341b0046a41106a22094200370300200341b0046a41086a220a4200370300200342003703b00420024116200341b0046a100020034190046a41186a200129030037030020034190046a41106a200929030037030020034190046a41086a200a290300370300200320032903b00437039004412010272201450d042001200329038801370000200141186a20034188016a41186a290300370000200141106a20034188016a41106a290300370000200141086a20034188016a41086a2903003700002001412041c00010282201450d0520012005370020200141286a2004370000200141c00041800110282201450d062001201b370050200120032f0188043b00302001200736003720012006360033200120032903c80237003b200141d8006a201c370000200141326a20032d008a043a0000200141c3006a200341c8026a41086a290300370000200141c8006a200341d5026a29000037000020034190046a4120200141e00010032001102920021029200341bc046a200836020041002106200341b0046a41086a41003a00002003410a3a00b00441b8d6c5004100200341b0046a1088010b0b2000200736020420002006360200200341a0056a24000f0b41124101102a000b41244101102a000b41204101102a000b41c0004101102a000b4180014101102a000bf90a03027f017e077f230041d0006b22042400200441306a41086a220542003703002004420037033041c1c8c100411d200441306a1004200441206a41086a20052903003703002004200429033037032002400240024002400240024002400240024002400240200441206a411041b8d6c50041004100100b417f470d00200441106a41888dc300410d1094012004290318420020042802101b210602402002a74101470d0020044184ccc100411a109401024020042903082006580d0020042802000d0b0b200441306a41086a22054200370300200442003703304184ccc100411a200441306a1004200441206a41086a2005290300370300200420042903303703202004200620014201867c370330200441206a4110200441306a410810030b200028020821052000280204210720002802002108200441306a41086a220042003703002004420037033041c1c8c100411d200441306a1004200441206a41086a2000290300370300200420042903303703202004410036023820044201370330410810272200450d01200442888080808001370234200420003602302000200637000020004108411010282200450d02200442908080808002370234200020013700082004200036023020042005360244200441c4006a200441306a103002402005450d002008200541286c6a21092004280234210a2004280238210b20082100034002400240200a200b6b4120490d00200b41206a21052004280230210c0c010b200b41206a2205200b490d0b200a410174220c20052005200c491b220d4100480d0b02400240200a0d00200d1027210c0c010b2004280230200a200d1028210c0b200c450d062004200d3602342004200c360230200d210a0b200c200b6a220b41186a200041186a290000370000200b41106a200041106a290000370000200b41086a200041086a29000037000020042005360238200b2000290000370000200041206a29030021010240200a20056b41074b0d00200541086a220b2005490d0b200a410174220d200b200b200d491b220b4100480d0b02400240200a0d00200b1027210c0c010b200c200a200b1028210c0b200c450d072004200b3602342004200c360230200b210a0b2004200541086a220b360238200c20056a20013700002009200041286a2200470d000b0b2004280234210c200428023821000240024020024201510d0002400240200c2000460d00200428023021050c010b200041016a22052000490d0b2000410174220c20052005200c491b220c4100480d0b0240024020000d00200c102721050c010b20042802302000200c102821050b2005450d082004200c360234200420053602300b2004200041016a220a360238200520006a41003a00000c010b02400240200c2000460d00200428023021050c010b200041016a22052000490d0a2000410174220c20052005200c491b220c4100480d0a0240024020000d00200c102721050c010b20042802302000200c102821050b2005450d082004200c360234200420053602300b2004200041016a220b360238200520006a41013a00000240200c200b6b41074b0d00200b41086a220a200b490d0a200c410174220d200a200a200d491b220a4100480d0a02400240200c0d00200a102721050c010b2005200c200a102821050b2005450d092004200a36023420042005360230200a210c0b2004200041096a220a3602382005200b6a20033700000b200441206a41102005200a10030240200c450d00200510290b2007450d0a200810290c0a0b200041046a280200450d09200028020010290c090b41084101102a000b41104101102a000b200d4101102a000b200b4101102a000b200c4101102a000b200c4101102a000b200a4101102a000b102b000b200041046a280200450d00200028020010290b200441d0006a24000b02000ba80102027f047e230041c0006b21020240200128020022032001280204470d00200041003602000f0b2001200341e0006a360200200241086a200341c8006a2900002204370300200241106a200341d0006a2900002205370300200241186a200341d8006a29000022063703002002200341c0006a290000220737030020002003360200200020073700042000410c6a2004370000200041146a20053700002000411c6a20063700000b290020004101360204200041086a200128020420012802006b41e0006e2201360200200020013602000bd10304037f027e067f027e23004180016b210302402001280200220420012802042205460d002001200441e0006a360200200341206a41186a200441d8006a2900002206370300200341206a41106a200441d0006a2900002207370300200341106a22082007370300200341086a2209200441c8006a290000370300200341186a220a20063703002003200441c0006a290000370300200341e0006a41186a220b200a290300370300200341e0006a41106a220c2008290300370300200341e0006a41086a220d20092903003703002003200329030037036002402002450d00200541a07f6a2105034020052004460d022001200441c0016a360200200441a0016a2900002106200441b8016a2900002107200441b0016a290000210e200341206a41086a200441a8016a290000220f3703002009200f3703002008200e370300200a20073703002003200637032020032006370300200b200a290300370300200c2008290300370300200d200929030037030020032003290300370360200441e0006a21042002417f6a22020d000b0b20002004360200200020032903603702042000410c6a200d290300370200200041146a200c2903003702002000411c6a200b2903003702000f0b200041003602000bf60505097f017e017f017e037f23004180026b2202240020024100360218200241186a2001280200220320012802042204410420044104491b220510ce041a2001200420056b22063602042001200320056a2205360200024002400240200441034b0d00200041003602000c010b20022802182107200242003702042002418883c000360200200241086a210802402007450d00200241a0016a41027221094100210a034020024200370318200241186a20052006410820064108491b220410ce041a2001200620046b3602042001200520046a36020002400240200641074d0d002002290318210b200241186a200110442002280218220c0d010b2000410036020020022802002002280204200228020810fc010c030b200229021c210d2002200b370310024002402002280200220e418883c000460d002002280204210f0c010b2009410041da0010cd041a200241186a410041840110cd041a41e4011027220e450d044100210f200e4100360200200e41046a200241a0016a41dc0010ce041a200e41e0006a200241186a41840110ce041a200241003602042002200e3602000b200a41016a210a024002400340200e41086a2105200e2f01062210410374210641002104024003402006450d01200241106a2005410810d0042203450d03200641786a2106200441016a2104200541086a21052003417f4a0d000b2004417f6a21100b0240200f450d00200f417f6a210f200e20104102746a41e4016a280200210e0c010b0b2002200b37022c20022008360228200220103602242002200e36021c20024100360218200220023602202002200d3702a4012002200c3602a001200241186a200241a0016a10fd010c010b200e2004410c6c6a220641e4006a220528020021042005200d370200200641e0006a220528020021062005200c3602002006450d002004450d00200610290b200a2007460d0120012802002105200128020421060c000b0b20002002290300370200200041086a20082802003602000b20024180026a24000f0b41e4014104102a000bd90303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200441e0006a2802002104200141016a21010c010b02400240200028020022010d002003ad210541002106410021010c010b20003301044220862003ad842105410121060b200010292005a72103024002402005422088a7220720012f01064f0d00200121040c010b034002400240200128020022040d002003ad2105410021040c010b200641016a210620013301044220862003ad8421050b200110292005a72103200421012005422088a7220720042f01064f0d000b0b200741027420046a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a280200210402402006417f6a2201450d00034020002802e40121002001417f6a22010d000b0b410021010b2004450d012002417f6a210202402005a7450d00200410290b20020d000b0b02402000418883c000460d0020002802002101200010292001450d0020012802002104200110292004450d00024020042802002201450d000340200410292001210420012802002200210120000d000b0b200410290b0be71207027f017e057f027e017f017e0a7f230041b0036b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241f0016a41086a2207200141086a280200360200200220012902003703f001024002400240024020002f01062201410b490d00200241d0026a410272410041da0010cd041a200241386a410041840110cd041a0240024041e40110272208450d0020084100360200200841046a200241d0026a41dc0010ce041a200841e0006a200241386a41840110ce042107200241386a41086a2209200041b0016a280200360200200220002902a8013703382000413c6a330000210a2000413e6a310000210b20002d003f210c2000350038210d200841086a200041c0006a20002f010641796a220141037410ce04210e2007200041b4016a2001410c6c10ce042107200041063b0106200820013b0106200241d0026a41086a2009280200360200200220022903383703d002200d200a200b4210868442208684210a0240024020034107490d002003410374200e6a41506a200e200341796a22094103746a220e200141ffff037120096b41037410cf041a200e20043700002003410c6c20076a220341b87f6a200341ac7f6a2203200841066a22012f010020096b410c6c10cf041a200341086a200241f0016a41086a280200360200200320022903f0013702000c010b200041086a20034103746a220741086a2007200041066a22012f010020036b41037410cf041a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c10cf041a200741086a200241f0016a41086a280200360200200720022903f0013702000b200120012f010041016a3b0100200241286a41086a220f200241d0026a41086a22102802002203360200200241086a221120033602002002200c3a0017200220022903d00222043703282002200a3e02102002200a4230883c00162002200a4220883d011420022004370300200229031021042000280200220c450d0320002f01042112200241d0026a410272211303402002200641016a22063602202002200c360224200f201128020036020020022002290300370328201241ffff03712109024002400240200c2f01062200410b490d002013410041da0010cd041a200241f0016a200241d0026a41dc0010ce041a200241386a410041b40110cd041a41940210272207450d0520074100360200200741046a200241f0016a41dc0010ce041a200741e0006a200241386a41b40110ce042103200c41386a290000210a200241386a41086a2214200c41b0016a2802003602002002200c41a8016a290200370338200741086a200c41c0006a200c2f0106220141796a220041037410ce0421152003200c41b4016a2000410c6c10ce042116200741e4016a200c4180026a2001417a6a220e41027410ce042117200c41063b0106200720003b01060240200e450d00410021002017210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b20102014280200220036020020022002290338220b3703d002201420003602002002200b370338201241ffff037122034107490d0120152009417a6a22034103746a2015200941796a22004103746a220120072f010620006b41037410cf041a200120043700002009410c6c20166a220141b87f6a200141ac7f6a220120072f0106220e20006b410c6c10cf041a200141086a200f280200360200200120022903283702002007200e41016a22013b01062009410274221220176a416c6a201720034102746a220e200141ffff0371220920036b41027410cf041a200e200836020020092003490d02200720126a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320002009490d000c030b0b200c41086a2201200941016a22034103746a200120094103746a2201200020096b220741037410cf041a20012004370000200c2009410c6c6a220141ec006a200141e0006a220e2007410c6c10cf041a200141e8006a200241286a41086a280200360200200e2002290328370200200c200041016a22003b01062009410274200c41e4016a22016a41086a200120034102746a2201200041ffff0371220720036b41027410cf041a20012008360200201241ffff037120074f0d07200c2003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b01042001200c360200200341046a210320002007490d000c080b0b200c41086a2200200941016a220e4103746a200020094103746a2200200c2f0106220120096b221241037410cf041a20002004370000200c41e0006a2009410c6c6a2200410c6a20002012410c6c10cf041a200041086a200f28020036020020002002290328370200200c200141016a22003b010620094102742217200c41e4016a22016a41086a2001200e4102746a2212200041ffff03712201200e6b41027410cf041a20122008360200200320014f0d00200c20176a41e8016a2100034020002802002203200941016a22093b01042003200c360200200041046a210020012009470d000b0b200241106a41086a2014280200220036020020112000360200200220022903382204370310200220043703000240200c28020022000d0020072108200a21040c050b200c2f010421122000210c200a2104200721080c000b0b41e4014104102a000b4194024104102a000b200020034103746a220941106a200941086a2209200120036b41037410cf041a2009200437000020002003410c6c6a220141ec006a200141e0006a220920002f010620036b410c6c10cf041a200141e8006a2007280200360200200920022903f001370200200020002f010641016a3b01060c010b200241d0026a410272410041da0010cd041a200241f0016a200241d0026a41dc0010ce041a200241386a410041b40110cd041a41940210272200450d0120004100360200200041046a200241f0016a41dc0010ce041a200041e0006a200241386a41b40110ce0421012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f01062203410c6c6a22012002290300370200200020034103746a41086a2004370000200141086a200241086a280200360200200041e4016a200341016a22034102746a2008360200200020033b0106200820033b0104200820003602000b200241b0036a24000f0b4194024104102a000b840b02037f017e024002400240024002400240024002400240024002400240024020002802000e0400010203000b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0c20024101742204200320032004491b22044100480d0c0240024020020d002004102721030c010b200128020020022004102821030b2003450d0420012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a00002000280204210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d0c20024101742200200420042000491b22004100480d0c0240024020020d002000102721020c010b200128020020022000102821020b2002450d0520012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0b20024101742204200320032004491b22044100480d0b0240024020020d002004102721030c010b200128020020022004102821030b2003450d0520012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a00002000290308210502400240200141046a2802002202200428020022006b4108490d00200128020021020c010b200041086a22032000490d0b20024101742200200320032000491b22004100480d0b0240024020020d002000102721020c010b200128020020022000102821020b2002450d0620012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0a20024101742204200320032004491b22044100480d0a0240024020020d002004102721030c010b200128020020022004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00002000280204210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d0a20024101742200200420042000491b22004100480d0a0240024020020d002000102721020c010b200128020020022000102821020b2002450d0720012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0920024101742204200320032004491b22044100480d090240024020020d002004102721030c010b200128020020022004102821030b2003450d0720012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a00002000290308210502400240200141046a2802002202200428020022006b4108490d00200128020021020c010b200041086a22032000490d0920024101742200200320032000491b22004100480d090240024020020d002000102721020c010b200128020020022000102821020b2002450d0820012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20044101102a000b20004101102a000b20044101102a000b20004101102a000b20044101102a000b20004101102a000b20044101102a000b20004101102a000b102b000b130020004101360204200041d8cdc1003602000b340020004180f4c10036020420004100360200200041146a4107360200200041106a41a4d1c100360200200041086a42073702000b130020004101360204200041f8dcc1003602000bff0101057f230041106b2202240020024100360208200242013703002002410d36020c2002410c6a20021030024002400240024020022802042203200228020822046b410d490d002004410d6a2105200228020021030c010b2004410d6a22052004490d0220034101742206200520052006491b22064100480d020240024020030d002006102721030c010b200228020020032006102821030b2003450d0120022006360204200220033602000b20022005360208200320046a2204410029009ecc41370000200441056a41002900a3cc4137000020002002290300370200200041086a2002280208360200200241106a24000f0b20064101102a000b102b000ba504010b7f230041106b220324002003420037030820012002200341086a102020032003290308370300200120026a21040240024002400240200241086a220520024f0d00200341086a2106200321074100210841002105410121094100210a0340200841017421022006200741016a220b6b210c034020072d00002107024002400240024020082005470d002008417f417f200c200420016b6a22052005200c491b220541016a220d200d2005491b6a22052008490d072002200520052002491b22054100480d070240024020080d002005102721090c010b200920082005102821090b2009450d010b200920086a20073a00000240024002400240200a41ff01710e03010300010b20042001460d010c050b0240200b2006460d004100210a0c040b20042001470d040b200841016a21080c090b4101210a200b2006470d01200841016a21080c080b20054101102a000b200841016a2108200b21070c020b200841016a21084102210a200241026a21022001220741016a21010c000b0b0b410121092005450d0120054100480d002005102722090d0120054101102a000b102b000b410021080340200920086a200320086a2d00003a0000200841016a22084108470d000b024020020d00410821080c010b200920086a2107410021080340200720086a200120086a2d00003a00002002200841016a2208470d000b200420016b41086a21080b200020083602082000200536020420002009360200200341106a24000bad10030a7f027e047f23004190016b22032400024002400240024002400240411410272204450d00200441106a410028009c9342360000200441086a410029009493423700002004410029008c934237000020044114413410282204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341e8006a41186a22054200370300200341e8006a41106a22064200370300200341e8006a41086a220742003703002003420037036820044134200341e8006a1000200341c0006a41186a2005290300370300200341c0006a41106a2006290300370300200341c0006a41086a20072903003703002003200329036837034020034100360268200341c0006a4120200341e8006a1005210820032802682209417f460d042008450d042003200936022420032008360220200341106a200341206a102e2003280210450d0320032802142105200341086a200341206a102e2003280208450d03200328020c21072003200341206a102e2003280200450d032003280204210a200341003a0068200341e8006a2003280220220b20032802242206410047220c10ce041a2006200c490d0220032006200c6b3602242003200b200c6a3602202006450d0320032d0068220c41014b0d034100210602400240200c0e020100010b410121060b200341e8006a200341206a10442003280268220c450d032003413c6a41026a220b2003418c016a41026a2d00003a0000200320032f008c013b013c200329026c220d422088210e02402009450d00200810290b200ea72108200da72109200341e8006a41026a200b2d00003a0000200320032f013c3b01680c050b41144101102a000b41344101102a000b200c2006103e000b418f89c3004133104e000b410221060b200410290240024020064102470d004101210441a2e1c1002105411121070c010b200341c0006a41026a200341e8006a41026a2d00003a0000200320032f01683b0140410021040b2003411c6a41026a200341c0006a41026a2d00003a0000200320032f01403b011c024002402004450d002000200536020420004101360200200041086a20073602000c010b2003418c016a41026a220b2003411c6a41026a2d00003a0000200320032f011c3b018c01024002400240024002400240024002400240200228025820054b0d0020092102200c21040c010b411510272204450d012004410d6a41002900ce9242370000200441086a41002900c99242370000200441002900c1924237000020044115413510282204450d02200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341e8006a41186a22054200370300200341e8006a41106a22064200370300200341e8006a41086a220742003703002003420037036820044135200341e8006a1000200341c0006a41186a2005290300370300200341c0006a41106a2006290300370300200341c0006a41086a20072903003703002003200329036837034020034100360268200341c0006a4120200341e8006a1005210502400240024020032802682206417f460d002005450d002003200636022420032005360220200341e8006a200341206a10442003280268220f450d06200329026c210d02402006450d00200510290b20041029200341e8006a200f200d422088a72002108502200da72110200341e8006a41086a2802002107200328026c210520032802684101470d022000200536020420004101360200200041086a20073602002010450d01200f10290c010b20041029200041086a411a360200200041b3e1c100360204200041013602000b2009450d09200c10290c090b200341c0006a41026a221120034187016a2d00003a0000200320032f0085013b014020034184016a2d0000210620034180016a2802002108200341fc006a2802002102200341f8006a2802002104200341f4006a280200210a02402009450d00200c10290b2003418c016a41026a20112d00003a0000200320032f01403b018c012008417f4c0d044101210c02402008450d0020081027220c450d06200c2004200810ce041a0b200341206a41146a2008360200200341206a41106a20083602002003200a36022820032007360224200320053602202003200c36022c2003200641ff01714101463a0038411410272209450d06200941106a410028009c9342360000200941086a410029009493423700002009410029008c934237000020094114413410282209450d07200920012900003700142009412c6a200141186a290000370000200941246a200141106a2900003700002009411c6a200141086a290000370000200341e8006a41186a22014200370300200341e8006a41106a22114200370300200341e8006a41086a221242003703002003420037036820094134200341e8006a1000200341c0006a41186a2001290300370300200341c0006a41106a2011290300370300200341c0006a41086a2012290300370300200320032903683703402003412036026c2003200341c0006a360268200341206a200341e8006a105b2009102902402008450d00200c10290b2010450d00200f10290b20002005360204200020032f018c013b001d200041003602002000411c6a20063a0000200041186a2008360200200041146a2002360200200041106a20043602002000410c6a200a360200200041086a20073602002000411f6a200b2d00003a00000c070b41154101102a000b41354101102a000b418f89c3004133104e000b1039000b20084101102a000b41144101102a000b41344101102a000b20034190016a24000b9e6a04147f027e0d7f027e230041c0046b22042400200441b0036a20012002200310ff02200441b0036a41086a280200210520042802b40321060240024020042802b0034101470d002000200636020420004101360200200041086a20053602000c010b200441c4036a2802002207412c6c2108200441c8036a2802002109200441c0036a280200210a200441bc036a280200210b4100210c4100210102400340024020082001470d000c020b200b20016a21022001412c6a220d210120022d00004102470d000b200441d8006a200b200d6a41586a1080032004280258210c200428025c21010b4100210e20014100200c1b210f2007412c6c2108200c41b8d6c500200c1b21104100210102400340024020082001470d000c020b200b20016a21022001412c6a220d210120022d00004108470d000b200441d0006a200b200d6a41586a1080032004280250210e200428025421010b4100211120014100200e1b21122007412c6c2108200e41b8d6c500200e1b210d4100210102400340024020082001470d000c020b200b20016a21022001412c6a220c210120022d00004104470d000b200441c8006a200b200c6a41586a10800320042802482111200428024c21010b4100210e2001410020111b21132007412c6c2108201141b8d6c50020111b21144100210102400340024020082001470d000c020b200b20016a21022001412c6a220c210120022d00004103470d000b200441c0006a200b200c6a41586a1080032004280240210e200428024421010b4100211541002102024020014100200e1b2201450d00200141286c2108200e41b8d6c500200e1b41186a2101410021020340200220012d0000456a2102200141286a2101200841586a22080d000b0b200d201241146c6a21114100211202400240024003400240200d2011470d0020122015714101710d0341bb91c50041c38fc500201241017122011b2108411c411e20011b21010c020b41e18fc500210841382101200d41086a280200417c6a220e41024b0d01200d280200210c024002400240200e0e03000401000b41012115200c41b98fc500460d01200c28000041e3c2b1e306460d010c030b41012112200c41bd8fc500460d00200c41bd8fc500410610d0040d020b0240200d410c6a280200450d0041df90c5002108411321010c020b0240200d41106a280200220120026b220c20014d0d0041f290c5002108412a21010c020b41b990c5002108412621012013200c4d0d012014200c4102746a220c450d01419990c500210841202101200f200c280200220c4d0d012010200c4104746a220c450d01419c91c5002108411f2101200c2802080d01200d41146a210d200c2d000d4104460d000b0b200020083602040c010b2007412c6c2108410021010240034020082001460d01200b20016a21022001412c6a220d210120022d00004106470d000b200441386a200b200d6a41586a108003200428023c450d00200041878dc500360204411f21010c010b2007412c6c21082003280268210c410021010240034020082001460d01200b20016a21022001412c6a220d210120022d00004105470d000b200441306a200b200d6a41586a22011080030240200428023441014d0d0041182101200041a68dc5003602040c020b200441286a2001108003200428022c450d0020042802282201450d002001280200200c4d0d0041222101200041be8dc5003602040c010b2007412c6c2108410021010240034020082001460d01200b20016a21022001412c6a220d210120022d00004107470d000b200441206a200b200d6a41586a1080032004280220220120042802244104746a2108034020012008460d012001450d012001410c6a2102200141106a210120022d0000410271450d000b41322101200041ca8ec5003602040c010b2007412c6c2108410021010240034020082001460d01200b20016a21022001412c6a220d210120022d0000410b470d000b200b200d6a220141606a2802002202450d00200141586a280200220d200241186c6a210c0340200d220241186a210d2002280208410374210120022802002102024003402001450d01200141786a210120022d00042108200241086a21022008410271450d000b41312101200041998ec5003602040c030b200d200c470d000b0b2007412c6c2108410021010240034020082001460d01200b20016a21022001412c6a220d210120022d00004102470d000b200441186a200b200d6a41586a108003200428021c2201450d002004280218220220014104746a211103402002450d01200241106a210e200420022d000d22083a00b0032002280200220120022802086a210c410021024100200441b0036a20084104461b210d024003400240024002400240200241ff01710e03000102000b2001200c460d014100210220012108200141016a21010c020b2001200c460d034101210220012108200141016a21010c010b200d450d0241022102200d21084100210d0b20082d0000410271450d000b41392101200041e08dc5003602040c030b200e2102200e2011470d000b0b2007412c6c21084100210c4100210102400340024020082001470d000c020b200b20016a21022001412c6a220d210120022d00004102470d000b200441106a200b200d6a41586a1080032004280210210c200428021421010b4100210e20014100200c1b210f2007412c6c2108200c41b8d6c500200c1b21104100210102400340024020082001470d000c020b200b20016a21022001412c6a220d210120022d00004103470d000b200441086a200b200d6a41586a1080032004280208210e200428020c21010b200e41b8d6c500200e1b220220014100200e1b41286c6a210d4100211302400240024003400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002200d460d00412d210141dff5c200210820022802084103470d1102402002280200220c419ab0c500460d00200c419ab0c500410310d0040d120b200241286a21114115210c41d8f4c200210e4114210141cbf5c200210802400240024020022d00180e040014011b000b4136210c41a2f4c200210e200f200228021c22014d0d1a201020014104746a2214450d1a2002280214210c200228020c210220092d00700d01200c410b470d01413821014193f5c2002108200241ab8ac500460d13200241ab8ac500410b10d004450d130c160b412f2101418cf6c200210820022802144106470d120240200228020c220c419cf4c200460d00200c419cf4c200410610d0040d130b02402013450d00411f2101200041bbf6c2003602040c1b0b2002411c6a2113201121020c160b4126210141edf4c2002108200c417d6a220c41134b0d110240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200c0e14002a2a2a0e042a062d0b0a2a011110172a2a0c15000b2002419db0c500460d292002419db0c500410310d004450d29419db0c5002002410310d0040d2941011027220e450d19200e41003a0000024020142d000c41e000470d0020142802084101470d002014280200211241002102034020024101460d03200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c310b200241a888c500460d0141a888c5002002410f10d004450d010240200241b788c500460d0041b788c5002002410f10d0040d290b410110272212450d1a201241003a000020142d000c41e000470d2a20142802084101470d2a2014280200211541002102034020024101460d04201220026a210c201520026a210e200241016a2102200e2d0000200c2d0000460d000c2b0b0b20142d000d2101200e10292011210220014104460d2b0c2d0b41041027220e450d17200e4100360000024020142d000c41e000470d0020142802084104470d002014280200211241002102034020024104460d23200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c2e0b0240200241c688c500460d00200229000042e5f0d1fbb5ac98b6ec00520d260b410710272212450d1820124100360003201241013a0002201241003b000020142d000c41e000470d2620142802084107470d262014280200211541002102034020024107460d03201220026a210c201520026a210e200241016a2102200e2d0000200c2d0000460d000c270b0b20142d000d220c4104460d262012102920112102200c41fb0171450d280c240b200241ce88c500460d0141ce88c5002002410a10d004450d01200241d888c500460d0241d888c5002002410a10d004450d020240200241e288c500460d0041e288c5002002410a10d0040d070b4126210c41edf4c200210e20142d000c41e000470d2a20142802080d2a2011210220142d000d4104460d270c2a0b20142d000d220c4104460d232012102920112102200c41fb0171450d260c220b410710272212450d1520124100360003201241013a0002201241003b0000024020142d000c41e000470d0020142802084107470d0020142802002115410021020340024020024107470d0020142d000d220c4104460d022012102920112102200c41fb0171450d280c240b201220026a210c201520026a210e200241016a2102200e2d0000200c2d0000460d000b0b20121029200041edf4c2003602040c290b41021027220e450d15200e41003b0000024020142d000c41e000470d0020142802084102470d002014280200211241002102034020024102460d1e200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c280b0240200241f788c500460d0041f788c5002002410d10d0040d200b4126210c41edf4c200210e20142d000c41e000470d2620142802080d262011210220142d000d4104460d230c260b02402002418489c500460d00418489c5002002410c10d0040d1f0b4126210c41edf4c200210e20142d000c41e000470d2520142802080d252011210220142d000d4104460d220c250b02402002419b89c500460d00419b89c5002002411510d0040d1e0b4126210c41edf4c200210e20142d000c41e000470d2420142802080d242011210220142d000d4104460d210c240b0240200241b089c500460d0041b089c5002002410a10d0040d1d0b41021027220e450d12200e41003b0000024020142d000c41e000470d0020142802084102470d002014280200211241002102034020024102460d03200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c240b0240200241ba89c500460d0041ba89c5002002410710d0040d1c0b4126210c41edf4c200210e20142d000c41e000470d2220142802080d222011210220142d000d4104460d1f0c220b20142d000d2101200e10292011210220014104460d1e0c200b200241c189c500460d0141c189c5002002411110d004450d010240200241f289c500460d0041f289c5002002411110d0040d1a0b41041027220e450d12200e4100360000024020142d000c41e000470d0020142802084104470d002014280200211241002102034020024104460d07200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c210b200241d289c500460d0141d289c5002002411010d004450d01200241e289c500460d0241e289c5002002411010d004450d020240200241b68ac500460d0041b68ac5002002411010d0040d190b4126210c41edf4c200210e20142d000c41e000470d1f20142802080d1f2011210220142d000d4104460d1c0c1f0b41021027220e450d0e200e41003b0000024020142d000c41e000470d0020142802084102470d002014280200211241002102034020024102460d16200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c1f0b4126210c41edf4c200210e20142d000c41e000470d1d20142802080d1d20142d000d22014104460d1d20112102200141fb0171450d1a0c1b0b41031027220e450d0d200e41003a0002200e41003b0000024020142d000c41e000470d0020142802084103470d002014280200211241002102034020024103460d15200e20026a2108201220026a210c200241016a2102200c2d000020082d0000460d000b0b200e1029200041edf4c2003602040c1d0b0240200241838ac500460d0041838ac5002002411610d0040d150b410210272212450d0e201241003b0000024020142d000c41e000470d0020142802084102470d002014280200211541002102034020024102460d04201220026a210c201520026a210e200241016a2102200e2d0000200c2d0000460d000b0b201210290c140b20142d000d2101200e10292011210220014104460d170c190b0240200241998ac500460d0041998ac5002002411210d0040d130b4126210c41edf4c200210e20142d000c41e000470d1920142802080d192011210220142d000d4104460d160c190b20142d000d2101201210292011210220014104460d150c170b024020130d0041002116410021170c100b024020132802040d00200041daf6c200360204413221010c190b024020132802002216201341086a28020022174d0d002000418cf7c20036020441c90021010c190b201720032802644d0d0f200041d5f7c20036020441c10021010c180b41014101102a000b41044101102a000b41014101102a000b41074101102a000b41074101102a000b41024101102a000b41024101102a000b41024101102a000b41034101102a000b41044101102a000b41024101102a000b20142d000d2101200e10292011210220014104460d080c0a0b20142d000d2101200e10292011210220014104460d070c090b20142d000d2101200e10292011210220014104460d060c080b20142d000d2101200e10292011210220014104460d050c070b20092903082118200441b8036a220242003703002004418883c0003602b4032009290310211920042018a7417f2018428080808010541b3602c00320042019a7417f2019428080808010541b3602b003200441b0036a4104722201410d1081032001410c108103200141071081032001410f108103200441b0036a410c6a220128020021132002280200211120042802c003211a20042802b403210c20042802b003211b200441c0036a220820073602002001200a3602002004200b3602b803200420053602b403200420063602b003200441e0006a200441b0036a108203024002400240410110272201450d00200141003a0000200420042f01b003220d3b01a002200841e0083b01002002428180808010370300200420013602b403200441013602b0032004200d3b01c203200441e0006a200441b0036a108303210b0240410310272202450d00200241026a41002d009cb0453a0000200241002f009ab0453b00000240410310272208450d00200841026a41002d009fb0453a0000200841002f009db0453b000002400240024002400240024002400240200441f4006a280200220d200441e0006a41106a2802002201470d00200141016a220d2001490d012001410174220e200d200d200e491b220dad42287e2218422088a70d012018a7220e4100480d010240024020010d00200e102721010c010b200428026c200141286c200e102821010b2001450d072004200d3602702004200136026c2004280274210d0b200428026c200d41286c6a220141003a00182001200836020c2001428380808030370204200120023602002001411c6a200b360200200141106a4283808080303702002004200428027441016a360274200441b0036a200441e0006a418c0110ce041a200441f0016a200441b0036a108403200441f0016a41106a280200220f412c6c210120042802f801220e41586a210202400340410021082001450d01200141546a2101200241286a210d2002412c6a220b2102200d2d00004103470d000b200b41086a2802002201450d00200141286c2102200b28020041186a2101410021080340200820012d0000456a2108200141286a2101200241586a22020d000b0b200f412c6c2101200e41586a21022008417f6a210d02400340410021082001450d01200141546a2101200241286a210b2002412c6a22072102200b2d00004103470d000b200741086a2802002201450d00200141286c2102200728020041186a2101410021080340200820012d0000456a2108200141286a2101200241586a22020d000b0b200f412c6c2101200e41606a21020240034041002107024020010d00410021010c020b200141546a2101200241206a210b2002412c6a22142102200b2d00004104470d000b201428020021010b0240024002400240200f450d00200120086a211c200e200f412c6c6a211d4100211e4100211403400240200e2d000041786a220141034b0d00024002400240024020010e0403010200030b200e28020c2201450d03200e280204220b200141186c6a211f0340201421200240200b22212802144104742202450d00202128020c21010340024020012d0000410b470d00200141046a2208280200220b200d490d002008200b41016a3602000b200141106a2101200241706a22020d000b0b02400240024002400240024002400240024002400240410810272201450d002001428080808010370200410410272222450d012021410c6a21082022410036020020212802142223450d0241002102410121122023210b4101210f4101211541012114024003402002200b4f0d01200241016a210502400240024002400240024002400240200828020020024104746a2d0000220b417e6a220241044b0d0020020e050101010302010b200b1085032124200c210b201121250340200b410c6a2107200b41086a2126200b2f010621104100210202400240034020102002460d01202620026a2106200741086a2107200241016a210202404100417f410120062d00002206202441ff0171220a4b1b2006200a461b41016a0e03000301000b0b2002417f6a21100b024020250d00201b210b0c070b2025417f6a2125200b20104102746a41ec006a280200210b0c010b0b201b210b20072802000e0404100304040b200b1085032124200c210b2011212502400340200b410c6a2107200b41086a2126200b2f010621104100210202400240034020102002460d01202620026a2106200741086a2107200241016a210202404100417f410120062d00002206202441ff0171220a4b1b2006200a461b41016a0e03000301000b0b2002417f6a21100b024020250d00201b210b0c030b2025417f6a2125200b20104102746a41ec006a280200210b0c010b0b201b210b024020072802000e0401110001010b200741046a280200210b0b2014417f6a220220144f0d0f200220144b0d0f200f202220024102746a28020022024d0d0f200120024103746a22072802042202200b6a220b2002490d0f2007200b360204024002402012200f460d00201221100c010b201241016a22022012490d1e2012410174220b20022002200b491b221041ffffffff01712010470d1e201041037422024100480d1e0240024020120d002002102721010c010b200120124103742002102821010b2001450d0c0b2001200f4103746a22024101360204200220053602000240024020152014460d00201521060c010b201541016a22022015490d1e2015410174220b20022002200b491b220641ffffffff03712006470d1e200641027422024100480d1e0240024020150d002002102721220c010b202220154102742002102821220b2022450d0d0b200f41016a2102202220144102746a200f360200201441016a21140c050b2014450d0e2014417f6a21140c030b2014450d0d024002402012200f460d00201221100c010b201241016a22022012490d1c2012410174220b20022002200b491b221041ffffffff01712010470d1c201041037422024100480d1c0240024020120d002002102721010c010b200120124103742002102821010b2001450d0c0b2001200f4103746a22024101360204200220053602000240024020152014417f6a220b460d00201521060c010b20154101742202201420142002491b220641ffffffff03712006470d1c200641027422024100480d1c0240024020150d002002102721220c010b202220154102742002102821220b2022450d0d0b200f41016a21022022200b4102746a200f3602000c030b200741046a280200210b0b2014417f6a220220144f0d0b200220144b0d0b200f202220024102746a28020022024d0d0b200120024103746a22072802042202200b6a220b2002490d0b2007200b3602040b20122110200f2102201521060b20052023460d0a2021280214210b201021122002210f20062115200521020c000b0b41a0b0c5002002200b1037000b41084104102a000b41044104102a000b200141086a210741012106410121100c060b20024104102a000b20024104102a000b20024104102a000b20024104102a000b02402012450d00200110290b4101211e024020150d00202021140c080b20221029202021140c070b2002450d01200120024103746a21070b20012114410121020340200129020021182004412d3a00b003200420184220883e02b403200820022018a76a220b417f6a200441b0036a1086032004410b3a00b0032004200d3602b4032008200b200441b0036a108603200241026a21022007200141086a2201470d000b201421010b02402010450d00200110290b02402006450d00202210290b202141186a210b02400240201a450d0020212802142202450d00202128020c210120024104742102410021080340024020012d0000412c470d002001410b3a0000200141046a201c360200200841016a21080b200141106a2101200241706a22020d000b4101211420080d010b202021140b200b201f470d000c040b0b200e2802042201200d490d02200e200141016a3602040c020b200e28020c2201450d01200e280204220b2001411c6c6a21070340200b2201411c6a210b024020012802182202450d0020012802102101200241027421020340024020012802002208200d490d002001200841016a3602000b200141046a21012002417c6a22020d000b0b200b2007460d020c000b0b200e28020c2201450d00200141146c2102200e28020441106a2101034002402001417c6a2802000d0020012802002208200d490d002001200841016a3602000b200141146a21012002416c6a22020d000b0b200e412c6a220e201d470d000b201e4101710d0220144101710d01200428028002210720042802f801210e0b200441fc016a280200211220042802f401211420042802f001210f410021100c020b200441b0036a41106a200441f0016a41106a280200360200200441b0036a41086a200441f0016a41086a290300370300200420042903f0013703b003200441a0026a200441b0036a108203411010272202450d07200241063a0000410110272201450d06200141003a000041011027220b450d05200b20012d00003a000020011029411010272208450d04200841063a000041f00010272201450d03200141063a00602001412c3b01502001200d3602442001410b3a0040200141d8003a00302001201a3602242001412d3a0020200141003602142001410f3a0010200141003602042001410f3a0000024020082d00004109470d00200828020841ffffffff0371450d00200828020410290b20081029024020022d00004109470d00200228020841ffffffff0371450d00200228020410290b20021029200441d4036a4287808080f000370200200441d0036a2001360200200441cc036a4100360200200441b0036a410c6a4281808080800c370200200441b8036a4101360200200441003602dc03200442043702c4032004200b3602b403200441013602b003200441a0026a200441b0036a108703200441b0036a200441a0026a418c0110ce041a20044188026a200441b0036a10840320044188026a410c6a280200211220044198026a2802002107200428028802210f200428028c022114200428029002210e410021100c010b200441fc016a280200211220042802f801210e02402004280280022207450d002007412c6c2102200e2101034020011088032001412c6a2101200241546a22020d000b0b41012110411a211441fc8ec500210f02402012450d00200e10290b0b02402011450d000340200c28026c210c2011417f6a22110d000b0b4100210841002101024003402013450d01024002402001200c2f01064f0d00200c20014103746a41146a2902002118200141016a21010c010b02400240200c28020022010d002008ad21184100210d410021010c010b200c3301044220862008ad8421184101210d0b200c10292018a72108024002402018422088a7220b20012f01064f0d00200121020c010b034002400240200128020022020d002008ad2118410021020c010b200d41016a210d20013301044220862008ad8421180b200110292018a72108200221012018422088a7220b20022f01064f0d000b0b200b41027420026a41f0006a280200210c2002200b4103746a41146a29020021180240200d417f6a2201450d000340200c28026c210c2001417f6a22010d000b0b410021010b2013417f6a21132018a74103470d000b0b0240200c418883c000460d00200c2802002101200c10292001450d0020012802002102200110292002450d00024020022802002201450d000340200210292001210220012802002208210120080d000b0b200210290b02402010450d002000200f36020420004101360200200041086a20143602000c160b200441a0026a41106a2007360200200441a0026a410c6a20123602002004200e3602a802200420143602a4022004200f3602a002200441b0036a200441a0026a2009280260108903024020042802b0034101470d000240200441b0036a41086a280200450d0020042802b40310290b200041968fc50036020420004101360200200041086a41233602000c160b200441c4036a2802002102200441b0036a41106a2802002112200441b0036a410c6a2802002110200441b8036a280200210d20042802b4032108200328025821032004410036029002200442013703880202400240410410272201450d002004410436028c022004200428029002220b41046a3602900220042001360288022001200b6a200836000002400240200428028c02220820042802900222016b4104490d0020042802880221080c010b200141046a220b2001490d0320084101742201200b200b2001491b22014100480d030240024020080d002001102721080c010b20042802880220082001102821080b2008450d022004200136028c02200420083602880220042802900221010b2004200141046a36029002200820016a200d36000020102002412c6c22016a210d024020020d00201021010c0e0b200141546a2113200441b0036a4101722102200441b0036a41276a210b200441b0036a41206a210c200441b0036a41186a210e200441b0036a41106a2107200441b0036a41086a211120102101034020012d00002108200b200141286a280000360000200c200141216a290000370300200e200141196a2900003703002007200141116a2900003703002011200141096a2900003703002004200141016a2900003703b00302402008410f470d002001412c6a21010c0f0b200441a0026a41276a2214200b280000360000200441a0026a41206a220f200c290300370300200441a0026a41186a200e2903002218370300200441a0026a41106a20072903002219370300200441a0026a41086a20112903002227370300200420042903b00322283703a00220022028370000200241086a2027370000200241106a2019370000200241186a2018370000200241206a200f290300370000200241276a2014280000360000200420083a00b003200441e0006a200441b0036a20044188026a108a0320042d00602208411a470d0d201341546a21132001412c6a2201200d470d000b200d21010c0d0b41044101102a000b20014101102a000b102b000b41f0004108102a000b41104108102a000b41014101102a000b41014101102a000b41104108102a000b200e4104102a000b41034101102a000b41034101102a000b41014101102a000b200428026421152004280268210302402013450d002001412c6a2101200441b0036a4101722102200441b0036a41276a210c200441b0036a41206a210e200441b0036a41186a2107200441b0036a41106a2111200441b0036a41086a2113034020012d0000210b200c200141286a280000360000200e200141216a2900003703002007200141196a2900003703002011200141116a2900003703002013200141096a2900003703002004200141016a2900003703b003200b410f460d01200441a0026a41276a2214200c280000360000200441a0026a41206a220f200e290300370300200441a0026a41186a20072903002218370300200441a0026a41106a20112903002219370300200441a0026a41086a20132903002227370300200420042903b00322283703a00220022028370000200241086a2027370000200241106a2019370000200241186a2018370000200241206a200f290300370000200241276a20142800003600002004200b3a00b003200441b0036a1088032001412c6a2201200d470d000b0b02402012450d00201010290b0240200428028c02450d0020042802880210290b024020084105470d002003450d00201510290b200041d791c50036020420004101360200200041086a41253602000c0a0b02402001200d460d00200441b0036a4101722102200441b0036a41276a210b200441b0036a41206a210c200441b0036a41186a210e200441b0036a41106a2107200441b0036a41086a2111034020012d00002108200b200141286a280000360000200c200141216a290000370300200e200141196a2900003703002007200141116a2900003703002011200141096a2900003703002004200141016a2900003703b0032008410f460d01200441a0026a41276a2213200b280000360000200441a0026a41206a2214200c290300370300200441a0026a41186a200e2903002218370300200441a0026a41106a20072903002219370300200441a0026a41086a20112903002227370300200420042903b00322283703a00220022028370000200241086a2027370000200241106a2019370000200241186a2018370000200241206a2014290300370000200241276a2013280000360000200420083a00b003200441b0036a1088032001412c6a2201200d470d000b0b02402012450d00201010290b2004280288022101200429028c0221182000411c6a41003a0000200041146a2018370200200041106a20013602002000410c6a2017360200200041086a2016360200200020033602042000411d6a20042f00f0013b0000200041003602002000411f6a200441f2016a2d00003a00000c090b200020083602040c070b20121029200041edf4c2003602040c060b20121029200041edf4c2003602040c050b02400240200241ec88c500460d0041ec88c5002002410b10d0040d010b4126210c41edf4c200210e20142d000c41e000470d0420142802080d042011210220142d000d4104460d010c040b024002402002419089c500460d00419089c5002002410b10d0040d010b4126210c41edf4c200210e20142d000c41e000470d0420142802080d042011210220142d000d4104460d010c040b0240200241ab8ac500460d0041ab8ac5002002410b10d0040d020b0240024041021027220c450d00200c41003b0000024020142d000c41e000470d0020142802084102470d002014280200210e41002101034020014102460d03200c20016a2102200e20016a2108200141016a210120082d000020022d0000460d000b0b200c10290c030b41024101102a000b20142d000d2101200c10292011210220014104460d000c020b0b41262101200041edf4c2003602040c020b4126210c41edf4c200210e0b200c21012000200e3602040b20004101360200200041086a200136020002402007450d00200b2007412c6c6a2100200b210c0340200c220d412c6a210c02400240200d2d00002201410d4b0d00024002400240024002400240024002400240024002400240024020010e0e0001020304050607080e090a0b0c000b200d41086a280200450d0d200d41046a28020010290c0d0b0240200d41086a280200450d00200d41046a28020010290b200d41146a280200450d0c200d41106a28020010290c0c0b0240200d410c6a2802002202450d00200d41046a28020021012002410474210203400240200141046a280200450d00200128020010290b200141106a2101200241706a22020d000b0b200d41086a280200450d0b200d28020410290c0b0b0240200d410c6a2802002202450d00200d41046a2802002101200241286c210203400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200241586a22020d000b0b200d41086a280200450d0a200d28020410290c0a0b200d41086a280200450d09200d41046a28020010290c090b200d41086a280200450d08200d41046a28020010290c080b200d41086a280200450d07200d41046a28020010290c070b0240200d410c6a2802002201450d00200d41046a280200220820014104746a210e0340024020082802082202450d0020082802002101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b200841106a21010240200841046a280200450d00200828020010290b200121082001200e470d000b0b200d41086a280200450d06200d28020410290c060b0240200d410c6a2802002202450d00200d41046a2802002101200241146c210203400240200141046a280200450d00200128020010290b200141146a21012002416c6a22020d000b0b200d41086a280200450d05200d28020410290c050b0240200d410c6a2802002201450d00200d41046a28020022082001411c6c6a210e034002402008410c6a2802002202450d0020082802042101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200e470d000b0b200d41086a280200450d04200d28020410290c040b0240200d410c6a2802002201450d00200d41046a2802002208200141186c6a210e03400240200841046a280200450d00200828020010290b0240200841146a2802002202450d00200828020c2101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b200841186a21010240200841106a280200450d00200828020c10290b200121082001200e470d000b0b200d41086a280200450d03200d28020410290c030b0240200d410c6a2802002201450d00200d41046a28020022082001411c6c6a210e034002402008410c6a2802002202450d0020082802042101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200e470d000b0b200d41086a280200450d02200d28020410290c020b0240200d41046a2d0000220141024b0d0002400240024020010e03000102000b200d410c6a280200450d04200d41086a28020010290c040b0240200d41146a2802002202450d00200d410c6a28020021012002410c6c21020340024020012802002208450d00200141046a280200450d00200810290b2001410c6a2101200241746a22020d000b0b200d41106a280200450d03200d28020c10290c030b0240200d41146a2802002201450d00200d410c6a280200220720014104746a211103402007220e41106a21070240200e2802042201450d000240200e410c6a2802002202450d002002410c6c21020340024020012802002208450d00200141046a280200450d00200810290b2001410c6a2101200241746a22020d000b0b200e41086a280200450d00200e28020410290b20072011470d000b0b200d41106a280200450d02200d28020c10290c020b200d410c6a280200450d01200d41086a28020010290c010b0240200d41086a280200450d00200d41046a28020010290b0240200d41146a2802002201450d00200d41186a280200450d00200110290b200d41246a280200450d00200d41206a28020010290b200c2000470d000b0b200a450d00200b10290b200441c0046a24000bb21c05017f027e037f027e097f23004180066b220224004202210302400240024002400240024002400240024002400240200129036822044202520d00200241186a20014198016a41880110ce041a0c010b20024186026a200141036a2d00003a0000200241e8016a41086a200141146a290200370300200241e8016a410d6a200141196a290000370000200220012f00013b0184022002200129020c3703e80120012d000021052001280204210620012802082107200241c0026a200141dc006a290000370300200241b8026a200141d4006a290000370300200241b0026a200141cc006a290000370300200241a8026a200141c4006a290000370300200241a0026a2001413c6a29000037030020024188026a41106a200141346a29000037030020024188026a41086a2001412c6a2900003703002002200129002437038802200241c8026a41086a20014188016a290300370300200241c8026a41106a20014190016a290300370300200220014180016a2903003703c802200141f8006a290300210820012903702109200241086a41888dc300410d10940142002103024020044201520d002009500d022002290310420020022802081b2203200820082003541b2203200320087d2009827d21030b41101027220a450d02200a41086a41002900bf8d43370000200a41002900b78d43370000200a411041201028220a450d03200a2003370010200241e0056a41186a220b4200370300200241e0056a41106a220c4200370300200241e0056a41086a220d4200370300200242003703e005200a4118200241e0056a1000200241c0056a41186a200b290300370300200241c0056a41106a200c290300370300200241c0056a41086a200d290300370300200220022903e0053703c005200241c0056a412041b8d6c50041004100100b210b200a102902400240200b417f470d004101210a411f210b41afb8c300210c0c010b200241b8036a2003108702200241be056a20022d00ba033a0000200241e8056a200241cb036a290000370300200241ed056a200241b8036a41186a290000370000200220022f01b8033b01bc05200220022900c3033703e00520022800bb03210c20022800bf03210b4100210a0b200241b8056a41026a220d200241bc056a41026a220e2d00003a000020024190056a41086a220f200241e0056a41086a221029030037030020024190056a41106a200241e0056a41106a290300370300200220022f01bc053b01b805200220022903e005370390050240200a450d002002419c036a41026a200241b4056a41026a2d00003a000020024180036a41086a200241a0036a41086a29030037030020024180036a41106a200241a0036a41106a290300370300200220022f01b4053b019c03200220022903a00337038003200041086a200b3602002000200c3602042000410136020020014198016a103d0c0a0b200241a0036a410d6a221120024190056a410d6a290000370000200241a0036a41086a220a200f2903003703002002419c036a41026a220f200d2d00003a000020024180036a41086a220d200a29030037030020024180036a41106a200241a0036a41106a290300370300200220022f01b8053b019c03200220022903900537038003200241fc026a41026a220a200f2d00003a0000200220022f019c033b01fc02200241e0026a410d6a220f20024180036a410d6a290000370000200241e0026a41086a2212200d29030037030020022002290380033703e002200241b8036a20014198016a41880110ce041a200241b8036a4198016a2008370300200241c8046a2009370300200241f7046a200b360000200241f3046a200c360000200241d8046a220b20022903c802370300200241e0046a200241c8026a41086a290300370300200241e8046a200241c8026a41106a290300370300200241f2046a200a2d00003a0000200241fb046a20022903e00237000020024183056a201229030037000020024188056a200f290000370000200220043703c004200220022f01fc023b01f004200e20024184026a41026a2d00003a00002010200241e8016a41086a290300370300200241e0056a410d6a2201200241e8016a410d6a290000370000200220022f0184023b01bc05200220022903e8013703e005024002400240200541ff01714101470d0020024180036a200641067610cc01200228028003210a024002402002280288032006413f7122014b0d00410021010c010b200241b8056a41026a200a20014105746a220141026a2d00003a0000200241a8036a200141136a290000370300200241ad036a200141186a290000370000200220012f00003b01b8052002200129000b3703a0032001280007210720012800032106410121010b0240200228028403450d00200a10290b20010d01410121014184efc2002106411521070c020b200241b8056a41026a200241bc056a41026a2d00003a0000200241a0036a41086a200241e0056a41086a29030037030020112001290000370000200220022f01bc053b01b805200220022903e0053703a0030b20024180036a41026a200241b8056a41026a2d00003a0000200241e0056a41086a200241a0036a41086a290300370300200241e0056a410d6a200241a0036a410d6a290000370000200220022f01b8053b018003200220022903a0033703e005410021010b200241b4056a41026a220a20024180036a41026a2d00003a0000200241c0056a41086a220c200241e0056a41086a290300370300200241c0056a41106a200241e0056a41106a290300370300200220022f0180033b01b405200220022903e0053703c00502402001450d002000200636020420004101360200200041086a2007360200200241b8036a103d0c0a0b200241a3056a200c290300370000200241a8056a200241cd056a290000370000200220022f01b4053b01900520022007360097052002200636009305200220022903c00537009b052002200a2d00003a009205200241003602e805200242013703e005200241b8036a200241e0056a10320240024020022903c0044201510d000240024020022802e40520022802e8052201460d0020022802e005210a0c010b200141016a220a2001490d0a20014101742206200a200a2006491b22064100480d0a0240024020010d0020061027210a0c010b20022802e005200120061028210a0b200a450d07200220063602e4052002200a3602e00520022802e80521010b2002200141016a3602e805200a20016a41003a00000c010b20022903d00420022903c8042204420c882203420120034201561b8021030240024020022802e405220a20022802e80522016b4102490d0020022802e005210a0c010b200141026a22062001490d09200a4101742201200620062001491b22014100480d0902400240200a0d0020011027210a0c010b20022802e005200a20011028210a0b200a450d07200220013602e4052002200a3602e00520022802e80521010b2002200141026a3602e805200a20016a2003a741047420047aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b200b200241e0056a10542002200241e0046a3602c005200241c0056a200241e0056a10590240024020022802e405220c20022802e805220a6b4120490d0020022802e00521010c010b200a41206a2201200a490d08200c410174220a20012001200a491b22064100480d0802400240200c0d002006102721010c010b20022802e005200c2006102821010b2001450d07200220063602e405200220013602e00520022802e805210a2006210c0b2001200a6a2206200241f0046a220b290000370000200641186a200b41186a290000370000200641106a200b41106a290000370000200641086a200b41086a29000037000002400240200a41206a220a4180024b0d0002402001200a20024188026a20024190056a10140d004101210a0c020b2001200a20024188026a20024190056a101545210a0c010b200241e0056a41186a22064200370300200241e0056a41106a220b4200370300200241e0056a41086a220d4200370300200242003703e0052001200a200241e0056a1000200241c0056a41186a2006290300370300200241c0056a41106a200b290300370300200241c0056a41086a200d290300370300200220022903e0053703c0050240200241c0056a412020024188026a20024190056a10140d004101210a0c010b200241c0056a412020024188026a20024190056a101545210a0b0240200c450d00200110290b200a450d08200241c8016a41186a20024190056a41186a290300370300200241c8016a41106a20024190056a41106a290300370300200241c8016a41086a20024190056a41086a290300370300200241a0016a41086a200241d0046a290300370300200241a0016a41106a200241d8046a290300370300200241a0016a41186a200241e0046a290300370300200241c0016a200241e8046a29030037030020022002290390053703c8012002200241c8046a2903003703a00120022903c0042103200241186a200241b8036a41880110ce041a0b200041086a20022903c801370300200041286a2003370300200041306a20022903a001370300200041206a200241c8016a41186a290300370300200041186a200241c8016a41106a290300370300200041106a200241c8016a41086a290300370300200041386a200241a0016a41086a290300370300200041c0006a200241a0016a41106a290300370300200041c8006a200241a0016a41186a290300370300200041d0006a200241a0016a41206a290300370300200041d8006a200241186a41880110ce041a2000410036020020024180066a24000f0b41a8cec5001058000b41104101102a000b41204101102a000b20064101102a000b20014101102a000b20064101102a000b102b000b200041a981c20036020420004101360200200041086a411a360200200241b8036a103d0b20024180066a24000bfb0301067f230041e0006b22022400024002400240411010272203450d00200341086a41002900bf8d43370000200341002900b78d4337000020034110412010282203450d0120032001370010200241c0006a41186a22044200370300200241c0006a41106a22054200370300200241c0006a41086a220642003703002002420037034020034118200241c0006a1000200241186a2004290300370300200241106a2005290300370300200241086a2006290300370300200220022903403703002002410036024020024120200241c0006a100521060240024020022802402204417f460d00200241c0006a2004412020044120491b22056a41004100412020056b2005411f4b1b10cd041a200241c0006a2006200510ce041a2004411f4d0d04200241206a41186a2204200241c0006a41186a290000370300200241206a41106a2205200241c0006a41106a290000370300200241206a41086a2207200241c0006a41086a2900003703002002200229004037032020061029200041186a2004290300370000200041106a2005290300370000200041086a2007290300370000200020022903203700000c010b200041186a4200370000200041106a4200370000200041086a4200370000200042003700000b20031029200241e0006a24000f0b41104101102a000b41204101102a000b418f89c3004133104e000bf70603057f027e067f230041c0016b22022400200242003703800120024180016a2001280200220320012802042204410820044108491b220510ce041a2001200420056b22063602042001200320056a220536020002400240200441074b0d00200042003703000c010b2002290380012107200242003703800120024180016a20052006410820064108491b220410ce041a2001200620046b22033602042001200520046a22053602000240200641074d0d00200229038001210820024180016a2003412020034120491b22046a41004100412020046b2004411f4b1b10cd041a20024180016a2005200410ce041a2001200320046b22063602042001200520046a220536020002402003411f4b0d00200042003703000c020b200241e0006a41186a220320024180016a41186a2209290000370300200241e0006a41106a220a20024180016a41106a220b290000370300200241e0006a41086a220c20024180016a41086a220d290000370300200220022900800137036020024180016a200641c000200641c000491b22046a4100410041c00020046b2004413f4b1b10cd041a20024180016a2005200410ce041a2001200620046b3602042001200520046a36020002402006413f4b0d00200042003703000c020b200241386a220120024180016a41386a290000370300200241306a220420024180016a41306a290000370300200241286a220520024180016a41286a290000370300200241206a220620024180016a41206a290000370300200241186a220e2009290000370300200241106a2209200b290000370300200241086a220b200d290000370300200241c0006a41086a220d200c290300370300200241c0006a41106a220c200a290300370300200241c0006a41186a220a2003290300370300200220022900800137030020022002290360370340200041106a200837030020002007370308200041186a2002290340370300200041206a200d290300370300200041286a200c290300370300200041306a200a290300370300200041386a2002290300370300200041c0006a200b290300370300200041c8006a2009290300370300200041d0006a200e290300370300200041d8006a2006290300370300200041e0006a2005290300370300200041e8006a2004290300370300200041f0006a2001290300370300200042013703000c010b200042003703000b200241c0016a24000b860204017f017e037f017e230041c0006b2203240042002104200341206a41186a22054200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020012002200341206a1000200341186a2005290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703002003410036022020034120200341206a1005210202400240024020032802202201417f470d000c010b20034200370320200341206a20022001410820014108491b10ce041a200141074d0d012003290320210820021029420121040b2000200837030820002004370300200341c0006a24000f0b418f89c3004133104e000bc80101027f230041206b22022400200241106a41086a220342003703002002420037031020002001200241106a1004200241086a2003290300370300200220022903103703002002410036021020024110200241106a10052101024002400240024020022802102200417f470d00410221000c010b200241003a0010200241106a20012000410047220310ce041a20002003490d012000450d0220022d001021002001102920024110100c0b200241206a240020000f0b20032000103e000b418f89c3004133104e000b870802087f0a7e230041e0026b22022400200241386a2001280200200128020428020c1100000240024020022903384201520d0020024198026a4101722103200241386a41086a2104200241ab016a21050340200241a8016a41186a2206200441186a290000370300200241a8016a41106a2207200441106a290000370300200241a8016a41086a2208200441086a290000370300200220042900003703a80120024198026a200241a8016a108c02024002400240024020022d0098024101460d00200241003602e8010c010b200241c0026a41186a200341186a290000370300200241c0026a41106a200341106a290000370300200241c0026a41086a200341086a290000370300200220032900003703c002200241c8016a200241c0026a108d0220022802e80122090d010b4200210a4200210b0c010b200241c8016a41086a290300210b20022903c801210a20022802ec01450d00200910290b20024198026a41086a2008290300220c37030020024198026a41106a2007290300220d37030020024198026a41186a2006290300220e370300200220022903a801220f37039802200241c8016a41086a2207200c370300200241c8016a41106a2208200d370300200241c8016a41186a2209200e3703002002200f3703c801200241206a41b18ac0004116108601200241106a2002290328200241206a41106a290300427f420010d4042002200a200b20022903104200200228022022061b220c4201200c420156200241106a41086a290300420020061b220c420052200c501b22061b200c420020061b10d404024002402002290300220c50450d00410221060c010b200241c0026a41186a2009290300370300200241c0026a41106a2008290300370300200241c0026a41086a2007290300370300200220022903c8013703c002200220022800a8013602a001200220052800003600a3014200211041002106200c2111200a2112200b21130b20024180016a41086a200241c0026a41086a29030037030020024180016a41106a200241c0026a41106a29030037030020024180016a41186a200241c0026a41186a290300370300200220022903c00237038001200220022802a001360278200220022800a30136007b024020064102460d002000201137031020004200370308200042003703002000200229038001370320200020063a004020002002280278360041200041186a2010370300200041d0006a2013370300200041c8006a2012370300200041c4006a200228007b360000200041286a20024188016a290300370300200041306a20024190016a290300370300200041386a20024180016a41186a2903003703000c030b200241386a2001280200200128020428020c11000020022903384201510d000b0b200041023a00400b200241e0026a24000bbd0402087f047e230041e0006b22022400024002400240410e10272203450d00200341066a41002900c7a244370000200341002900c1a2443700002003410e412e10282203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a22054200370300200242003703202003412e200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002410036024020024120200241c0006a100521050240024020022802402201417f460d00200241206a2001412020014120491b22046a41004100412020046b2004411f4b1b10cd041a200241206a2005200410ce041a2001411f4d0d04200241c0006a41186a2201200241206a41186a2204290300370300200241c0006a41106a2206200241206a41106a2207290300370300200241c0006a41086a2208200241206a41086a2209290300370300200220022903203703402005102920042001290300220a37030020072006290300220b37030020092008290300220c37030020022002290340220d370320200041013a00002000200d370001200041096a200c370000200041116a200b370000200041196a200a3700000c010b200041003a00000b20031029200241e0006a24000f0b410e4101102a000b412e4101102a000b418f89c3004133104e000bee05010c7f230041d0016b2202240002400240024002400240410e10272203450d00200341066a410029009fa34437000020034100290099a3443700002003410e412e10282203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241f8006a41186a22014200370300200241f8006a41106a22044200370300200241f8006a41086a22054200370300200242003703782003412e200241f8006a1000200241d8006a41186a2001290300370300200241d8006a41106a2004290300370300200241d8006a41086a20052903003703002002200229037837035820024100360278200241d8006a4120200241f8006a1005210420022802782201417f460d03200220013602cc01200220043602c801200241f8006a200241c8016a10d3032002280298012205450d02200241386a41186a2206200241f8006a41186a290300370300200241386a41106a2207200241f8006a41106a290300370300200241386a41086a2208200241f8006a41086a290300370300200241086a41086a2209200241f8006a412c6a290200370300200241086a41106a220a200241f8006a41346a290200370300200241086a41186a220b200241f8006a413c6a290200370300200241286a220c200241f8006a41c4006a290200370300200241306a220d200241f8006a41cc006a280200360200200220022903783703382002200229029c0137030802402001450d00200410290b200020022903383703002000200536022020002002290308370224200041186a2006290300370300200041106a2007290300370300200041086a20082903003703002000412c6a2009290300370200200041346a200a2903003702002000413c6a200b290300370200200041c4006a200c290300370200200041cc006a200d2802003602000c040b410e4101102a000b412e4101102a000b418f89c3004133104e000b200041003602200b20031029200241d0016a24000b8e0a03077f037e047f230041d0016b22022400200241b0016a41186a22034200370300200241b0016a41106a22044200370300200241b0016a41086a22054200370300200242003703b001200241b0016a2001280200220620012802042207412020074120491b220810ce041a2001200720086b3602042001200620086a360200024002402007411f4b0d00410021070c010b20024190016a41186a2003290300220937030020024190016a41106a2004290300220a37030020024190016a41086a2005290300220b370300200241f0006a41086a200b370300200241f0006a41106a200a370300200241f0006a41186a2009370300200220022903b00122093703900120022009370370410121070b200241b0016a41186a2208200241f0006a41186a290300370300200241b0016a41106a2206200241f0006a41106a290300370300200241b0016a41086a2203200241f0006a41086a290300370300200220022903703703b0010240024020070d00200041003602080c010b200241306a41186a2008290300370300200241306a41106a2006290300370300200241306a41086a2003290300370300200220022903b00137033020022001105202402002290300a70d00200041003602080c010b20022903082109200241b0016a41186a22044200370300200241b0016a41106a22054200370300200241b0016a41086a220c4200370300200242003703b001200241b0016a2001280200220320012802042207412020074120491b220810ce041a2001200720086b22063602042001200320086a220836020002402007411f4b0d00200041003602080c010b200241d0006a41086a200c290300370300200241d0006a41106a2005290300370300200241d0006a41186a2004290300370300200220022903b001370350200241b0016a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd041a200241b0016a2008200710ce041a2001200620076b3602042001200820076a36020002402006411f4b0d00200041003602080c010b200241f0006a41086a2203200241b0016a41086a2207290300370300200241f0006a41106a2204200241b0016a41106a2208290300370300200241f0006a41186a2205200241b0016a41186a2206290300370300200220022903b001370370200241106a200110430240200228021022010d00200041003602080c010b2007200241306a41086a2903003703002008200241306a41106a2903003703002006200241306a41186a29030037030020024190016a41086a220c200241d0006a41086a29030037030020024190016a41106a220d200241d0006a41106a29030037030020024190016a41186a220e200241d0006a41186a290300370300200220022903303703b00120022002290350370390012002290214210a200241106a41186a220f2005290300370300200241106a41106a22052004290300370300200241106a41086a22042003290300370300200220022903703703102000200a37020c2000200136020820002009370300200041146a20022903b0013702002000411c6a2007290300370200200041246a20082903003702002000412c6a2006290300370200200041346a2002290390013702002000413c6a200c290300370200200041c4006a200d290300370200200041cc006a200e290300370200200041ec006a200f290300370200200041e4006a2005290300370200200041dc006a2004290300370200200041d4006a20022903103702000b200241d0016a24000bcb2a04057f027e027f047e230041e0046b22022400200241003a00d402200241d4026a2001280200220320012802042204410047220510ce041a0240024002400240024002400240024002400240024020042005490d002001200420056b22063602042001200320056a2205360200024020040d00200041123a00000c0b0b024020022d00d402220441104b0d000240024002400240024002400240024002400240024002400240024002400240024020040e11000102030405060708090a0b0c0d0e0f10000b200241d8036a2001103c20022802d8032104200241d4026a200241d8036a41047241840110ce041a024020044112470d00200041123a00000c1c0b200241d0016a200241d4026a41840110ce041a41880110272205450d1220052004360200200541046a200241d0016a41840110ce041a20022001105302402002290300a70d00200041123a00002005103d200510290c1c0b200241106a290300210720022903082108200041013a0000200020022f00b0013b0001200041086a2008370300200041046a2005360200200041186a2002290358370300200041106a2007370300200041036a200241b2016a2d00003a0000200041206a200241d8006a41086a290300370300200041286a200241d8006a41106a290300370300200041306a200241d8006a41186a2903003703000c1b0b200241186a2001102e024020022802180d00200041123a00000c1b0b200228021c2101200041023a0000200020022f00d4023b0001200041046a2001360200200041086a20022903d803370300200041036a200241d4026a41026a2d00003a0000200041106a200241d8036a41086a290300370300200041186a200241d8036a41106a290300370300200041206a200241d8036a41186a290300370300200041286a200241d8036a41206a290300370300200041306a200241d8036a41286a2903003703000c1a0b200241206a2001102e024020022802200d00200041123a00000c1a0b20022802242106200241003a00d402200241d4026a2001280200220320012802042204410047220510ce041a20042005490d112001200420056b3602042001200320056a360200024002402004450d0020022d00d402220141ff007122044106490d010b200041123a00000c1a0b200041033a0000200041046a2006360200200041026a20043a0000200020014107763a0001200041086a20022903d803370300200041106a200241d8036a41086a290300370300200041186a200241d8036a41106a290300370300200041206a200241d8036a41186a290300370300200041286a200241d8036a41206a290300370300200041306a200241d8036a41286a2903003703000c190b200241286a2001102e024020022802280d00200041123a00000c190b200228022c2106200241003a00d402200241d4026a2001280200220320012802042204410047220510ce041a20042005490d112001200420056b3602042001200320056a360200024002402004450d0020022d00d402220141ff007122044106490d010b200041123a00000c190b200041043a0000200041046a2006360200200041026a20043a0000200020014107763a0001200041086a20022903d803370300200041106a200241d8036a41086a290300370300200041186a200241d8036a41106a290300370300200041206a200241d8036a41186a290300370300200041286a200241d8036a41206a290300370300200041306a200241d8036a41286a2903003703000c180b200241d8036a2001103c20022802d8032104200241d4026a200241d8036a41047241840110ce041a024020044112470d00200041123a00000c180b200241d0016a200241d4026a41840110ce041a41880110272205450d1120052004360200200541046a200241d0016a41840110ce041a200241003a00d402200241d4026a2001280200220920012802042204410047220310ce041a20042003490d122001200420036b22063602042001200920036a2203360200024002402004450d0020022d00d402220a4103490d010b200041123a00000c170b200242003703d803200241d8036a20032006410820064108491b220410ce041a2001200620046b22093602042001200320046a22043602000240200641074b0d00200041123a00000c170b20022903d8032107200242003703d803200241d8036a20042009410820094108491b220310ce041a2001200920036b3602042001200420036a3602000240200941074b0d00200041123a00000c170b200041106a20022903d803370300200041086a2007370300200041046a20053602002000200a3a0001200041053a0000200041186a2002290358370300200041206a200241d8006a41086a290300370300200041286a200241d8006a41106a290300370300200041306a200241d8006a41186a2903003703000c170b200241003602d402200241d4026a20052006410420064104491b220410ce041a2001200620046b3602042001200520046a3602000240200641034b0d00200041123a00000c170b20022802d4022101200041063a0000200020022f00d0013b0001200041046a2001360200200041086a20022903d803370300200041036a200241d2016a2d00003a0000200041106a200241d8036a41086a290300370300200041186a200241d8036a41106a290300370300200041206a200241d8036a41186a290300370300200041286a200241d8036a41206a290300370300200041306a200241d8036a41286a2903003703000c160b200241d8036a2001103c20022802d8032101200241d4026a200241d8036a41047241840110ce041a024020014112470d00200041123a00000c160b200241d0016a200241d4026a41840110ce041a41880110272204450d1120042001360200200441046a200241d0016a41840110ce041a200041073a0000200020022f00b0013b0001200041036a200241b2016a2d00003a0000200041046a2004360200200041086a2002290358370300200041106a200241d8006a41086a290300370300200041186a200241d8006a41106a290300370300200041206a200241d8006a41186a290300370300200041286a200241d8006a41206a290300370300200041306a200241d8006a41286a2903003703000c150b200241d8036a2001103c20022802d8032101200241d4026a200241d8036a41047241840110ce041a024020014112470d00200041123a00000c150b200241d0016a200241d4026a41840110ce041a41880110272204450d1120042001360200200441046a200241d0016a41840110ce041a200041083a0000200020022f00b0013b0001200041036a200241b2016a2d00003a0000200041046a2004360200200041086a2002290358370300200041106a200241d8006a41086a290300370300200041186a200241d8006a41106a290300370300200041206a200241d8006a41186a290300370300200041286a200241d8006a41206a290300370300200041306a200241d8006a41286a2903003703000c140b41002109200241d4026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241d4026a2005200410ce041a2001200620046b22033602042001200520046a220436020002402006411f4d0d00200241d0016a41186a200241d4026a41186a2900002207370300200241d0016a41106a200241d4026a41106a2900002208370300200241d0016a41086a200241d4026a41086a290000220b370300200241d8006a41086a200b370300200241d8006a41106a2008370300200241d8006a41186a2007370300200220022900d40222073703d00120022007370358410121090b200241d8036a41186a2205200241d8006a41186a290300370300200241d8036a41106a2206200241d8006a41106a290300370300200241d8036a41086a220a200241d8006a41086a290300370300200220022903583703d803024020090d00200041123a00000c140b200241b0016a41186a2005290300370300200241b0016a41106a2006290300370300200241b0016a41086a200a290300370300200220022903d8033703b001200242003703d803200241d8036a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041123a00000c140b20022903d8032107200242003703d803200241d8036a20042006410820064108491b220510ce041a2001200620056b3602042001200420056a3602000240200641074b0d00200041123a00000c140b20024190016a41086a200241b0016a41086a290300220837030020024190016a41106a200241b0016a41106a290300220b37030020024190016a41186a200241b0016a41186a290300220c370300200220022903b001220d3703900120022903d803210e200041093a00002000200d370001200041096a2008370000200041116a200b370000200041196a200c370000200041216a200228008901360000200041246a2002418c016a280000360000200041306a200e370300200041286a20073703000c130b41002103200241d4026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241d4026a2005200410ce041a2001200620046b3602042001200520046a36020002402006411f4d0d00200241d0016a41186a200241d4026a41186a2900002207370300200241d0016a41106a200241d4026a41106a2900002208370300200241d0016a41086a200241d4026a41086a290000220b370300200241d8006a41086a200b370300200241d8006a41106a2008370300200241d8006a41186a2007370300200220022900d40222073703d00120022007370358410121030b200241d8036a41186a2201200241d8006a41186a290300370300200241d8036a41106a2204200241d8006a41106a290300370300200241d8036a41086a2205200241d8006a41086a290300370300200220022903583703d803024020030d00200041123a00000c130b200241b0016a41186a20012903002207370300200241b0016a41106a20042903002208370300200241b0016a41086a2005290300220b370300200220022903d803220c3703b0012000410a3a00002000200c370001200041096a200b370000200041116a2008370000200041196a2007370000200041216a200229009001370000200041296a20024190016a41086a290000370000200041306a2002419f016a2900003700000c120b200241306a2001102e024020022802300d00200041123a00000c120b200228023421012000410b3a0000200020022f00d4023b0001200041046a2001360200200041086a20022903d803370300200041036a200241d6026a2d00003a0000200041106a200241d8036a41086a290300370300200041186a200241d8036a41106a290300370300200041206a200241d8036a41186a290300370300200041286a200241d8036a41206a290300370300200041306a200241d8036a41286a2903003703000c110b200241c8006a2001105202402002290348a70d00200041123a00000c110b20022903502107200241c0006a2001102e024020022802400d00200041123a00000c110b20022802442104200241386a2001102e024020022802380d00200041123a00000c110b200228023c21012000410c3a0000200020022f00d4023b0001200041106a2007370300200041086a2001360200200041046a2004360200200041186a20022903d803370300200041036a200241d6026a2d00003a0000200041206a200241d8036a41086a290300370300200041286a200241d8036a41106a290300370300200041306a200241d8036a41186a2903003703000c100b200241d4026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241d4026a2005200410ce041a2001200620046b3602042001200520046a36020002402006411f4b0d00200041123a00000c100b200241d8006a41086a200241d4026a41086a2900002208370300200241d8006a41106a200241d4026a41106a290000220b370300200241d8006a41186a200241d4026a41186a290000220c370300200220022900d40222073703d803200220073703582000410d3a000020002007370001200041096a2008370000200041116a200b370000200041196a200c370000200041216a20022900b001370000200041296a200241b0016a41086a290000370000200041306a200241bf016a2900003700000c0f0b2000410e3a00000c0e0b200241d4026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241d4026a2005200410ce041a2001200620046b3602042001200520046a36020002402006411f4b0d00200041123a00000c0e0b200241d8006a41086a200241d4026a41086a2900002208370300200241d8006a41106a200241d4026a41106a290000220b370300200241d8006a41186a200241d4026a41186a290000220c370300200220022900d40222073703d803200220073703582000410f3a000020002007370001200041096a2008370000200041116a200b370000200041196a200c370000200041216a20022900b001370000200041296a200241b0016a41086a290000370000200041306a200241b0016a410f6a2900003700000c0d0b200241d4026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241d4026a2005200410ce041a2001200620046b22033602042001200520046a220436020002402006411f4b0d00200041123a00000c0d0b200241d8006a41086a200241d4026a41086a290000370300200241d8006a41106a200241d4026a41106a290000370300200241d8006a41186a200241d4026a41186a290000370300200220022900d40222073703d80320022007370358200241003a00d402200241d4026a20042003410047220510ce041a20032005490d0a2001200320056b3602042001200420056a360200024002402003450d0020022d00d40222014106490d010b200041123a00000c0d0b200241b0016a41186a200241d8006a41186a2903002207370300200241b0016a41106a200241d8006a41106a2903002208370300200241b0016a41086a200241d8006a41086a290300220b37030020022002290358220c3703b001200041103a00002000200c370001200041096a200b370000200041116a2008370000200041196a2007370000200041216a20013a0000200041226a2002290190013701002000412a6a20024190016a41086a290100370100200041306a2002419e016a2901003701000c0c0b200041113a00000c0b0b200041123a00000c0a0b20052004103e000b4188014108102a000b20052004103e000b20052004103e000b4188014108102a000b20032004103e000b4188014108102a000b4188014108102a000b20052003103e000b2005103d200510290b200241e0046a24000b890a02057f047e230041d0036b22022400200241003a00c802200241c8026a2001280200220320012802042204410047220510ce041a02400240024002400240024020042005490d002001200420056b22063602042001200320056a2205360200024020040d00200041053a00000c060b02400240024020022d00c802220441034b0d0002400240024020040e0400010204000b200241c0016a2001102d20022802c00122010d04200041053a00000c0a0b200241c8026a2001103c20022802c8022101200241c0016a200241c8026a41047241840110ce041a024020014112470d00200041053a00000c0a0b200241386a200241c0016a41840110ce041a41880110272204450d0520042001360200200441046a200241386a41840110ce041a200041023a0000200020022f00353b0001200041036a200241356a41026a2d00003a0000200041046a2004360200200041086a2002290214370200200041106a200241146a41086a290200370200200041186a200241146a41106a290200370200200041206a200241146a41186a2902003702000c090b20022001102e024020022802000d00200041053a00000c090b20022802042105200241c8026a2001103c20022802c8022101200241c0016a200241c8026a41047241840110ce041a024020014112470d00200041053a00000c090b200241386a200241c0016a41840110ce041a41880110272204450d0520042001360200200441046a200241386a41840110ce041a200041033a0000200020022f00353b0001200041036a200241376a2d00003a0000200041086a2004360200200041046a20053602002000410c6a2002290214370200200041146a200241146a41086a2902003702002000411c6a200241246a290200370200200041246a2002412c6a2802003602000c080b200041053a00000c070b200241c8026a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200241c8026a2005200410ce041a2001200620046b3602042001200520046a3602002006411f4d0d05200241c0016a41186a200241c8026a41186a290000370300200241c0016a41106a200241c8026a41106a290000370300200241c0016a41086a200241c8026a41086a290000370300200220022900c8023703c001200241086a2001102e024020022802080d00200041053a00000c070b200228020c2106200241003a00c802200241c8026a2001280200220320012802042204410047220510ce041a20042005490d042001200420056b3602042001200320056a360200024020040d00200041053a00000c070b200241386a41086a200241c0016a41086a2903002207370300200241386a41106a200241c0016a41106a2903002208370300200241386a41186a200241c0016a41186a2903002209370300200220022903c001220a37033820022d00c8022101200041043a00002000200a370001200041096a2007370000200041116a2008370000200041196a2009370000200041246a2006360200200041216a20013a00000c060b20022902c4012107200041013a0000200020022f00383b0001200041086a2007370000200041046a2001360000200041106a20022902c802370200200041036a2002413a6a2d00003a0000200041186a200241c8026a41086a290200370200200041206a200241c8026a41106a2902003702000c050b20052004103e000b4188014108102a000b4188014108102a000b20052004103e000b200041053a00000b200241d0036a24000bc12308057f017e017f027e017f037e087f027e230041f0056b22022400200241003a0070200241f0006a2001280200220320012802042204410047220510ce041a02400240024002400240024020042005490d002001200420056b22063602042001200320056a2205360200024020040d00200041073a00000c060b02400240024002400240024020022d0070220441054b0d000240024002400240024020040e06000102030406000b200241d8026a200110f10220024180056a200241d8026a41f00010ce041a200220022800c9033602d0032002200241cc036a2800003600d303024020022d00c80322014102470d00200041073a00000c100b200241e8016a20024180056a41f00010ce041a200220022800d3033600e304200220022802d0033602e004200241f7006a200241e8016a41f00010ce041a200041013a0000200041016a200241f0006a41f70010ce041a200041f8006a20013a0000200041f9006a20022802e004360000200041fc006a20022800e3043600000c0f0b200241086a2001105202402002290308a70d00200041073a00000c0f0b20022903102107200241f0006a20011044200228027022010d05200041073a00000c0e0b200241f0006a2001105020024180056a41086a2204200241f9006a29000037030020024180056a41106a220520024181016a29000037030020024180056a41186a220320024189016a29000037030020024180056a411f6a220620024190016a2800003600002002200229007137038005024020022d007022084102470d00200041073a00000c0e0b200241e8016a411f6a2006280000360000200241e8016a41186a2003290300370300200241e8016a41106a2005290300370300200241e8016a41086a200429030037030020022002290380053703e801200241286a2001105302402002290328a70d00200041073a00000c0e0b200241286a41106a290300210720022903302109200241186a2001105202402002290318a70d00200041073a00000c0e0b2002290320210a200241f0006a20011044200228027022010d05200041073a00000c0d0b200241d0006a2001105302402002290350a70d00200041073a00000c0d0b200241e0006a290300210720022903582109200241c0006a2001105202402002290340a70d00200041073a00000c0d0b2002290348210a20024180056a41186a2206420037030020024180056a41106a2208420037030020024180056a41086a220b4200370300200242003703800520024180056a2001280200220320012802042204412020044120491b220510ce041a2001200420056b3602042001200320056a360200024002402004411f4b0d00410021040c010b200241e8016a41186a2006290300220c370300200241e8016a41106a2008290300220d370300200241e8016a41086a200b290300220e370300200241d0036a41086a200e370300200241d0036a41106a200d370300200241d0036a41186a200c3703002002200229038005220c3703e8012002200c3703d003410121040b200241f0006a41186a2205200241d0036a41186a290300370300200241f0006a41106a2203200241d0036a41106a290300370300200241f0006a41086a2206200241d0036a41086a290300370300200220022903d003370370024020040d00200041073a00000c0d0b200241e0046a41186a2005290300370300200241e0046a41106a2003290300370300200241e0046a41086a2006290300370300200220022903703703e004200241f0006a20011044200228027022010d05200041073a00000c0c0b20024180056a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a20024180056a2005200410ce041a2001200620046b22033602042001200520046a220436020002402006411f4b0d00200041073a00000c0c0b200241e0046a41086a20024180056a41086a290000370300200241e0046a41106a20024180056a41106a290000370300200241e0046a41186a20024180056a41186a29000037030020022002290080052207370370200220073703e004200241003a0070200241f0006a20042003410047220510ce041a20032005490d072001200320056b22063602042001200420056a22043602002003450d0820022d0070220541014b0d08410021030240024020050e020100010b20024180056a2006412020064120491b22056a41004100412020056b2005411f4b1b10cd041a20024180056a2004200510ce041a2001200620056b3602042001200420056a3602002006411f4d0d09200241f0006a41086a20024180056a41086a2900002207370300200241d0036a41186a20024180056a41186a290000370300200241d0036a41106a20024180056a41106a290000370300200241d0036a41086a200737030020022002290080052207370370200220073703d003410121030b200241a0046a41086a2201200241d0036a41086a290300370300200241a0046a41106a2204200241d0036a41106a290300370300200241a0046a41186a2205200241d0036a41186a290300370300200241c0046a41086a2206200241e0046a41086a290300370300200241c0046a41106a2208200241e0046a41106a290300370300200241c0046a41186a220b200241e0046a41186a290300370300200220022903d0033703a004200220022903e0043703c004200041053a0000200041216a20033a0000200020022903c004370001200041096a2006290300370000200041116a2008290300370000200041196a200b290300370000200041226a20022903a0043700002000412a6a2001290300370000200041326a20042903003700002000413a6a2005290300370000200041f8006a2002418e036a290100370100200041f2006a20024188036a290100370100200041ea006a20024180036a290100370100200041e2006a200241f8026a290100370100200041da006a200241d8026a41186a290100370100200041d2006a200241d8026a41106a290100370100200041ca006a200241d8026a41086a290100370100200041c2006a20022901d8023701000c0b0b200041073a00000c0a0b20024180056a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a20024180056a2005200410ce041a2001200620046b22033602042001200520046a22053602002006411f4d0d08200241e0046a41086a20024180056a41086a2208290000370300200241e0046a41106a20024180056a41106a220b290000370300200241e0046a41186a20024180056a41186a220f29000037030020022002290080052207370370200220073703e00420024180056a2003412020034120491b22046a41004100412020046b2004411f4b1b10cd041a20024180056a2005200410ce041a2001200320046b22063602042001200520046a220436020002402003411f4b0d00200041073a00000c0a0b200241d0036a41086a2008290000370300200241d0036a41106a200b290000370300200241d0036a41186a200f29000037030020022002290080053703d003200242003703e002200242003703d802200241d8026a20042006411020064110491b220510ce041a2001200620056b3602042001200420056a36020002402006410f4b0d00200041073a00000c0a0b200241e0026a290300210720022903d8022109200241e8006a2001102e02402002280268450d0002400240200228026c22104180012010418001491b220b0d004101210f0c010b200b41057422041027220f450d090b02402010450d00200241d8026a41186a2111200241d8026a41106a2112200241d8026a41086a21134100210841002103410021050340201142003703002012420037030020134200370300200242003703d802200241d8026a2001280200221420012802042204412020044120491b220610ce041a2001200420066b3602042001201420066a36020002402004411f4b0d00200b450d03200f10290c030b200541016a2104200241f0006a41186a22062011290300370300200241f0006a41106a22142012290300370300200241f0006a41086a22152013290300370300200220022903d80237037002402005200b470d0002402008200420042008491b220b41ffffff3f71200b470d00200b41057422164100480d000240024020050d0020161027210f0c010b200f200320161028210f0b200f0d0120164101102a000b102b000b200f20036a22052002290370370000200541186a2006290300370000200541106a2014290300370000200541086a2015290300370000200841026a2108200341206a21032004210520102004470d000b0b200f0d040b200041073a00000c090b20022902742109200041023a0000200020022f0080053b0001200041106a2007370300200041086a2009370000200041046a2001360000200041036a20024180056a41026a2d00003a0000200041186a200241d8026a41e80010ce041a0c080b200241d0036a41086a2204200241e8016a41086a290300370300200241d0036a41106a2205200241e8016a41106a290300370300200241d0036a41186a2203200241e8016a41186a290300370300200241d0036a411f6a2206200241e8016a411f6a280000360000200220022903e8013703d0032002290274210c200041033a0000200020022f00e0043b0001200041036a200241e2046a2d00003a0000200041046a20083a0000200041c0006a2007370300200041386a2009370300200041c8006a200a3703002000412c6a200c370200200041286a2001360200200041056a20022903d0033700002000410d6a2004290300370000200041156a20052903003700002000411d6a2003290300370000200041246a2006280000360000200041f8006a200241d8026a41286a290300370300200041f0006a200241f8026a290300370300200041e8006a200241d8026a41186a290300370300200041e0006a200241d8026a41106a290300370300200041d8006a200241d8026a41086a290300370300200041d0006a20022903d8023703000c070b200241c0046a41086a200241e0046a41086a290300220c370300200241c0046a41106a200241e0046a41106a290300220d370300200241c0046a41186a200241e0046a41186a290300220e370300200220022903e00422173703c00420022902742118200041386a2007370300200041306a2009370300200041043a000020002017370001200041096a200c370000200041116a200d370000200041196a200e370000200041216a20022f00a0043b0000200041236a200241a2046a2d00003a0000200041c0006a200a370300200041286a2018370000200041246a2001360000200041c8006a20022903d802370300200041d0006a200241d8026a41086a290300370300200041d8006a200241d8026a41106a290300370300200041e0006a200241d8026a41186a290300370300200041e8006a200241f8026a290300370300200041f0006a200241d8026a41286a290300370300200041f8006a200241d8026a41306a2903003703000c060b200241c0046a41186a2201200241e0046a41186a290300370300200241c0046a41106a2204200241e0046a41106a290300370300200241c0046a41086a2205200241e0046a41086a290300370300200241a0046a41086a2203200241d0036a41086a290300370300200241a0046a41106a2206200241d0036a41106a290300370300200241a0046a41186a2208200241d0036a41186a290300370300200220022903e0043703c004200220022903d0033703a004200041063a0000200020022903c004370001200041096a2005290300370000200041116a2004290300370000200041196a2001290300370000200041216a20022903a004370000200041296a2003290300370000200041316a2006290300370000200041396a2008290300370000200041c1006a20022f009d043b0000200041c3006a2002419f046a2d00003a0000200041d8006a2007370300200041d0006a2009370300200041c8006a2010ad422086200bad84370000200041c4006a200f360000200041f8006a200241f8036a41186a290300370300200041f0006a200241f8036a41106a290300370300200041e8006a200241f8036a41086a290300370300200041e0006a20022903f8033703000c050b20052004103e000b20052003103e000b200041073a00000c020b20044101102a000b200041073a00000b200241f0056a24000ba30b01077f230041106b2202240002400240024002400240024002400240024020002d0000417f6a220341034b0d00024002400240024020030e0400010203000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0c20034101742205200420042005491b22054100480d0c0240024020030d002005102721040c010b200128020020032005102821040b2004450d0520012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280204210320022000410c6a280200220036020c2002410c6a200110302000450d0320004105742106200141046a210703400240024020072802002204200528020022006b4120490d00200128020021040c010b200041206a22082000490d0d20044101742200200820082000491b22004100480d0d0240024020040d002000102721040c010b200128020020042000102821040b2004450d072001200436020020072000360200200528020021000b2005200041206a360200200420006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000c040b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0b20034101742205200420042005491b22054100480d0b0240024020030d002005102721040c010b200128020020032005102821040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000280204200110320c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0a20034101742205200420042005491b22054100480d0a0240024020030d002005102721040c010b200128020020032005102821040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200041046a200110302000280208200110320c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0920034101742205200420042005491b22054100480d090240024020030d002005102721040c010b200128020020032005102821040b2004450d0620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d0920044101742203200520052003491b22034100480d090240024020040d002003102721040c010b200128020020042003102821040b2004450d0720012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a29000037000020032000290001370000200041246a2001103002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d0920034101742205200420042005491b22054100480d090240024020030d002005102721040c010b200128020020032005102821040b2004450d0820012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d00213a00000b200241106a24000f0b20054101102a000b20004101102a000b20054101102a000b20054101102a000b20054101102a000b20034101102a000b20054101102a000b102b000bf71802047f017e20002802582102024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141046a2802002203200141086a28020022046b4104490d00200128020021030c010b200441046a22052004490d1320034101742204200520052004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0120012003360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200320046a20023600002000290300210602400240200141046a2802002203200528020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0220012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290308210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0320012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290310210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0420012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290318210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0520012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290320210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290328210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0720012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290330210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0820012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290338210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0920012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290340210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0a20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290348210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290350210602400240200141046a2802002203200228020022046b4108490d00200128020021030c010b200441086a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0c20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a2006370000200028025c210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0d20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280260210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0e20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280264210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d0f20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280268210502400240200141046a2802002203200228020022046b4104490d00200128020021030c010b200441046a22022004490d1320034101742204200220022004491b22044100480d130240024020030d002004102721030c010b200128020020032004102821030b2003450d1020012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a200536000002400240200141046a28020020022802002204460d00200128020021030c010b200441016a22032004490d1320044101742202200320032002491b22024100480d130240024020040d002002102721030c010b200128020020042002102821030b2003450d1120012003360200200141046a2002360200200141086a28020021040b200141086a2202200441016a360200200320046a20002d00703a0000200028026c210302400240200141046a2802002204200228020022006b4104490d00200128020021040c010b200041046a22022000490d1320044101742200200220022000491b22004100480d130240024020040d002000102721040c010b200128020020042000102821040b2004450d1220012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a20033600000f0b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20024101102a000b20004101102a000b102b000bb01405167f017e017f027e037f230041206b220224000240024020014115490d0002402001410176220341ffffff3f712003470d0020034105742204417f4c0d0041012105024002402004450d00200410272205450d010b200041606a2106200041a07f6a210741042108410021094100210a2001210b034002400240200b220c417f6a220d0d004101210e4100210b0c010b0240024002400240024002402000200d4105746a200c410574220f20006a41406a412010d0044100480d004102200c6b210d2007200f6a21044101210e03400240200d200e6a4101470d004100210b200c210e0c080b200e41016a210e200441206a2004412010d0042110200441606a21042010417f4a0d000b200c200e6b210d0c010b2007200f6a2104024003400240200d4101470d004100210d0c020b200d417f6a210d200441206a2004412010d0042110200441606a210420104100480d000b0b200c200d490d01200c20014b0d03200c200d6b220e4101762211450d002006200f6a21042000200d4105746a21100340200241186a220f201041186a2212290000370300200241106a2213201041106a2214290000370300200241086a2215201041086a221629000037030020022010290000370300200441086a22172900002118200441106a2219290000211a200441186a220b290000211b201020042900003700002012201b3700002014201a37000020162018370000200b200f290300370000201920132903003700002017201529030037000020042002290300370000200441606a2104201041206a21102011417f6a22110d000b0b0240200d0d00200d210b0c050b0240200e41094d0d00200d210b0c050b200c20014b0d01200c200d6b21112000200d4105746a210f0340200c200d417f6a220b490d040240200c200b6b220e4102490d002000200d4105746a22042000200b4105746a220d412010d004417f4a0d00200d2900002118200d2004290000370000200241186a2215200d41186a2210290000370300200241106a2216200d41106a2212290000370300200241086a2217200d41086a22132900003703002013200441086a2900003700002012200441106a2900003700002010200441186a29000037000020022018370300410121140240200e4103490d00200d41c0006a2002412010d004417f4a0d0041022110200f210402400340200441186a200441386a290000370000200441106a200441306a290000370000200441086a200441286a2900003700002004200441206a221229000037000020112010460d01200441c0006a21132010211420122104201041016a211020132002412010d004417f4a0d020c000b0b201021140b200d20144105746a22042002290300370000200441186a2015290300370000200441106a2016290300370000200441086a20172903003700000b200b450d05200f41606a210f201141016a2111200b210d200e410a4f0d050c000b0b200d200c103e000b200c200d417f6a220b490d010b200c2001107f000b200b200c103e000b0240024002402009200a470d0002400240200941016a22042009490d0020094101742210200420042010491b220441ffffffff01712004470d002004410374221041004e0d010b102b000b0240024020090d002010102721080c010b200820094103742010102821080b2008450d01200421090b2008200a4103746a2204200e3602042004200b360200200a41016a2215210a20154102490d0103400240024002400240200820152213417f6a22154103746a2204280200450d00201341037420086a221141746a280200220e200428020422104d0d004102210a201341024d0d0620082013417d6a22044103746a280204220d2010200e6a4d0d014103210a201341034d0d06201141646a280200200d200e6a4d0d012013210a0c060b20134103490d012004280204211020082013417d6a22044103746a280204210d0b200d2010490d010b2013417e6a21040b0240024002400240024002402013200441016a221c4d0d00201320044d0d01200820044103746a2216280204221d20162802006a22042008201c4103746a22172802002219490d02200420014b0d03201641046a211e200020194105746a22122017280204221441057422106a210e2004410574210d200420196b220a20146b220420144f0d042005200e2004410574221010ce04220f20106a21110240024020144101480d00200441014e0d010b200e2104200f21100c060b2006200d6a210d200e21040340200d200441606a220e201141606a220a200a200e412010d004410048220c1b2210290000370000200d41186a201041186a290000370000200d41106a201041106a290000370000200d41086a201041086a2900003700002011200a200c1b211102402012200e2004200c1b2204490d00200f21100c070b200d41606a210d200f2110200f2011490d000c060b0b41d8e3c100201c20131037000b41d8e3c100200420131037000b20192004103e000b20042001107f000b20052012201010ce04220f20106a21110240024020144101480d00200a20144a0d010b20122104200f21100c010b2000200d6a210c200f21102012210403402004200e2010200e2010412010d004410048220a1b220d290000370000200441186a200d41186a290000370000200441106a200d41106a290000370000200441086a200d41086a2900003700002010201041206a200a1b2110200441206a2104200e41206a200e200a1b220e200c4f0d01201120104b0d000b0b20042010201120106b41607110ce041a201e201d20146a360200201620193602002017201741086a201c417f7320136a41037410cf041a2015210a201541014d0d020c000b0b20104104102a000b200b0d000b02402009450d00200810290b2003450d03200510290c030b20044101102a000b1039000b20014102490d002001417f6a2110200141057420006a41206a210c410121110340024002400240024020102204417f6a221020014b0d00200120106b220d4102490d03200020044105746a2204200020104105746a220a412010d004417f4a0d03200a2900002118200a2004290000370000200241186a2212200a41186a220e290000370300200241106a2213200a41106a220f290000370300200241086a2214200a41086a22082900003703002008200441086a290000370000200f200441106a290000370000200e200441186a2900003700002002201837030041012104200d4103490d02200a41c0006a2002412010d004417f4a0d024100210f200c21040340200441406a220d200441606a220e290000370000200d41186a200e41186a290000370000200d41106a200e41106a290000370000200d41086a200e41086a2900003700002011200f220d460d02200d417f6a210f20042002412010d004210e200441206a2104200e417f4a0d020c000b0b20102001103e000b4102200d6b21040b200a20044105746a22042002290300370000200441186a2012290300370000200441106a2013290300370000200441086a20142903003700000b200c41606a210c2011417f6a211120100d000b0b200241206a24000be91a03037f027e067f230041f0016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e12000102030405060708090a0b0c0d0e0f1011000b200241e8006a200141086a10960220004100360200200041106a200241e8006a41086a290300370300200041086a20022903683703000c110b109702000b20004102360200200041086a200141086a2903003703000c0f0b200241e8006a200141046a1038200041033602002000410c6a200241f0006a280200360200200020022903683702040c0e0b109802000b0240024002400240200141086a280200417f6a220341014b0d0020030e020102010b41e4bdc0001058000b41012103024002402001410c6a22042d00004101460d00200241026a200441036a2d00003a0000200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a0000200220042f00013b01002002200141146a290200370368200141106a2802002104410021030c010b200141106a28020021040b200241246a41026a200241026a2d00003a0000200241286a41086a200241e8006a41086a290300370300200241286a41106a200241e8006a41106a290300370300200241286a41186a200241e8006a41186a280200360200200220022f01003b012420022002290368370328200141386a29030021052001290330210641012107200241106a21010c010b41012103024002402001410c6a22042d00004101460d00200241ee016a200441036a2d00003a0000200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a0000200220042f00013b01ec012002200141146a290200370368200141106a2802002104410021030c010b200141106a28020021040b41022107200241246a41026a200241ec016a41026a2d00003a0000200241286a41086a200241e8006a41086a290300370300200241286a41106a200241e8006a41106a290300370300200241286a41186a200241e8006a41186a280200360200200220022f01ec013b012420022002290368370328200220012903303703102002200141386a290300370318200141c8006a290300210520012903402106200221010b20012006370300200120053703082000410c6a20033a0000200041086a2007360200200020022f01243b000d2000410f6a200241266a2d00003a0000200041106a2004360200200041146a20022903283702002000411c6a200241286a41086a290300370200200041246a200241286a41106a2903003702002000412c6a200241c0006a280200360200200041386a200241106a41086a290300370300200041306a2002290310370300200041c0006a2002290300370300200041c8006a200241086a290300370300200041053602000c0c0b200241e8006a200141086a10990220004106360200200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c0b0b200241e8006a41186a200141286a290000370300200241e8006a41106a200141206a290000370300200241f0006a200141186a290000370300200241e8006a41286a200141386a290000370300200241e8006a41306a200141c0006a290000370300200241e8006a41386a200141c8006a2900003703002002200141106a2900003703682002200141306a290000370388012001410c6a2802002203417f4c0d0b0240024020030d00410121010c010b20012802042104200310272201450d0d20012004200310ce041a0b200241286a41386a2204200241e8006a41386a290300370300200241286a41306a2207200241e8006a41306a290300370300200241286a41286a2208200241e8006a41286a290300370300200241286a41206a2209200241e8006a41206a290300370300200241286a41186a220a200241e8006a41186a290300370300200241286a41106a220b200241e8006a41106a290300370300200241286a41086a220c200241e8006a41086a290300370300200220022903683703282000410c6a2003360200200041086a200336020020002001360204200041106a2002290328370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a2004290300370200200041073602000c0a0b200241e8006a200141086a109a0220004108360200200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c090b200241e8006a200141046a109b0220004109360200200041246a20024188016a2903003702002000411c6a20024180016a290300370200200041146a200241f8006a2903003702002000410c6a200241f0006a290300370200200020022903683702040c080b200241e8006a200141046a109b022000410a360200200041246a20024188016a2903003702002000411c6a20024180016a290300370200200041146a200241f8006a2903003702002000410c6a200241f0006a290300370200200020022903683702040c070b200241e8006a200141086a10c8012000410b360200200041c0006a200241e8006a41386a290300370300200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c060b2000410c360200200041086a200141086a2903003703000c050b2001410c6a2802002203417f4c0d050240024020030d00410121010c010b20012802042104200310272201450d0820012004200310ce041a0b200020013602042000410d3602002000410c6a2003360200200041086a20033602000c040b024002400240024002400240200141086a280200417f6a220341024b0d0020030e03010203010b4190a9c1001058000b200141386a2903002105200141306a290300210641012103024002402001410c6a2d00004101460d00200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a00002002200141146a29020037036820012f000d2001410f6a2d0000411074722104200141106a2802002101410021030c010b200141106a28020021010b200241286a41186a200241e8006a41186a280200360200200241286a41106a200241e8006a41106a290300370300200241286a41086a200241e8006a41086a29030037030020022002290368370328410121070c030b2001410c6a28020022034108762104410221070c010b2001410c6a28020022034108762104410321070b0b2000410e360200200041386a2005370300200041306a2006370300200041106a2001360200200041086a2007360200200041146a20022903283702002000410c6a2004410874200341ff0171723602002000411c6a200241286a41086a290300370200200041246a200241286a41106a2903003702002000412c6a200241c0006a2802003602000c030b200241e8006a200141086a109c02200041086a200241e8006a41800110ce041a2000410f3602000c020b02400240024002402001280204417f6a220341014b0d0020030e020102010b41f8e2c1001058000b41880110272203450d072003200141086a280200109502410121010c010b4101210302400240200141086a2d00004101460d00200241e8006a41086a200141186a290200370300200241e8006a41106a200141206a290200370300200241e8006a41186a200141286a2d00003a00002002200141106a29020037036820012f00092001410b6a2d00004110747241087421072001410c6a2802002104410021030c010b2001410c6a2802002104410021070b200241286a41186a200241e8006a41186a280200360200200241286a41106a200241e8006a41106a290300370300200241286a41086a200241e8006a41086a2903003703002002200229036837032820032007722103410221010b20002001360204200041103602002000410c6a2004360200200041086a2003360200200041106a2002290328370200200041186a200241286a41086a290300370200200041206a200241286a41106a290300370200200041286a200241286a41186a2802003602000c010b200241e8006a200141086a10b101200041086a200241e8006a41d80010ce041a200041113602000b200241f0016a24000f0b1039000b20034101102a000b20034101102a000b4188014108102a000bac0703037f017e077f0240024002400240024002400240024002400240024002400240024002402001280200417f6a220241054b0d0020020e06010203040506010b41b48ec3001058000b200041013602000f0b2001410c6a2802002202417f4c0d040240024020020d00410121010c010b20012802042103200210272201450d0620012003200210ce041a0b20002001360204200041023602002000410c6a2002360200200041086a20023602000f0b20004103360200200041086a200141086a2903003703000f0b2001410c6a2802002202417f4c0d020240024020020d00410121010c010b20012802042103200210272201450d0520012003200210ce041a0b20002001360204200041043602002000410c6a2002360200200041086a20023602000f0b2001410c6a2802002204ad42187e2205422088a70d012005a72203417f4c0d01200128020421020240024020030d00410421060c010b200310272206450d050b0240024020040d00410021070c010b2002200441186c6a210841002107200621010340200241086a2802002203417f4c0d03200228020021090240024020030d004101210a0c010b20031027220a450d080b200a2009200310ce04210a200241146a2802002209417f4c0d032002410c6a280200210b0240024020090d004101210c0c010b20091027220c450d090b200c200b200910ce04210b200141146a2009360200200141106a20093602002001410c6a200b360200200141086a2003360200200141046a20033602002001200a360200200141186a2101200741016a2107200241186a22022008470d000b0b20002006360204200041053602002000410c6a2007360200200041086a20043602000f0b2001410c6a280200220cad420c7e2205422088a70d002005a72202417f4c0d00200128020421030240024020020d00410421080c010b200210272208450d070b02400240200c0d00410021090c010b2003200c410c6c6a210b41002109200821020340200341086a2802002201417f4c0d02200328020021070240024020010d004101210a0c010b20011027220a450d0a0b200a2007200110ce042107200241086a2001360200200241046a2001360200200220073602002002410c6a2102200941016a21092003410c6a2203200b470d000b0b20002008360204200041063602002000410c6a2009360200200041086a200c3602000f0b1039000b20024101102a000b20024101102a000b20034104102a000b20034101102a000b20094101102a000b20024104102a000b20014101102a000b0a0041dc8dc3001058000b0a004198eec2001058000bbf0c03047f017e057f230041206b2202240002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2203410c4b0d0020030e0d0102030405060708090a0b0c0d010b41e8fcc4001058000b4101210302400240200141046a2d00004101460d002002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030c010b200141086a28020021040b200041286a2001290328370300200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a28020036020020012d00012101200041013a0000200020013a00010c0c0b200041023a0000200041106a200141106a290300370300200041086a200141086a2903003703000c0b0b200041033a0000200041106a200141106a290300370300200041086a200141086a2903003703000c0a0b200041043a00000c090b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a2802003602000c080b2001410c6a2802002205ad42247e2206422088a70d082006a72204417f4c0d08200141046a28020021030240024020040d00410421070c010b200410272207450d0a0b0240024020050d00410021040c010b200541246c2108410021042002411e6a21092007210103400240024020032d00004101460d002009200341036a2d00003a0000200341046a280000210a200341016a2f0000210b200241086a200341106a290000370300200241106a200341186a290000370300200241186a200341206a2d00003a00002002200b3b011c2002200341086a2900003703004100210b0c010b200341046a280200210a4101210b0b200341246a21032001200b3a0000200141046a200a360200200141016a20022f011c3b0000200141036a20092d00003a0000200141086a2002290300370200200141106a200241086a290300370200200141186a200241106a290300370200200141206a200241186a280200360200200141246a2101200441016a21042008415c6a22080d000b0b200041063a00002000410c6a2004360200200041086a2005360200200041046a20073602000c070b200041073a00000c060b200041083a0000200020012d00013a00010c050b4101210302400240200141046a2d00004101460d002002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030c010b200141086a28020021010b200041093a0000200041046a20033a0000200041056a20022f011c3b0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a2802003602000c040b2000410a3a0000200041046a200141046a2802003602000c030b2000410b3a00000c020b2000410c3a0000200041046a200141046a2802003602000c010b2001410c6a280200220841ffffff3f712008470d0120084105742203417f4c0d01200141046a280200210a0240024020030d004101210b0c010b20031027220b450d040b0240024020080d0041002108410021010c010b200841057421044160200a6b2109200b2101200a2103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200a20084105746a20096a41057641016a21010b2000410d3a00002000410c6a2001360200200041086a2008360200200041046a200b3602000b200241206a24000f0b1039000b20044104102a000b20034101102a000be50701017f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220241104b0d0020020e110102030405060708090a0b0c0d0e0f1011010b41c499c4001058000b41880110272202450d102002200141046a28020010c103200041046a2002360200200041013a0000200041106a200141106a290300370300200041086a200141086a2903003703000f0b200041023a0000200041046a200141046a2802003602000f0b200041033a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b200041043a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b41880110272202450d0d2002200141046a28020010c103200041046a2002360200200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200020012d00013a00010f0b200041063a0000200041046a200141046a2802003602000f0b41880110272202450d0c2002200141046a28020010c103200041073a0000200041046a20023602000f0b41880110272202450d0c2002200141046a28020010c103200041083a0000200041046a20023602000f0b200041093a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041306a200141306a290300370300200041286a200141286a2903003703000f0b2000410a3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b2000410b3a0000200041046a200141046a2802003602000f0b2000410c3a0000200041106a200141106a290300370300200041046a200141046a2902003702000f0b2000410d3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b2000410e3a00000f0b2000410f3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b200041103a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00000f0b200041113a00000f0b4188014108102a000b4188014108102a000b4188014108102a000b4188014108102a000beb0301067f024002400240024002400240024020012d0000417f6a220241034b0d0020020e0401020304010b41c893c2001058000b2001410c6a280200220341ffffff3f712003470d0320034105742202417f4c0d03200141046a28020021040240024020020d00410121050c010b200210272205450d050b0240024020030d0041002103410021010c010b20034105742106416020046b21072005210120042102034020012002290000370000200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a290000370000200141206a2101200241206a2102200641606a22060d000b200420034105746a20076a41057641016a21010b200041013a00002000410c6a2001360200200041086a2003360200200041046a20053602000f0b200141046a10f7022101200041023a0000200041046a20013602000f0b200141046a2802002102200041086a200141086a10f702360200200041046a2002360200200041033a00000f0b200041043a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041246a200141246a280200360200200041216a200141216a2d00004100473a00000f0b1039000b20024101102a000ba60f05027f017e027f027e017f230041c0006b22022400024002400240024002400240024002400240024002400240024020012d0000417f6a220341054b0d0020030e06010203040506010b4190e1c2001058000b200041f9006a2002280020360000200041086a200141086a290300370300200041fc006a200241236a280000360000200041106a200141106a290300370300200041186a200141186a290300370300200041206a200141206a290300370300200041286a200141286a290300370300200041306a200141306a290300370300200041386a200141386a290300370300200041c0006a200141c0006a290300370300200041c8006a200141c8006a290300370300200041d0006a200141d0006a290300370300200041d8006a200141d8006a290300370300200041e0006a200141e0006a290300370300200041e8006a200141e8006a290300370300200041f0006a200141f0006a290300370300200041f8006a200141f8006a2d00004100473a0000200041013a00000c050b2001410c6a2802002203417f4c0d05200141106a29030021040240024020030d00410121010c010b200141046a2802002105200310272201450d0720012005200310ce041a0b200041023a00002000410c6a2003360200200041086a2003360200200041046a2001360200200041106a20043703000c040b4101210502400240200141046a2d00004101460d00200241026a200141076a2d00003a0000200241206a41086a200141146a290000370300200241306a2001411c6a290000370300200241386a200141246a2d00003a00002002200141056a2f00003b010020022001410c6a290000370320200141086a2800002106410021050c010b200141086a28020021060b200141306a2802002203417f4c0d04200141c0006a290300210420012903382107200129034821080240024020030d00410121010c010b20012802282109200310272201450d0720012009200310ce041a0b200041c0006a2004370300200041386a2007370300200041046a20053a0000200041056a20022f01003b0000200041086a20063602002000410c6a2002290320370200200041c8006a2008370300200041306a20033602002000412c6a2003360200200041286a2001360200200041076a200241026a2d00003a0000200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a280200360200200041033a00000c030b200141386a2903002104200141306a2903002107200141c0006a2903002108200241386a200141196a290000370300200241306a200141116a290000370300200241286a200141096a290000370300200220012900013703202001412c6a2802002203417f4c0d030240024020030d00410121010c010b200141246a2802002105200310272201450d0720012005200310ce041a0b20002002290320370001200041043a0000200041386a2004370300200041306a2007370300200041c0006a20083703002000412c6a2003360200200041286a2003360200200041246a2001360200200041096a200241286a290300370000200041116a200241306a290300370000200041196a200241386a2903003700000c020b200241186a2205200141196a290000370300200241106a2206200141116a290000370300200241086a2209200141096a29000037030020022001290001370300410021030240200141216a2d00004101470d00200241206a41186a2001413a6a290000370300200241206a41106a200141326a290000370300200241206a41086a2001412a6a2900003703002002200141226a290000370320410121030b20002002290300370001200041216a20033a0000200041226a2002290320370000200041196a2005290300370000200041116a2006290300370000200041096a20092903003700002000412a6a200241206a41086a290300370000200041326a200241206a41106a2903003700002000413a6a200241206a41186a290300370000200041053a00000c010b200241186a200141196a290000370300200241106a200141116a290000370300200241086a200141096a29000037030020022001290001370300200241206a41186a200141396a290000370300200241206a41106a200141316a290000370300200241206a41086a200141296a2900003703002002200141216a290000370320200141cc006a280200220341ffffff3f712003470d0120034105742205417f4c0d01200141d8006a2903002104200141d0006a2903002107200141c4006a28020021010240024020050d00410121060c010b200510272206450d060b20062001200341057410ce042101200041d8006a2004370300200041d0006a2007370300200041cc006a2003360200200041c8006a2003360200200041c4006a2001360200200041196a200241186a290300370000200041116a200241106a290300370000200041096a200241086a29030037000020002002290300370001200041216a2002290320370000200041296a200241206a41086a290300370000200041316a200241206a41106a290300370000200041396a200241206a41186a290300370000200041063a00000b200241c0006a24000f0b1039000b20034101102a000b20034101102a000b20034101102a000b20054101102a000bc9b30103047f027e057f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002203410d4b0d000240024002400240024002400240024002400240024002400240024020030e0e000102030405060708090a0b0c0d000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5a20034101742205200420042005491b22054100480d5a0240024020030d002005102721040c010b200128020020032005102821040b2004450d0f20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a280200210420052802002103024020002d00014101460d000240024020042003460d00200128020021000c010b200341016a22002003490d5b20034101742204200020002004491b22044100480d5b0240024020030d002004102721000c010b200128020020032004102821000b2000450d1120012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000c0e0b0240024020042003460d00200128020021000c010b200341016a22002003490d5a20034101742204200020002004491b22044100480d5a0240024020030d002004102721000c010b200128020020032004102821000b2000450d1120012000360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200020036a41013a00000c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d1120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d1220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5920044101742203200520052003491b22034100480d590240024020040d002003102721040c010b200128020020042003102821040b2004450d1320012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000280204210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d5920034101742200200520052000491b22004100480d590240024020030d002000102721030c010b200128020020032000102821030b2003450d1420012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0c0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5820034101742205200420042005491b22054100480d580240024020030d002005102721040c010b200128020020032005102821040b2004450d1420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a000020002d0008220341024b0d0b02400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5a20034101742205200420042005491b22054100480d5a0240024020030d002005102721040c010b200128020020032005102821040b2004450d1720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5a20044101742203200520052003491b22034100480d5a0240024020040d002003102721040c010b200128020020042003102821040b2004450d1820012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a29030021062000290330210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5a20034101742200200420042000491b22004100480d5a0240024020030d002000102721030c010b200128020020032000102821030b2003450d1920012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c0d0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d1920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5920044101742203200520052003491b22034100480d590240024020040d002003102721040c010b200128020020042003102821040b2004450d1a20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c0c0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5820034101742205200420042005491b22054100480d580240024020030d002005102721040c010b200128020020032005102821040b2004450d1a20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5820044101742203200520052003491b22034100480d580240024020040d002003102721040c010b200128020020042003102821040b2004450d1b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5820044101742203200520052003491b22034100480d580240024020040d002003102721040c010b200128020020042003102821040b2004450d1c20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a29030021062000290350210702400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d5820044101742203200520052003491b22034100480d580240024020040d002003102721040c010b200128020020042003102821040b2004450d1d20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a2203200637000820032007370000200041e8006a29030021062000290360210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5820034101742200200420042000491b22004100480d580240024020030d002000102721030c010b200128020020032000102821030b2003450d1e20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c0b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5720034101742205200420042005491b22054100480d570240024020030d002005102721040c010b200128020020032005102821040b2004450d1e20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a000020002d0008220341024b0d0a02400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5920034101742205200420042005491b22054100480d590240024020030d002005102721040c010b200128020020032005102821040b2004450d2120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a29030021062000290310210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5920034101742200200420042000491b22004100480d590240024020030d002000102721030c010b200128020020032000102821030b2003450d2220012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c0c0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5820034101742205200420042005491b22054100480d580240024020030d002005102721040c010b200128020020032005102821040b2004450d2220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5820044101742203200520052003491b22034100480d580240024020040d002003102721040c010b200128020020042003102821040b2004450d2320012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200028022c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d5820034101742200200520052000491b22004100480d580240024020030d002000102721030c010b200128020020032000102821030b2003450d2420012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c0b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5720034101742205200420042005491b22054100480d570240024020030d002005102721040c010b200128020020032005102821040b2004450d2420012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5720044101742203200520052003491b22034100480d570240024020040d002003102721040c010b200128020020042003102821040b2004450d2520012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a29030021062000290330210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d5720034101742200200420042000491b22004100480d570240024020030d002000102721030c010b200128020020032000102821030b2003450d2620012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c0a0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5620034101742205200420042005491b22054100480d560240024020030d002005102721040c010b200128020020032005102821040b2004450d2620012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5620034101742205200420042005491b22054100480d560240024020030d002005102721040c010b200128020020032005102821040b2004450d2720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280204210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d5620034101742200200520052000491b22004100480d560240024020030d002000102721030c010b200128020020032000102821030b2003450d2820012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c090b02400240200141046a2208280200200141086a22042802002203460d00200128020021050c010b200341016a22052003490d5520034101742209200520052009491b22094100480d550240024020030d002009102721050c010b200128020020032009102821050b2005450d2820012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41053a000020002d00082203410a4b0d080240024002400240024002400240024002400240024020030e0b000102030405060708090a000b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5f20034101742209200520052009491b22094100480d5f0240024020030d002009102721050c010b200128020020032009102821050b2005450d3320012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41003a0000200028020c21090240024020082802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d5f20054101742203200a200a2003491b22034100480d5f0240024020050d002003102721050c010b200128020020052003102821050b2005450d3420012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a2009360000200041186a2903002106200029031021070240024020082802002203200428020022006b4110490d00200128020021030c010b200041106a22052000490d5f20034101742200200520052000491b22004100480d5f0240024020030d002000102721030c010b200128020020032000102821030b2003450d3520012003360200200141046a2000360200200141086a28020021000b2004200041106a360200200320006a22012006370008200120073700000c120b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5e20034101742209200520052009491b22094100480d5e0240024020030d002009102721050c010b200128020020032009102821050b2005450d3520012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41013a0000200028020c21090240024020082802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d5e20054101742203200a200a2003491b22034100480d5e0240024020050d002003102721050c010b200128020020052003102821050b2005450d3620012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a2009360000200041286a2903002106200029032021070240024020082802002205200428020022036b4110490d00200128020021050c010b200341106a22092003490d5e20054101742203200920092003491b22034100480d5e0240024020050d002003102721050c010b200128020020052003102821050b2005450d3720012005360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200520036a2203200637000820032007370000200028021021032002200041186a280200220036020c2002410c6a200110302000450d1120004105742109200141046a210c03400240024020082802002205200428020022006b4120490d00200128020021050c010b200041206a220a2000490d5f20054101742200200a200a2000491b22004100480d5f0240024020050d002000102721050c010b200128020020052000102821050b2005450d3920012005360200200c2000360200200b28020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200941606a22090d000c120b0b02400240200828020020042802002200460d00200128020021030c010b200041016a22032000490d5d20004101742205200320032005491b22054100480d5d0240024020000d002005102721030c010b200128020020002005102821030b2003450d3820012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c100b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5c20034101742209200520052009491b22094100480d5c0240024020030d002009102721050c010b200128020020032009102821050b2005450d3820012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41033a0000200028020c21090240024020082802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d5c20054101742203200a200a2003491b22034100480d5c0240024020050d002003102721050c010b200128020020052003102821050b2005450d3920012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a200936000020002d0009220041024b0d0f02400240024020000e03000102000b02400240200828020020042802002200460d00200128020021030c010b200041016a22032000490d5e20004101742205200320032005491b22054100480d5e0240024020000d002005102721030c010b200128020020002005102821030b2003450d3c20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a00000c110b02400240200828020020042802002200460d00200128020021030c010b200041016a22032000490d5d20004101742205200320032005491b22054100480d5d0240024020000d002005102721030c010b200128020020002005102821030b2003450d3c20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a00000c100b02400240200828020020042802002200460d00200128020021030c010b200041016a22032000490d5c20004101742205200320032005491b22054100480d5c0240024020000d002005102721030c010b200128020020002005102821030b2003450d3c20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a00000c0f0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5b20034101742209200520052009491b22094100480d5b0240024020030d002009102721050c010b200128020020032009102821050b2005450d3c20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41043a0000200028020c21050240024020082802002203200428020022006b4104490d00200128020021030c010b200041046a22082000490d5b20034101742200200820082000491b22004100480d5b0240024020030d002000102721030c010b200128020020032000102821030b2003450d3d20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0e0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5a20034101742209200520052009491b22094100480d5a0240024020030d002009102721050c010b200128020020032009102821050b2005450d3d20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41053a0000200028020c21050240024020082802002203200428020022006b4104490d00200128020021030c010b200041046a22082000490d5a20034101742200200820082000491b22004100480d5a0240024020030d002000102721030c010b200128020020032000102821030b2003450d3e20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0d0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5920034101742209200520052009491b22094100480d590240024020030d002009102721050c010b200128020020032009102821050b2005450d3e20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41063a0000200028020c21050240024020082802002203200428020022006b4104490d00200128020021030c010b200041046a22082000490d5920034101742200200820082000491b22004100480d590240024020030d002000102721030c010b200128020020032000102821030b2003450d3f20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a20053600000c0c0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5820034101742209200520052009491b22094100480d580240024020030d002009102721050c010b200128020020032009102821050b2005450d3f20012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41073a0000200028020c21090240024020082802002205200428020022036b4104490d00200128020021050c010b200341046a220a2003490d5820054101742203200a200a2003491b22034100480d580240024020050d002003102721050c010b200128020020052003102821050b2005450d4020012005360200200141046a2003360200200141086a28020021030b2004200341046a360200200520036a200936000002400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5820034101742208200520052008491b22084100480d580240024020030d002008102721050c010b200128020020032008102821050b2005450d4120012005360200200141046a2008360200200141086a28020021030b2004200341016a360200200520036a20002d00093a00000c0b0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5720034101742209200520052009491b22094100480d570240024020030d002009102721050c010b200128020020032009102821050b2005450d4120012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41083a00000240024020082802002205200428020022036b4120490d00200128020021050c010b200341206a22092003490d5720054101742203200920092003491b22034100480d570240024020050d002003102721050c010b200128020020052003102821050b2005450d4220012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220341186a200041096a220541186a290000370000200341106a200541106a290000370000200341086a200541086a290000370000200320052900003700000240024020082802002205200428020022036b4120490d00200128020021050c010b200341206a22082003490d5720054101742203200820082003491b22034100480d570240024020050d002003102721050c010b200128020020052003102821050b2005450d4320012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c0a0b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5620034101742209200520052009491b22094100480d560240024020030d002009102721050c010b200128020020032009102821050b2005450d4320012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a41093a00000240024020082802002205200428020022036b4120490d00200128020021050c010b200341206a22082003490d5620054101742203200820082003491b22034100480d560240024020050d002003102721050c010b200128020020052003102821050b2005450d4420012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c090b02400240200828020020042802002203460d00200128020021050c010b200341016a22052003490d5520034101742209200520052009491b22094100480d550240024020030d002009102721050c010b200128020020032009102821050b2005450d4420012005360200200141046a2009360200200141086a28020021030b2004200341016a360200200520036a410a3a00000240024020082802002205200428020022036b4120490d00200128020021050c010b200341206a22092003490d5520054101742203200920092003491b22034100480d550240024020050d002003102721050c010b200128020020052003102821050b2005450d4520012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220341186a200041096a220541186a290000370000200341106a200541106a290000370000200341086a200541086a290000370000200320052900003700000240024020082802002205200428020022036b4120490d00200128020021050c010b200341206a22092003490d5520054101742203200920092003491b22034100480d550240024020050d002003102721050c010b200128020020052003102821050b2005450d4620012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220341186a200041296a220541186a290000370000200341106a200541106a290000370000200341086a200541086a29000037000020032005290000370000200029035021060240024020082802002203200428020022006b4108490d00200128020021030c010b200041086a22052000490d5520034101742200200520052000491b22004100480d550240024020030d002000102721030c010b200128020020032000102821030b2003450d4720012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a20063700000c080b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5420034101742205200420042005491b22054100480d540240024020030d002005102721040c010b200128020020032005102821040b2004450d4720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a0000200041046a2001109e020c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5320034101742205200420042005491b22054100480d530240024020030d002005102721040c010b200128020020032005102821040b2004450d4720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200041046a2001109e020c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d5220034101742205200420042005491b22054100480d520240024020030d002005102721040c010b200128020020032005102821040b2004450d4720012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a0000024002400240024020002d00040e0400010203000b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5520034101742205200420042005491b22054100480d550240024020030d002005102721040c010b200128020020032005102821040b2004450d4b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5520044101742203200520052003491b22034100480d550240024020040d002003102721040c010b200128020020042003102821040b2004450d4c20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5520044101742203200520052003491b22034100480d550240024020040d002003102721040c010b200128020020042003102821040b2004450d4d20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c080b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5420034101742205200420042005491b22054100480d540240024020030d002005102721040c010b200128020020032005102821040b2004450d4d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d5420044101742203200520052003491b22034100480d540240024020040d002003102721040c010b200128020020042003102821040b2004450d4e20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c070b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5320034101742205200420042005491b22054100480d530240024020030d002005102721040c010b200128020020032005102821040b2004450d4e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000280208210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d5320034101742200200520052000491b22004100480d530240024020030d002000102721030c010b200128020020032000102821030b2003450d4f20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c060b02400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d5220034101742205200420042005491b22054100480d520240024020030d002005102721040c010b200128020020032005102821040b2004450d4f20012004360200200141046a2005360200200141086a28020021030b200141086a2208200341016a360200200420036a41033a0000200028020821032002200041106a280200220436020c2002410c6a2001103002402004450d0020044105742109200141046a210a034002400240200a2802002205200828020022046b4120490d00200128020021050c010b200441206a220b2004490d5420054101742204200b200b2004491b22044100480d540240024020050d002004102721050c010b200128020020052004102821050b2005450d5220012005360200200a2004360200200828020021040b2008200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200941606a22090d000b0b2000280214210320022000411c6a280200220036020c2002410c6a200110302000450d0520004105742108200141086a2105200141046a210903400240024020092802002204200528020022006b4120490d00200128020021040c010b200041206a220a2000490d5320044101742200200a200a2000491b22004100480d530240024020040d002000102721040c010b200128020020042000102821040b2004450d522001200436020020092000360200200528020021000b2005200041206a360200200420006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200841606a22080d000c060b0b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d800120034101742205200420042005491b22054100480d80010240024020030d002005102721040c010b200128020020032005102821040b2004450d5220012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000280204220341024b0d0402400240024020030e03000102000b02400240200141046a280200200141086a2802002203460d00200128020021050c010b200341016a22042003490d820120034101742205200420042005491b22044100480d82010240024020030d002004102721050c010b200128020020032004102821050b2005450d5520012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200028020821032002200041106a280200220036020c2002410c6a200110302000450d062003200041286c6a210a200141046a210503400240024020052802002208200428020022006b4120490d00200128020021080c010b200041206a22092000490d830120084101742200200920092000491b22004100480d83010240024020080d002000102721080c010b200128020020082000102821080b2008450d572001200836020020052000360200200428020021000b2004200041206a360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a29030021060240024020052802002208200428020022006b4108490d00200128020021080c010b200041086a22092000490d830120084101742200200920092000491b22004100480d83010240024020080d002000102721080c010b200128020020082000102821080b2008450d582001200836020020052000360200200428020021000b2004200041086a360200200820006a2006370000200a200341286a2203470d000c070b0b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d810120004101742204200320032004491b22044100480d81010240024020000d002004102721030c010b200128020020002004102821030b2003450d5720012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a00000c050b02400240200141046a280200200141086a2802002200460d00200128020021030c010b200041016a22032000490d800120004101742204200320032004491b22044100480d80010240024020000d002004102721030c010b200128020020002004102821030b2003450d5720012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a00000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7f20034101742205200420042005491b22054100480d7f0240024020030d002005102721040c010b200128020020032005102821040b2004450d5720012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a000020002d0008220341044b0d030240024002400240024020030e050001020304000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d830120034101742205200420042005491b22054100480d83010240024020030d002005102721040c010b200128020020032005102821040b2004450d5c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200028020c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d830120034101742200200520052000491b22004100480d83010240024020030d002000102721030c010b200128020020032000102821030b2003450d5d20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d820120034101742205200420042005491b22054100480d82010240024020030d002005102721040c010b200128020020032005102821040b2004450d5d20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a29030021062000290310210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d820120034101742200200420042000491b22004100480d82010240024020030d002000102721030c010b200128020020032000102821030b2003450d5e20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d810120034101742205200420042005491b22054100480d81010240024020030d002005102721040c010b200128020020032005102821040b2004450d5e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200028022c210802400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d810120044101742203200520052003491b22034100480d81010240024020040d002003102721040c010b200128020020042003102821040b2004450d5f20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2008360000200041386a29030021062000290330210702400240200141046a2802002204200528020022036b4110490d00200128020021040c010b200341106a22052003490d810120044101742203200520052003491b22034100480d81010240024020040d002003102721040c010b200128020020042003102821040b2004450d6020012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320063700082003200737000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d810120044101742203200520052003491b22034100480d81010240024020040d002003102721040c010b200128020020042003102821040b2004450d6120012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d800120034101742205200420042005491b22054100480d80010240024020030d002005102721040c010b200128020020032005102821040b2004450d6120012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a29030021062000290310210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d800120034101742200200420042000491b22004100480d80010240024020030d002000102721030c010b200128020020032000102821030b2003450d6220012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7f20034101742205200420042005491b22054100480d7f0240024020030d002005102721040c010b200128020020032005102821040b2004450d6220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a29030021062000290310210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d7f20034101742200200420042000491b22004100480d7f0240024020030d002000102721030c010b200128020020032000102821030b2003450d6320012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7e20034101742205200420042005491b22054100480d7e0240024020030d002005102721040c010b200128020020032005102821040b2004450d6320012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a000020002d0008220341054b0d0202400240024002400240024020030e06000102030405000b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d830120034101742205200420042005491b22054100480d83010240024020030d002005102721040c010b200128020020032005102821040b2004450d6920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d830120044101742203200520052003491b22034100480d83010240024020040d002003102721040c010b200128020020042003102821040b2004450d6a20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d830120044101742203200520052003491b22034100480d83010240024020040d002003102721040c010b200128020020042003102821040b2004450d6b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a29030021062000290350210702400240200141046a2802002203200528020022006b4110490d00200128020021030c010b200041106a22042000490d830120034101742200200420042000491b22004100480d83010240024020030d002000102721030c010b200128020020032000102821030b2003450d6c20012003360200200141046a2000360200200141086a28020021000b200141086a200041106a360200200320006a22012006370008200120073700000c070b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d820120034101742205200420042005491b22054100480d82010240024020030d002005102721040c010b200128020020032005102821040b2004450d6c20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d820120044101742203200520052003491b22034100480d82010240024020040d002003102721040c010b200128020020042003102821040b2004450d6d20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d820120044101742203200520052003491b22034100480d82010240024020040d002003102721040c010b200128020020042003102821040b2004450d6e20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c060b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d810120034101742205200420042005491b22054100480d81010240024020030d002005102721040c010b200128020020032005102821040b2004450d6e20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d810120044101742203200520052003491b22034100480d81010240024020040d002003102721040c010b200128020020042003102821040b2004450d6f20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000c050b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d800120034101742205200420042005491b22054100480d80010240024020030d002005102721040c010b200128020020032005102821040b2004450d6f20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200028020c210402400240200141046a2802002203200528020022006b4104490d00200128020021030c010b200041046a22052000490d800120034101742200200520052000491b22004100480d80010240024020030d002000102721030c010b200128020020032000102821030b2003450d7020012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20043600000c040b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7f20034101742205200420042005491b22054100480d7f0240024020030d002005102721040c010b200128020020032005102821040b2004450d7020012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d7f20044101742203200520052003491b22034100480d7f0240024020040d002003102721040c010b200128020020042003102821040b2004450d7120012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d7f20034101742205200420042005491b22054100480d7f0240024020030d002005102721040c010b200128020020032005102821040b2004450d7220012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a20002d00293a00000c030b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7e20034101742205200420042005491b22054100480d7e0240024020030d002005102721040c010b200128020020032005102821040b2004450d7220012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d7e20044101742203200520052003491b22034100480d7e0240024020040d002003102721040c010b200128020020042003102821040b2004450d7320012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200028022c21082002200041346a280200220036020c2002410c6a2001103002400240200141046a2802002204200528020022036b2000490d00200128020021040c010b200320006a22052003490d7e20044101742203200520052003491b22034100480d7e0240024020040d002003102721040c010b200128020020042003102821040b2004450d7420012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a2008200010ce041a0c020b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7d20034101742205200420042005491b22054100480d7d0240024020030d002005102721040c010b200128020020032005102821040b2004450d7420012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a0000200041026a2104200141046a280200210820052802002103024020002d00014101460d000240024020082003460d00200128020021000c010b200341016a22002003490d7e20034101742205200020002005491b22054100480d7e0240024020030d002005102721000c010b200128020020032005102821000b2000450d7620012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240200141046a28020020052802002200460d00200128020021030c010b200041016a22032000490d7e20004101742205200320032005491b22054100480d7e0240024020000d002005102721030c010b200128020020002005102821030b2003450d7720012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a20042d00003a00000c020b0240024020082003460d00200128020021000c010b200341016a22002003490d7d20034101742205200020002005491b22054100480d7d0240024020030d002005102721000c010b200128020020032005102821000b2000450d7720012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a000002400240200141046a2802002203200528020022006b4120490d00200128020021030c010b200041206a22052000490d7d20034101742200200520052000491b22004100480d7d0240024020030d002000102721030c010b200128020020032000102821030b2003450d7820012003360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200320006a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a290000370000200120042900003700000c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d7c20034101742205200420042005491b22054100480d7c0240024020030d002005102721040c010b200128020020032005102821040b2004450d7820012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a000002400240200141046a28020020052802002203460d00200128020021040c010b200341016a22042003490d7c20034101742205200420042005491b22054100480d7c0240024020030d002005102721040c010b200128020020032005102821040b2004450d7920012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000290308210602400240200141046a2802002204200528020022036b4108490d00200128020021040c010b200341086a22052003490d7c20044101742203200520052003491b22034100480d7c0240024020040d002003102721040c010b200128020020042003102821040b2004450d7a20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341086a360200200420036a200637000002400240200141046a2802002204200528020022036b4120490d00200128020021040c010b200341206a22052003490d7c20044101742203200520052003491b22034100480d7c0240024020040d002003102721040c010b200128020020042003102821040b2004450d7b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041106a220041186a290000370000200141106a200041106a290000370000200141086a200041086a290000370000200120002900003700000b200241106a24000f0b20054101102a000b20044101102a000b20044101102a000b20054101102a000b20054101102a000b20034101102a000b20004101102a000b20054101102a000b20054101102a000b20034101102a000b20004101102a000b20054101102a000b20034101102a000b20054101102a000b20034101102a000b20034101102a000b20034101102a000b20004101102a000b20054101102a000b20054101102a000b20004101102a000b20054101102a000b20034101102a000b20004101102a000b20054101102a000b20034101102a000b20004101102a000b20054101102a000b20054101102a000b20004101102a000b20094101102a000b20094101102a000b20034101102a000b20004101102a000b20094101102a000b20034101102a000b20034101102a000b20004101102a000b20054101102a000b20094101102a000b20034101102a000b20054101102a000b20054101102a000b20054101102a000b20094101102a000b20004101102a000b20094101102a000b20004101102a000b20094101102a000b20004101102a000b20094101102a000b20034101102a000b20084101102a000b20094101102a000b20034101102a000b20034101102a000b20094101102a000b20034101102a000b20094101102a000b20034101102a000b20034101102a000b20004101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b20054101102a000b20034101102a000b20054101102a000b20004101102a000b20054101102a000b20044101102a000b20004101102a000b102b000b20054101102a000b20044101102a000b20004101102a000b20004101102a000b20044101102a000b20044101102a000b20054101102a000b20054101102a000b20004101102a000b20054101102a000b20004101102a000b20054101102a000b20034101102a000b20034101102a000b20034101102a000b20054101102a000b20004101102a000b20054101102a000b20004101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b20004101102a000b20054101102a000b20034101102a000b20034101102a000b20054101102a000b20034101102a000b20054101102a000b20004101102a000b20054101102a000b20034101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b20054101102a000b20054101102a000b20054101102a000b20054101102a000b20004101102a000b20054101102a000b20054101102a000b20034101102a000b20034101102a000b102b000bde1f01047f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000220241054b0d0002400240024002400240024020020e06000102030405000b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1c20024101742204200320032004491b22044100480d1c0240024020020d002004102721030c010b200128020020022004102821030b2003450d0720012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41003a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1c20034101742202200420042002491b22024100480d1c0240024020030d002002102721030c010b200128020020032002102821030b2003450d0820012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041196a290000370000200241106a200041116a290000370000200241086a200041096a290000370000200220002900013700002000280244210502400240200141046a2802002203200428020022026b4104490d00200128020021030c010b200241046a22042002490d1c20034101742202200420042002491b22024100480d1c0240024020030d002002102721030c010b200128020020032002102821030b2003450d0920012003360200200141046a2002360200200141086a28020021020b200141086a2204200241046a360200200320026a200536000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1c20034101742202200420042002491b22024100480d1c0240024020030d002002102721030c010b200128020020032002102821030b2003450d0a20012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041216a220341186a290000370000200241106a200341106a290000370000200241086a200341086a290000370000200220032900003700002000280248210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d1c20024101742200200420042000491b22004100480d1c0240024020020d002000102721020c010b200128020020022000102821020b2002450d0b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1b20024101742204200320032004491b22044100480d1b0240024020020d002004102721030c010b200128020020022004102821030b2003450d0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1b20034101742202200420042002491b22024100480d1b0240024020030d002002102721030c010b200128020020032002102821030b2003450d0c20012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041196a290000370000200241106a200041116a290000370000200241086a200041096a2900003700002002200029000137000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1b20034101742202200420042002491b22024100480d1b0240024020030d002002102721030c010b200128020020032002102821030b2003450d0d20012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041216a220341186a290000370000200241106a200341106a290000370000200241086a200341086a2900003700002002200329000037000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d1b20024101742204200320032004491b22044100480d1b0240024020020d002004102721030c010b200128020020022004102821030b2003450d0e20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20002d00413a00002000280244210502400240200141046a2802002203200428020022026b4104490d00200128020021030c010b200241046a22042002490d1b20034101742202200420042002491b22024100480d1b0240024020030d002002102721030c010b200128020020032002102821030b2003450d0f20012003360200200141046a2002360200200141086a28020021020b200141086a2204200241046a360200200320026a20053600002000280248210302400240200141046a2802002202200428020022006b4104490d00200128020021020c010b200041046a22042000490d1b20024101742200200420042000491b22004100480d1b0240024020020d002000102721020c010b200128020020022000102821020b2002450d1020012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1a20024101742204200320032004491b22044100480d1a0240024020020d002004102721030c010b200128020020022004102821030b2003450d1020012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1a20034101742202200420042002491b22024100480d1a0240024020030d002002102721030c010b200128020020032002102821030b2003450d1120012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1920024101742204200320032004491b22044100480d190240024020020d002004102721030c010b200128020020022004102821030b2003450d1120012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1920034101742202200420042002491b22024100480d190240024020030d002002102721030c010b200128020020032002102821030b2003450d1220012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1820024101742204200320032004491b22044100480d180240024020020d002004102721030c010b200128020020022004102821030b2003450d1220012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1820034101742202200420042002491b22024100480d180240024020030d002002102721030c010b200128020020032002102821030b2003450d1320012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041196a290000370000200241106a200041116a290000370000200241086a200041096a2900003700002002200029000137000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d1820024101742204200320032004491b22044100480d180240024020020d002004102721030c010b200128020020022004102821030b2003450d1420012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20002d00213a00000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d1720024101742204200320032004491b22044100480d170240024020020d002004102721030c010b200128020020022004102821030b2003450d1420012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41053a000002400240200141046a2802002203200428020022026b4120490d00200128020021030c010b200241206a22042002490d1720034101742202200420042002491b22024100480d170240024020030d002002102721030c010b200128020020032002102821030b2003450d1520012003360200200141046a2002360200200141086a28020021020b200141086a2204200241206a360200200320026a220241186a200041196a290000370000200241106a200041116a290000370000200241086a200041096a2900003700002002200029000137000002400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d1720024101742204200320032004491b22044100480d170240024020020d002004102721030c010b200128020020022004102821030b2003450d1620012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20002d00213a00000b0f0b20044101102a000b20024101102a000b20024101102a000b20024101102a000b20004101102a000b20044101102a000b20024101102a000b20024101102a000b20044101102a000b20024101102a000b20004101102a000b20044101102a000b20024101102a000b20044101102a000b20024101102a000b20044101102a000b20024101102a000b20044101102a000b20044101102a000b20024101102a000b20044101102a000b102b000b130020004102360204200041bce4c1003602000b130020004102360204200041d0cbc5003602000b130020004101360204200041e0e7c2003602000b1300200041033602042000419085c0003602000b130020004103360204200041a89ec4003602000b130020004101360204200041ccc8c5003602000b13002000410b3602042000418ccbc3003602000b130020004106360204200041808bc2003602000b130020004104360204200041f8bec0003602000b130020004103360204200041f8c1c5003602000b130020004105360204200041dca1c1003602000b130020004106360204200041b484c2003602000b130020004101360204200041f888c0003602000bb10501027f4190ce0021024100210302400240024002400240024002400240024002400240024002400240024002400240024020012802000e1200110c0c1101020304090a0b11110d110e11000b417f2102200141086a280200417f6a220141054b0d0e41012103024002400240024020010e06140001020303140b41c0843d21020c120b4190ce0021020c120b41c09a0c21020c110b4190ce0021020c100b200141086a280200417f6a220141014b0d0d41c0843d21024100210320010e020f030f0b200141086a2d0000417f6a2201410c4b0d0c41a0c21e21024100210302400240024020010e0d111100000101111101020c0c0c110b4180b51821020c0f0b41b0e32d21020c0e0b4101210341f0930921020c0e0b41f0930921020c0c0b200141086a2d0000417f6a220141104b0d0a41c096b10221024100210320010e110c0c010100000c0c0101070702020203030c0b4101210341a0c21e21020c0b0b41c09a0c21020c090b41a08d0621020c080b41a0c21e21020c070b20012d0004417f6a220141034b0d054101210341a08d0621020240024020010e0409090001090b41c096b10221020c080b41c09a0c21020c070b20012d0004417f6a220141034b0d044101210341a08d0621020240024020010e0408080001080b41c096b10221020c070b41c09a0c21020c060b200141086a280200417f6a220141094b0d0341a0cb98012102410021030240024020010e0a07070700070102020202070b41d0a5cc0021020c050b4180ade20421020c040b410121034190ce0021020c040b200141086a280200417f6a220141024b0d0141a0c21e210241002103024020010e03040000040b4101210341a08d0621020c030b410121032001280204417f6a220141014b0d0041c0843d210220010e020200020b4190ce0021020b410021030b200020033a0004200020023602000be4910108017f017e097f017e037f017e0e7f067e230041a0076b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e12000102030405060708090a0b0c0f10111213000b200141106a29030021042001410c6a280200210520022d0001210620022d000021020240024002400240024002400240024002400240200141086a28020022070e0700010203040607000b20034194036a41013602002003420137028403200341ccfdc40036028003200341023602dc06200341c4fdc4003602d8062003200341d8066a3602900320034180036a4190b8c3001057000b4100210841ad88c3004100200220067241ff01711b21094128210a4101210b0c4a0b2004a7210702400240200241ff01710d004101210b200641ff01714101460d010b41d588c3002109412a210a4101210b410021082007450d4a0c490b20070d020c470b4101210b0240200220067241ff0171450d0041ad88c30021094128210a410021080c490b410810272202450d192002200437000041a0b8c300410a200241081003200210290c460b2004a721070240200220067241ff0171450d0041ad88c30021094128210a4101210b4100210820070d470c480b41aab8c300410520052004422088a710034101210b2007450d450b200510290c440b2004422088a721092004a7210a0240200220067241ff0171450d0002402009450d00200941186c21082005210203400240200241046a280200450d00200228020010290b0240200241106a280200450d002002410c6a28020010290b200241186a2102200841686a22080d000b0b41ad88c30021094101210c4100210d200a0d020c430b0240200941186c2202450d00200520026a21082005210203402002280200200241086a2802002002410c6a280200200241146a2802001003200241186a22022008470d000b0b02402009450d00200941186c21082005210203400240200241046a280200450d00200228020010290b0240200241106a280200450d002002410c6a28020010290b200241186a2102200841686a22080d000b0b4101210c200a450d41200510290c410b2004422088a721092004a7210a200220067241ff0171450d0102402009450d002009410c6c21082005210203400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b41ad88c30021094100210c4101210d200a450d410b200510290c400b02402009410c6c2202450d00200520026a21082005210203402002280200200241086a280200100c2002410c6a22022008470d000b0b02402009450d002009410c6c21082005210203400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b4101210d200a450d3d200510290c3d0b10ae02000b418988c30021094124210a4101210820022d00000d2a20022d000141ff01714102470d2a200141086a290300210420034190056a41086a22024200370300200342003703900541bdcbc500411320034190056a100420034190046a41086a200229030037030020032003290390053703900420034190046a411041b8d6c50041004100100b417f470d12200341186a41ceecc200410d109401024002402003290320500d002003280218450d00200341086a41ceecc200410d109401200329031042b9067c42b90620032802081b2004560d010b20034190056a41086a22024200370300200342003703900541ceecc200410d20034190056a100420034190046a41086a22062002290300370300200320032903900537039004200320043703800320034190046a411020034180036a4108100341012108200341013a00800320024200370300200342003703900541bdcbc500411320034190056a10042006200229030037030020032003290390053703900420034190046a411020034180036a410110030c0b0b41e8ebc2001058000b20034188036a2001410c6a2802003602002003200129020437038003200341286a20034180036a20022d000020022d000110af02200328022c210a200328022821094100210b410121080c3f0b10b002000b200341fc026a41026a22062001410f6a2d00003a0000200341f0046a41086a2207200141206a290300370300200341f0046a410d6a2209200141256a290000370000200320012f000d3b01fc022003200141186a2903003703f004200141386a290300210e200141306a2903002104200141146a280200210f200141106a28020021082001410c6a2d0000211020022d0001211120022d0000210a024002400240200141086a2802000e03000102000b20034180036a41146a41013602002003420137028403200341ccfdc40036028003200341023602dc06200341c4fdc4003602d8062003200341d8066a3602900320034180036a41c0bec0001057000b2002411a6a2901002112200241196a2d00002113200241186a2d00002114200241166a2f01002115200241156a2d00002116200241146a2d00002117200241126a2f0100210b200241116a2d00002105200241106a2d0000210c2002410e6a2f0100210d2002410d6a2d000021182002410c6a2d000021192002410a6a2f0100211a200241096a2d0000211b200241086a2d0000211c200241066a2f0100211d200241056a2d0000211e200241046a2d0000211f200241026a2f0100212020034188046a41026a20062d00003a000020034198066a41086a200729030037030020034198066a410d6a2009290000370000200320032f01fc023b018804200320032903f004370398064101210241d588c300210941002106412a210702400240200a41ff0171450d004100210a0c010b4100210a201141ff01714101470d00201d410874201e72201c41187472210941002102201b2107201a21062019210a0b200641ffff0371410874200741ff017172200a41187472210a20020d32200320123703e805200320133a00e705200320143a00e605200320153b01e405200320163a00e305200320173a00e2052003200b3b01e005200320053a00df052003200c3a00de052003200d3b01dc05200320183a00db052003200a3600d705200320093600d3052003201f3a00d205200320203b01d005200341b8066a41026a220220034188046a41026a2d00003a0000200320032f0188043b01b80620034180036a41086a20034198066a41086a29030037030020034180036a410d6a220620034198066a410d6a2900003700002003200329039806370380030240201041ff01714101460d00200341c8066a41026a20022d00003a0000200341b0046a41086a20034180036a41086a290300370300200341b0046a410d6a2006290000370000200320032f01b8063b01c80620032003290380033703b0040c2e0b20034190046a200841067610cc012003280290042106024002402003280298042008413f7122024b0d00410021020c010b200341c8066a41026a200620024105746a220241026a2d00003a0000200341b8046a200241136a290000370300200341bd046a200241186a290000370000200320022f00003b01c8062003200229000b3703b0042002280007210f20022800032108410121020b0240200328029404450d00200610290b20020d2d410121024115210f4184efc20021080c2e0b200141c8006a2903002112200141c0006a290300212120034198066a41026a20062d00003a0000200341d8066a41086a2007290300370300200341d8066a410d6a2009290000370000200320032f01fc023b019806200320032903f0043703d80602402011200a7241ff0171450d0041ad88c30021094128210a410121084101210b0c3e0b200341b8066a41026a220220034198066a41026a2d00003a000020034180036a41086a2206200341d8066a41086a29030037030020034180036a410d6a2207200341d8066a410d6a290000370000200320032f0198063b01b806200320032903d806370380030240201041ff01714101460d00200341c8066a41026a20022d00003a0000200341b0046a41086a2006290300370300200341b0046a410d6a2007290000370000200320032f01b8063b01c80620032003290380033703b0040c2b0b200341d0056a200841067610cc0120032802d00521060240024020032802d8052008413f7122024b0d00410021020c010b200341c8066a41026a200620024105746a220241026a2d00003a0000200341b8046a200241136a290000370300200341bd046a200241186a290000370000200320022f00003b01c8062003200229000b3703b0042002280007210f20022800032108410121020b024020032802d405450d00200610290b20020d2a410121024184efc20021084115210f0c2b0b20034180036a41306a200141386a29030037030020034180036a41286a200141306a29030037030020034180036a41206a200141286a29030037030020034180036a41186a200141206a29030037030020034180036a41106a200141186a29030037030020034180036a41086a200141106a2903003703002003200141086a29030037038003200341d8066a41206a200241206a290200370300200341d8066a41186a200241186a290200370300200341d8066a41106a200241106a290200370300200341d8066a41086a200241086a290200370300200320022902003703d80620034190026a20034180036a200341d8066a10b102200328029402210a20032802900221094100210f410121084101210b0c3d0b200141086a280200210c2001280204210d200341d8066a2001410c6a41c40010ce041a2002411a6a2901002104200241196a2d00002106200241186a2d00002107200241166a2f01002111200241156a2d0000210f200241146a2d00002110200241126a2f01002113200241116a2d00002114200241106a2d000021152002410e6a2f010021162002410d6a2d000021172002410c6a2d0000210b2002410a6a2f01002105200241096a2d00002118200241086a2d00002119200241066a2f0100211a200241056a2d0000211b200241046a2d0000211c200241026a2f0100211d20022d0001210820022d00002102200341e8046a20034194076a290200370300200341e0046a2003418c076a290200370300200341d8046a20034184076a290200370300200341d0046a200341fc066a290200370300200341b0046a41186a200341f4066a290200370300200341b0046a41106a200341d8066a41146a290200370300200341b0046a41086a200341d8066a410c6a290200370300200320032902dc063703b00441d588c3002109412a210a20020d26200841ff01714101470d26200320043703a805200320063a00a705200320073a00a605200320113b01a4052003200f3a00a305200320103a00a205200320133b01a005200320143a009f05200320153a009e05200320163b019c05200320173a009b052003201c3a0092052003201d3b01900520032005410874201872200b41187472360097052003201a410874201b722019411874723600930520034180036a20034190056a108d0220032802a0032202450d0e200341d0056a41106a20034180036a41386a290300370300200341d0056a41086a20034180036a41306a290300370300200341d0056a41186a200341c0036a290300370300200341d0056a41206a200341c8036a28020036020020034190046a41086a200341dc056a29020037030020034190046a41106a2208200341e4056a29020037030020034190046a41186a200341ec056a290200370300200320034180036a41286a2903003703d005200320032902d40537039004024020032802a403450d00200210290b200341f0046a41086a20034190046a41086a290300370300200341f0046a41106a2008290300370300200341f0046a41186a20034190046a41186a29030037030020032003290390043703f00420034190056a41386a200341b0046a41386a29030037030020034190056a41306a200341b0046a41306a29030037030020034190056a41286a200341b0046a41286a29030037030020034190056a41206a200341b0046a41206a29030037030020034190056a41186a200341b0046a41186a29030037030020034190056a41106a200341b0046a41106a29030037030020034190056a41086a200341b0046a41086a290300370300200320032903b0043703900520034198066a200341f0046a108d0120034180036a200328029806220220032802a006108e010240024020032d0080034101460d00200341003a00d0050c010b200341d0056a20034180036a41c10010ce041a0b0240200328029c06450d00200210290b20034190056a41206a2105200341f1056a2118200341d0056a410172211941042109410a2107034002400240200741766a2213410a4b22160d0020034190056a21060240024020130e0b0102020202020202020200010b200521060b0240412010272208450d0020082006290000370000200841186a200641186a290000370000200841106a200641106a290000370000200841086a200641086a29000037000041202102410021150c020b41204101102a000b4101211541b8d6c500210641002102410121080b200320023602c406200320023602c006200320083602bc06200320073602b806200341c8066a200341b8066a108f0120032802d006210a20032802c806211120034100360280032011200a20034180036a1005211002400240200328028003220a417f460d0020034190046a200a4120200a4120491b220f6a410041004120200f6b200f411f4b1b10cd041a20034190046a2010200f10ce041a200a411f4d0d1220034180036a41186a220a20034190046a41186a29030037030020034180036a41106a220f20034190046a41106a29030037030020034180036a41086a221420034190046a41086a2903003703002003200329039004370380032010102920034198066a41186a2210200a29030037030020034198066a41106a2217200f29030037030020034198066a41086a220b2014290300370300200320032903800337039806024020032802cc06450d00201110290b02402002450d00200810290b200a2010290300370300200f20172903003703002014200b29030037030020032003290398063703800320034180036a200341f0046a412010d004450d0141b0e2c10021094118210a0c290b024020032802cc06450d00201110290b2002450d00200810290b0240024020032d00d0054101470d004100210841b8d6c500210a024020160d000240024020130e0b0002020202020202020201000b412021082019210a0c010b412021082018210a0b024020022008470d002006200a460d022006200a200210d004450d020b0240024020080d00410121110c010b200810272211450d142011200a200810ce041a0b2003200836028c0320032008360288032003201136028403200320073602800320034198066a20034180036a108f01200328029806220a20032802a006100c0240200328029c06450d00200a10290b2008450d00201110290b4101210a024020150d0020021027220a450d14200a2006200210ce041a0b2003200236028c0320032002360288032003200a36028403200320073602800320034198066a20034180036a108f0120032802a00621072003280298062106412010272208450d14200820032903f004370000200841186a200341f0046a41186a290300370000200841106a200341f0046a41106a290300370000200841086a200341f0046a41086a29030037000020062007200841201003200810290240200328029c06450d00200610290b2002450d00200a10290b024020094108460d00200941d0e3c1006a2802002107200941046a21090c010b0b20034180036a200341f0046a108d0120032802880321062003280280032108412010272202450d132002200329039005370000200241186a20034190056a41186a290300370000200241106a20034190056a41106a290300370000200241086a20034190056a41086a2903003700002002412041c00010282202450d14200220032903b005370020200241386a20034190056a41386a290300370000200241306a20034190056a41306a290300370000200241286a20034190056a41286a29030037000020082006200241c0001003200210290240200328028403450d00200810290b200341013a00800320034190056a41086a22024200370300200342003703900541a7c8c500410f20034190056a100420034190046a41086a200229030037030020032003290390053703900420034190046a411020034180036a41011003410021090240200c450d00200d10290b0c270b20034180036a41306a200141386a29030037030020034180036a41286a200141306a29030037030020034180036a41206a200141286a29030037030020034180036a41186a200141206a29030037030020034180036a41106a200141186a29030037030020034180036a41086a200141106a2903003703002003200141086a29030037038003200341d8066a41206a200241206a290200370300200341d8066a41186a200241186a290200370300200341d8066a41106a200241106a290200370300200341d8066a41086a200241086a290200370300200320022902003703d80620034198026a20034180036a200341d8066a10b202200328029c02210a200328029802210941002113410121084101210b4101210f410121100c3d0b200341d8066a41206a200141246a290200370300200341d8066a41186a2001411c6a290200370300200341d8066a41106a200141146a290200370300200341d8066a41086a2001410c6a290200370300200320012902043703d80620034180036a41206a200241206a29020037030020034180036a41186a200241186a29020037030020034180036a41106a200241106a29020037030020034180036a41086a200241086a2902003703002003200229020037038003200341a0026a200341d8066a20034180036a10b30220032802a402210a20032802a002210941002114410121084101210b4101210f41012110410121130c3d0b200341d8066a41206a200141246a290200370300200341d8066a41186a2001411c6a290200370300200341d8066a41106a200141146a290200370300200341d8066a41086a2001410c6a290200370300200320012902043703d80620034180036a41206a200241206a29020037030020034180036a41186a200241186a29020037030020034180036a41106a200241106a29020037030020034180036a41086a200241086a2902003703002003200229020037038003200341a8026a200341d8066a20034180036a10b40220032802ac02210a20032802a802210941002115410121084101210b4101210f4101211041012113410121140c3d0b20034180036a41386a200141c0006a29030037030020034180036a41306a200141386a29030037030020034180036a41286a200141306a29030037030020034180036a41206a200141286a29030037030020034180036a41186a200141206a29030037030020034180036a41106a200141186a29030037030020034180036a41086a200141106a2903003703002003200141086a29030037038003200341d8066a41206a200241206a290200370300200341d8066a41186a200241186a290200370300200341d8066a41106a200241106a290200370300200341d8066a41086a200241086a290200370300200320022902003703d806200341b0026a20034180036a200341d8066a10c90120032802b402210a20032802b002210941002116410121084101210b4101210f410121104101211341012114410121150c3d0b418988c30021094124210a4101210820022d00000d2020022d000141ff01714102470d20200141086a290300210420034190056a41086a22024200370300200342003703900541a18ac000411020034190056a100420034190046a41086a200229030037030020032003290390053703900420034190046a411041b8d6c50041004100100b417f470d10200341b8026a41888dc300410d10940120032903c002420020032802b8021b2004540d0120034190056a41086a22024200370300200342003703900541a18ac000411020034190056a100420034190046a41086a2002290300370300200320032903900537039004200320043703800320034190046a411020034180036a410810030b410021094101210b0c350b41f08bc0001058000b200141086a2802002106200128020421070240024020022d00000d004101210820022d000141ff01714101460d010b41d588c3002109412a210a41002117410121082006450d1d200710290c1d0b200241096a280000210a2006450d1b200710290c1b0b20034180036a41306a200141386a29030037030020034180036a41286a200141306a29030037030020034180036a41206a200141286a29030037030020034180036a41186a200141206a29030037030020034180036a41106a200141186a29030037030020034180036a41086a200141106a2903003703002003200141086a29030037038003200341d8066a41206a200241206a290200370300200341d8066a41186a200241186a290200370300200341d8066a41106a200241106a290200370300200341d8066a41086a200241086a290200370300200320022902003703d806200341c8026a20034180036a200341d8066a10f50120032802cc02210a20032802c8022109410121084101210b0c320b20034180036a200141086a41800110ce041a200341d8066a41206a200241206a290200370300200341d8066a41186a200241186a290200370300200341d8066a41106a200241106a290200370300200341d8066a41086a200241086a290200370300200320022902003703d806200341d0026a20034180036a200341d8066a10b50220032802d402210a20032802d002210941002106410121084101210b4101210f4101211041012113410121144101211541012116410121170c390b200141086a280200210820012802042106200341f0046a41086a22092001411c6a290200370300200341f0046a410d6a220a200141216a2900003700002003200141146a2902003703f0042002411a6a2901002104200241196a2d00002111200241186a2d0000210f200241166a2f01002110200241156a2d00002113200241146a2d00002114200241126a2f01002115200241116a2d00002116200241106a2d000021172002410e6a2f0100210b2002410d6a2d000021052002410c6a2d0000210c2002410a6a2f0100210d200241096a2d00002118200241086a2d00002119200241066a2f0100211a200241056a2d0000211b200241046a2d0000211c200241026a2f0100211d20022d0001210720022d0000210202400240024020060e03000201000b20034180036a41146a41013602002003420137028403200341ccfdc40036028003200341023602dc06200341c4fdc4003602d8062003200341d8066a3602900320034180036a4194e6c1001057000b200141106a28020021202001410c6a280200211f20034198066a410d6a200a29000037000020034198066a41086a2009290300370300200320032903f0043703980641012106412a210a4100211e41d588c300210902400240200241ff0171450d00410021020c010b41002102200741ff01714101470d00201a410874201b72201941187472210941002106200c211e200d21022018210a0b200241ffff0371410874201e41187472200a41ff017172210a20060d16200320043703e805200320113a00e7052003200f3a00e605200320103b01e405200320133a00e305200320143a00e205200320153b01e005200320163a00df05200320173a00de052003200b3b01dc05200320053a00db052003200a3600d705200320093600d3052003201c3a00d2052003201d3b01d00520034190056a41086a22024200370300200342003703900541a4e6c100410820034190056a1004200341d8066a41086a200229030037030020032003290390053703d8062003410036028003200341d8066a411020034180036a10052102024002402003280280032206417f460d002002450d0020034180036a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd041a20034180036a2002200710ce041a2006411f4d0d0e20034190046a41186a220620034180036a41186a220729000037030020034190046a41106a220920034180036a41106a220a29000037030020034190046a41086a221120034180036a41086a220f2900003703002003200329008003370390042002102920072006290300370300200a2009290300370300200f20112903003703002003200329039004370380030c010b20034188036a420037030020034190036a420037030020034198036a420037030020034200370380030b0240200341d0056a20034180036a412010d004450d0041ace6c10021094131210a0c170b20034180036a410d6a220220034198066a410d6a29000037000020034180036a41086a220620034198066a41086a2903003703002003200329039806370380030240200841ff01714101460d0020034190056a410d6a200229000037000020034190056a41086a2006290300370300200320032903800337039005200841087621080c140b20034190046a201f41067610cc01200328029004210602400240200328029804201f413f7122024b0d00410021020c010b20034198056a200620024105746a220241136a2900003703002003419d056a200241186a2900003700002003200229000b3703900520022f0000200241026a2d0000411074722108200228000721202002280003211f410121020b0240200328029404450d00200610290b20020d1341012106411521204184efc200211f0c140b4101210641d588c30021094100210a412a211e02400240200241ff0171450d00410021020c010b41002102200741ff01714101470d00201a410874201b722019411874722109410021062018211e200d210a200c21020b200a41ffff0371410874201e41ff017172200241187472210a20060d112003201c3a00d2052003201d3b01d005200320043703e805200320113a00e7052003200f3a00e605200320103b01e405200320133a00e305200320143a00e205200320153b01e005200320163a00df05200320173a00de052003200b3b01dc05200320053a00db052003200a3600d705200320093600d30520034190056a41086a22024200370300200342003703900541a4e6c100410820034190056a1004200341d8066a41086a200229030037030020032003290390053703d8062003410036028003200341d8066a411020034180036a10052102024002402003280280032206417f460d002002450d0020034180036a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd041a20034180036a2002200710ce041a2006411f4d0d0e20034190046a41186a220620034180036a41186a220729000037030020034190046a41106a220920034180036a41106a220a29000037030020034190046a41086a221120034180036a41086a220f2900003703002003200329008003370390042002102920072006290300370300200a2009290300370300200f20112903003703002003200329039004370380030c010b20034188036a420037030020034190036a420037030020034198036a420037030020034200370380030b0240200341d0056a20034180036a412010d004450d0041dde6c10021094122210a0c120b20034180036a200841880110ce041a41002109200341003b01d806200341d8026a20034180036a200341d8066a10ad020240024020032802d80222020d00410121020c010b200220032802dc021010410021020b200320023a0082032003410c3b01800341b8d6c500410020034180036a108801200810290c140b200141d4006a2802002110200141d0006a280200211320022d0001210820022d00002102200341d8066a200141086a41c80010ce041a02400240024020020d00200841ff01714102460d010b02402010450d00201310290b0240200341e4066a280200450d0020032802e00610290b200341ec066a28020021060240200341f4066a2802002202450d002002410c6c21082006210203400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b418988c3002109200341f0066a280200450d01200610290c010b200341f0026a4193c8c500411410b50120034180036a20032802f402410020032802f0021b2214200341fc066a221510b201200328028003220820032802880341b8d6c50041004100100b21020240200328028403450d00200810290b02402002417f470d00200341e0026a41888dc300410d10940120034188036a20032903e802420020032802e0021b37030020034180036a41106a20032902fc0637030020034198036a20034184076a290200370300200341a0036a2003418c076a290200370300200341a8036a20034194076a2902003703002003410d3a00800341b8d6c500410020034180036a1088012003410036028803200342013703800320032802e00621072003200341d8066a41106a28020022023602d005200341d0056a20034180036a103002400240200328028403220620032802880322086b2002490d0020032802800321060c010b200820026a22092008490d122006410174220a20092009200a491b22094100480d120240024020060d002009102721060c010b20032802800320062009102821060b2006450d0f200320093602840320032006360280030b2003200820026a36028803200620086a2007200210ce041a200341ec066a28020021082003200341f4066a28020022023602d005200341d0056a20034180036a10300240024020020d002003280288032111200328028403210920032802800321070c010b20082002410c6c6a210f03402008280200210a2003200841086a28020022023602d005200341d0056a20034180036a103002400240200328028403220920032802880322066b2002490d0020032802800321070c010b200620026a22072006490d1420094101742211200720072011491b22114100480d140240024020090d002011102721070c010b20032802800320092011102821070b2007450d1220032011360284032003200736028003201121090b2003200620026a221136028803200720066a200a200210ce041a2008410c6a2208200f470d000b0b200341d0056a2014201510b20120032802d805210f20032802d005210a20034100360288032003420137038003200320113602900520034190056a20034180036a103002400240200328028403220620032802880322086b2011490d0020032802800321020c010b200820116a22022008490d1220064101742214200220022014491b22144100480d120240024020060d002014102721020c010b20032802800320062014102821020b2002450d1120032014360284032003200236028003201421060b200220086a2007201110ce041a200a200f2002200820116a100302402006450d00200210290b024020032802d405450d00200a10290b2009450d00200710290b02402010450d00201310290b0240200341e4066a280200450d0020032802e00610290b200341ec066a28020021060240200341f4066a2802002202450d002002410c6c21082006210203400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b41002109200341f0066a280200450d00200610290b4124210a41002111410121084101210b4101210f41012110410121134101211441012115410121164101211741012106410121070c380b41084101102a000b41a0ebc2001058000b4189e2c10021094127210a0c170b418f89c3004133104e000b20084101102a000b20024101102a000b41204101102a000b41204101102a000b41c0004101102a000b41dc8ac0001058000b418f89c3004133104e000b418f89c3004133104e000b20094101102a000b20114101102a000b20144101102a000b102b000b2008103d200810290c030b20034180036a410d6a20034190056a410d6a29000037000020034180036a41086a20034190056a41086a290300370300200320032903900537038003410021060b200341d8066a41086a220220034180036a41086a290300370300200341d8066a41106a20034180036a41106a29030037030020032003290380033703d80602402006450d002020210a201f21090c020b200341b0046a410d6a200341d8066a410d6a290000370000200341b0046a41086a2002290300370300200320032903d8063703b00420034190056a41086a22064200370300200342003703900541a4e6c100410820034190056a10042002200629030037030020032003290390053703d8062003410036028003200341d8066a411020034180036a10052102024002402003280280032206417f460d002002450d0020034180036a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd041a20034180036a2002200710ce041a2006411f4d0d0420034190046a41186a220620034180036a41186a220729000037030020034190046a41106a220920034180036a41106a220a29000037030020034190046a41086a221120034180036a41086a220f2900003703002003200329008003370390042002102920072006290300370300200a2009290300370300200f20112903003703002003200329039004370380030c010b20034188036a420037030020034190036a420037030020034198036a420037030020034200370380030b200341d8066a41186a20034180036a41186a2903002204370300200341d8066a41106a20034180036a41106a290300220e370300200341d8066a41086a220220034180036a41086a22062903002212370300200320032903800322213703d8062003418a036a201237010020034192036a200e3701002003419a036a20043701002003418c023b01800320032021370182034100210941b8d6c500410020034180036a10880120034180036a410d6a2207200341b0046a410d6a2900003700002006200341b0046a41086a290300370300200320032903b0043703800320034190056a41086a220a4200370300200342003703900541a4e6c100410820034190056a10042002200a29030037030020032003290390053703d806412010272202450d03200220083b0000200220203600072002201f360003200220032903800337000b200241026a20084110763a0000200241136a2006290300370000200241186a2007290000370000200341d8066a4110200241201003200210290b0b41002107410121084101210b4101210f41012110410121134101211441012115410121164101211741012106410121110c230b418f89c3004133104e000b41204101102a000b410021174101210b4101210f4101211041012113410121144101211541012116410121064101210741012111410021090c200b4101210b4101210f41012110410121134101211441012115410121160c1d0b4101210b0c150b200c450d00200d10290b41002110410121084101210b4101210f0c150b200341d0056a41026a200341c8066a41026a2d00003a000020034180036a41086a200341b0046a41086a29030037030020034180036a410d6a200341b0046a410d6a290000370000200320032f01c8063b01d005200320032903b00437038003410021020b2003418c046a41026a2206200341d0056a41026a2d00003a000020034190056a41086a220720034180036a41086a29030037030020034190056a41106a20034180036a41106a290300370300200320032f01d0053b018c0420032003290380033703900520020d0220034193036a200729030037000020034198036a2003419d056a290000370000200320032f018c043b0180032003200f360087032003200836008303200320032903900537008b03200320062d00003a00820302400240024002400240411410272202450d00200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d0120022003290380033700142002412c6a20034198036a290300370000200241246a20034180036a41106a2903003700002002411c6a20034180036a41086a290300370000200341f8016a20024134108401200341f8016a41106a2903002122200329038002212320032802f8012108200210292023420020081b222320045422062022420020081b2222200e542022200e5122021b0d0220232004562022200e5620021b450d04200341e0016a41b18ac0004116108601200341f0016a290300212420032903e801212520032802e001210220034190056a41086a22084200370300200342003703900541b18ac000411620034190056a100420034190046a41086a2008290300370300200320032903900537039004200342002024420020021b22242006ad200e20227d7c7c2025420020021b2222202320047d222554ad7d2223202220257d2225202256202320245620232024511b22021b3703d80520034200202520021b3703d005200341d0056a21020c030b41144101102a000b41344101102a000b200341c8016a41b18ac0004116108601200341d8016a290300212420032903d001212520032802c801210220034190056a41086a22084200370300200342003703900541b18ac000411620034190056a100420034190046a41086a20082903003703002003200329039005370390042003427f2024420020021b2224200e20227d2004202354ad7d7c2025420020021b2222200420237d7c22232022542202ad7c22222002202220245420222024511b22021b3703d8052003427f202320021b3703d005200341d0056a21020b20034190046a41102002411010030b20034180036a2004200e10890102400240024002400240411810272202450d00200241106a41002900cf8c40370000200241086a41002900c78c40370000200241002900bf8c4037000020024118413810282202450d012002200329038003370018200241306a20034198036a290300370000200241286a20034180036a41106a290300370000200241206a20034180036a41086a290300370000200341b0016a20024138108401200341b0016a41106a290300210420032903b801210e20032802b001210820021029200e420020081b220e20215422062004420020081b2204201254200420125122021b0d02200e202156200420125620021b450d0420034198016a41b18ac0004116108601200341a8016a290300212220032903a0012123200328029801210220034190056a41086a22084200370300200342003703900541b18ac000411620034190056a100420034190046a41086a2008290300370300200320032903900537039004200342002022420020021b22222006ad201220047d7c7c2023420020021b2204200e20217d222354ad7d220e200420237d2223200456200e202256200e2022511b22021b3703d80520034200202320021b3703d005200341d0056a21020c030b41184101102a000b41384101102a000b20034180016a41b18ac000411610860120034190016a29030021222003290388012123200328028001210220034190056a41086a22084200370300200342003703900541b18ac000411620034190056a100420034190046a41086a20082903003703002003200329039005370390042003427f2022420020021b2222201220047d2021200e54ad7d7c2023420020021b22042021200e7d7c220e2004542202ad7c22042002200420225420042022511b22021b3703d8052003427f200e20021b3703d005200341d0056a21020b20034190046a41102002411010030b20034180036a20212012109c010c040b20034190046a41026a200341c8066a41026a2d00003a000020034180036a41086a200341b0046a41086a29030037030020034180036a410d6a200341b0046a410d6a290000370000200320032f01c8063b019004200320032903b00437038003410021020b2003418c046a41026a220620034190046a41026a2d00003a000020034190056a41086a220720034180036a41086a29030037030020034190056a41106a20034180036a41106a290300370300200320032f0190043b018c042003200329038003370390052002450d010b200f210a20082109410121084101210b0c0e0b200341eb066a2007290300370000200341f0066a2003419d056a290000370000200320032f018c043b01d8062003200f3600df06200320083600db0620032003290390053700e306200320062d00003a00da06411410272202450d02200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d03200220032903d0053700142002412c6a200341e8056a290300370000200241246a200341d0056a41106a2903003700002002411c6a200341d0056a41086a290300370000200341e8006a20024134108401200341e8006a41106a2903002121200329037021222003280268210820021029411410272202450d04200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d05200220032903d8063700142002412c6a200341f0066a290300370000200241246a200341d8066a41106a2903003700002002411c6a200341d8066a41086a290300370000200341d0006a20024134108401200341d0006a41106a2903002124200329035821252003280250210620021029024020044280a094a58d1d7c22122004542202200e2002ad7c2223200e54201220045a1b450d004128210a41d0bec0002109410121084101210b0c0e0b02402022420020081b222220127d22262022562021420020081b222120237d2022201254ad7d221220215620122021511b450d00411d210a41e8b5c3002109410121084101210b0c0e0b2024420020061b21212025420020061b21220240200442ffffe883b1de1656200e420052200e501b0d00202220218450450d00411f210a4185b6c3002109410121084101210b0c0e0b200341c8006a200341d0056a4102202620121091010240200328024822090d000240202220047c222320225422022021200e7c2002ad7c222220215420222021511b450d00412d210a41a4b6c3002109410121084101210b0c0f0b200341d0056a200341d8066a412010d004450d01200341d0056a20262012108901411410272202450d07200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d08200220032903d8063700142002412c6a200341d8066a41186a2208290300370000200241246a200341d8066a41106a2903003700002002411c6a200341d8066a41086a29030037000020034180036a41186a2206420037030020034180036a41106a2207420037030020034180036a41086a2209420037030020034200370380032002413420034180036a100020034190046a41186a200629030037030020034190046a41106a200729030037030020034190046a41086a200929030037030020032003290380033703900420034190046a412041b8d6c50041004100100b21062002102902402006417f470d00200341d8066a108701200341b8036a2022370300200341b0036a202337030020034180036a41086a41003a000020034189036a20032903d80637000020034191036a200341d8066a41086a29030037000020034199036a200341e8066a290300370000200341a1036a2008290300370000200341023a00800341b8d6c500410020034180036a1088010b200341d8066a20232022108901200341306a41b18ac0004116108601200341306a41106a2903002112200329033821212003280230210220034190056a41086a22064200370300200342003703900541b18ac000411620034190056a100420034190046a41086a2006290300370300200320032903900537039004200342002012420020021b22222021420020021b22124280a094a58d1d54ad7d222120124280e0ebdaf2627c22232012562021202256201242ff9f94a58d1d561b22021b3703880320034200202320021b3703800320034190046a411020034180036a41101003200341e8036a4200370300200341e0036a4280a094a58d1d370300200341d8036a200e370300200341d0036a200437030020034180036a41086a41023a000020034189036a20032903d00537000020034191036a200341d0056a41086a29030037000020034199036a200341d0056a41106a290300370000200341a1036a200341d0056a41186a290300370000200341a9036a20032903d806370000200341b1036a200341d8066a41086a290300370000200341b9036a200341d8066a41106a290300370000200341c1036a2008290300370000200341023a00800341b8d6c500410020034180036a1088010c010b200328024c210a410121084101210b0c0d0b410021090b410121084101210b0c0b0b41144101102a000b41344101102a000b41144101102a000b41344101102a000b41144101102a000b41344101102a000b4100210c410021090c010b4100210d410021090b4128210a4101210b4100210802402007417f6a220241054b0d004101210f410121104101211341012114410121154101211641012117410121064101210741012111024002400240024020020e06100010010203100b4100210841000d062004a70d050c060b4100210841000d052004a70d040c050b200d450d0402402004422088a72202450d00200241186c21062005210203400240200241046a280200450d00200228020010290b0240200241106a280200450d002002410c6a28020010290b200241186a2102200641686a22060d000b0b2004a70d030c040b200c450d0302402004422088a72202450d002002410c6c21062005210203400240200241046a280200450d00200228020010290b2002410c6a2102200641746a22060d000b0b2004a70d020c030b02402004422088a72202450d002002410c6c21062005210203400240200241046a280200450d00200228020010290b2002410c6a2102200641746a22060d000b0b2004a70d010c020b410021084101210f410121104101211341012114410121154101211641012117410121064101210741012111410021090c0a0b200510290b4101210f0b410121100b410121130b410121140b410121150b410121160b410121170b410121060b41012107410121110b024002402001280200220241104b0d000240024002400240024002400240024002400240024020020e11000c0c010c0c0203040506070c080c090a000b2008450d0b0240200141086a280200220241054b0d0002400240024020020e060f0f000f01020f0b200141106a280200450d0e2001410c6a28020010290c0e0b200141106a280200450d0d2001410c6a28020010290c0d0b0240200141146a2802002208450d002001410c6a2802002102200841186c210803400240200241046a280200450d00200228020010290b0240200241106a280200450d002002410c6a28020010290b200241186a2102200841686a22080d000b0b200141106a280200450d0c200128020c10290c0c0b0240200141146a2802002208450d002001410c6a28020021022008410c6c210803400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b200141106a280200450d0b200128020c10290c0b0b200b450d0a02402001410c6a2802002202450d0020012802042207200241f8006c6a211103400240200741106a2802002208450d0020072802082102200841246c210803400240024020022d0000220641034b0d0002400240024020060e0404000102040b2002410c6a280200450d03200241086a28020010290c030b2002410c6a280200450d02200241086a28020010290c020b2002410c6a280200450d01200241086a28020010290c010b200241086a280200450d00200241046a28020010290b200241246a21022008415c6a22080d000b0b200741f8006a210202402007410c6a280200450d00200728020810290b2002210720022011470d000b0b200141086a280200450d0a200128020410290c0a0b200f450d090240200141086a2d00002202410c4b0d0020024106470d0a200141106a280200450d0a2001410c6a28020010290c0a0b200141106a280200450d092001410c6a28020010290c090b2010450d08200141086a280200450d08200128020410290c080b2013450d07200141086a2d0000417f6a220241074b0d07024002400240024020020e08000b0b0b010b0203000b2001410c6a2202280200103d200228020010290c0a0b2001410c6a2202280200103d200228020010290c090b2001410c6a2202280200103d200228020010290c080b2001410c6a2202280200103d200228020010290c070b2014450d0620012d0004417f6a220241024b0d0602400240024020020e03000102000b2001410c6a280200450d08200141086a28020010290c080b200141086a2202280200103d200228020010290c070b2001410c6a2202280200103d200228020010290c060b2015450d0520012d0004417f6a220241024b0d0502400240024020020e03000102000b2001410c6a280200450d07200141086a28020010290c070b200141086a2202280200103d200228020010290c060b2001410c6a2202280200103d200228020010290c050b2016450d04200141086a280200417f6a220241014b0d040240024020020e020001000b200141106a280200450d052001410c6a28020010290c050b200141106a280200450d042001410c6a28020010290c040b2017450d03200141086a280200450d03200128020410290c030b2006450d020240200141086a2d0000220241054b0d0002400240024020020e06060600010206060b200141106a280200450d052001410c6a28020010290c050b200141346a280200450d04200141306a28020010290c040b200141306a280200450d032001412c6a28020010290c030b200141d0006a280200450d02200141cc006a28020010290c020b2007450d0120012802044101470d01200141086a2202280200103d200228020010290c010b2011450d000240200141146a280200450d00200141106a28020010290b0240200141246a2802002208450d002001411c6a28020021022008410c6c210803400240200241046a280200450d00200228020010290b2002410c6a2102200841746a22080d000b0b0240200141206a280200450d00200128021c10290b200141d4006a280200450d00200141d0006a28020010290b2000200a36020420002009360200200341a0076a24000b4d01017f230041206b22002400200041146a410136020020004201370204200041ccfdc4003602002000410236021c200041c4fdc4003602182000200041186a360210200041908fc3001057000be42107067f017e017f017e017f027e137f230041e0026b22042400200128020821052001280204210620012802002107418988c30021084124210902400240200241ff01710d00200341ff01714102470d0020044188016a41086a22014200370300200442003703880141fcc7c500411720044188016a1004200441186a41086a200129030037030020042004290388013703182004410036028801200441186a411020044188016a10052101024002400240024002400240024002402004280288012202417f460d002001450d00200441003a00880120044188016a20012002410047220310ce041a20022003490d042002450d0120042d00880121022001102920024102460d002002410171450d0041f086c3002108411c21090c080b200441013a00c00220044188016a41086a22014200370300200442003703880141fcc7c500411720044188016a1004200441186a41086a220220012903003703002004200429038801370318200441186a4110200441c0026a41011003200441086a41888dc300410d1094012004290310210a20042802082103200142003703002004420037038801418bf4c200411120044188016a10042002200129030037030020042004290388013703182004410036028801200441186a411020044188016a10052101024002402004280288012202417f460d002001450d00200420023602c402200420013602c00220044188016a200441c0026a1046200428028801220b450d04200429028c01210c2002450d01200110290c010b4108210b4200210c0b02400240200ca7200c422088a72201470d00200141016a22022001490d012001410174220d20022002200d491bad220e42c8007e220f422088a70d01200fa722024100480d010240024020010d0020021027210b0c010b200b200141c8006c20021028210b0b200b450d03200c42808080807083200e84210c0b200b200141c8006c6a220141003a00002001200a420020031b220e37030820012004280018360001200141046a200441186a41036a2800003600002001200429038801370310200141186a20044188016a41086a290300370300200141206a20044188016a41106a290300370300200141286a20044188016a41186a290300370300200141306a20044188016a41206a290300370300200141386a20044188016a41286a290300370300200141c0006a20044188016a41306a290300370300200c4280808080107c210a2007200541f8006c6a2110024020050d00200721110c070b200441ff016a2112200441b7016a2113200441ef006a2114200441276a2115200441dc016a211620044188016a41346a21172004419c016a211820044188016a410c6a2119200441b6026a211a200441a2026a41046a211b2007211103402011280208211c2011290300210c20044188016a2011410c6a41ec0010ce041a201141f8006a2111201c450d07200441186a20044188016a41ec0010ce041a2004201c360290012004200c370388012019200441186a41ec0010ce041a200441003602b002200442013703a80202400240024002400240412010272201450d00200442a080808080043702ac02200420013602a80220012018290000370000200141086a201841086a290000370000200141106a201841106a290000370000200141186a201841186a29000037000020044188016a200441a8026a10540240024020042802ac02220220042802b00222036b4120490d00200341206a210120042802a80221050c010b200341206a22012003490d0720024101742205200120012005491b220d4100480d070240024020020d00200d102721050c010b20042802a8022002200d102821050b2005450d022004200d3602ac02200420053602a802200d21020b200420013602b002200520036a22032017290000370000200341086a201741086a290000370000200341106a201741106a290000370000200341186a201741186a2900003700000240200220016b411f4b0d00200141206a22032001490d072002410174220d20032003200d491b22034100480d070240024020020d002003102721050c010b200520022003102821050b2005450d03200420033602ac02200420053602a8020b200520016a220541086a201641086a290000370000200541106a201641106a290000370000200541186a201641186a2900003700002004200141206a3602b002200520162900003700002004200428029801221d3602c002200441c0026a200441a8026a103002400240201d0d0020042802b002210520042802ac02210820042802a80221020c010b201d41246c210920042802ac02210820042802b0022101201c21030340200441c0026a2003104f20042802c002211e02400240200820016b20042802c802220d490d002001200d6a210520042802a80221020c010b2001200d6a22052001490d0920084101742202200520052002491b221f4100480d090240024020080d00201f102721020c010b20042802a8022008201f102821020b2002450d062004201f3602ac02200420023602a802201f21080b200420053602b002200220016a201e200d10ce041a024020042802c402450d00201e10290b200341246a2103200521012009415c6a22090d000b0b200441c0026a41186a22034200370300200441c0026a41106a220d4200370300200441c0026a41086a221e4200370300200442003703c00220022005200441c0026a100020044180026a41186a2220200329030037030020044180026a41106a2221200d29030037030020044180026a41086a2222201e290300370300200420042903c0023703800202402008450d00200210290b200c50450d04418c87c3002108411021090c0b0b41204101102a000b200d4101102a000b20034101102a000b201f4101102a000b0240200c200e580d00419c87c3002108411821090c070b200441c0026a200c427f7c1087020240200441c0026a2018412010d004450d0041b487c3002108411921090c070b0240200c200e5a0d0041cd87c3002108412621090c070b200b200a422088a7220241c8006c221f6a2105200b2101024002400240024002400240201f41d901490d00200b21010340024020012d00004101470d0020122001460d07200141016a20044180026a412010d004450d070b0240200141c8006a22082d00004101470d0020132001460d03200141c9006a20044180026a412010d004450d030b024020014190016a22082d00004101470d0020142001460d0420014191016a20044180026a412010d004450d040b0240200141d8016a22082d00004101470d0020152001460d06200141d9016a20044180026a412010d004450d060b2005200141a0026a22016b41d8014b0d000b0b20052001470d02410021010c040b200821010c030b200821010c020b0340024020012d00004101470d0020122001460d03200141016a20044180026a412010d004450d030b2005200141c8006a2201470d000b410021010c010b200821010b200441c0026a200c108702200441c0026a20044180026a412010d004210541f387c30021084116210920010d062005450d06200441c0026a109801200441c0026a410210960320034200370300200d4200370300201e4200370300200442003703c002200441c0026a4101109603201e2022290300370300200d20212903003703002003202029030037030020042004290380023703c00202400240200aa72002470d00200241016a22012002490d0320024101742205200120012005491bad220c42c8007e220f422088a70d03200fa722014100480d030240024020020d0020011027210b0c010b200b201f20011028210b0b200b450d01200a42808080807083200c84210a0b200b201f6a220141013a0000200141096a201e290300370000200120042903c0023700012003290300210c200d290300210f200141003a0021200141116a200f370000200141196a200c370000200120042900a80237002c200141346a200441a8026a41086a2900003700002001413a6a201a290000370000200120042801a202360142200141c6006a201b2f01003b01000240201d450d00201d41246c2105201c210103400240024020012d0000220241034b0d0002400240024020020e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012005415c6a22050d000b0b0240200428029401450d00201c10290b200a4280808080107c210a20112010470d010c090b0b20014108102a000b102b000b418f89c3004133104e000b20024108102a000b418f89c3004133104e000b20032002103e000b0240201d450d00201d41246c2105201c210103400240024020012d0000220241034b0d0002400240024020020e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012005415c6a22050d000b0b0240200428029401450d00201c10290b024020112010460d00034020112802082203450d012011410c6a280200210d0240201141106a2802002201450d00200141246c21052003210103400240024020012d0000220241034b0d0002400240024020020e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012005415c6a22050d000b0b201141f8006a21110240200d450d00200310290b20112010470d000b0b02402006450d00200710290b200aa7450d03200b10290c030b20112010460d00034020112802082203450d012011410c6a280200210d0240201141106a2802002201450d00200141246c21052003210103400240024020012d0000220241034b0d0002400240024020020e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012005415c6a22050d000b0b201141f8006a21110240200d450d00200310290b20112010470d000b0b02402006450d00200710290b20044188016a41086a220142003703002004420037038801418bf4c200411120044188016a1004200441186a41086a200129030037030020042004290388013703184100210820044100360290012004420137038801200b200a422088a720044188016a109203200428028c012101200441186a41102004280288012205200428029001100302402001450d00200510290b0240200aa7450d00200b10290b0c010b02402005450d002007200541f8006c6a210d2007210303400240200341106a2802002205450d0020032802082101200541246c210503400240024020012d0000220241034b0d0002400240024020020e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012005415c6a22050d000b0b200341f8006a210102402003410c6a280200450d00200328020810290b200121032001200d470d000b0b2006450d00200710290b2000200936020420002008360200200441e0026a24000b4d01017f230041206b22002400200041146a410136020020004201370204200041ccfdc4003602002000410236021c200041c4fdc4003602182000200041186a360210200041f4eec2001057000b83d50106017f037e0c7f017e157f057e23004190056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0e000102030405060708090a0b0c0d000b2003419c046a41013602002003420137028c04200341ccfdc40036028804200341023602fc01200341c4fdc4003602f8012003200341f8016a3602980420034188046a41d4fdc4001057000b200141306a2903002104200141286a29030021052002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d00002110200241046a2d00002111200241026a2f010021122001411d6a29000021132001411c6a2d000021142001411b6a2d00002115200141196a2f00002116200141186a2d00002117200141176a2d00002118200141156a2f00002119200141146a2d0000211a200141136a2d0000211b200141116a2f0000211c200141106a2d0000211d2001410c6a280200211e200141086a280200211f200141076a2d00002120200141056a2f00002121200141046a2d0000212220012d00012123412a212441d588c30021250240024020022d0000450d004101212641002127410021280c010b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002124200241066a2f0100410874200241056a2d000072200241086a2d0000411874722125410021260b202841ffff0371410874202741187472202441ff017172212420260d4f410e10272202450d3f200241066a41002900c7a244370000200241002900c1a2443700002002410e412e10282202450d3e20022006370026200220073a0025200220083a0024200220093b00222002200a3a00212002200b3a00202002200c3b001e2002200d3a001d2002200e3a001c2002200f3b001a200220103a00192002202436001520022025360011200220113a0010200220123b000e200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e803200341e8036a412041b8d6c50041004100100b21262002102902402026417f460d0041aefec4002125411421240c500b0240202241ff01714101470d0020034188046a201f41067610cc01200328028804212602400240200328029004201f413f7122024b0d00410021020c010b202620024105746a2202290018211320022d0017211420022d0016211520022f0014211620022d0013211720022d0012211820022f0010211920022d000f211a20022d000e211b20022f000c211c20022d000b211d2002280007211e2002280003211f20022d0002212020022f00002121410121020b0240200328028c04450d00202610290b2002450d4f0b2003201337039002200320143a008f02200320153a008e02200320163b018c02200320173a008b02200320183a008a02200320193b0188022003201a3a0087022003201b3a0086022003201c3b0184022003201d3a0083022003201e3600ff012003201f3600fb01200320203a00fa01200320213b01f801410e10272202450d3d200241066a410029009fa34437000020024100290099a3443700002002410e412e10282202450d3c200220032903f80137000e200241266a200341f8016a41186a2903003700002002411e6a200341f8016a41106a290300370000200241166a200341f8016a41086a290300370000200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e803200341e8036a412041b8d6c50041004100100b2126200210292026417f470d4d02402005428080e983b1de165441002004501b450d0041fdfdc4002125413121240c500b20034188046a41186a200341f8016a41186a29030037030020034188046a41106a200341f8016a41106a29030037030020034188046a41086a200341f8016a41086a290300370300200320032903f80137038804410e10272202450d3b200241066a41002900c7a244370000200241002900c1a2443700002002410e412e10282202450d3a20022006370026200220073a0025200220083a0024200220093b00222002200a3a00212002200b3a00202002200c3b001e2002200d3a001d2002200e3a001c2002200f3b001a200220103a00192002202436001520022025360011200220113a0010200220123b000e200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e803412010272226450d392026200329038804370000202641186a20034188046a41186a290300370000202641106a20034188046a41106a290300370000202641086a20034188046a41086a290300370000200341e8036a41202026412010032026102920021029410d10272202450d38200241056a41002900aca344370000200241002900a7a3443700002002410d412d10282202450d3720022006370025200220073a0024200220083a0023200220093b00212002200a3a00202002200b3a001f2002200c3b001d2002200d3a001c2002200e3a001b2002200f3b0019200220103a00182002202436001420022025360010200220113a000f200220123b000d200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f0042002412d200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e803024002400240024002400240202341037122264103460d0020260e03010203010b200341e8036a41204101410010030c040b410021270c020b410121270c010b410221270b200320273a00f004410110272226450d37202620273a0000200341e8036a4120202641011003202610290b20021029411410272202450d35200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d342002200637002c200220073a002b200220083a002a200220093b00282002200a3a00272002200b3a00262002200c3b00242002200d3a00232002200e3a00222002200f3b0020200220103a001f2002202436001b20022025360017200220113a0016200220123b0014200320024134108401200341106a2903002113200329030821292003280200212620021029200341cc046a2006370200200341cb046a20073a0000200341ca046a20083a0000200341c8046a20093b0100200341c7046a200a3a0000200341c6046a200b3a0000200341c4046a200c3b0100200341c3046a200d3a0000200341c2046a200e3a0000200341c0046a200f3b0100200341bf046a20103a0000200341bb046a2024360000200341b7046a2025360000200341b6046a20113a0000200341b0046a4100360200200341a0046a2013420020261b220620042029420020261b2213200554200620045420062004511b22021b2206370300200320123b01b404200342083703a80420032013200520021b22133703980420032006370390042003201337038804200341f8016a20034188046a10d803200341ac046a280200450d4c20032802a80410290c4c0b20022d00000d4a20022d00014101470d4a200141106a2903002106200141086a2903002113200241196a2d00002125200241186a2d00002124200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f01002107200241116a2d00002108200241106a2d000021092002410e6a2f0100210a2002410d6a2d0000210b2002410c6a2d0000210c2002410a6a2f0100210d200241096a2d0000210e200241086a2d0000210f200241066a2f01002110200241056a2d00002111200241046a2d00002112200241026a2f0100211f20032002411a6a29010037038004200320253a00ff03200320243a00fe03200320263b01fc03200320273a00fb03200320283a00fa03200320073b01f803200320083a00f703200320093a00f6032003200a3b01f4032003200b3a00f303200320123a00ea032003201f3b01e8032003200e200d410874200c41187472723600ef0320032011201041087472200f411874723600eb0320034188046a200341e8036a108c02024020032d0088044101460d0041d2fec4002125410b21240c4f0b2003200329028c0437006b200320032d008b043a006a200320032f0089043b01682003200341a1046a2900003703800120032003419d046a28000036027c200320034195046a290000370274200320034188046a410c6a22022d00003a007320034188046a200341e8006a108d0220032802a8042224450d49200341f0046a41086a20034188046a41346a2902002204370300200341b0016a41086a22262004370300200341b0016a41106a222720034188046a413c6a290200370300200341b0016a41186a222820034188046a41c4006a2902003703002003200341b4046a29020022043703f004200320043703b001200341d4046a280200210720034188046a41286a2802002108200235020021042003280288042102200329028c042105200329039804212920032802ac042125200341f8016a41186a20034188046a41186a290300222a370300200341f8016a410c6a20043e0200200341f8016a41286a20083602002003419c026a20253602002003202937038802200320053702fc012003202436029802200320023602f801200341f8016a41c4006a2028290300370200200341f8016a413c6a2027290300370200200341f8016a41346a2026290300370200200320032903b0013702a402200320073602c402411410272202450d32200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d31200220032903e8033700142002412c6a200341e8036a41186a290300370000200241246a200341e8036a41106a2903003700002002411c6a200341e8036a41086a290300370000200341186a20024134108401200341186a41106a29030021052003290320210420032802182124200210292004420020241b220420032903f801222b7d222c2004562005420020241b2205200341f8016a41086a290300222d7d2004202b54ad7d220420055620042005511b450d470c480b200141106a2903002113200141086a29030021042002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d00002110200241046a2d00002111200241026a2f01002112412a212441d588c30021250240024020022d0000450d004101212641002127410021280c010b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002124200241066a2f0100410874200241056a2d000072200241086a2d0000411874722125410021260b202841ffff0371410874202741187472202441ff017172212420260d4d2003200637038001200320073a007f200320083a007e200320093b017c2003200a3a007b2003200b3a007a2003200c3b01782003200d3a00772003200e3a00762003200f3b0174200320103a00732003202436006f2003202536006b200320113a006a200320123b016820034188046a200341e8006a108d0220032802a8042226450d48200341f0046a41086a20034188046a41346a2902002206370300200341b0016a41086a22242006370300200341c0016a222720034188046a413c6a290200370300200341b0016a41186a222820034188046a41c4006a2902003703002003200341b4046a29020022063703f004200320063703b001200341d4046a280200210720034188046a41286a280200212520034188046a410c6a35020021292003280288042108200329028c04212b200329039804210620032802ac042102200341f8016a41186a20034188046a41186a2903002205370300200341f8016a410c6a20293e0200200341f8016a41286a20253602002003419c026a200236020020032006370388022003202b3702fc012003202636029802200320083602f801200341f8016a41c4006a2028290300370200200341f8016a413c6a2027290300370200200341f8016a41346a2024290300370200200320032903b0013702a402200320073602c40202400240024002402025411f4b0d00200620042006200454200520135420052013511b22241b22042005201320241b221384500d03200341f8016a41186a4200200520137d2006200454ad7d2229200620047d222b428080e983b1de165441002029501b22241b37030020034200202b20241b37038802200341306a4189c7c500411210b501200328023421272003280230212820252002470d02200241016a22072002490d4920024101742208200720072008491b2207ad42187e2229422088a70d492029a7220841004e0d010c490b41ddfec4002125412321242002450d50202610290c500b0240024020020d002008102721260c010b2026200241186c2008102821260b2026450d312003200736029c0220032026360298020b2026202541186c6a22022005201320241b37030820022006200420241b3703002002202741a0056a41a00520281b360210200320032802a00241016a3602a002200341e8006a200341f8016a10d803200328029c0221020b2002450d4a20032802980210290c4a0b41d588c3002125412a212420022d00000d4c20022d00014101470d4c200241196a2d00002125200241186a2d00002124200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f01002107200241116a2d00002108200241106a2d000021092002410e6a2f0100210a2002410d6a2d0000210b2002410c6a2d0000210c2002410a6a2f0100210d200241096a2d0000210e200241086a2d0000210f200241066a2f01002110200241056a2d00002111200241046a2d00002112200241026a2f0100211f20032002411a6a2901003703c801200320253a00c701200320243a00c601200320263b01c401200320273a00c301200320283a00c201200320073b01c001200320083a00bf01200320093a00be012003200a3b01bc012003200b3a00bb01200320123a00b2012003201f3b01b0012003200e200d410874200c41187472723600b70120032011201041087472200f411874723600b30120034188046a200341b0016a108d0220032802a8042207450d47200341c8026a41086a200341bc046a290200370300200341c8026a41106a200341c4046a290200370300200341c8026a41186a200341cc046a2902003703002003200341b4046a2902003703c80220034188046a41186a2903002129200341b0046a280200210920034194046a3502002106200329039804212b20032802ac04210a2003350288042104200329028c042113200341c8006a4189c7c500411210b501410021282006422086201342208884210620042013422086842113024002400240200941186c2202450d00200328024c410020032802481b2126200720026a2127200941186c41686a2125200721020340200241086a2903002105200229030021042026200241106a2802002224490d024200200620057d2013200454ad7d2205201320047d2204201356200520065620052006511b22241b21064200200420241b2113202541686a2125200241186a22022027470d000b0b410821080240200a0d00410021240c020b20071029410021240c010b411810272208450d2e2008200437030020082024360210200820053703080240024020250d0041012128410121240c010b200241186a210b200941186c20076a41686a210c41012128410121240340200b210202400340200241086a2903002105200229030021042026200241106a2802002225490d014200200620057d2013200454ad7d2205201320047d2204201356200520065620052006511b22251b21064200200420251b2113200241186a22022027470d000c030b0b024020242028470d00202841016a22242028490d4820284101742209202420242009491b2224ad42187e222c422088a70d48202ca722094100480d480240024020280d002009102721080c010b2008202841186c2009102821080b2008450d300b200241186a210b2008202841186c6a220920053703082009200437030020092025360210202841016a2128200c2002470d000b0b200a450d00200710290b200341b0046a2028360200200341ac046a20243602002003202b3703980420034188046a41186a2029370300200341cc046a200341c8026a41186a290300370200200341c4046a200341d8026a290300370200200341bc046a200341d0026a2903003702002003201337038804200320032903c8023702b404200320083602a80420032006370390040240202b2029844200520d002028450d0a0b200341b0016a20034188046a10d8030c430b200141106a2903002113200141086a2903002104200141186a280200211f2002411a6a2901002106200241196a2d00002107200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d00002110200241046a2d00002111200241026a2f0100211241d588c3002125412a21240240024020022d0000450d004101212641002127410021280c010b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002124200241066a2f0100410874200241056a2d000072200241086a2d0000411874722125410021260b202741ffff0371410874202441ff017172202841187472212420260d4b2003200637038003200320073a00ff02200320083a00fe02200320093b01fc022003200a3a00fb022003200b3a00fa022003200c3b01f8022003200d3a00f7022003200e3a00f6022003200f3b01f402200320103a00f302200320243600ef02200320253600eb02200320113a00ea02200320123b01e80220034188046a200341e8026a108d0220032802a8042202450d46200341f0046a41086a20034188046a41346a2902002206370300200341b0016a41086a22252006370300200341b0016a41106a222420034188046a413c6a290200370300200341b0016a41186a222720034188046a41c4006a290200370300200320034188046a412c6a29020022063703f004200320063703b001200341d4046a280200212820034188046a41286a280200210720034188046a410c6a35020021062003280288042108200329028c042105200329039804212920032802ac042126200341f8016a41186a20034188046a41186a290300370300200341f8016a410c6a20063e0200200341f8016a41286a20073602002003419c026a20263602002003202937038802200320053702fc012003200236029802200320083602f801200341f8016a41c4006a2027290300370200200341f8016a413c6a2024290300370200200341f8016a41346a2025290300370200200320032903b0013702a402200320283602c4020240201f410a4b0d00200341f8016a412c6a222510ca0320032013370358200320043703502003201f360260411210272202450d2b200241106a41002f0088a3443b0000200241086a4100290080a344370000200241002900f8a24437000020024112413210282202450d2a200220252900003700122002412a6a202541186a290000370000200241226a202541106a2900003700002002411a6a202541086a290000370000200341f0046a41186a22244200370300200341f0046a41106a22264200370300200341f0046a41086a22274200370300200342003703f00420024132200341f0046a1000200341e8036a41186a2024290300370300200341e8036a41106a2026290300370300200341e8036a41086a2027290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a10052124024002402003280288042226417f460d002024450d00200320263602f404200320243602f00420034188046a200341f0046a10af0320032d00a00422254102460d2b200341b0016a41186a2227200341b9046a290000370300200341b0016a41106a2207200341b1046a290000370300200341b0016a41086a2208200341a9046a290000370300200341e8006a41086a2209200341ca046a290100370300200341e8006a41106a220a200341d2046a290100370300200341e8006a41186a220b200341da046a290100370300200320032900a1043703b0012003200341c2046a290100370368200341c1046a2d0000212802402026450d00202410290b200341c8026a41086a2008290300370300200341c8026a41106a2007290300370300200341c8026a41186a202729030037030020034188036a41086a200929030037030020034188036a41106a200a29030037030020034188036a41186a200b290300370300200320032903b0013703c80220032003290368370388030c010b200341f0046a41186a22244200370300200341f0046a41106a22264200370300200341f0046a41086a22274200370300200342003703f00441b3a4c400411a200341f0046a1000200341e8036a41186a2024290300370300200341e8036a41106a2026290300370300200341e8036a41086a2027290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a100521240240024002402003280288042226417f460d002024450d00200341f0046a2026412020264120491b22276a41004100412020276b2027411f4b1b10cd041a200341f0046a2024202710ce041a2026411f4d0d2c200341b0016a41186a2226200341f0046a41186a290300370300200341b0016a41106a2227200341f0046a41106a290300370300200341b0016a41086a2228200341f0046a41086a290300370300200320032903f0043703b00120241029200341a8036a41186a20262903002206370300200341a8036a41106a20272903002213370300200341a8036a41086a20282903002204370300200320032903b00122053703a803200341c8036a41186a2006370300200341c8036a41106a2013370300200341c8036a41086a2004370300200320053703c8034112102722240d0141124101102a000b200341f0046a41186a22244200370300200341f0046a41106a22264200370300200341f0046a41086a22274200370300200342003703f00441b3a4c400411a200341f0046a1000200341e8036a41186a2024290300370300200341e8036a41106a2026290300370300200341e8036a41086a2027290300370300200320032903f0043703e803412010272224450d2a20242025290000370000202441186a202541186a290000370000202441106a202541106a290000370000202441086a202541086a290000370000200341e8036a412020244120100320241029410021280c010b202441106a41002f0088a3443b0000202441086a4100290080a344370000202441002900f8a24437000020244112413210282224450d28202420032903c8033700122024412a6a200341c8036a41186a290300370000202441226a200341c8036a41106a2903003700002024411a6a200341c8036a41086a290300370000200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f00420244132200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a100521262003280288042227417f460d262026450d262003202736026c2003202636026820034188046a200341e8006a10af0320032d00a00422284102460d2720034188046a41086a290300210620032903880421132003280298042107200341b0016a200341a1046a41c70010ce041a02402027450d00202610290b200341e8006a200341b0016a41c10010ce041a200320283a00880420034188046a410172200341e8006a41c10010ce041a200341cc016a200341aa046a410020032d00a9044101461b360200200320063703b801200320133703b001200320253602c801200320073602c001200341f0046a41186a22264200370300200341f0046a41106a22274200370300200341f0046a41086a22284200370300200342003703f00420244132200341f0046a1000200341e8036a41186a2026290300370300200341e8036a41106a2027290300370300200341e8036a41086a2028290300370300200320032903f0043703e8032003410036027020034201370368200341b0016a41106a200341e8006a10302003200341b0016a3602f004200341f0046a200341e8006a10590240024020032802c80122070d00200341003a00f00402400240200328026c222720032802702207460d00200328026821260c010b200741016a22262007490d4920074101742227202620262027491b22274100480d490240024020070d002027102721260c010b200328026820072027102821260b2026450d282003202736026c200320263602680b2003200741016a2228360270202620076a41003a00000c010b200341013a00f00402400240200328026c20032802702227460d00200328026821260c010b202741016a22262027490d4820274101742228202620262028491b22284100480d480240024020270d002028102721260c010b200328026820272028102821260b2026450d262003202836026c200320263602680b2003202741016a360270202620276a41013a000002400240200328026c2208200328027022286b411f4d0d00200821270c010b202841206a22272028490d4820084101742209202720272009491b22274100480d480240024020080d002027102721260c010b202620082027102821260b2026450d252003202736026c200320263602680b202620286a220841086a200741086a290000370000200841106a200741106a290000370000200841186a200741186a2900003700002003202841206a2228360270200820072900003700000b0240024020032802cc0122070d00200341003a00f004024020272028470d00202741016a22072027490d4920274101742208200720072008491b22074100480d490240024020270d002007102721260c010b202620272007102821260b2026450d252003200736026c200320263602680b2003202841016a360270202620286a41003a000020032802702128200328026c2127200328026821260c010b200341013a00f004024020272028470d00202741016a22082027490d4820274101742209200820082009491b22084100480d480240024020270d002008102721260c010b202620272008102821260b2026450d232003200836026c200320263602680b2003202841016a360270202620286a41013a000002400240200328026c2227200328027022286b4120490d00200328026821260c010b202841206a22262028490d4820274101742208202620262008491b22084100480d480240024020270d002008102721260c010b200328026820272008102821260b2026450d222003200836026c20032026360268200821270b202620286a220841086a200741086a290000370000200841106a200741106a290000370000200841186a200741186a2900003700002003202841206a2228360270200820072900003700000b200341e8036a412020262028100302402027450d00202610290b20241029200341f0046a41186a22244200370300200341f0046a41106a22264200370300200341f0046a41086a22274200370300200342003703f00441b3a4c400411a200341f0046a1000200341e8036a41186a2024290300370300200341e8036a41106a2026290300370300200341e8036a41086a2027290300370300200320032903f0043703e803412010272224450d1f20242025290000370000202441186a202541186a290000370000202441106a202541106a290000370000202441086a202541086a290000370000200341e8036a41202024412010032024102920034188036a41086a200341c8036a41086a29030037030020034188036a41106a200341c8036a41106a29030037030020034188036a41186a200341c8036a41186a290300370300200320032903c80337038803410121280b410021250b20034188046a41086a200341c8026a41086a29030037030020034188046a41106a200341c8026a41106a29030037030020034188046a41186a200341c8026a41186a290300370300200341b0016a41086a20034188036a41086a290300370300200341b0016a41106a20034188036a41106a290300370300200341b0016a41186a20034188036a41186a290300370300200320032903c8023703880420032003290388033703b001200341f0046a41186a22244200370300200341f0046a41106a22264200370300200341f0046a41086a22274200370300200342003703f00420024132200341f0046a1000200341e8036a41186a2024290300370300200341e8036a41106a2026290300370300200341e8036a41086a2027290300370300200320032903f0043703e8032003410036027020034201370368200341d0006a41106a200341e8006a10302003200341d0006a3602f004200341f0046a200341e8006a10590240024020254101460d00200341003a00f00402400240200328026c222420032802702227460d00200328026821250c010b202741016a22252027490d4720274101742224202520252024491b22244100480d470240024020270d002024102721250c010b200328026820272024102821250b2025450d1f2003202436026c200320253602680b2003202741016a2226360270202520276a41003a00000c010b200341013a00f00402400240200328026c20032802702224460d00200328026821250c010b202441016a22252024490d4620244101742226202520252026491b22264100480d460240024020240d002026102721250c010b200328026820242026102821250b2025450d1d2003202636026c200320253602680b2003202441016a360270202520246a41013a000002400240200328026c2227200328027022266b411f4d0d00202721240c010b202641206a22242026490d4620274101742207202420242007491b22244100480d460240024020270d002024102721250c010b202520272024102821250b2025450d1c2003202436026c200320253602680b202520266a222741086a20034188046a41086a290300370000202741106a20034188046a41106a290300370000202741186a20034188046a41186a2903003700002003202641206a222636027020272003290388043700000b02400240202841ff01714101460d00200341003a00f004024020242026470d00202441016a22272024490d4720244101742228202720272028491b22274100480d470240024020240d002027102721250c010b202520242027102821250b2025450d1c2003202736026c200320253602680b2003202641016a360270202520266a41003a000020032802702126200328026c2124200328026821250c010b200341013a00f004024020242026470d00202441016a22272024490d4620244101742228202720272028491b22274100480d460240024020240d002027102721250c010b202520242027102821250b2025450d1a2003202736026c200320253602680b2003202641016a360270202520266a41013a000002400240200328026c2224200328027022266b4120490d00200328026821250c010b202641206a22252026490d4620244101742227202520252027491b22274100480d460240024020240d002027102721250c010b200328026820242027102821250b2025450d192003202736026c20032025360268202721240b202520266a222741086a200341b0016a41086a290300370000202741106a200341b0016a41106a290300370000202741186a200341b0016a41186a2903003700002003202641206a2226360270202720032903b0013700000b200341e8036a412020252026100302402024450d00202510290b20021029200328029c02450d4920032802980210290c490b4180ffc4002125411b21242026450d4b200210290c4b0b2001410c6a2802002109200141086a2802002108200141046a28020021282002411a6a2901002106200241196a2d0000210a200241186a2d0000210b200241166a2f0100210c200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d0000211f200241046a2d00002114200241026a2f0100211541d588c3002125412a21240240024020022d0000450d004101212641002127410021070c010b41012126410021274100210720022d00014101470d002002410c6a2d000021072002410a6a2f01002127200241096a2d00002124200241066a2f0100410874200241056a2d000072200241086a2d0000411874722125410021260b202741ffff0371410874202441ff017172200741187472212420260d40200320063703c0032003200a3a00bf032003200b3a00be032003200c3b01bc032003200d3a00bb032003200e3a00ba032003200f3b01b803200320103a00b703200320113a00b603200320123b01b4032003201f3a00b303200320243600af03200320253600ab03200320143a00aa03200320153b01a80320034188046a200341a8036a108d02024020032802a804220a0d004110212441c2fec40021250c410b200341f0046a41086a20034188046a41346a2902002206370300200341b0016a41086a22022006370300200341c0016a222520034188046a413c6a290200370300200341b0016a41186a222420034188046a41c4006a290200370300200320034188046a412c6a29020022063703f004200320063703b001200341d4046a280200212620034188046a41286a280200212720034188046a410c6a35020021062003280288042107200329028c042113200329039804210420032802ac04210b200341f8016a41186a20034188046a41186a290300370300200341f8016a410c6a20063e0200200341f8016a41286a2027360200200341f8016a41246a200b3602002003200437038802200320133702fc012003200a36029802200320073602f801200341f8016a41c4006a2024290300370200200341f8016a413c6a2025290300370200200341f8016a41346a2002290300370200200320032903b0013702a402200320263602c40220090d3e41ba80c500212541172124410121020c3f0b20022d00000d4520022d00014101470d45200241196a2d00002125200241186a2d00002124200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f01002107200241116a2d00002108200241106a2d000021092002410e6a2f0100210a2002410d6a2d0000210b2002410c6a2d0000210c2002410a6a2f0100210d200241096a2d0000210e200241086a2d0000210f200241066a2f01002110200241056a2d00002111200241046a2d00002112200241026a2f0100211f20032002411a6a29010037038001200320253a007f200320243a007e200320263b017c200320273a007b200320283a007a200320073b0178200320083a0077200320093a00762003200a3b01742003200b3a0073200320123a006a2003201f3b01682003200e200d41087472200c4118747236006f20032011201041087472200f4118747236006b20034188046a200341e8006a108d0220032802a8042202450d44200341f0046a41086a20034188046a41346a2902002206370300200341b0016a41086a22242006370300200341c0016a222620034188046a413c6a290200370300200341b0016a41186a222720034188046a41c4006a290200370300200320034188046a412c6a29020022063703f004200320063703b001200341d4046a280200212820034188046a41286a280200210720034188046a410c6a35020021062003280288042108200329028c042113200329039804210420032802ac042125200341f8016a41186a20034188046a41186a290300370300200341f8016a410c6a20063e0200200341f8016a41286a20073602002003419c026a20253602002003200437038802200320133702fc012003200236029802200320083602f801200341f8016a41c4006a2027290300370200200341f8016a413c6a2026290300370200200341f8016a41346a2024290300370200200320032903b0013702a402200320283602c402200341f8016a412c6a222410c903202410ca032025450d46200210290c460b20022d00000d4420022d00014101470d4420012d00012114200241196a2d00002125200241186a2d00002124200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f01002107200241116a2d00002108200241106a2d000021092002410e6a2f0100210a2002410d6a2d0000210b2002410c6a2d0000210c2002410a6a2f0100210d200241096a2d0000210e200241086a2d0000210f200241066a2f01002110200241056a2d00002111200241046a2d00002112200241026a2f0100211f20032002411a6a2901003703c801200320253a00c701200320243a00c601200320263b01c401200320273a00c301200320283a00c201200320073b01c001200320083a00bf01200320093a00be012003200a3b01bc012003200b3a00bb01200320123a00b2012003201f3b01b0012003200e200d41087472200c411874723600b70120032011201041087472200f411874723600b30120034188046a200341b0016a108d0220032802a8042226450d43200341f8016a41086a200341bc046a29020037030020034188026a200341c4046a290200370300200341f8016a41186a200341cc046a2902003703002003200341b4046a2902003703f80120032802ac042127410d10272202450d12200241056a41002900aca344370000200241002900a7a3443700002002410d412d10282202450d11200220032903f80137000d200241256a200341f8016a41186a2903003700002002411d6a200341f8016a41106a290300370000200241156a200341f8016a41086a290300370000200341f0046a41186a22254200370300200341f0046a41106a22244200370300200341f0046a41086a22284200370300200342003703f0042002412d200341f0046a1000200341e8036a41186a2025290300370300200341e8036a41106a2024290300370300200341e8036a41086a2028290300370300200320032903f0043703e803024002400240024002400240201441037122254103460d0020250e03010203010b200341e8036a41204101410010030c040b410021240c020b410121240c010b410221240b200320243a00f004410110272225450d11202520243a0000200341e8036a4120202541011003202510290b200210292027450d45202610290c450b2001411d6a29000021132001411c6a2d000021142001411b6a2d00002115200141196a2f00002116200141186a2d00002117200141176a2d00002118200141156a2f00002119200141146a2d0000211a200141136a2d0000211b200141116a2f0000211c200141106a2d0000211d2001410c6a280200211e200141086a2802002107200141076a2d00002120200141056a2f00002121200141046a2d000021222002411a6a2901002106200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f0100211f41d588c3002125412a21240240024020022d0000450d004101212641002127410021280c010b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002124200241066a2f0100410874200241056a2d000072200241086a2d0000411874722125410021260b202741ffff0371410874202441ff017172202841187472212420260d47200320063703e002200320083a00df02200320093a00de022003200a3b01dc022003200b3a00db022003200c3a00da022003200d3b01d8022003200e3a00d7022003200f3a00d602200320103b01d402200320113a00d302200320243600cf02200320253600cb02200320123a00ca022003201f3b01c80220034188046a200341c8026a108c0241012126024020032d0088044101460d0041d2fec4002125410b2124410121270c490b2003200329028c043700eb02200320032d008b043a00ea02200320032f0089043b01e8022003200341a1046a2900003703800320032003419d046a2800003602fc02200320034195046a2900003702f402200320034194046a2d00003a00f3020240202241ff01714101470d0020034188046a200741067610cc012003280288042125024002402003280290042007413f7122024b0d00410021020c010b202520024105746a2202290018211320022d0017211420022d0016211520022f0014211620022d0013211720022d0012211820022f0010211920022d000f211a20022d000e211b20022f000c211c20022d000b211d2002280007211e2002280003210720022d0002212020022f00002121410121020b0240200328028c04450d00202510290b2002450d470b200320133703a003200320143a009f03200320153a009e03200320163b019c03200320173a009b03200320183a009a03200320193b0198032003201a3a0097032003201b3a0096032003201c3b0194032003201d3a0093032003201e36008f032003200736008b03200320203a008a03200320213b018803410e10272202450d0e200241066a410029009fa34437000020024100290099a3443700002002410e412e10282202450d0d200220032903880337000e200241266a20034188036a41186a2903003700002002411e6a20034188036a41106a290300370000200241166a20034188036a41086a290300370000200341f0046a41186a22254200370300200341f0046a41106a22244200370300200341f0046a41086a22264200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2025290300370300200341e8036a41106a2024290300370300200341e8036a41086a2026290300370300200320032903f0043703e803200341e8036a412041b8d6c50041004100100b2125200210292025417f470d4520034188036a200341e8026a412010d004450d44410e10272202450d0c200241066a41002900c7a244370000200241002900c1a2443700002002410e412e10282202450d0b200220032903c80237000e200241266a200341c8026a41186a2903003700002002411e6a200341c8026a41106a290300370000200241166a200341c8026a41086a290300370000200341f0046a41186a22254200370300200341f0046a41106a22244200370300200341f0046a41086a22264200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2025290300370300200341e8036a41106a2024290300370300200341e8036a41086a2026290300370300200320032903f0043703e803412010272225450d0a2025200329038803370000202541186a20034188036a41186a290300370000202541106a20034188036a41106a290300370000202541086a20034188036a41086a290300370000200341e8036a41202025412010032025102920021029410e10272202450d09200241066a410029009fa34437000020024100290099a3443700002002410e412e10282202450d08200220032903e80237000e200241266a200341e8026a41186a2903003700002002411e6a200341e8026a41106a290300370000200241166a200341e8026a41086a290300370000200341f0046a41186a22254200370300200341f0046a41106a22244200370300200341f0046a41086a22264200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2025290300370300200341e8036a41106a2024290300370300200341e8036a41086a2026290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a10052126024002402003280288042224417f470d00410021250c010b200320243602542003202636025020034188046a200341d0006a10d30320032802a8042225450d08200341f0046a41186a20034188046a41186a290300370300200341f0046a41106a20034188046a41106a290300370300200341f0046a41086a20034188046a41086a290300370300200341f8016a41086a200341b4046a290200370300200341f8016a41106a200341bc046a290200370300200341f8016a41186a200341c4046a290200370300200341f8016a41206a200341cc046a290200370300200341a0026a200341d4046a28020036020020032003290388043703f004200320032902ac043703f80102402024450d00202610290b200341e8036a4120100c0b200341c8036a41186a2224200341f0046a41186a290300370300200341c8036a41106a2226200341f0046a41106a290300370300200341c8036a41086a2227200341f0046a41086a290300370300200341b0016a41086a2228200341f8016a41086a290300370300200341b0016a41106a2207200341f8016a41106a290300370300200341b0016a41186a2208200341f8016a41186a290300370300200341b0016a41206a2209200341f8016a41206a290300370300200341b0016a41286a220a200341f8016a41286a280200360200200320032903f0043703c803200320032903f8013703b001024020250d00200210290c450b200341a8036a41186a220b2024290300370300200341a8036a41106a22242026290300370300200341a8036a41086a22262027290300370300200341e8006a41086a22272028290300370300200341e8006a41106a22282007290300370300200341e8006a41186a22072008290300370300200341e8006a41206a22082009290300370300200341e8006a41286a2209200a280200360200200320032903c8033703a803200320032903b0013703682002102920034188046a41186a200b29030037030020034188046a41106a202429030037030020034188046a41086a2026290300370300200341ac046a2003290368370200200341b4046a2027290300370200200341bc046a2028290300370200200341c4046a2007290300370200200341cc046a2008290300370200200341d4046a2009280200360200200320032903a80337038804200320253602a804410e10272202450d06200241066a410029009fa34437000020024100290099a3443700002002410e412e10282202450d05200220032903880337000e200241266a20034188036a41186a2903003700002002411e6a20034188036a41106a290300370000200241166a20034188036a41086a290300370000200341f0046a41186a22254200370300200341f0046a41106a22244200370300200341f0046a41086a22264200370300200342003703f0042002412e200341f0046a1000200341e8036a41186a2025290300370300200341e8036a41106a2024290300370300200341e8036a41086a2026290300370300200320032903f0043703e803200341203602fc012003200341e8036a3602f80120034188046a200341f8016a10c7032002102920032802ac04450d4420032802a80410290c440b4101212620022d000120022d0000720d39200141046a280200210220034188046a41086a22254200370300200342003703880441bdc6c500411620034188046a1004200341f8016a41086a202529030037030020032003290388043703f8012003200236028804200341f8016a411020034188046a410410030c380b024020022d000120022d000072450d0041ad88c3002125412821240c460b41012126200341013a00b00120034188046a41086a22024200370300200342003703880441d7c7c500411320034188046a1004200341f8016a41086a200229030037030020032003290388043703f801200341f8016a4110200341b0016a410110030c370b4101212620022d000120022d0000720d37200141046a280200210220034188046a41086a22254200370300200342003703880441f0c6c500411920034188046a1004200341f8016a41086a202529030037030020032003290388043703f8012003200236028804200341f8016a411020034188046a410410030c360b200141086a2802002108200141046a2802002109024020022d000120022d000072450d0041ad88c30021254128212441002127410121262008450d45200910290c450b2001410c6a280200210220034188046a41086a22254200370300200342003703880441d180c500411520034188046a1004200341f8016a41086a202529030037030020032003290388043703f80120034100360290042003420137038804200320023602b001200341b0016a20034188046a10300240024020020d002003280290042124200328028c04212620032802880421270c010b200241057421282003280288042127200328028c042126200328029004212520092102034002400240202620256b4120490d00202541206a21240c010b202541206a22242025490d3e20264101742207202420242007491b22074100480d3e0240024020260d002007102721270c010b202720262007102821270b02402027450d00200721260c010b20074101102a000b202720256a22252002290000370000202541186a200241186a290000370000202541106a200241106a290000370000202541086a200241086a29000037000020242125200241206a2102202841606a22280d000b2003202636028c04200320243602900420032027360288040b200341f8016a411020272024100302402026450d00202710290b410121262008450d34200910290c340b200341f8016a41186a200341b4046a220241186a290000370300200341f8016a41106a200241106a290000370300200341f8016a41086a200241086a290000370300200342f3e885db96cddbb3203703c803200320022900003703f801200341386a41888dc300410d10940120032003290340420020032802381b3703e803200341e8006a200341f8016a109301200328026c21252003280268210220032802702124200341fc006a200341c8036a36020020032002202441286c6a360274200320023602702003202536026c200320023602682003200341e8036a360278200341f0046a200341e8006a104a200341e8006a41086a200341f0046a41086a280200360200200320032903f004370368200341f8016a200341e8006a10a701200341f8016a108b010c390b412e4101102a000b410e4101102a000b418f89c3004133104e000b412e4101102a000b410e4101102a000b41204101102a000b412e4101102a000b410e4101102a000b412e4101102a000b410e4101102a000b41014101102a000b412d4101102a000b410d4101102a000b20274101102a000b20274101102a000b20274101102a000b20244101102a000b20264101102a000b20244101102a000b41204101102a000b20084101102a000b20084101102a000b20074101102a000b20274101102a000b20284101102a000b20274101102a000b419bffc400419f01104e000b418f89c3004133104e000b41324101102a000b41204101102a000b418f89c3004133104e000b418f89c3004133104e000b41324101102a000b41124101102a000b20094108102a000b41184108102a000b20084108102a000b41344101102a000b41144101102a000b41344101102a000b41144101102a000b41014101102a000b412d4101102a000b410d4101102a000b41204101102a000b412e4101102a000b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b410e4101102a000b41002127410021250c0f0b41002125410121270c0e0b41ad88c300212541282124410121270c0d0b0240024002400240200941246c22240d0020282102410021260c010b200341c8026a41026a2225202841036a2d00003a0000200341e8036a41086a2227202841146a290000370300200341e8036a410d6a2207202841196a290000370000200320282f00013b01c8022003202829000c3703e803202841246a2102024020282d0000220c4102470d00410021260c010b2028280008210d2028280004212620034188036a41026a20252d00003a0000200341e8006a41086a2027290300370300200341e8006a410d6a2007290000370000200320032f01c8023b018803200320032903e8033703680240200c4101460d00200341e8026a41026a20034188036a41026a2d00003a0000200341f0046a41086a200341e8006a41086a290300370300200341f0046a410d6a200341e8006a410d6a290000370000200320032f0188033b01e802200320032903683703f0040c020b200341c8036a202641067610cc0120032802c80321270240024020032802d0032026413f7122254b0d00410021250c010b200341e8026a41026a202720254105746a222541026a2d00003a0000200341f8046a202541136a290000370300200341fd046a202541186a290000370000200320252f00003b01e8022003202529000b3703f0042025280007210d20252800032126410121250b024020032802cc03450d00202710290b20250d014184efc20021260b410121254100210c410021240c010b20034188046a410d6a2225200341f0046a410d6a29000037000020034188046a41086a2227200341f0046a41086a290300370300200341d0006a41026a2207200341e8026a41026a2d00003a0000200341b0016a41086a220c2027290300370300200341b0016a410d6a22272025290000370000200320032f01e8023b0150200320032903f0043703b00102400240412010272225450d00202520032f01503b00002025200d36000720252026360003202520032903b00137000b202541026a20072d00003a0000202541136a200c290300370000202541186a2027290000370000024002400240202820246a221e2002470d00201e21020c010b200341c8026a41026a2226202841276a2d00003a0000200341e8036a41086a2227202841386a290000370300200341e8036a410d6a22072028413d6a290000370000200320282f00253b01c802200320282900303703e803202841c8006a210220282d0024220c4102470d010b200341023a0088044101210c41002126410121240c030b202828002c21152028280028212420034188036a41026a20262d00003a0000200341e8006a41086a2027290300370300200341e8006a410d6a2007290000370000200320032f01c8023b018803200320032903e8033703680240200c4101460d00200341e8026a41026a20034188036a41026a2d00003a0000200341f0046a41086a200341e8006a41086a290300370300200341f0046a410d6a200341e8006a410d6a290000370000200320032f0188033b01e802200320032903683703f0040c020b200341c8036a202441067610cc0120032802c80321260240024020032802d0032024413f7122244b0d0041002127200d21150c010b200341e8026a41026a202620244105746a222441026a2d00003a0000200341f8046a202441136a290000370300200341fd046a202441186a290000370000200320242f00003b01e8022003202429000b3703f0042024280007211520242800032124410121270b024020032802cc03450d00202610290b20270d0120034190046a41153602004184efc200212620034184efc20036028c044101210c200341013a008804410121240c020b41204101102a000b20034194046a221020032903f00437020020034188046a41086a2015360200200341a1046a2202200341f0046a410d6a22192900003700002003419c046a200341f0046a41086a2207290300370200200341b0016a41086a221120034191046a290000370300200341b0016a41186a22122002290000370300200341b0016a41106a221f20034199046a2900003703002003202436028c04200320032f01e8023b0089042003200341e8026a41026a221a2d00003a008b0420032003290089043703b001200941246c41b87f6a211d20034188046a41017221264102210f4120210e4102210c41002127410121240340200341f0046a41186a220d2012290300370300200341f0046a41106a2214201f29030037030020072011290300370300200320032903b0013703f0040240200c417f6a2024470d00200f200c200c200f491b222441ffffff3f712024470d06202441057422024100480d062025200e2002102822250d0020024101102a000b2025200e6a220220032903f004370000200241186a200d290300370000200241106a2014290300370000200241086a20072903003700000240024002400240202741f803460d00201d2027470d01201e21020c020b202820276a41c8006a21020c010b200341c8026a41026a2214202820276a220241cb006a2d00003a0000200341e8036a41086a2216200241dc006a290000370300200341e8036a410d6a2217200241e1006a2900003700002003200241c9006a2f00003b01c8022003200241d4006a2900003703e803200241c8006a2d000022184102470d01200241ec006a21020b200341023a008804410021260c020b200241d0006a280000211b200241cc006a280000210d20034188036a41026a221c20142d00003a0000200341e8006a41086a22142016290300370300200341e8006a410d6a22162017290000370000200320032f01c8023b018803200320032903e8033703680240024020184101460d00201a201c2d00003a00002007201429030037030020192016290000370000200320032f0188033b01e802200320032903683703f004201b21150c010b200341c8036a200d41067610cc01200d413f7121144100211620032802c8032117024020032802d00320144d0d00201a201720144105746a220d41026a2d00003a00002007200d41136a2900003703002019200d41186a2900003700002003200d2f00003b01e8022003200d29000b3703f004200d2800072115200d280003210d410121160b024020032802cc03450d00201710290b20160d0020034115360290044184efc200212620034184efc20036028c04200341013a008804200241ec006a21020c020b202620032f01e8023b0000201020032903f004370000202641026a201a2d00003a0000201041086a20072903003700002010410d6a201929000037000020032015360290042003200d36028c04200341003a0088042011202641086a290000370300201f202641106a2900003703002012202641186a290000370300200320262900003703b001200f41026a210f200e41206a210e200c41016a210c202741246a21270c000b0b0240024020260d004100210d0c010b4101210d02402024450d00202510290b20262125411521240b200341f8016a412c6a21072028200941246c6a21270240034020272002460d0120022d00002126200241246a210220264102470d000b0b02402008450d00202810290b0240200d450d00410021020c010b200710c9032003200c36025820032024360254200320253602500240024002400240024002400240024002400240024002400240411210272202450d00200241106a41002f00f6a2443b0000200241086a41002900eea244370000200241002900e6a24437000020024112413210282209450d01200920072900003700122009412a6a200741186a290000370000200941226a200741106a2900003700002009411a6a200741086a290000370000200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f00420094132200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a10052102024002402003280288042226417f460d002002450d00200320263602ec04200320023602e804200341e8026a200341e8046a102d0240024020032802e802220e450d0020032802ec02212720034188046a200341e8046a10940320032d00880422254102470d012027450d00200e10290b418f89c3004133104e000b200341b0016a41186a2228200341a1046a290000370300200341b0016a41106a220720034199046a290000370300200341b0016a41086a220820034191046a290000370300200341e8006a41086a220a200341b2046a290100370300200341e8006a41106a220b200341ba046a290100370300200341e8006a41186a220c200341c2046a29010037030020032003290089043703b0012003200341aa046a290100370368200341a9046a2d00002124200341f0046a41086a220d2008290300370300200341f0046a41106a22082007290300370300200341f0046a41186a22072028290300370300200341c8036a41086a2228200a290300370300200341c8036a41106a220a200b290300370300200341c8036a41186a220b200c290300370300200320032903b0013703f004200320032903683703c80302402026450d00200210290b200341c8026a41086a200d290300370300200341c8026a41106a2008290300370300200341c8026a41186a200729030037030020034188036a41086a202829030037030020034188036a41106a200a29030037030020034188036a41186a200b290300370300200320032903f0043703c802200320032903c803370388032027450d01200e10290c010b200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f00441c6a3c400411a200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a100521020240024002402003280288042225417f460d002002450d00200341f0046a2025412020254120491b22246a41004100412020246b2024411f4b1b10cd041a200341f0046a2002202410ce041a2025411f4d0d06200341b0016a41186a2225200341f0046a41186a290300370300200341b0016a41106a2224200341f0046a41106a290300370300200341b0016a41086a2226200341f0046a41086a290300370300200320032903f0043703b00120021029200341c8036a41186a20252903002206370300200341c8036a41106a20242903002213370300200341c8036a41086a20262903002204370300200320032903b00122053703c803200341e8006a41186a2006370300200341e8006a41106a2013370300200341e8006a41086a2004370300200320053703684112102722020d0141124101102a000b200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f00441c6a3c400411a200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e803412010272202450d0620022007290000370000200241186a200741186a290000370000200241106a200741106a290000370000200241086a200741086a290000370000200341e8036a412020024120100320021029410021240c010b200241106a41002f00f6a2443b0000200241086a41002900eea244370000200241002900e6a2443700002002411241321028220a450d06200a2003290368370012200a412a6a200341e8006a41186a290300370000200a41226a200341e8006a41106a290300370000200a411a6a200341e8006a41086a290300370000200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f004200a4132200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e8032003410036028804200341e8036a412020034188046a100521022003280288042224417f460d072002450d07200320243602ec02200320023602e802200341f0046a200341e8026a102d0240024020032802f004220b450d00200341f8046a280200212520032802f404210c200341b0016a200341e8026a10940320032d00b00122264102470d01200c450d00200b10290b418f89c3004133104e000b20034188046a200341b0016a410172222741c10010ce041a200341b0016a20034188046a41c30010ce041a02402024450d00200210290b20034188046a200341b0016a41c30010ce041a200320263a00b001202720034188046a41c10010ce041a20032d00d101210d200341f0046a41186a22024200370300200341f0046a41106a22244200370300200341f0046a41086a22264200370300200342003703f004200a4132200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2024290300370300200341e8036a41086a2026290300370300200320032903f0043703e80320034201370388042003410036029004200320253602f004200341f0046a20034188046a1030024002402025450d0020254105742128410020032802900422256b2126200328028c042127200b2102034002400240202720266a4120490d0020032802880421240c010b202541206a22242025490d1620274101742208202420242008491b22084100480d160240024020270d002008102721240c010b20032802880420272008102821240b2024450d0c2003200836028c042003202436028804200821270b202420256a222441086a200241086a290000370000202441106a200241106a290000370000202441186a200241186a2900003700002003202541206a22253602900420242002290000370000202641606a2126200241206a2102202841606a22280d000c020b0b20032802900421250b200341013a00f00402400240200328028c042025460d0020032802880421020c010b202541016a22022025490d1320254101742224200220022024491b22244100480d130240024020250d002024102721020c010b20032802880420252024102821020b2002450d0a2003202436028c0420032002360288040b2003202541016a36029004200220256a41013a000002400240200328028c04222620032802900422246b411f4d0d00202621250c010b202441206a22252024490d1320264101742227202520252027491b22254100480d130240024020260d002025102721020c010b200220262025102821020b2002450d0b2003202536028c0420032002360288040b200220246a222641086a200741086a290000370000202641106a200741106a290000370000202641186a200741186a2900003700002003202441206a2228360290042026200729000037000002400240200341d2016a4100200d4101461b22260d00200341003a00f0040240024020252028460d00202521080c010b202541016a22262025490d1520254101742227202620262027491b22084100480d150240024020250d002008102721020c010b200220252008102821020b2002450d0e2003200836028c0420032002360288040b2003202441216a222436029004200220286a41003a00000c010b200341013a00f0040240024020252028460d00202521270c010b202541016a22272025490d1420254101742208202720272008491b22274100480d140240024020250d002027102721020c010b200220252027102821020b2002450d0e2003202736028c0420032002360288040b2003202441216a222536029004200220286a41013a000002400240202720256b411f4d0d00202721080c010b202541206a22282025490d1420274101742208202820282008491b22084100480d140240024020270d002008102721020c010b200220272008102821020b2002450d0f2003200836028c0420032002360288040b200220256a222541086a202641086a290000370000202541106a202641106a290000370000202541186a202641186a2900003700002003202441c1006a222436029004202520262900003700000b200341e8036a412020022024100302402008450d00200210290b0240200c450d00200b10290b200a1029200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f00441c6a3c400411a200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e803412010272202450d0e20022007290000370000200241186a200741186a290000370000200241106a200741106a290000370000200241086a200741086a290000370000200341e8036a41202002412010032002102920034188036a41086a200341e8006a41086a29030037030020034188036a41106a200341e8006a41106a29030037030020034188036a41186a200341e8006a41186a2903003703002003200329036837038803410121240b410021250b20034195046a200341c8026a41086a2903003700002003419d046a200341c8026a41106a290300370000200341a5046a200341c8026a41186a290300370000200341ad046a20243a0000200341ae046a200329038803370100200341b6046a20034188036a41086a290300370100200341be046a20034188036a41106a290300370100200341c6046a20034188036a41186a290300370100200320253a008c04200320032903c80237008d042003200341d0006a36028804200341f0046a41186a22024200370300200341f0046a41106a22254200370300200341f0046a41086a22244200370300200342003703f00420094132200341f0046a1000200341e8036a41186a2002290300370300200341e8036a41106a2025290300370300200341e8036a41086a2024290300370300200320032903f0043703e803200341003602b801200342013703b00120032802502102200320032802582225360268200341e8006a200341b0016a1030024002402025450d0020254105742107410020032802b80122256b212620032802b001212820032802b401212703400240202720266a411f4b0d00202541206a22242025490d1420274101742208202420242008491b22244100480d140240024020270d002024102721280c010b202820272024102821280b2028450d03202421270b202820256a22242002290000370000202441186a200241186a290000370000202441106a200241106a290000370000202441086a200241086a290000370000202641606a2126202541206a2125200241206a2102200741606a22070d000b200320273602b401200320253602b801200320283602b0010b20034188046a410472200341b0016a10c60320032802b4012102200341e8036a412020032802b001222520032802b801100302402002450d00202510290b2009102902402003280254450d00200328025010290b0240200328029c02450d0020032802980210290b4100212641012127410021250c1a0b20244101102a000b41124101102a000b41324101102a000b418f89c3004133104e000b41204101102a000b41324101102a000b419bffc400419f01104e000b20084101102a000b20244101102a000b20254101102a000b20084101102a000b20274101102a000b20084101102a000b41204101102a000b0240200b450d00200a10290b20020d0041012127410021260c0b0b41012127410021262008450d0a202810290c0a0b024020032802ac04450d0020032802a80410290b410021250c080b102b000b20032013202c202c201356200420065620042006511b22021b221320297c220537038802200341f8016a41186a2006200420021b2206202a7c2005201354ad7c37030020032013202b7c22043703f80120032006202d7c2004201354ad7c37038002200341e8006a200341f8016a10d803200328029c0221250b2025450d0220032802980210290c020b41c2fec4002125411021240c040b41d588c3002125412a21240c030b4100212541012126410121270c030b41e4fdc4002125411921240c010b4184efc2002125411521240b41012126410121270b0240024020012d00002202410d4b0d00410120027441be3f710d01024020024106460d002002410d470d012027450d02200141086a280200450d02200141046a28020010290c020b2026450d01200141086a280200450d01200141046a28020010290c010b200141086a280200450d00200141046a28020010290b200020243602042000202536020020034190056a24000bb0c90107017f027e017f017e157f017e027f230041a0086b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e12000102030405060708090b0c0d0e0f101112000b200341b4036a4101360200200342013702a403200341ccfdc4003602a00320034102360264200341c4fdc4003602602003200341e0006a3602b003200341a0036a41a09ac4001057000b200141106a2903002104200141086a2903002105200141046a28020021062002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f01002113024002400240024020022d0000450d002003200737028402200320083a008302200320093a0082022003200a3b018002410121020c010b2002410c6a2d000021142002410a6a2f01002115200241096a2d00002116200241086a2d00002117200241066a2f01002118200241056a2d0000211920022d0001211a200320073703800241012102201a41ff01714101460d010b412a21164100211441d588c300211a410021150c010b2018410874201972201741187472211a410021020b201541ffff0371410874201441187472201641ff017172211420020d5920032007370378200320083a0077200320093a00762003200a3b01742003200b3a00732003200c3a00722003200d3b01702003200e3a006f2003200f3a006e200320103b016c200320113a006b200320143600672003201a360063200320123a0062200320133b01600240200542808084fea6dee1115441002004501b450d0041b09ac400211a410d21140c5a0b200341106a200341e0006a2005200410ac0102402003280210450d0041bd9ac400211a411a21140c5a0b200341086a41b086c500411910b501200328020c210220032802082114200341b8076a41086a221a4200370300200342003703b80741b086c5004119200341b8076a1004200341f0066a41086a2215201a290300370300200320032903b8073703f00620032002410020141b221641016a3602a003200341f0066a4110200341a0036a41041003412010272202450d1120022003290360370000200341b4036a428180808010370200200241186a200341e0006a41186a290300370000200241106a200341e0006a41106a290300370000200241086a200341e0006a41086a290300370000200320053703a003200320023602b003200320043703a8032016200341a0036a10c203201a4200370300200342003703b80741b7d2c3004115200341b8076a10042015201a290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a1005211a0240024020032802a0032208417f460d00201a450d0020032008360284022003201a36028002200341a0036a20034180026a103f20032802a0032214450d14200341a8036a280200210220032802a40321152008450d01201a10290c010b4108211441002102410021150b200341a0036a200610c103200341c0006a41186a2208200341e0006a41186a290300370300200341c0006a41106a2209200341e0006a41106a290300370300200341c0006a41086a220a200341e0006a41086a29030037030020032003290360370340024020152002470d00200241016a221a2002490d4920024101742215201a201a2015491b2215ad42b0017e2207422088a70d492007a7221a4100480d490240024020020d00201a102721140c010b2014200241b0016c201a102821140b2014450d140b2014200241b0016c220b6a200341a0036a41880110ce04221a201636028801201a200329034037028c01201a4194016a200a290300370200201a419c016a2009290300370200201a41a4016a2008290300370200200320153602a403200320143602a0032003200241016a221a3602a803200341b8076a41086a22084200370300200342003703b80741b7d2c3004115200341b8076a1004200341f0066a41086a2008290300370300200320032903b8073703f00620034110360284022003200341f0066a36028002200341a0036a20034180026a10330240201a2002490d00200b41b0016a211a2014210203402002103d200241b0016a2102201a41d07e6a221a0d000b0b02402015450d00201410290b200341b8036a2004370300200341b0036a2005370300200341ac036a201636020041002116200341a8036a41003a0000200341053a00a00341b8d6c5004100200341a0036a1088012006103d200610294101211541012106410121084100211a0c5a0b200141046a280200210a2002411a6a2901002107200241196a2d00002116200241186a2d00002108200241166a2f01002109200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f01002113024002400240024020022d0000450d002003200737028402200320163a008302200320083a008202200320093b018002410121020c010b2002410c6a2d000021142002410a6a2f01002106200241096a2d00002115200241086a2d00002117200241066a2f01002118200241056a2d0000211920022d0001211a200320073703800241012102201a41ff01714101460d010b412a21154100211441d588c300211a410021060c010b2018410874201972201741187472211a410021020b200641ffff0371410874201441187472201541ff017172211420020d5520032007370378200320163a0077200320083a0076200320093b01742003200b3a00732003200c3a00722003200d3b01702003200e3a006f2003200f3a006e200320103b016c200320113a006b200320143600672003201a360063200320123a0062200320133b0160200341a0036a200a10b603024020032802b00322020d0041d79ac400211a41242114410121150c570b200341bc036a2802002116200341a0036a41186a280200211a20032802b4032106200341186a200341e0006a20032902a403220742208620033502a003842204200341ac036a350200422086200742208884220710ac0120032802180d54200341c0006a41186a200341e0006a41186a290300370300200341c0006a41106a2215200341e0006a41106a290300370300200341c0006a41086a2209200341e0006a41086a2903003703002003200329036037034002402006201a460d00200621080c520b200641016a22142006490d4720064101742208201420142008491b220841ffffff3f712008470d47200841057422144100480d470240024020060d002014102721020c010b200220064105742014102821020b20020d5120144101102a000b2002411a6a2901002107200241196a2d0000211a200241186a2d00002114200241166a2f01002106024020022d0000450d0020032007370284022003201a3a008302200320143a008202200320063b0180020c500b200241156a2d00002116200241146a2d00002108200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002117200241026a2f01002118200141026a2d00002119200141046a280200211b20022d0001210220012d0001211c200320073703800241012115200241ff01714101460d060c4f0b2002411a6a2901002107200241196a2d0000211a200241186a2d00002114200241166a2f01002106024020022d0000450d0020032007370284022003201a3a008302200320143a008202200320063b0180020c4f0b200141026a2d00002118200141046a280200211920012d0001211b200241156a2d00002115200241146a2d00002116200241126a2f01002108200241116a2d00002109200241106a2d0000210a2002410e6a2f0100210b2002410d6a2d0000210c2002410c6a2d0000210d2002410a6a2f0100210e200241096a2d0000210f200241086a2d00002110200241066a2f01002111200241056a2d00002112200241046a2d00002113200241026a2f0100211720022d000121022003200737038002200241ff01714101470d4e200320073703782003201a3a0077200320143a0076200320063b0174200320153a0073200320163a0072200320083b0170200320093a006f2003200a3a006e2003200b3b016c2003200c3a006b200320133a0062200320173b01602003200e410874200d41187472200f7236006720032011410874201272201041187472360063200341a0036a200341e0006a10c30320032d00a0034101470d4d200341ac036a2d00002102200341ad036a2900002107200341b5036a280000211a20032f00a103211420032d00a303210620032902a40321042003200341b9036a2900003703b8032003201a3602b403200320073702ac03200320023a00ab03200320043700a303200320063a00a203200320143b01a003200341a0036a2019201b41ff0171410047201810c403211a41222114410121150c540b2002410c6a2802002109200241086a280200210a200241046a2802002106200141106a2903002105200141086a2903002107200141046a2802002115200241036a2d0000211620012d0001211420022d0000211a20022f0001210820034180026a41086a2002411c6a2802003602002003200241146a290200370380020240024002400240201a4101470d00200641ff01710d01200a2009490d010c020b201a4103460d010b201a20082016411074727241ff01710d010b42002104200341b8076a41086a22024200370300200342003703b80741888dc300410d200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a1005211a024020032802a0032202417f460d00200342003703a003200341a0036a201a2002410820024108491b10ce041a200241074d0d1220032903a0032104201a10290b200341a0036a201541880110ce041a200341e0006a2004200742c0d102200742c0d102561b7c200341a0036a2014200510b503410121060240024020032802604101470d002003280264221a0d010b20151029410021150c4c0b200341e8006a28020021140c4a0b2015103d4128211441ad88c300211a0c490b41a584c200211a410e211420022d0000417f6a220941024b0d51200141046a280200210a410121154101210641012108410121160240024020090e03005701000b200241046a2d00000d5241012115410121064101210841012116200241086a28020041036c2002410c6a280200410174490d560b200341a0036a200a10a703024020032802a8034112470d0041bf9dc400211a410d2114410121150c530b20032802a003210220034180026a200341a0036a410472419c0110ce041a20032002360260200341e0006a41047220034180026a419c0110ce041a200341003602a803200342013703a003200341e0006a41086a2214200341a0036a103220032802a403211a20032802a803210620032802a003210220034180026a41186a2215420037030020034180026a41106a2216420037030020034180026a41086a2208420037030020034200370380022002200620034180026a1000200341c8056a41186a22062015290300370300200341c8056a41106a22152016290300370300200341c8056a41086a2216200829030037030020032003290380023703c8050240201a450d00200210290b200341a0036a41186a2006290300370300200341a0036a41106a2015290300370300200341a0036a41086a2016290300370300200320032903c8053703a003411710272202450d102002410f6a41002900af9b44370000200241086a41002900a89b44370000200241002900a09b4437000020024117413710282202450d11200220032903a0033700172002412f6a200341a0036a41186a2216290300370000200241276a200341a0036a41106a22082903003700002002411f6a200341a0036a41086a29030037000020034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002413720034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341c0046a412041b8d6c50041004100100b211a20021029201a417f460d472014103d41cc9dc400211a41252114410121150c520b200141046a280200210641a584c200211a410e211420022d0000417f6a221541024b0d450240024020150e03004701000b200241086a2802004101742002410c6a280200490d46200241046a28020041ff01710d460b200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341f0066a411041b8d6c50041004100100b417f460d4141d19bc400211a411521140c450b200141046a280200210641a584c200211a410e211420022d0000417f6a221541024b0d3f0240024020150e03004101000b200241046a2d00000d40200241086a28020041036c2002410c6a280200410174490d400b200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341f0066a411041b8d6c50041004100100b417f460d3e41d19bc400211a411521140c3f0b200141306a2903002104200141286a290300210720034190086a200141196a29000037030020034188086a200141116a290000370300200341f8076a41086a200141096a290000370300200320012900013703f8074101211541a584c200211a410e211420022d0000417e6a220641014b0d4f0240024020060e020001000b200241046a2d00000d50200241086a28020041036c2002410c6a280200410174490d500b200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a1005210220032802a003221a417f460d3c2002450d3c2003201a3602dc07200320023602d807200341a0036a200341d8076a103c20032802a0034112460d38200341e0006a200341a0036a41880110ce041a200341003a009f082003419f086a20032802d807221620032802dc072214410047220610ce041a20142006490d0f2003201420066b3602dc072003201620066a3602d807024002402014450d0020032d009f0822064103490d010b200341e0006a103d0c390b2003280260211420034180026a200341e0006a41047241840110ce041a20144112460d38200341c8056a20034180026a41840110ce041a0240201a450d00200210290b200341c0046a200341c8056a41840110ce041a20032014360260200341e0006a410472200341c0046a41840110ce041a20064102460d3941f29bc400211a412a21140c3a0b200320073703b8032003201a3a00b703200320143a00b603200320063b01b403200320163a00b303200320083a00b203200320093b01b0032003200a3a00af032003200b3a00ae032003200c3b01ac032003200d3a00ab03200320173a00a203200320183b01a0032003200f410874200e411874722010723600a703200320124108742013722011411874723600a303200341a0036a201b201c41ff0171410047201910c403211a412221140c4e0b200341f0076a200141196a290000370300200341d8076a41106a200141116a290000370300200341d8076a41086a200141096a290000370300200320012900013703d8074101211541a584c200211a410e211420022d00004101470d4d200241236a2d00002116200241216a2f000021082002411f6a2d000021092002411d6a2f0000210a2002410f6a2d0000210b2002410d6a2f0000210c2002410b6a2d0000210d200241096a2f0000210e200241076a2d0000210f200241056a2f00002110200241246a3502002105200241206a310000211d200241116a2900002107200241106a2d000021112002410c6a2d00002112200241086a2d00002113200241046a2d000021062003200241196a28000036028802200320073703800220064101470d4d200320032902840222043d018808200320113a008308200320044238883c008f08200320044230883c008e08200320044220883d018c08200320044218883c008b08200320044210883c008a08200320073d018408200320074218883c0087082003200c200b411074724108742012723600ff072003200e200d411074724108742013723600fb0720032010200f4110747222023b01f807200320024110763a00fa0720032007a74110763a0086082003201d421886200a200941107472ad42ffffff0783842008201641107472ad42ffffff07834220868420054238868437039008200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a100521020240024020032802a003221a417f460d002002450d002003201a3602bc07200320023602b807200341a0036a200341b8076a103c20032802a0034112460d37200341e0006a200341a0036a41880110ce041a200341003a009f082003419f086a20032802b807221620032802bc072214410047220610ce041a20142006490d102003201420066b3602bc072003201620066a3602b807024002402014450d0020032d009f084103490d010b200341e0006a103d0c380b2003280260211420034180026a200341e0006a41047241840110ce041a20144112460d37200341c8056a20034180026a41840110ce041a0240201a450d00200210290b200341c0046a200341c8056a41840110ce041a200320143602a003200341a0036a410472200341c0046a41840110ce041a2003410036026820034201370360200341a0036a200341e0006a10322003280264211a200328026821062003280260210220034180026a41186a221642003703004110211420034180026a41106a2208420037030020034180026a41086a2209420037030020034200370380022002200620034180026a1000200341e0006a41186a2016290300370300200341e0006a41106a2008290300370300200341e0006a41086a200929030037030020032003290380023703600240201a450d00200210290b200341d8076a200341e0006a412010d0042102200341a0036a103d41d39cc400211a20020d4f200341a0036a200341d8076a10c50320032802a803220b0d01410021024101210b420021070c360b4114211441bf9cc400211a0c4e0b410021020240024020032902ac032207422088a7221a41014b0d00201a0e023601360b0340201a410176221420026a22062002200b20064105746a200341f8076a412010d0044101481b2102201a20146b221a41014b0d000b0b200b20024105746a200341f8076a412010d004221a450d33201a411f7620026a21020c340b4101211520022d000120022d0000720d31200141046a28020010ab030c480b4101211520022d000120022d0000720d30200141086a2802002106200141046a2802002102200341e0006a200141106a290300220710ac03200328026021140240024002402003280268221a20024d0d00201420024190016c6a22162802004112460d01201420024190016c6a4188016a2802002006470d012016103d20164112360200200341a0036a41086a200341e0006a41086a280200360200200320032903603703a003411710272202450d102002410f6a41002900ffd143370000200241086a41002900f8d143370000200241002900f0d14337000020024117412e10282202450d112002200737001720034180026a41186a221a420037030020034180026a41106a2214420037030020034180026a41086a2206420037030020034200370380022002411f20034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2014290300370300200341c0046a41086a200629030037030020032003290380023703c00420034120360284022003200341c0046a36028002200341a0036a20034180026a10312002102920032802a0032114024020032802a8032202450d0020024190016c211a201421020340024020022802004112460d002002103d0b20024190016a2102201a41f07e6a221a0d000b0b20032802a403450d4a201410290c4a0b201a450d010b201a4190016c211a201421020340024020022802004112460d002002103d0b20024190016a2102201a41f07e6a221a0d000b0b02402003280264450d00201410290b41f19dc400211a411221140c4b0b200341e0006a41186a200141196a290000370300200341e0006a41106a200141116a290000370300200341e0006a41086a200141096a29000037030020032001290001370360200241166a2f0100211a200241186a2d00002114200241196a2d000021062002411a6a2901002107024020022d0000450d002003200737028402200320063a008302200320143a0082022003201a3b0180020c450b200241026a2f01002116200241046a2d00002108200241056a2d00002109200241066a2f0100210a200241086a2d0000210b200241096a2d0000210c2002410a6a2f0100210d2002410c6a2d0000210e2002410d6a2d0000210f2002410e6a2f01002110200241106a2d00002111200241116a2d00002112200241126a2f01002113200241146a2d00002117200241156a2d0000211820022d000121022003200737038002200241ff01714101470d44410f10272202450d0e200241076a41002900909d44370000200241002900899d443700002002410f412f10282202450d0f2002200329036037000f200241276a200341e0006a41186a221c2903003700002002411f6a200341e0006a41106a221e290300370000200241176a200341e0006a41086a221f29030037000020034180026a41186a2215420037030020034180026a41106a2219420037030020034180026a41086a221b420037030020034200370380022002412f20034180026a1000200341c0046a41186a2015290300370300200341c0046a41106a2019290300370300200341c0046a41086a201b29030037030020032003290380023703c004200341c0046a412041b8d6c50041004100100b21152002102902402015417f460d0041989dc400211a410f2114410121150c4b0b200341a0036a41186a201c290300370300200341a0036a41106a201e290300370300200341a0036a41086a201f290300370300200320032903603703a003410f10272202450d10200241076a41002900909d44370000200241002900899d443700002002410f412f10282215450d11201520032903a00337000f201541276a200341a0036a41186a2903003700002015411f6a200341a0036a41106a290300370000201541176a200341a0036a41086a29030037000020034180026a41186a2202420037030020034180026a41106a2219420037030020034180026a41086a221b420037030020034200370380022015412f20034180026a1000200341c0046a41186a2002290300370300200341c0046a41106a2019290300370300200341c0046a41086a201b29030037030020032003290380023703c004412010272202450d1220022007370018200220063a0017200220143a00162002201a3b0014200220183a0013200220173a0012200220133b0010200220123a000f200220113a000e200220103b000c2002200f3a000b2002200d410874200c72200e411874723600072002200a410874200972200b41187472360003200220083a0002200220163b0000200341c0046a412020024120100320021029201510294100211a410121150c4a0b2002411a6a2901002107200241196a2d00002114200241186a2d00002106200241166a2f01002115024020022d0000450d002003200737028402200320143a008302200320063a008202200320153b0180020c440b200241156a2d00002116200241146a2d00002108200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002117200241026a2f0100211820022d000121022003200737038002200241ff01714101470d43410f10272202450d124100211a200241076a41002900909d44370000200241002900899d443700002002410f412f10282202450d1320022007370027200220143a0026200220063a0025200220153b0023200220163a0022200220083a0021200220093b001f2002200a3a001e2002200b3a001d2002200c3b001b2002200d3a001a2002200f410874201072200e4118747236001620022012410874201372201141187472360012200220173a0011200220183b000f20034180026a41186a2214420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002412f20034180026a1000200341c0046a41186a2014290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341c0046a4120100c20021029410121150c460b200341f8076a41186a200141196a290000370300200341f8076a41106a200141116a290000370300200341f8076a41086a200141096a290000370300200320012900013703f8072002411a6a2901002107200241196a2d0000211a200241186a2d00002114200241166a2f01002106024020022d0000450d0020032007370284022003201a3a008302200320143a008202200320063b0180020c430b200241156a2d00002115200241146a2d00002116200241126a2f01002108200241116a2d00002109200241106a2d0000210a2002410e6a2f0100210b2002410d6a2d0000210c2002410c6a2d0000210d2002410a6a2f0100210e200241096a2d0000210f200241086a2d00002110200241066a2f01002111200241056a2d00002112200241046a2d00002113200241026a2f0100211720022d000121022003200737038002200241ff01714101470d42200320073703e0052003201a3a00df05200320143a00de05200320063b01dc05200320153a00db05200320163a00da05200320083b01d805200320093a00d7052003200a3a00d6052003200b3b01d4052003200c3a00d305200320133a00ca05200320173b01c8052003200e410874200f72200d411874723600cf05200320114108742012722010411874723600cb05200341a0036a200341f8076a10c30320032d00a0034101470d41200320032902a403370063200320032d00a3033a0062200320032f00a1033b01602003200341b9036a2900003703782003200341b5036a2800003602742003200341ad036a29000037026c2003200341ac036a2d00003a006b0240200341e0006a200341c8056a412010d004450d0041a79dc400211a410b2114410121150c490b200341a0036a41186a200341f8076a41186a290300370300200341a0036a41106a200341f8076a41106a290300370300200341a0036a41086a200341f8076a41086a290300370300200320032903f8073703a003410f10272202450d134100211a200241076a41002900909d44370000200241002900899d443700002002410f412f10282202450d14200220032903a00337000f200241276a200341a0036a41186a2903003700002002411f6a200341a0036a41106a290300370000200241176a200341a0036a41086a29030037000020034180026a41186a2214420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002412f20034180026a1000200341c0046a41186a2014290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341c0046a4120100c20021029410121150c480b200141216a2d0000210a200341206a41186a200141196a290000370300200341206a41106a200141116a290000370300200341206a41086a200141096a290000370300200320012900013703202002411a6a2901002107200241196a2d00002116200241186a2d00002108200241166a2f01002109200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f01002113024002400240024020022d0000450d002003200737028402200320163a008302200320083a008202200320093b018002410121020c010b2002410c6a2d000021142002410a6a2f01002106200241096a2d00002115200241086a2d00002117200241066a2f01002118200241056a2d0000211920022d0001211a200320073703800241012102201a41ff01714101460d010b41d588c300211a41002106412a2115410021140c010b2018410874201972201741187472211a410021020b200641ffff0371410874201541ff017172201441187472211420020d46200320143600d7062003201a3600d306200320123a00d206200320133b01d0062003200e3a00df062003200f3a00de06200320103b01dc06200320113a00db06200320163a00e706200320083a00e606200320093b01e4062003200b3a00e3062003200c3a00e2062003200d3b01e006200320073703e806200341f0066a41186a2007370300200341f0066a41106a20032903e006370300200341f0066a41086a200341d0066a41086a290300370300200320032903d0063703f006200341c8056a41186a200341206a41186a290300370300200341c8056a41106a200341206a41106a290300370300200341c8056a41086a200341206a41086a2903003703002003200a3a00e805200320032903203703c805411510272202450d142002410d6a41002900bbd143370000200241086a41002900b6d143370000200241002900aed14337000020024115413510282202450d15200220032903f0063700152002412d6a200341f0066a41186a290300370000200241256a200341f0066a41106a2903003700002002411d6a200341f0066a41086a29030037000020034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005211a0240024020032802a0032216417f460d00201a450d00200320163602fc072003201a3602f807200341a0036a200341f8076a10fc0220032d00c10322064102460d18200341e0006a41186a2208200341da036a290100370300200341e0006a41106a2209200341d2036a290100370300200341e0006a41086a220a200341ca036a29010037030020034180026a41086a220b200341eb036a29000037030020034180026a41106a220c200341f3036a29000037030020034180026a41186a220d200341fb036a290000370300200320032901c2033703602003200341e3036a29000037038002200341e2036a2d0000211502402016450d00201a10290b200341c0006a41086a200a290300370300200341c0006a41106a2009290300370300200341c0006a41186a2008290300370300200341f8076a41086a200b290300370300200341f8076a41106a200c290300370300200341f8076a41186a200d2903003703002003200329036037034020032003290380023703f8070c010b20034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a221542003703002003420037038002419ad2c300411d20034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005211a02400240024020032802a0032206417f460d00201a450d0020034180026a2006412020064120491b22156a41004100412020156b2015411f4b1b10cd041a20034180026a201a201510ce041a2006411f4d0d1b200341a0036a41186a220620034180026a41186a290300370300200341a0036a41106a221520034180026a41106a290300370300200341a0036a41086a221620034180026a41086a29030037030020032003290380023703a003201a102920034198076a41186a2006290300220737030020034198076a41106a2015290300220437030020034198076a41086a20162903002205370300200320032903a003221d37039807200341b8076a41186a2007370300200341b8076a41106a2004370300200341b8076a41086a20053703002003201d3703b80741151027221a0d0141154101102a000b20034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a221542003703002003420037038002419ad2c300411d20034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c00441201027221a450d1b201a20032903f006370000201a41186a200341f0066a41186a290300370000201a41106a200341f0066a41106a290300370000201a41086a200341f0066a41086a290300370000200341c0046a4120201a41201003201a1029410021150c010b201a410d6a41002900bbd143370000201a41086a41002900b6d143370000201a41002900aed143370000201a4115413510282215450d1b201520032903b8073700152015412d6a200341b8076a41186a290300370000201541256a200341b8076a41106a2903003700002015411d6a200341b8076a41086a29030037000020034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2216420037030020034200370380022015413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201629030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005210820032802a0032209417f460d1d2008450d1d20032009360284022003200836028002200341a0036a20034180026a10fc0220032d00c103220b4102460d1c200341f8076a41186a221a200341a0036a41186a290300370300200341f8076a41106a2206200341a0036a41106a290300370300200341f8076a41086a2216200341a0036a41086a290300370300200320032903a0033703f80720032d00c003210a200341e0006a200341c2036a220c41c10010ce041a02402009450d00200810290b200341d8076a41086a22082016290300370300200341d8076a41106a22092006290300370300200341d8076a41186a220d201a290300370300200320032903f8073703d80720034180026a200341e0006a41c10010ce041a201a200d2903003703002006200929030037030020162008290300370300200320032903d8073703f8072003200b3a00a003200341a0036a41017220034180026a41c10010ce041a200341e0006a41186a201a290300370300200341e0006a41106a2006290300370300200341e0006a41086a2016290300370300200320032903f80737036020032d00c103210920034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2216420037030020034200370380022015413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201629030037030020032003290380023703c00441201027221a450d1e201a2003290360370000201a41186a200341e0006a41186a290300370000201a41106a200341e0006a41106a290300370000201a41086a200341e0006a41086a29030037000002400240200a41054b0d000240024002400240024002400240200a0e06000102030405000b200341003a009f080c050b200341013a009f080c040b200341023a009f080c030b200341033a009f080c020b200341043a009f080c010b200341053a009f080b41c0002106201a412041c0001028221a450d21201a20032d009f083a002041012108200341013a009f08412121160c010b200341013a009f0841000d3b41c000210641202116201a412041c0001028221a450d2120032d009f0821080b201a20166a20083a000002402006201641016a22086b411f4b0d0041000d3b2006410174220a200841206a220b200b200a491b220a4100480d3b201a2006200a1028221a450d2c200a21060b201a20086a220820032903f006370000200841186a200341f0066a41186a290300370000200841106a200341f0066a41106a290300370000200841086a200341f0066a41086a290300370000201641216a210802400240200c410020094101461b22160d0041002116200341003a009f080240024020062008460d00200821060c010b41000d3d20064101742216200641016a220820082016491b22164100480d3d201a200620161028221a450d2420032d009f0821160b201a20066a20163a0000200641016a21060c010b200341013a009f080240024020062008460d004101210a20062109200821060c010b41000d3c20064101742208200641016a220920092008491b22094100480d3c201a200620091028221a450d2420032d009f08210a0b201a20066a200a3a000002402009200641016a22086b411f4b0d0041000d3c2009410174220a200841206a220b200b200a491b220a4100480d3c201a2009200a1028221a0d00200a4101102a000b201a20086a22082016290000370000200841186a201641186a290000370000200841106a201641106a290000370000200841086a201641086a290000370000200641216a21060b200341c0046a4120201a20061003201a10292015102920034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a221542003703002003420037038002419ad2c300411d20034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c00441201027221a450d23201a20032903f006370000201a41186a200341f0066a41186a290300370000201a41106a200341f0066a41106a290300370000201a41086a200341f0066a41086a290300370000200341c0046a4120201a41201003201a1029200341f8076a41086a200341b8076a41086a290300370300200341f8076a41106a200341b8076a41106a290300370300200341f8076a41186a200341b8076a41186a290300370300200320032903b8073703f807410121150b410021060b200341ad036a200341c0006a41086a290300370000200341b5036a200341c0006a41106a290300370000200341bd036a200341c0006a41186a290300370000200341c5036a20153a0000200341c6036a20032903f807370100200341ce036a200341f8076a41086a290300370100200341d6036a200341f8076a41106a290300370100200341de036a200341f8076a41186a290300370100200320063a00a403200320032903403700a5032003200341c8056a3602a00320034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341003602682003420137036041201027221a450d22201a20032903c805370000201a41186a200341c8056a41186a290300370000201a41106a200341c8056a41106a290300370000201a41086a200341c8056a41086a290300370000200342a080808080043702642003201a360260024020032d00e805220641054b0d00024002400240024002400240024020060e06000102030405000b200341003a009f080c050b200341013a009f080c040b200341023a009f080c030b200341033a009f080c020b200341043a009f080c010b200341053a009f080b201a412041c0001028221a450d24201a20032d009f083a00202003201a360260200342c080808090043702640b200341a0036a410472200341e0006a10c6032003280264211a200341c0046a412020032802602206200328026810030240201a450d00200610290b20021029200342e4cab5fbb6ccdcb0e3003703900720034190076a200341d0066a427f10a601200341a0036a41086a41083a0000200341a9036a20032903d006370000200341b1036a200341d0066a41086a290300370000200341b9036a200341d0066a41106a290300370000200341c1036a200341d0066a41186a290300370000200341c9036a2003290320370000200341d1036a200341206a41086a290300370000200341d9036a200341206a41106a290300370000200341e1036a200341206a41186a290300370000200341053a00a0034100211a41b8d6c5004100200341a0036a108801410121150c470b2002411a6a2901002107200241196a2d00002116200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d00002110200241046a2d00002111200241026a2f01002112024002400240024020022d0000450d002003200737028402200320163a008302200320083a008202200320093b018002410121020c010b2002410c6a2d000021142002410a6a2f01002106200241096a2d00002115200241086a2d00002113200241066a2f01002117200241056a2d0000211820022d0001211a200320073703800241012102201a41ff01714101460d010b41d588c300211a41002106412a2115410021140c010b2017410874201872201341187472211a410021020b200641ffff0371410874201541ff017172201441187472211420020d45200320073703b007200320163a00af07200320083a00ae07200320093b01ac072003200a3a00ab072003200b3a00aa072003200c3b01a8072003200d3a00a7072003200e3a00a6072003200f3b01a407200320103a00a3072003201436009f072003201a36009b07200320113a009a07200320123b019807411510272202450d23410d21142002410d6a41002900bbd143370000200241086a41002900b6d143370000200241002900aed14337000020024115413510282202450d2420022003290398073700152002412d6a20034198076a41186a290300370000200241256a20034198076a41106a2903003700002002411d6a20034198076a41086a29030037000020034180026a41186a221a420037030020034180026a41106a2206420037030020034180026a41086a2215420037030020034200370380022002413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2006290300370300200341c0046a41086a201529030037030020032003290380023703c004200341c0046a412041b8d6c50041004100100b211a200210290240201a417f470d0041b29dc400211a410121150c470b411510272202450d252002410d6a41002900bbd143370000200241086a41002900b6d143370000200241002900aed14337000020024115413510282202450d2620022003290398073700152002412d6a20034198076a41186a290300370000200241256a20034198076a41106a2903003700002002411d6a20034198076a41086a29030037000020034180026a41186a221a420037030020034180026a41106a2214420037030020034180026a41086a2206420037030020034200370380022002413520034180026a1000200341c0046a41186a201a290300370300200341c0046a41106a2014290300370300200341c0046a41086a200629030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005211a20032802a0032214417f460d29201a450d29200320143602cc052003201a3602c805200341a0036a200341c8056a10fc0220032d00c10322064102460d27200341e0006a41086a200341ca036a290100370300200341e0006a41106a200341d2036a290100370300200341e0006a41186a200341da036a29010037030020034180026a41086a200341eb036a29000037030020034180026a41106a200341f3036a29000037030020034180026a41186a200341fb036a290000370300200320032901c2033703602003200341e3036a29000037038002200341e2036a2d0000211520032c00c003211602402014450d00201a10290b200341c0046a4120100c0c2a0b41204101102a000b418f89c3004133104e000b201a4108102a000b418f89c3004133104e000b41174101102a000b41374101102a000b20062014103e000b20062014103e000b41174101102a000b412e4101102a000b410f4101102a000b412f4101102a000b410f4101102a000b412f4101102a000b41204101102a000b410f4101102a000b412f4101102a000b410f4101102a000b412f4101102a000b41154101102a000b41354101102a000b418f89c3004133104e000b418f89c3004133104e000b41204101102a000b41354101102a000b418f89c3004133104e000b419bffc400419f01104e000b41204101102a000b41c0004101102a000b41c0004101102a000b20164101102a000b20094101102a000b41204101102a000b41204101102a000b41c0004101102a000b41154101102a000b41354101102a000b41154101102a000b41354101102a000b418f89c3004133104e000b200a4101102a000b41022106410021160b200341d8076a41186a2208200341e0006a41186a290300370300200341d8076a41106a2209200341e0006a41106a290300370300200341d8076a41086a220a200341e0006a41086a290300370300200341b8076a41086a221a20034180026a41086a290300370300200341b8076a41106a220b20034180026a41106a290300370300200341b8076a41186a220c20034180026a41186a290300370300200320032903603703d80720032003290380023703b8072002102941002114024020064102460d00200341c8056a41086a200a290300370300200341c8056a41106a2009290300370300200341c8056a41186a2008290300370300200341f8076a41086a201a290300370300200341f8076a41106a200b290300370300200341f8076a41186a200c290300370300200320032903d8073703c805200320032903b8073703f8074100210202400240024002400240024002400240024002400240201541ff01714101470d00411510272202450d012002410d6a41002900bbd143370000200241086a41002900b6d143370000200241002900aed14337000020024115413510282202450d02200220032903f8073700152002412d6a20034190086a290300370000200241256a20034188086a2903003700002002411d6a200341f8076a41086a2903003700000b0240024020064101470d00411510272214450d042014410d6a41002900bbd143370000201441086a41002900b6d143370000201441002900aed14337000020144115413510282214450d05201420032903c8053700152014412d6a200341c8056a41186a290300370000201441256a200341c8056a41106a2903003700002014411d6a200341c8056a41086a29030037000020034180026a41186a2208420037030020034180026a41106a2209420037030020034180026a41086a220a420037030020034200370380022014413520034180026a1000200341c0046a41186a2008290300370300200341c0046a41106a2009290300370300200341c0046a41086a200a29030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005210b024020032802a003220c417f460d00200b0d020b41e0a3c40041d300104e000b20034180026a41186a2214420037030020034180026a41106a2208420037030020034180026a41086a220942003703002003420037038002419ad2c300411d20034180026a1000200341c0046a41186a2014290300370300200341c0046a41106a2008290300370300200341c0046a41086a200929030037030020032003290380023703c0040240201541ff01714101460d00200341c0046a4120100c0c0a0b412010272214450d05201420032903f807370000201441186a200341f8076a41186a290300370000201441106a200341f8076a41106a290300370000201441086a200341f8076a41086a290300370000200341c0046a4120201441201003201410290c090b2003200c3602f4062003200b3602f006200341a0036a200341f0066a10fc0220032d00c103220d4102460d0520034180026a41206a220e200341a0036a41206a220f2d00003a000020034180026a41186a2208200341a0036a41186a221029030037030020034180026a41106a2209200341a0036a41106a221129030037030020034180026a41086a220a200341a0036a41086a2212290300370300200320032903a00337038002200341e0006a200341c2036a221341c10010ce041a0240200c450d00200b10290b201320032900603701002012200a2903003703002011200929030037030020102008290300370300200f200e2d00003a0000200341ca036a200341e0006a41086a290000370100200341d2036a200341e0006a41106a290000370100200341da036a200341e0006a41186a29000037010020032003290380023703a0032003200d3a00c103200341e2036a20153a0000200341e3036a20032903f807370000200341eb036a200341f8076a41086a290300370000200341f3036a200341f8076a41106a290300370000200341fb036a200341f8076a41186a2903003700002008420037030020094200370300200a420037030020034200370380022014413520034180026a1000200341c0046a41186a2008290300370300200341c0046a41106a2009290300370300200341c0046a41086a200a29030037030020032003290380023703c0042003410036026820034201370360412010272215450d06201520032903a003370000201541086a200341a0036a41086a290300370000201541106a200341a0036a41106a290300370000201541186a200341a0036a41186a290300370000200342a0808080800437026420032015360260024020032d00c003220841054b0d00024002400240024002400240024020080e06000102030405000b410021080c050b410121080c040b410221080c030b410321080c020b410421080c010b410521080b200320083a0080022015412041c00010282215450d08201520083a0020200342c08080809004370264200320153602600b200341c1036a200341e0006a10c60320032802642115200341c0046a4120200328026022082003280268100302402015450d00200810290b201410294101210b0c090b41154101102a000b41354101102a000b41154101102a000b41354101102a000b41204101102a000b418f89c3004133104e000b41204101102a000b41c0004101102a000b410021144100210b0b0240024002400240024002400240024020020d00410021060c010b20034180026a41186a2215420037030020034180026a41106a2208420037030020034180026a41086a2209420037030020034200370380022002413520034180026a1000200341c0046a41186a2015290300370300200341c0046a41106a2008290300370300200341c0046a41086a200929030037030020032003290380023703c004200341003602a003200341c0046a4120200341a0036a1005210a20032802a003220c417f460d02200a450d022003200c3602f4062003200a3602f006200341a0036a200341f0066a10fc0220032d00c1034102460d0120034180026a41206a220d200341a0036a41206a220e2d00003a000020034180026a41186a2215200341a0036a41186a220f29030037030020034180026a41106a2208200341a0036a41106a221029030037030020034180026a41086a2209200341a0036a41086a2211290300370300200320032903a00337038002200341e0006a200341c2036a221241c10010ce041a0240200c450d00200a10290b2011200929030037030020102008290300370300200f2015290300370300200e200d2d00003a000020032003290380023703a0032012200341e0006a41c10010ce0420032903c805370100200341ca036a200341c8056a41086a290300370100200341d2036a200341c8056a41106a290300370100200341da036a200341c8056a41186a290300370100200320063a00c10320154200370300200842003703002009420037030020034200370380022002413520034180026a1000200341c0046a41186a2015290300370300200341c0046a41106a2008290300370300200341c0046a41086a200929030037030020032003290380023703c0042003410036026820034201370360412010272206450d03200620032903a003370000200641086a200341a0036a41086a290300370000200641106a200341a0036a41106a290300370000200641186a200341a0036a41186a290300370000200342a0808080800437026420032006360260024020032d00c003221541054b0d00024002400240024002400240024020150e06000102030405000b410021150c050b410121150c040b410221150c030b410321150c020b410421150c010b410521150b200320153a0080022006412041c00010282206450d05200620153a0020200342c08080809004370264200320063602600b200341c1036a200341e0006a10c60320032802642106200341c0046a4120200328026022152003280268100302402006450d00201510290b20021029410121060b200b20144572450d040c050b418f89c3004133104e000b41e0a3c40041d300104e000b41204101102a000b41c0004101102a000b201410290b02402002452006720d00200210290b201621140b42002107201a4200370300200342003703b80741888dc300410d200341b8076a1004200341f0066a41086a201a290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a1005211a0240024020032802a0032202417f460d00200342003703a003200341a0036a201a2002410820024108491b10ce041a200241074d0d0120032903a0032107201a10290b200342e4cab5fbb6ccdcb0e300370360200341e0006a20034198076a427f427f2014410274419886c5006a3502004280af1a7e20077c410210a801200341a0036a41086a41093a0000200341a0036a41096a200329039807370000200341b1036a20034198076a41086a290300370000200341b9036a200341a8076a290300370000200341c1036a200341b0076a290300370000200341053a00a0034100211a41b8d6c5004100200341a0036a108801410121150c1c0b418f89c3004133104e000b41ad88c300211a412821140c1a0b41e39cc400211a412621142007a7450d19200b10290c190b200341a0036a41186a200341f8076a41186a290300370300200341a0036a41106a200341f8076a41106a290300370300200341a0036a41086a200341f8076a41086a290300370300200320032903f8073703a00302400240024002400240024020022007422088a722144b0d00024020142007a7470d00201441016a221a2014490d1020144101742206201a201a2006491b221a41ffffff3f71201a470d10201a41057422064100480d100240024020140d0020061027210b0c010b200b201441057420061028210b0b200b450d02201aad21070b200b20024105746a221a41206a201a201420026b41057410cf041a201a41186a200341a0036a41186a290300370000201a41106a200341a0036a41106a290300370000201a41086a200341a0036a41086a290300370000201a20032903a003370000200341b8076a41086a22024200370300200342003703b80741888dc300410d200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a100521020240024020032802a003221a417f460d002002450d00200342003703a003200341a0036a2002201a4108201a4108491b10ce041a201a41074d0d0420032903a00321042002102920044280af1a7c21040c010b4280af1a21040b411310272202450d032002410f6a41002800bb9c44360000200241086a41002900b49c44370000200241002900ac9c443700002002411341331028220c450d04200c20032903d807370013200c412b6a200341d8076a41186a290300370000200c41236a200341d8076a41106a290300370000200c411b6a200341d8076a41086a29030037000020034180026a41186a2202420037030020034180026a41106a221a420037030020034180026a41086a220642003703002003420037038002200c413320034180026a1000200341c0046a41186a2002290300370300200341c0046a41106a201a290300370300200341c0046a41086a200629030037030020032003290380023703c004200341003602a803200342013703a003410810272202450d05200220043700002003428880808080013702a403200320023602a0032003201441016a2202360260200341e0006a200341a0036a103002400240024020020d0020032802a803211a20032802a403211620032802a00321080c010b410020032802a803221a6b2106201441057441206a210920032802a003210820032802a4032116200b210203400240201620066a411f4b0d00201a41206a2214201a490d132016410174220a20142014200a491b22144100480d130240024020160d002014102721080c010b200820162014102821080b2008450d03201421160b2008201a6a22142002290000370000201441186a200241186a290000370000201441106a200241106a290000370000201441086a200241086a290000370000200641606a2106201a41206a211a200241206a2102200941606a22090d000b200320163602a4032003201a3602a803200320083602a0030b2007a72102200341c0046a41202008201a100302402016450d00200810290b200c102902402002450d00200b10290b200341a0036a41086a410a3a0000200341a9036a20032903f807370000200341c9036a20032903d807370000200341b1036a200341f8076a41086a290300370000200341b9036a200341f8076a41106a290300370000200341c1036a200341f8076a41186a290300370000200341d1036a200341d8076a41086a290300370000200341d9036a200341d8076a41106a290300370000200341e1036a200341d8076a41186a290300370000200341053a00a003200341f0036a20043703004100211a41b8d6c5004100200341a0036a108801200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341f0066a4110100c0c1f0b20144101102a000b41d0b1c5001058000b20064101102a000b418f89c3004133104e000b41134101102a000b41334101102a000b41084101102a000b418f89c3004133104e000b418f89c3004133104e000b200341003602a803200342013703a003200341e0006a200341a0036a103220032802a403211a20032802a803211420032802a003210220034180026a41186a2206420037030020034180026a41106a2216420037030020034180026a41086a2208420037030020034200370380022002201420034180026a1000200341a0036a41186a2006290300370300200341a0036a41106a2016290300370300200341a0036a41086a200829030037030020032003290380023703a0030240201a450d00200210290b0240200341f8076a200341a0036a412010d004450d0041e69bc400211a410c21140c010b42002105200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a221a2002290300370300200320032903b8073703f006200341f0066a4110100c20024200370300200342003703b80741888dc300410d200341b8076a1004201a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a1005211a024020032802a0032202417f460d00200342003703a003200341a0036a201a2002410820024108491b10ce041a200241074d0d0220032903a0032105201a10290b200341a0036a200341e0006a41880110ce041a20034180026a2005200742c0d102200742c0d102561b7c200341a0036a4102200410b50302402003280280024101470d00200328028402221a450d0020034188026a28020021140c160b4100211a0c150b200341e0006a103d0c140b418f89c3004133104e000b419c9cc400211a411021140c120b200341003602a803200342013703a0032006200341a0036a103220032802a403211a20032802a803211420032802a003210220034180026a41186a2215420037030020034180026a41106a2216420037030020034180026a41086a2208420037030020034200370380022002201420034180026a1000200341e0006a41186a22142015290300370300200341e0006a41106a2016290300370300200341e0006a41086a200829030037030020032003290380023703600240201a450d00200210290b200341a0036a41186a2014290300370300200341a0036a41106a200341e0006a41106a290300370300200341a0036a41086a200341e0006a41086a290300370300200320032903603703a00320034180026a200341a0036a10c503024002400240200328028802221a450d00200329038002210442002107200341b8076a41086a22024200370300200342003703b80741888dc300410d200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a10052102024020032802a0032214417f460d002002450d00200342003703a003200341a0036a20022014410820144108491b10ce041a201441074d0d0220032903a0032107200210290b02402003418c026a280200450d00201a10290b200720045a0d0041b79bc400211a411a21140c030b200341a0036a200641880110cf041a200341023a00a804200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f00620034100360288022003420137038002200341a0036a20034180026a1032024020032d00a804220241024b0d00024002400240024020020e03000102000b4100211a0c020b4101211a0c010b4102211a0b2003201a3a009f08024002402003280284022003280288022202460d0020032802800221140c010b200241016a221a2002490d0620024101742214201a201a2014491b221a4100480d060240024020020d00201a102721140c010b2003280280022002201a102821140b2014450d032003201a36028402200320143602800220032d009f08211a20032802880221020b2003200241016a36028802201420026a201a3a00000b2003280284022102200341f0066a4110200328028002221a200328028802100302402002450d00201a10290b200341a0036a103d200610294100210841012115410121060c0b0b418f89c3004133104e000b201a4101102a000b2006103d200610294100210841012115410121060c110b200341003602a803200342013703a0032006200341a0036a103220032802a403211a20032802a803211420032802a003210220034180026a41186a2215420037030020034180026a41106a2216420037030020034180026a41086a2208420037030020034200370380022002201420034180026a1000200341e0006a41186a22142015290300370300200341e0006a41106a2016290300370300200341e0006a41086a200829030037030020032003290380023703600240201a450d00200210290b200341a0036a41186a2014290300370300200341a0036a41106a200341e0006a41106a290300370300200341a0036a41086a200341e0006a41086a290300370300200320032903603703a00320034180026a200341a0036a10c5030240200328028802221a450d00200329038002210442002107200341b8076a41086a22024200370300200342003703b80741888dc300410d200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f006200341003602a003200341f0066a4110200341a0036a10052102024020032802a0032214417f460d002002450d00200342003703a003200341a0036a20022014410820144108491b10ce041a201441074d0d0320032903a0032107200210290b02402003418c026a280200450d00201a10290b200720045a0d0041b79bc400211a411a21140c040b200341a0036a200641880110cf041a200341003a00a804200341b8076a41086a22024200370300200342003703b8074188d4c3004116200341b8076a1004200341f0066a41086a2002290300370300200320032903b8073703f00620034100360288022003420137038002200341a0036a20034180026a1032024020032d00a804220241024b0d00024002400240024020020e03000102000b4100211a0c020b4101211a0c010b4102211a0b2003201a3a009f08024002402003280284022003280288022202460d0020032802800221140c010b200241016a221a2002490d0220024101742214201a201a2014491b221a4100480d020240024020020d00201a102721140c010b2003280280022002201a102821140b2014450d042003201a36028402200320143602800220032d009f08211a20032802880221020b2003200241016a36028802201420026a201a3a00000b2003280284022102200341f0066a4110200328028002221a200328028802100302402002450d00201a10290b200341a0036a103d2006102941002106410121150c060b102b000b418f89c3004133104e000b201a4101102a000b2006103d200610294100210641012115410121080c0c0b2016200341c8056a41186a2903003703002008200341c8056a41106a290300370300200341a0036a41086a200341c8056a41086a290300370300200320032903c8053703a003200341013a00f80702400240411710272202450d004100211a2002410f6a41002900af9b44370000200241086a41002900a89b44370000200241002900a09b4437000020024117413710282202450d01200220032903a0033700172002412f6a200341a0036a41186a290300370000200241276a200341a0036a41106a2903003700002002411f6a200341a0036a41086a29030037000020034180026a41186a2206420037030020034180026a41106a2215420037030020034180026a41086a2216420037030020034200370380022002413720034180026a1000200341c0046a41186a2006290300370300200341c0046a41106a2015290300370300200341c0046a41086a201629030037030020032003290380023703c00441012115200341c0046a4120200341f8076a4101100320021029200a10ab032014103d0c090b41174101102a000b41374101102a000b201510294101210641002115410121080c0a0b410121080b410121164100211a0c0a0b41959bc400211a410b2114410121150c060b41d588c300211a412a2114410121150c050b2002201a4105746a22142003290340370000201441186a200341c0006a41186a290300370000201441106a2015290300370000201441086a200929030037000041012115200341a0036a41186a201a41016a360200200341b4036a2008360200200320073703a803200320043703a003200320163602bc03200320023602b003200a200341a0036a10c2030b4100211a0b4101210641012108410121160c050b41fb9ac400211a411a21142006450d0020021029410121150c010b410121150b41012106410121080b410121160c010b2006103d20061029410021164101211541012106410121080b0240024020012d0000417f6a2202410f4b0d00024002400240024020020e1000040404010402030404040405040505000b2016450d04200141046a2202280200103d200228020010290c040b2015450d03200141046a2202280200103d200228020010290c030b2006450d02200141046a2202280200103d200228020010290c020b2008450d01200141046a2202280200103d200228020010290c010b200241074b0d00024002400240024020020e080004040401040203000b200141046a2202280200103d200228020010290c030b200141046a2202280200103d200228020010290c020b200141046a2202280200103d200228020010290c010b200141046a2202280200103d200228020010290b200020143602042000201a360200200341a0086a24000bd75d02157f037e230041d0036b2203240002400240024002400240024002400240024002400240024002400240024002400240024020012d000022040e0500010d0302000b200341b4026a4101360200200342013702a402200341ccfdc4003602a00220034102360274200341c4fdc4003602702003200341f0006a3602b002200341a0026a41bce4c2001057000b200141086a2802002105200141046a2802002106024020022d000120022d000072450d0041ad88c300210741282108410021094101210a02402005450d00200610290b4101210b0c100b2001410c6a280200210c200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a1005210202400240024020032802a0022207417f460d002002450d00200320073602fc01200320023602f801200341a0026a200341f8016a102d20032802a002220d450d02200341a8026a280200210a20032802a402210e2007450d01200210290c010b4101210d4100210a4100210e0b200d200a1094022006200c109402200d4100200a1b210920064100200c1b2108200d41206a200d200a1b2107200641206a2006200c1b21022006200c4105746a210f200d200a4105746a2110410021114100211241012113410021144100211541012116034002400240024002400240024002402009450d0003402008450d02024020092008460d0020092008412010d004220a0d040b410020072007201046220a1b2109410020022002200f46220b1b21082007200741206a200a1b21072002200241206a200b1b210220090d000b0b4100210920080d04201320112006200c10ba0102402012450d00201310290b02402015450d00201610290b02402005450d00200610290b4101210a200e450d16200d10290c160b200341a0026a41186a220a200941186a290000370300200341a0026a41106a220b200941106a290000370300200341a0026a41086a2217200941086a290000370300200320092900003703a002024020122011470d00201141016a22082011490d0a20114101742209200820082009491b221241ffffff3f712012470d0a201241057422084100480d0a0240024020110d002008102721130c010b201320114105742008102821130b2013450d020b201320114105746a220820032903a002370000200841186a200a290300370000200841106a200b290300370000200841086a20172903003700002007200741206a200720104622091b210a410021084100200720091b21090c040b200a417f4a0d02200341a0026a41186a220a200941186a290000370300200341a0026a41106a220b200941106a290000370300200341a0026a41086a2217200941086a290000370300200320092900003703a002024020122011470d00201141016a22092011490d0920114101742212200920092012491b221241ffffff3f712012470d09201241057422094100480d090240024020110d002009102721130c010b201320114105742009102821130b2013450d020b201320114105746a220920032903a002370000200941186a200a290300370000200941106a200b290300370000200941086a20172903003700002007200741206a200720104622091b210a4100200720091b21090c030b20084101102a000b20094101102a000b200341a0026a41186a220a200841186a290000370300200341a0026a41106a220b200841106a290000370300200341a0026a41086a2217200841086a290000370300200320082900003703a0020240024020152014470d00201441016a22082014490d0720144101742215200820082015491b221541ffffff3f712015470d07201541057422084100480d070240024020140d002008102721160c010b201620144105742008102821160b2016450d010b201620144105746a220820032903a002370000200841186a200a290300370000200841106a200b290300370000200841086a2017290300370000410020022002200f46220a1b2108201441016a21142002200241206a200a1b21020c020b20084101102a000b201141016a2111200a21070c000b0b418f89c3004133104e000b200141216a2d0000210e200141246a2802002105200341306a41186a200141196a290000370300200341306a41106a200141116a290000370300200341306a41086a200141096a290000370300200320012900013703302002411a6a2901002118200241196a2d0000210f200241186a2d00002110200241166a2f01002114200241156a2d00002111200241146a2d00002115200241126a2f01002116200241116a2d00002117200241106a2d000021122002410e6a2f010021132002410d6a2d00002106200241046a2d0000210d200241026a2f0100210c41d588c3002107412a21080240024020022d0000450d00410121094100210a4100210b0c010b410121094100210a4100210b20022d00014101470d002002410c6a2d0000210b2002410a6a2f0100210a200241096a2d00002108200241066a2f0100410874200241056a2d000072200241086a2d0000411874722107410021090b200a41ffff0371410874200841ff017172200b411874722108024020090d00200320183703682003200f3a0067200320103a0066200320143b0164200320113a0063200320153a0062200320163b0160200320173a005f200320123a005e200320133b015c200320063a005b20032008360057200320073600532003200d3a00522003200c3b0150200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a10052102024002400240024020032802a0022207417f460d002002450d00200320073602fc01200320023602f801200341a0026a200341f8016a102d20032802a0022208450d02200341a8026a280200210920032802a402210a02402007450d00200210290b20082009200341d0006a10f90221020240200a450d00200810290b2002450d010c030b41014100200341d0006a10f9020d020b41d2e5c2002107411221080c020b418f89c3004133104e000b200341a0026a200341306a10f202024020032802a80222100d0041bfe5c2002107411321080c010b200341b8026a2802002111200341b4026a28020021144110210820032802ac02210b41e4e5c20021070240200520032802a0022217470d00200341bc026a280200210f20032802a40221122010200341a0026a41106a28020022154105746a2109201021024100210802400240024003400240200920026b41e0004b0d0020022009470d02410021160c040b200341d0006a2002460d0220082002200341d0006a412010d00422074100476a21082007450d02200241206a2207200341d0006a460d0220082007200341d0006a412010d00422074100476a21082007450d02200241c0006a2207200341d0006a460d0220082007200341d0006a412010d00422074100476a21082007450d02200241e0006a2207200341d0006a460d0220024180016a210220082007200341d0006a412010d00422074100476a210820070d000c020b0b201020154105746a21090340200341d0006a2002460d0120082002200341d0006a412010d00422074100476a21082007450d01410021162009200241206a2202470d000c020b0b410121160b2014200f4105746a210a201421024100210702400240024003400240200a20026b41e0004b0d002002200a470d02410021090c040b200341d0006a2002460d0220072002200341d0006a412010d00422094100476a21072009450d02200241206a2209200341d0006a460d0220072009200341d0006a412010d00422094100476a21072009450d02200241c0006a2209200341d0006a460d0220072009200341d0006a412010d00422094100476a21072009450d02200241e0006a2209200341d0006a460d0220024180016a210220072009200341d0006a412010d00422094100476a210720090d000c020b0b0340200341d0006a2002460d0120072002200341d0006a412010d00422094100476a21072009450d0141002109200a200241206a2202470d000c020b0b410121090b024002400240024002400240024002400240200e41ff01710d002009450d010c080b20160d07200341a0026a41186a2208200341d0006a41186a290300370300200341a0026a41106a220a200341d0006a41106a290300370300200341a0026a41086a2213200341d0006a41086a290300370300200320032903503703a0020240200b2015460d00200b21160c020b200b41016a2202200b490d0b200b4101742216200220022016491b221641ffffff3f712016470d0b201641057422024100480d0b02400240200b0d002002102721100c010b2010200b4105742002102821100b20100d0120024101102a000b200341a0026a41186a2209200341d0006a41186a290300370300200341a0026a41106a220a200341d0006a41106a290300370300200341a0026a41086a2213200341d0006a41086a290300370300200320032903503703a002024002402011200f460d00201121070c010b201141016a22022011490d0b20114101742207200220022007491b220741ffffff3f712007470d0b200741057422024100480d0b0240024020110d002002102721140c010b201420114105742002102821140b20140d0020024101102a000b2014200f4105746a220220032903a002370000200241186a2009290300370000200241106a200a290300370000200241086a2013290300370000200f41016a210f024002402016450d00201520084d0d0120102015417f6a22154105746a22022900002118200229000821192002290010211a201020084105746a220841186a200241186a2900003700002008201a37001020082019370008200820183700000b200b2116200721110c020b418ce6c200200820151037000b201020154105746a220220032903a002370000200241186a2008290300370000200241106a200a290300370000200241086a2013290300370000201541016a21152009450d00200f20074d0d012014200f417f6a220f4105746a22022900002118200229000821192002290010211a201420074105746a220741186a200241186a2900003700002007201a37001020072019370008200720183700000b200341c5026a2003290330370000200341ad026a200341d0006a41086a290300370000200341b5026a200341d0006a41106a290300370000200341bd026a200341d0006a41186a290300370000200341cd026a200341306a41086a290300370000200341d5026a200341306a41106a290300370000200341dd026a200341306a41186a290300370000200341013a00a402200341063a00a002200320032903503700a502200341ec026a200f360200200341e8026a2015360200200341e5026a200e3a000041b8d6c5004100200341a0026a108801200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a1005210720032802a0022208417f460d022007450d02200320083602fc01200320073602f801200341a0026a200341f8016a102d20032802a002220a450d01200341a8026a280200210220032802a402210902402008450d00200710290b2009450d03200a10290c030b418ce6c2002007200f1037000b418f89c3004133104e000b410021020b024002400240024002400240024002400240024002400240201520124f22070d0041002002200f6b2208200820024b1b2012490d00200341bc026a200f360200200341a0026a41186a2011360200200341a0026a41106a2015360200200341ac026a2016360200200320143602b402200320103602a802200320123602a402200320173602a002411a10272202450d01200241186a41002f00cfce423b0000200241106a41002900c7ce42370000200241086a41002900bfce42370000200241002900b7ce423700002002411a413a10282202450d022002200329033037001a200241326a200341306a41186a2903003700002002412a6a200341306a41106a290300370000200241226a200341306a41086a290300370000200341f8016a41186a22074200370300200341f8016a41106a22084200370300200341f8016a41086a22094200370300200342003703f8012002413a200341f8016a1000200341a8036a41186a2007290300370300200341a8036a41106a2008290300370300200341a8036a41086a2009290300370300200320032903f8013703a803200341203602742003200341a8036a360270200341a0026a200341f0006a10db022002102902402016450d00201010290b20110d060c070b024020070d00200341ad026a200341386a290300370000200341b5026a200341c0006a290300370000200341bd026a200341c8006a290300370000200341033a00a402200341063a00a002200320032903303700a50241b8d6c5004100200341a0026a1088010c050b200341ad026a200341306a41086a290300370000200341b5026a200341306a41106a290300370000200341bd026a200341c8006a290300370000200341023a00a402200341063a00a002200320032903303700a50241b8d6c5004100200341a0026a108801411e10272207450d02200741166a4100290096e542370000200741106a4100290090e542370000200741086a4100290088e54237000020074100290080e5423700002007411e413e10282207450d032007200329033037001e200741366a200341306a41186a220b2903003700002007412e6a200341306a41106a220f290300370000200741266a200341306a41086a2215290300370000200341f8016a41186a22094200370300200341f8016a41106a220a4200370300200341f8016a41086a22084200370300200342003703f8012007413e200341f8016a1000200341a8036a41186a2009290300370300200341a8036a41106a200a290300370300200341a8036a41086a2008290300370300200320032903f8013703a803200341a0026a200341a8036a10fa02024020032802a00222094112470d00200710290c050b200341f0006a200341a0026a410472220a41840110ce041a20071029200320093602a002200a200341f0006a41840110ce041a20034184026a200236020020082012360200200341003a00fc01200341013a00f801200341286a200341a0026a200341f8016a10ad0220032802282102200341ad026a2015290300370000200341b5026a200f290300370000200341bd026a200b290300370000200341c5026a2002453a0000200341043a00a402200341063a00a002200320032903303700a50241b8d6c5004100200341a0026a1088010c040b411a4101102a000b413a4101102a000b411e4101102a000b413e4101102a000b411a10272202450d03200241186a41002f00cfce423b0000200241106a41002900c7ce42370000200241086a41002900bfce42370000200241002900b7ce423700002002411a413a10282202450d042002200329033037001a200241326a200341306a41186a2903003700002002412a6a200341306a41106a290300370000200241226a200341306a41086a290300370000200341f8016a41186a22074200370300200341f8016a41106a22084200370300200341f8016a41086a22094200370300200342003703f8012002413a200341f8016a1000200341a8036a41186a2007290300370300200341a8036a41106a2008290300370300200341a8036a41086a2009290300370300200320032903f8013703a803200341a8036a4120100c20021029200341a0026a41086a22024200370300200342003703a002419acec200411d200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a100521020240024020032802a0022207417f460d002002450d00200320073602fc01200320023602f801200341a0026a200341f8016a102d20032802a0022208450d0720032902a402211802402007450d00200210290b200320183702fc01200320083602f8010c010b2003410036028002200342013703f8010b200341f8016a200341306a1036200341a0026a41086a22024200370300200342003703a002419acec200411d200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a802200342013703a00220032802f8012117200320032802800222023602a803200341a8036a200341a0026a10300240024020020d0020032802a802210720032802a402210a20032802a002210b0c010b2002410574210f410020032802a80222076b210920032802a002210b20032802a402210a2017210203400240200a20096a411f4b0d00200741206a22082007490d0d200a4101742215200820082015491b22084100480d0d02400240200a0d0020081027210b0c010b200b200a20081028210b0b200b450d052008210a0b200b20076a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200941606a2109200741206a2107200241206a2102200f41606a220f0d000b2003200a3602a402200320073602a8022003200b3602a0020b200341f0006a4110200b200710030240200a450d00200b10290b024020032802fc01450d00201710290b02402016450d00201010290b2011450d010b201410290b410021070c060b20084101102a000b411a4101102a000b413a4101102a000b418f89c3004133104e000b41f4e5c2002107411621080b0240200b450d00201010290b2011450d00201410290b4101210a4101210b410121090c0e0b200141086a2802002109200141046a280200210e2002411a6a2901002118200241196a2d00002110200241186a2d00002114200241166a2f01002111200241156a2d00002115200241146a2d00002116200241126a2f01002117200241116a2d00002112200241106a2d000021132002410e6a2f010021062002410d6a2d0000210d200241046a2d0000210c200241026a2f01002105412a210841d588c30021070240024020022d0000450d004101210a4100210b4100210f0c010b4101210a4100210b4100210f20022d00014101470d002002410c6a2d0000210b2002410a6a2f0100210f200241096a2d00002108200241066a2f0100410874200241056a2d000072200241086a2d00004118747221074100210a0b200f41ffff0371410874200b41187472200841ff0171722108200a0d0820032018370348200320103a0047200320143a0046200320113b0144200320153a0043200320163a0042200320173b0140200320123a003f200320133a003e200320063b013c2003200d3a003b20032008360037200320073600332003200c3a0032200320053b0130200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a10052102024002400240024020032802a0022207417f460d002002450d00200320073602fc01200320023602f801200341a0026a200341f8016a102d20032802a0022208450d02200341a8026a280200210a20032802a402210b02402007450d00200210290b2008200a200341306a10f90221020240200b450d00200810290b2002450d010c030b41014100200341306a10f9020d020b41cce4c2002107411521080c0a0b418f89c3004133104e000b200341003602a802200342013703a0022009200341a0026a103220032802a402210720032802a802210820032802a0022102200341f8016a41186a220a4200370300200341f8016a41106a220b4200370300200341f8016a41086a220f4200370300200342003703f80120022008200341f8016a1000200341d0006a41186a2208200a290300370300200341d0006a41106a220a200b290300370300200341d0006a41086a220b200f290300370300200320032903f80137035002402007450d00200210290b200341a0026a41186a2008290300370300200341a0026a41106a200a290300370300200341a0026a41086a200b290300370300200320032903503703a002024002400240024002400240024002400240411e10272202450d00200241166a4100290096e542370000200241106a4100290090e542370000200241086a4100290088e54237000020024100290080e5423700002002411e413e10282202450d01200220032903a00237001e200241366a200341a0026a41186a2903003700002002412e6a200341a0026a41106a290300370000200241266a200341a0026a41086a290300370000200341f8016a41186a22074200370300200341f8016a41106a22084200370300200341f8016a41086a220a4200370300200342003703f8012002413e200341f8016a1000200341a8036a41186a2007290300370300200341a8036a41106a2008290300370300200341a8036a41086a200a290300370300200320032903f8013703a803200341a8036a412041b8d6c50041004100100b2107200210292007417f470d020240200e4102490d00200341206a419ee5c200412110b5012003280224211520032802202116200341186a419ee5c200412110b50120032802182107200328021c2108200341a0026a41086a22024200370300200342003703a002419ee5c2004121200341a0026a1004200341f0006a41086a220a2002290300370300200320032903a0023703702003200841016a410120071b3602a002200341f0006a4110200341a0026a4104100320024200370300200342003703a002419acec200411d200341a0026a1004200a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a1005210220032802a0022207417f460d052002450d05200320073602fc01200320023602f801200341a0026a200341f8016a102d20032802a0022211450d0420032902a402211802402007450d00200210290b200341a0026a41186a200341d0006a41186a290300370300200341a0026a41106a200341d0006a41106a290300370300200341a0026a41086a200341d0006a41086a290300370300200320032903503703a002200341a0026a21072018a72018422088a72202470d080c070b200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a00237037041002102200341003602a002200341f0006a4110200341a0026a10052108024020032802a0022207417f460d00200320073602fc01200320083602f801200341a0026a200341f8016a102d20032802a002220b450d06200341a8026a280200210220032802a402210a02402007450d00200810290b200a450d00200b10290b200341a0026a200941880110ce041a200341fc006a2002360200200341f0006a41086a4101360200200341003a0074200341013a0070200341106a200341a0026a200341f0006a10ad0220032802102102200341ad026a200341d0006a41086a290300370000200341b5026a200341e0006a290300370000200341bd026a200341e8006a290300370000200341c5026a2002453a0000200341043a00a402200341063a00a002200320032903503700a502200341a0026a21020c080b411e4101102a000b413e4101102a000b41e1e4c2002107411f21080c0e0b418f89c3004133104e000b200341a0026a41186a200341d0006a41186a290300370300200341a0026a41106a200341d0006a41106a290300370300200341a0026a41086a200341d0006a41086a290300370300200320032903503703a002420021184101211141002102200341a0026a21070c010b418f89c3004133104e000b200241016a22082002490d022002410174220a20082008200a491b220841ffffff3f712008470d022008410574220a4100480d020240024020020d00200a102721110c010b20112002410574200a102821110b2011450d032018422088a721022008ad21180b20112002410574220b6a22082007290000370000200841186a200741186a290000370000200841106a200741106a290000370000200841086a200741086a290000370000200341a0026a41086a22074200370300200342003703a002419acec200411d200341a0026a1004200341f0006a41086a2007290300370300200320032903a002370370200341003602a802200342013703a0022003200241016a22073602f801200341f8016a200341a0026a103002400240200720024f0d0020032802a802210720032802a402210b20032802a002210f0c010b410020032802a80222076b210a200b41206a211020032802a002210f20032802a402210b2011210203400240200b200a6a411f4b0d00200741206a22082007490d04200b4101742214200820082014491b22084100480d0402400240200b0d0020081027210f0c010b200f200b20081028210f0b200f450d0b2008210b0b200f20076a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200a41606a210a200741206a2107200241206a2102201041606a22100d000b2003200b3602a402200320073602a8022003200f3602a0020b200341f0006a4110200f200710030240200b450d00200f10290b02402018a7450d00201110290b200341f0006a41186a200341d0006a41186a290300370300200341f0006a41106a200341d0006a41106a290300370300200341f0006a41086a200341d0006a41086a29030037030020032003290350370370200341a0026a200941880110ce041a411e10272202450d03200241166a4100290096e542370000200241106a4100290090e542370000200241086a4100290088e54237000020024100290080e5423700002002411e413e10282202450d042002200329037037001e200241366a200341f0006a41186a2903003700002002412e6a200341f0006a41106a290300370000200241266a200341f0006a41086a290300370000200341f8016a41186a22074200370300200341f8016a41106a22084200370300200341f8016a41086a220a4200370300200342003703f8012002413e200341f8016a1000200341a8036a41186a2007290300370300200341a8036a41106a2008290300370300200341a8036a41086a200a290300370300200320032903f8013703a8032003410036028002200342013703f801200341a0026a200341f8016a103220032802fc012107200341a8036a412020032802f8012208200328028002100302402007450d00200810290b20021029200341a0026a103d412010272202450d0520022003290330370000200241186a200341306a41186a290300370000200241106a200341306a41106a290300370000200241086a200341306a41086a290300370000200341f0006a41186a200341d0006a41186a290300370300200341f0006a41106a200341d0006a41106a290300370300200341f0006a41086a200341d0006a41086a29030037030020032003290350370370200341bc026a4100360200200341ac026a428180808010370200200342013702b402200320023602a8022003200e3602a40220032015410020161b22083602a002411a10272207450d06200741186a41002f00cfce423b0000200741106a41002900c7ce42370000200741086a41002900bfce42370000200741002900b7ce423700002007411a413a10282207450d072007200329037037001a200741326a200341f0006a41186a2903003700002007412a6a200341f0006a41106a290300370000200741226a200341f0006a41086a290300370000200341f8016a41186a220a4200370300200341f8016a41106a220b4200370300200341f8016a41086a220f4200370300200342003703f8012007413a200341f8016a1000200341a8036a41186a200a290300370300200341a8036a41106a200b290300370300200341a8036a41086a200f290300370300200320032903f8013703a803200341203602fc012003200341a8036a3602f801200341a0026a200341f8016a10db022007102920021029200341ad026a200341306a41086a290300370000200341b5026a200341306a41106a290300370000200341bd026a200341306a41186a290300370000200341c5026a2003290350370000200341cd026a200341d0006a41086a290300370000200341d5026a200341d0006a41106a290300370000200341dd026a200341d0006a41186a290300370000200341ec026a200e360200200341e8026a2008360200200341003a00a402200341063a00a002200320032903303700a502200341a0026a21020b4100210b41b8d6c50041002002108801200910294101210a0c0a0b102b000b200a4101102a000b411e4101102a000b413e4101102a000b41204101102a000b411a4101102a000b413a4101102a000b20084101102a000b2009103d200910294100210b4101210a410121090c040b200141046a280200210941d588c3002107412a210820022d00000d0120022d00014101470d01200241196a2d00002107200241186a2d00002108200241166a2f0100210a200241156a2d0000210b200241146a2d0000210f200241126a2f01002110200241116a2d00002114200241106a2d000021112002410e6a2f010021152002410d6a2d000021162002410c6a2d000021172002410a6a2f01002112200241096a2d00002113200241086a2d00002106200241066a2f0100210d200241056a2d0000210c200241046a2d00002105200241026a2f0100210e20032002411a6a290100370368200320073a0067200320083a00662003200a3b01642003200b3a00632003200f3a0062200320103b0160200320143a005f200320113a005e200320153b015c200320163a005b200320053a00522003200e3b0150200320132012410874201741187472723600572003200c200d41087472200641187472360053200341a0026a41086a22024200370300200342003703a00241d692c200411b200341a0026a1004200341f0006a41086a2002290300370300200320032903a002370370200341003602a002200341f0006a4110200341a0026a10052107024002400240024020032802a0022202417f460d00200320023602fc01200320073602f801200341a0026a200341f8016a102d20032802a0022208450d02200341a8026a280200210a20032802a402210b02402002450d00200710290b2008200a200341d0006a10f90221020240200b450d00200810290b2002450d010c030b41014100200341d0006a10f9020d020b41cce4c2002107411521080c030b418f89c3004133104e000b4100210a200341003602a802200342013703a0022009200341a0026a103220032802a402210720032802a802210820032802a0022102200341f8016a41186a220b4200370300200341f8016a41106a220f4200370300200341f8016a41086a22104200370300200342003703f80120022008200341f8016a1000200341a8036a41186a2208200b290300370300200341a8036a41106a2214200f290300370300200341a8036a41086a220f2010290300370300200320032903f8013703a80302402007450d00200210290b200341a0026a200941880110ce041a200341f0006a410d6a200341d0006a41086a290300370000200341f0006a41156a200341d0006a41106a290300370000200341f0006a411d6a200341d0006a41186a2903003700004101210b200341013a007420032003290350370075200341013a0070200341086a200341a0026a200341f0006a10ad0220032802082102200341a0026a410d6a200f290300370000200341a0026a41156a2014290300370000200341a0026a411d6a2008290300370000200341c5026a2002453a0000200341053a00a402200341063a00a002200320032903a8033700a50241b8d6c5004100200341a0026a108801200910290b41012109410021070c020b2009103d200910294101210b4100210a410121090c010b410021094101210b410021070b02402004410771417f6a220241024b0d0002400240024020020e03000102000b2009450d02200141086a280200450d02200141046a28020010290c020b200a450d01200141046a2802002202103d200210290c010b200b450d00200141086a2802002202103d200210290b2000200836020420002007360200200341d0036a24000b9a6f03197f077e017f23002203210420034180046b4160712205240002400240024002400240024002400240024002400240024002400240024002400240024020012d000022060e0500010d0302000b200541d4026a4101360200200542013702c402200541ccfdc4003602c0022005410236028401200541c4fdc40036028001200520054180016a3602d002200541c0026a41bce4c2001057000b200141086a2802002107200141046a2802002108024020022d000120022d000072450d0041ad88c3002103412821094100210a4101210b02402007450d00200810290b4101210c0c100b2001410c6a280200210d20054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a100521020240024002402005280280012203417f460d002002450d002005200336029c02200520023602980220054180016a20054198026a102d200528028001220e450d0220054188016a280200210b200528028401210f2003450d01200210290c010b4101210e4100210b4100210f0b200e200b1094022008200d109402200e4100200b1b210a20084100200d1b2109200e41206a200e200b1b2103200841206a2008200d1b21022008200d4105746a2110200e200b4105746a211141002112410021134100211441012115410021164100211741012118034002400240024002400240024002400240024002400240024002400240200a450d0003402009450d020240200a2009460d00200a2009412010d004220b0d040b410020032003201146220b1b210a410020022002201046220c1b21092003200341206a200b1b21032002200241206a200c1b2102200a0d000b0b4100210a20090d0b201341ffffff3f712013470d0220134105742202417f4c0d020240024020020d00410121090c010b200210272209450d040b410021034100210202402013450d00416020156b210a2009210220152103034020022003290000370000200241186a200341186a290000370000200241106a200341106a290000370000200241086a200341086a290000370000200241206a2102200341206a2103201241606a22120d000b201520134105746a200a6a41057641016a2102201321030b20052002360248200520033602442005200936024020092002410041202002676b10e00120054180016a41086a22024200370300200542003703800141e8e6c200411d20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a10052102024002402005280280012209417f460d002002450d002005200936029c02200520023602980220054180016a20054198026a102d2005280280012219450d0620054188016a2802002103200528028401211a2009450d01200210290c010b41012119410021034100211a0b024020034105742210450d00200541c0026a4114722112200541c0026a410872211b201921030340200541e0006a41186a2211200341186a290000370300200541e0006a41106a2216200341106a290000370300200541e0006a41086a2213200341086a2900003703002005200329000037036020054180016a200541e0006a10fb02200541003602c802200529039801211c200520052903d802221d37039801200529039001211e200520052903d002221f370390012005290380012120200520052903c002370380012005290388012121200520052903c802222237038801201f422088a7210c2022422088a7210a201da7210b2022a7210902402021a72202450d00200520203703c002200520213703c8022005201e3703d0022005201c3703d80220052002201ea74105746a3602a402200520023602a00220052021422088a736029c0220052002360298022005200541c0006a3602a802200541d8036a20054198026a104b201b41086a200541d8036a41086a2223280200360200201b20052903d8033702002005201e422088a72202201c422088a74105746a3602a402200520023602a0022005201ca736029c0220052002360298022005200541c0006a3602a802200541d8036a20054198026a104b201241086a2023280200360200201220052903d80337020020052903c802212120052903c002211e20052903d802212220052903d002211c02402009450d000240200a450d00200910290b200b450d00200c10290b2005201e3703800120052021370388012021422088a7210a2005201c37039001201c422088a7210c20052022370398012021a721092022a7210b0b411a102721020240024020090d002002450d09200241186a41002f009de7423b0000200241106a4100290095e742370000200241086a410029008de74237000020024100290085e7423700002002411a413a10282202450d0a2002200529036037001a200241326a20112903003700002002412a6a2016290300370000200241226a201329030037000020054198026a41186a2209420037030020054198026a41106a220a420037030020054198026a41086a220b420037030020054200370398022002413a20054198026a1000200541d8036a41186a2009290300370300200541d8036a41106a200a290300370300200541d8036a41086a200b29030037030020052005290398023703d803200541d8036a4120100c200210290c010b2002450d0a200241186a41002f009de7423b0000200241106a4100290095e742370000200241086a410029008de74237000020024100290085e7423700002002411a413a10282202450d0b2002200529036037001a200241326a20112903003700002002412a6a2016290300370000200241226a201329030037000020054198026a41186a2211420037030020054198026a41106a2216420037030020054198026a41086a2213420037030020054200370398022002413a20054198026a1000200541d8036a41186a2011290300370300200541d8036a41106a2016290300370300200541d8036a41086a201329030037030020052005290398023703d803200541203602c4022005200541d8036a3602c00220054180016a200541c0026a10db02200210290240200a450d00200910290b200b450d00200c10290b200341206a2103201041606a22100d000b0b0240201a450d00201910290b200541003602c802200542013703c0022005200d3602800120054180016a200541c0026a10300240024002400240200d0d0020052802c802210320052802c402210b20052802c002210c0c010b200d4105742110410020052802c80222036b210a20052802c002210c20052802c402210b2008210203400240200b200a6a411f4b0d00200341206a22092003490d16200b4101742211200920092011491b22094100480d1602400240200b0d0020091027210c0c010b200c200b20091028210c0b200c450d032009210b0b200c20036a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200a41606a210a200341206a2103200241206a2102201041606a22100d000b2005200b3602c402200520033602c8022005200c3602c0020b20054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c002200541c0026a4110200c200310030240200b450d00200c10290b02402005280244450d00200528024010290b02402014450d00201510290b02402017450d00201810290b02402007450d00200810290b4101210b200f0d010c1f0b20094101102a000b200e10290c1d0b200541c0026a41186a220b200a41186a290000370300200541c0026a41106a220c200a41106a290000370300200541c0026a41086a221b200a41086a2900003703002005200a2900003703c002024020142013470d00201341016a22092013490d112013410174220a20092009200a491b221441ffffff3f712014470d11201441057422094100480d110240024020130d002009102721150c010b201520134105742009102821150b2015450d090b201520134105746a220920052903c002370000200941186a200b290300370000200941106a200c290300370000200941086a201b2903003700002003200341206a2003201146220a1b210b4100210941002003200a1b210a0c0b0b200b417f4a0d09200541c0026a41186a220b200a41186a290000370300200541c0026a41106a220c200a41106a290000370300200541c0026a41086a221b200a41086a2900003703002005200a2900003703c002024020142013470d00201341016a220a2013490d1020134101742214200a200a2014491b221441ffffff3f712014470d102014410574220a4100480d100240024020130d00200a102721150c010b20152013410574200a102821150b2015450d090b201520134105746a220a20052903c002370000200a41186a200b290300370000200a41106a200c290300370000200a41086a201b2903003700002003200341206a2003201146220a1b210b41002003200a1b210a0c0a0b1039000b20024101102a000b418f89c3004133104e000b411a4101102a000b413a4101102a000b411a4101102a000b413a4101102a000b20094101102a000b200a4101102a000b200541c0026a41186a220b200941186a290000370300200541c0026a41106a220c200941106a290000370300200541c0026a41086a221b200941086a290000370300200520092900003703c0020240024020172016470d00201641016a22092016490d0720164101742217200920092017491b221741ffffff3f712017470d07201741057422094100480d070240024020160d002009102721180c010b201820164105742009102821180b2018450d010b201820164105746a220920052903c002370000200941186a200b290300370000200941106a200c290300370000200941086a201b290300370000410020022002201046220b1b2109201641016a21162002200241206a200b1b21020c020b20094101102a000b201241206a2112201341016a2113200b21030c000b0b418f89c3004133104e000b200141216a2d0000210e200141246a280200210d200541c0006a41186a200141196a290000370300200541c0006a41106a200141116a290000370300200541c0006a41086a200141096a290000370300200520012900013703402002411a6a2901002121200241196a2d00002110200241186a2d00002111200241166a2f01002116200241156a2d00002113200241146a2d00002117200241126a2f01002118200241116a2d00002112200241106a2d0000211b2002410e6a2f010021142002410d6a2d00002115200241046a2d00002123200241026a2f0100210841d588c3002103412a21090240024020022d0000450d004101210a4100210b4100210c0c010b4101210a4100210b4100210c20022d00014101470d002002410c6a2d0000210c2002410a6a2f0100210b200241096a2d00002109200241066a2f0100410874200241056a2d000072200241086a2d00004118747221034100210a0b200b41ffff0371410874200941ff017172200c4118747221090240200a0d0020052021370378200520103a0077200520113a0076200520163b0174200520133a0073200520173a0072200520183b0170200520123a006f2005201b3a006e200520143b016c200520153a006b2005200936006720052003360063200520233a0062200520083b016020054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a1005210202400240024002402005280280012203417f460d002002450d002005200336029c02200520023602980220054180016a20054198026a102d2005280280012209450d0220054188016a280200210a200528028401210b02402003450d00200210290b2009200a200541e0006a10f90221020240200b450d00200910290b2002450d010c030b41014100200541e0006a10f9020d020b41d2e5c2002103411221090c020b418f89c3004133104e000b200541c0026a200541c0006a10fb02024020052802c80222110d0041bfe5c2002103411321090c010b200541d8026a2802002113200541d4026a28020021164110210920052802cc02210c41e4e5c20021030240200d20052802c0022212470d00200541dc026a280200211020052802c402211b2011200541c0026a41106a28020022174105746a210a201121024100210902400240024003400240200a20026b41e0004b0d002002200a470d02410021180c040b200541e0006a2002460d0220092002200541e0006a412010d00422034100476a21092003450d02200241206a2203200541e0006a460d0220092003200541e0006a412010d00422034100476a21092003450d02200241c0006a2203200541e0006a460d0220092003200541e0006a412010d00422034100476a21092003450d02200241e0006a2203200541e0006a460d0220024180016a210220092003200541e0006a412010d00422034100476a210920030d000c020b0b201120174105746a210a0340200541e0006a2002460d0120092002200541e0006a412010d00422034100476a21092003450d0141002118200a200241206a2202470d000c020b0b410121180b201620104105746a210b201621024100210302400240024003400240200b20026b41e0004b0d002002200b470d024100210a0c040b200541e0006a2002460d0220032002200541e0006a412010d004220a4100476a2103200a450d02200241206a220a200541e0006a460d022003200a200541e0006a412010d004220a4100476a2103200a450d02200241c0006a220a200541e0006a460d022003200a200541e0006a412010d004220a4100476a2103200a450d02200241e0006a220a200541e0006a460d0220024180016a21022003200a200541e0006a412010d004220a4100476a2103200a0d000c020b0b0340200541e0006a2002460d0120032002200541e0006a412010d004220a4100476a2103200a450d014100210a200b200241206a2202470d000c020b0b4101210a0b024002400240024002400240024002400240200e41ff01710d00200a450d010c080b20180d07200541c0026a41186a2209200541e0006a41186a290300370300200541c0026a41106a220b200541e0006a41106a290300370300200541c0026a41086a2214200541e0006a41086a290300370300200520052903603703c0020240200c2017460d00200c21180c020b200c41016a2202200c490d0b200c4101742218200220022018491b221841ffffff3f712018470d0b201841057422024100480d0b02400240200c0d002002102721110c010b2011200c4105742002102821110b20110d0120024101102a000b200541c0026a41186a220a200541e0006a41186a290300370300200541c0026a41106a220b200541e0006a41106a290300370300200541c0026a41086a2214200541e0006a41086a290300370300200520052903603703c0020240024020132010460d00201321030c010b201341016a22022013490d0b20134101742203200220022003491b220341ffffff3f712003470d0b200341057422024100480d0b0240024020130d002002102721160c010b201620134105742002102821160b20160d0020024101102a000b201620104105746a220220052903c002370000200241186a200a290300370000200241106a200b290300370000200241086a2014290300370000201041016a2110024002402018450d00201720094d0d0120112017417f6a22174105746a22022900002121200229000821222002290010211c201120094105746a220941186a200241186a2900003700002009201c37001020092022370008200920213700000b200c2118200321130c020b418ce6c200200920171037000b201120174105746a220220052903c002370000200241186a2009290300370000200241106a200b290300370000200241086a2014290300370000201741016a2117200a450d00201020034d0d0120162010417f6a22104105746a22022900002121200229000821222002290010211c201620034105746a220341186a200241186a2900003700002003201c37001020032022370008200320213700000b200541e5026a2005290340370000200541cd026a200541e0006a41086a290300370000200541d5026a200541e0006a41106a290300370000200541dd026a200541e0006a41186a290300370000200541ed026a200541c0006a41086a290300370000200541f5026a200541c0006a41106a290300370000200541fd026a200541c0006a41186a290300370000200541013a00c402200541073a00c002200520052903603700c5022005418c036a201036020020054188036a201736020020054185036a200e3a000041b8d6c5004100200541c0026a10880120054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a100521032005280280012209417f460d022003450d022005200936029c02200520033602980220054180016a20054198026a102d200528028001220b450d0120054188016a2802002102200528028401210a02402009450d00200310290b200a450d03200b10290c030b418ce6c200200320101037000b418f89c3004133104e000b410021020b0240024002400240024002400240024002400240024002402017201b4f22030d004100200220106b2209200920024b1b201b490d00200541dc026a2010360200200541c0026a41186a2013360200200541c0026a41106a2017360200200541cc026a2018360200200520163602d402200520113602c8022005201b3602c402200520123602c002411a10272202450d01200241186a41002f009de7423b0000200241106a4100290095e742370000200241086a410029008de74237000020024100290085e7423700002002411a413a10282202450d022002200529034037001a200241326a200541c0006a41186a2903003700002002412a6a200541c0006a41106a290300370000200241226a200541c0006a41086a29030037000020054198026a41186a2203420037030020054198026a41106a2209420037030020054198026a41086a220a420037030020054200370398022002413a20054198026a1000200541d8036a41186a2003290300370300200541d8036a41106a2009290300370300200541d8036a41086a200a29030037030020052005290398023703d80320054120360284012005200541d8036a36028001200541c0026a20054180016a10db022002102902402018450d00201110290b20130d060c070b024020030d00200541cd026a200541c8006a290300370000200541d5026a200541d0006a290300370000200541dd026a200541d8006a290300370000200541033a00c402200541073a00c002200520052903403700c50241b8d6c5004100200541c0026a1088010c050b200541cd026a200541c0006a41086a290300370000200541d5026a200541c0006a41106a290300370000200541dd026a200541d8006a290300370000200541023a00c402200541073a00c002200520052903403700c50241b8d6c5004100200541c0026a108801411e10272203450d02200341166a41002900b5e742370000200341106a41002900afe742370000200341086a41002900a7e7423700002003410029009fe7423700002003411e413e10282203450d032003200529034037001e200341366a200541c0006a41186a220c2903003700002003412e6a200541c0006a41106a2210290300370000200341266a200541c0006a41086a221729030037000020054198026a41186a220a420037030020054198026a41106a220b420037030020054198026a41086a2209420037030020054200370398022003413e20054198026a1000200541d8036a41186a200a290300370300200541d8036a41106a200b290300370300200541d8036a41086a200929030037030020052005290398023703d803200541c0026a200541d8036a10fa02024020052802c002220a4112470d00200310290c050b20054180016a200541c0026a410472220b41840110ce041a200310292005200a3602c002200b20054180016a41840110ce041a200541a4026a20023602002009201b360200200541003a009c02200541023a009802200541386a200541c0026a20054198026a10ad0220052802382102200541cd026a2017290300370000200541d5026a2010290300370000200541dd026a200c290300370000200541e5026a2002453a0000200541043a00c402200541073a00c002200520052903403700c50241b8d6c5004100200541c0026a1088010c040b411a4101102a000b413a4101102a000b411e4101102a000b413e4101102a000b411a10272202450d03200241186a41002f009de7423b0000200241106a4100290095e742370000200241086a410029008de74237000020024100290085e7423700002002411a413a10282202450d042002200529034037001a200241326a200541c0006a41186a2903003700002002412a6a200541c0006a41106a290300370000200241226a200541c0006a41086a29030037000020054198026a41186a2203420037030020054198026a41106a2209420037030020054198026a41086a220a420037030020054200370398022002413a20054198026a1000200541d8036a41186a2003290300370300200541d8036a41106a2009290300370300200541d8036a41086a200a29030037030020052005290398023703d803200541d8036a4120100c2002102920054180016a41086a22024200370300200542003703800141e8e6c200411d20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a10052102024002402005280280012203417f460d002002450d002005200336029c02200520023602980220054180016a20054198026a102d2005280280012209450d07200529028401212102402003450d00200210290b2005202137029c0220052009360298020c010b200541003602a00220054201370398020b20054198026a200541c0006a103620054180016a41086a22024200370300200542003703800141e8e6c200411d20054180016a1004200541c0026a41086a200229030037030020052005290380013703c002200541003602880120054201370380012005280298022112200520052802a00222023602d803200541d8036a20054180016a10300240024020020d002005280288012103200528028401210b200528028001210c0c010b20024105742110410020052802880122036b210a200528028001210c200528028401210b2012210203400240200b200a6a411f4b0d00200341206a22092003490d0d200b4101742217200920092017491b22094100480d0d02400240200b0d0020091027210c0c010b200c200b20091028210c0b200c450d052009210b0b200c20036a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200a41606a210a200341206a2103200241206a2102201041606a22100d000b2005200b3602840120052003360288012005200c360280010b200541c0026a4110200c200310030240200b450d00200c10290b0240200528029c02450d00201210290b02402018450d00201110290b2013450d010b201610290b410021030c060b20094101102a000b411a4101102a000b413a4101102a000b418f89c3004133104e000b41f4e5c2002103411621090b0240200c450d00201110290b2013450d00201610290b4101210b4101210c4101210a0c0e0b200141086a280200210a200141046a280200210e2002411a6a2901002121200241196a2d00002111200241186a2d00002116200241166a2f01002113200241156a2d00002117200241146a2d00002118200241126a2f01002112200241116a2d0000211b200241106a2d000021142002410e6a2f010021152002410d6a2d00002123200241046a2d00002108200241026a2f0100210d41d588c3002103412a21090240024020022d0000450d004101210b4100210c410021100c010b4101210b4100210c4100211020022d00014101470d002002410c6a2d000021102002410a6a2f0100210c200241096a2d00002109200241066a2f0100410874200241056a2d000072200241086a2d00004118747221034100210b0b200c41ffff0371410874200941ff0171722010411874722109200b0d0820052021370358200520113a0057200520163a0056200520133b0154200520173a0053200520183a0052200520123b01502005201b3a004f200520143a004e200520153b014c200520233a004b2005200936004720052003360043200520083a00422005200d3b014020054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a1005210202400240024002402005280280012203417f460d002002450d002005200336029c02200520023602980220054180016a20054198026a102d2005280280012209450d0220054188016a280200210b200528028401210c02402003450d00200210290b2009200b200541c0006a10f90221020240200c450d00200910290b2002450d010c030b41014100200541c0006a10f9020d020b41cce4c2002103411521090c0a0b418f89c3004133104e000b200541003602c802200542013703c002200a200541c0026a103220052802c402210320052802c802210920052802c002210220054198026a41186a220b420037030020054198026a41106a220c420037030020054198026a41086a2210420037030020054200370398022002200920054198026a1000200541e0006a41186a2209200b290300370300200541e0006a41106a220b200c290300370300200541e0006a41086a220c2010290300370300200520052903980237036002402003450d00200210290b200541c0026a41186a2009290300370300200541c0026a41106a200b290300370300200541c0026a41086a200c290300370300200520052903603703c002024002400240024002400240024002400240411e10272202450d00200241166a41002900b5e742370000200241106a41002900afe742370000200241086a41002900a7e7423700002002410029009fe7423700002002411e413e10282202450d01200220052903c00237001e200241366a200541c0026a41186a2903003700002002412e6a200541c0026a41106a290300370000200241266a200541c0026a41086a29030037000020054198026a41186a2203420037030020054198026a41106a2209420037030020054198026a41086a220b420037030020054200370398022002413e20054198026a1000200541d8036a41186a2003290300370300200541d8036a41106a2009290300370300200541d8036a41086a200b29030037030020052005290398023703d803200541d8036a412041b8d6c50041004100100b2103200210292003417f470d020240200e4102490d00200541306a41bde7c200412110b5012005280234211720052802302118200541286a41bde7c200412110b50120052802282103200528022c210920054180016a41086a22024200370300200542003703800141bde7c200412120054180016a1004200541c0026a41086a220b200229030037030020052005290380013703c0022005200941016a410120031b36028001200541c0026a411020054180016a4104100320024200370300200542003703800141e8e6c200411d20054180016a1004200b200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a100521022005280280012203417f460d052002450d052005200336029c02200520023602980220054180016a20054198026a102d2005280280012213450d04200529028401212102402003450d00200210290b200541c0026a41186a200541e0006a41186a290300370300200541c0026a41106a200541e0006a41106a290300370300200541c0026a41086a200541e0006a41086a290300370300200520052903603703c002200541c0026a21032021a72021422088a72202470d080c070b20054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c002410021022005410036028001200541c0026a411020054180016a1005210902402005280280012203417f460d002005200336029c02200520093602980220054180016a20054198026a102d200528028001220c450d0620054188016a2802002102200528028401210b02402003450d00200910290b200b450d00200c10290b200541c0026a200a41880110ce041a2005418c016a200236020020054180016a41086a4101360200200541003a008401200541023a008001200541206a200541c0026a20054180016a10ad0220052802202102200541cd026a200541e0006a41086a290300370000200541d5026a200541f0006a290300370000200541dd026a200541f8006a290300370000200541e5026a2002453a0000200541043a00c402200541073a00c002200520052903603700c502200541c0026a21020c080b411e4101102a000b413e4101102a000b41e1e4c2002103411f21090c0e0b418f89c3004133104e000b200541c0026a41186a200541e0006a41186a290300370300200541c0026a41106a200541e0006a41106a290300370300200541c0026a41086a200541e0006a41086a290300370300200520052903603703c002420021214101211341002102200541c0026a21030c010b418f89c3004133104e000b200241016a22092002490d022002410174220b20092009200b491b220941ffffff3f712009470d022009410574220b4100480d020240024020020d00200b102721130c010b20132002410574200b102821130b2013450d032021422088a721022009ad21210b20132002410574220c6a22092003290000370000200941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020054180016a41086a22034200370300200542003703800141e8e6c200411d20054180016a1004200541c0026a41086a200329030037030020052005290380013703c002200541003602880120054201370380012005200241016a22033602980220054198026a20054180016a103002400240200320024f0d002005280288012103200528028401210c20052802800121100c010b410020052802880122036b210b200c41206a21112005280280012110200528028401210c2013210203400240200c200b6a411f4b0d00200341206a22092003490d04200c4101742216200920092016491b22094100480d0402400240200c0d002009102721100c010b2010200c2009102821100b2010450d0b2009210c0b201020036a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200b41606a210b200341206a2103200241206a2102201141606a22110d000b2005200c36028401200520033602880120052010360280010b200541c0026a41102010200310030240200c450d00201010290b02402021a7450d00201310290b20054180016a41186a200541e0006a41186a29030037030020054180016a41106a200541e0006a41106a29030037030020054180016a41086a200541e0006a41086a2903003703002005200529036037038001200541c0026a200a41880110ce041a411e10272202450d03200241166a41002900b5e742370000200241106a41002900afe742370000200241086a41002900a7e7423700002002410029009fe7423700002002411e413e10282202450d04200220052903800137001e200241366a20054180016a41186a2903003700002002412e6a20054180016a41106a290300370000200241266a20054180016a41086a29030037000020054198026a41186a2203420037030020054198026a41106a2209420037030020054198026a41086a220b420037030020054200370398022002413e20054198026a1000200541d8036a41186a2003290300370300200541d8036a41106a2009290300370300200541d8036a41086a200b29030037030020052005290398023703d803200541003602a0022005420137039802200541c0026a20054198026a1032200528029c022103200541d8036a4120200528029802220920052802a002100302402003450d00200910290b20021029200541c0026a103d412010272202450d0520022005290340370000200241186a200541c0006a41186a290300370000200241106a200541c0006a41106a290300370000200241086a200541c0006a41086a29030037000020054180016a41186a200541e0006a41186a29030037030020054180016a41106a200541e0006a41106a29030037030020054180016a41086a200541e0006a41086a2903003703002005200529036037038001200541dc026a4100360200200541cc026a428180808010370200200542013702d402200520023602c8022005200e3602c40220052017410020181b22093602c002411a10272203450d06200341186a41002f009de7423b0000200341106a4100290095e742370000200341086a410029008de74237000020034100290085e7423700002003411a413a10282203450d07200320052903800137001a200341326a20054180016a41186a2903003700002003412a6a20054180016a41106a290300370000200341226a20054180016a41086a29030037000020054198026a41186a220b420037030020054198026a41106a220c420037030020054198026a41086a2210420037030020054200370398022003413a20054198026a1000200541d8036a41186a200b290300370300200541d8036a41106a200c290300370300200541d8036a41086a201029030037030020052005290398023703d8032005412036029c022005200541d8036a36029802200541c0026a20054198026a10db022003102920021029200541cd026a200541c0006a41086a290300370000200541d5026a200541c0006a41106a290300370000200541dd026a200541c0006a41186a290300370000200541e5026a2005290360370000200541ed026a200541e0006a41086a290300370000200541f5026a200541e0006a41106a290300370000200541fd026a200541e0006a41186a2903003700002005418c036a200e36020020054188036a2009360200200541003a00c402200541073a00c002200520052903403700c502200541c0026a21020b4100210c41b8d6c50041002002108801200a10294101210b0c0a0b102b000b200b4101102a000b411e4101102a000b413e4101102a000b41204101102a000b411a4101102a000b413a4101102a000b20094101102a000b200a103d200a10294100210c4101210b4101210a0c040b200141046a280200210a41d588c3002103412a210920022d00000d0120022d00014101470d01200241196a2d00002103200241186a2d00002109200241166a2f0100210b200241156a2d0000210c200241146a2d00002110200241126a2f01002111200241116a2d00002116200241106a2d000021132002410e6a2f010021172002410d6a2d000021182002410c6a2d000021122002410a6a2f0100211b200241096a2d00002114200241086a2d00002115200241066a2f01002123200241056a2d00002108200241046a2d0000210d200241026a2f0100210e20052002411a6a290100370378200520033a0077200520093a00762005200b3b01742005200c3a0073200520103a0072200520113b0170200520163a006f200520133a006e200520173b016c200520183a006b2005200d3a00622005200e3b016020052014201b410874201241187472723600672005200820234108747220154118747236006320054180016a41086a22024200370300200542003703800141f192c200411b20054180016a1004200541c0026a41086a200229030037030020052005290380013703c0022005410036028001200541c0026a411020054180016a1005210302400240024002402005280280012202417f460d002005200236029c02200520033602980220054180016a20054198026a102d2005280280012209450d0220054188016a280200210b200528028401210c02402002450d00200310290b2009200b200541e0006a10f90221020240200c450d00200910290b2002450d010c030b41014100200541e0006a10f9020d020b41cce4c2002103411521090c030b418f89c3004133104e000b4100210b200541003602c802200542013703c002200a200541c0026a103220052802c402210320052802c802210920052802c002210220054198026a41186a220c420037030020054198026a41106a2210420037030020054198026a41086a2211420037030020054200370398022002200920054198026a1000200541d8036a41186a2209200c290300370300200541d8036a41106a22162010290300370300200541d8036a41086a2210201129030037030020052005290398023703d80302402003450d00200210290b200541c0026a200a41880110ce041a20054180016a410d6a200541e0006a41086a29030037000020054180016a41156a200541e0006a41106a29030037000020054180016a411d6a200541e0006a41186a2903003700004101210c200541013a0084012005200529036037008501200541023a008001200541186a200541c0026a20054180016a10ad0220052802182102200541c0026a410d6a2010290300370000200541c0026a41156a2016290300370000200541c0026a411d6a2009290300370000200541e5026a2002453a0000200541053a00c402200541073a00c002200520052903d8033700c50241b8d6c5004100200541c0026a108801200a10290b4101210a410021030c020b200a103d200a10294101210c4100210b4101210a0c010b4100210a4101210c410021030b02402006410771417f6a220241024b0d0002400240024020020e03000102000b200a450d02200141086a280200450d02200141046a28020010290c020b200b450d01200141046a2802002202103d200210290c010b200c450d00200141086a2802002202103d200210290b2000200936020420002003360200200424000bc08c0108077f027e0e7f027e027f017e0d7f0b7e230041e00a6b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0700010203040506000b200341e4046a4101360200200342013702d404200341ccfdc4003602d004200341023602b409200341c4fdc4003602b0092003200341b0096a3602e004200341d0046a41ece1c2001057000b200141e0006a2802002104200341b0096a200141086a41d80010ce041a20034188086a41186a200141fc006a28020036020020034188086a41106a200141f4006a29020037030020034188086a41086a200141ec006a2902003703002003200141e4006a29020037038808024020022d000120022d000072450d0041ad88c3002105412821020c220b200341b8076a41086a22024200370300200342003703b80741f987c5004118200341b8076a100420034190046a41086a2002290300370300200320032903b8073703900441002102200341003602d00420034190046a4110200341d0046a10052106024020032802d0042205417f460d002003200536029c062003200636029806200341d0046a20034198066a10f10220032d00c0054102460d0620032802a80521022005450d00200610290b024020022004490d0041fce1c2002105413521020c220b200341dc046a2004360200200341d0046a41086a41033a00002003410b3a00d0044100210541b8d6c5004100200341d0046a108801200341d0046a200341b0096a41d80010ce041a200341b4056a20034188086a41086a290300370200200341bc056a20034188086a41106a290300370200200341c4056a20034188086a41186a280200360200200320043602a80520032003290388083702ac05200341b8076a41086a22024200370300200342003703b80741f987c5004118200341b8076a100420034190046a41086a2002290300370300200320032903b80737039004200341003602a0062003420137039806200341d0046a20034198066a109302200328029c06210220034190046a4110200328029806220420032802a00610032002450d20200410290c200b2001410c6a2802002107200141086a2802002108200141046a2802002109200141106a290300210a2002411a6a290100210b200241196a2d0000210c200241186a2d0000210d200241166a2f0100210e200241156a2d0000210f200241146a2d00002110200241126a2f01002111200241116a2d00002112200241106a2d000021132002410e6a2f010021142002410d6a2d00002115200241046a2d00002116200241026a2f01002117412a210441d588c30021050240024020022d0000450d004101210641002118410021190c010b41012106410021184100211920022d00014101470d002002410c6a2d000021182002410a6a2f01002119200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021060b201941ffff0371410874201841187472200441ff017172210220060d1e2003200b3703b0062003200c3a00af062003200d3a00ae062003200e3b01ac062003200f3a00ab06200320103a00aa06200320113b01a806200320123a00a706200320133a00a606200320143b01a406200320153a00a3062003200236009f062003200536009b06200320163a009a06200320173b019806200341b8076a41086a22024200370300200342003703b80741f987c5004118200341b8076a100420034190046a41086a2002290300370300200320032903b80737039004200341003602d00420034190046a4110200341d0046a1005210220032802d0042205417f460d062002450d06200320053602bc07200320023602b807200341d0046a200341b8076a10f10220032d00c00522044102460d0520034188086a200341d0046a41f00010ce041a2003200341d0046a41f4006a28000036009309200320032800c1053602900902402005450d00200210290b200341b0096a20034188086a41f00010ce041a200341b0096a41f4006a200328009309360000200320043a00a00a20032003280290093600a10a0c150b200141c0006a290300211a200141386a290300211b2002411a6a290100210b200241196a2d0000210d200241186a2d0000210f200241166a2f01002110200241156a2d00002111200241146a2d00002112200241126a2f01002113200241116a2d00002114200241106a2d000021152002410e6a2f010021162002410d6a2d00002117200241046a2d00002107200241026a2f0100211c200141306a280200211d2001412c6a2802002108200141286a280200210e2001411d6a290000211e2001411c6a2d0000211f2001411b6a2d00002120200141196a2f00002121200141186a2d00002122200141176a2d00002123200141156a2f00002124200141146a2d00002125200141136a2d00002126200141116a2f00002127200141106a2d000021282001410c6a2802002129200141086a2802002109200141076a2d0000212a200141056a2f0000212b200141046a2d0000210c200141c8006a290300210a412a210441d588c30021050240024020022d0000450d004101210641002118410021190c010b41012106410021184100211920022d00014101470d002002410c6a2d000021182002410a6a2f01002119200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021060b201941ffff0371410874201841187472200441ff017172210220060d130240200c41ff01714101470d00200341d0046a200941067610cc0120032802d00421060240024020032802d8042009413f7122044b0d00410021040c010b200620044105746a2204290018211e20042d0017211f20042d0016212020042f0014212120042d0013212220042d0012212320042f0010212420042d000f212520042d000e212620042f000c212720042d000b2128200428000721292004280003210920042d0002212a20042f0000212b410121040b024020032802d404450d00200610290b20040d004184efc2002105411521020c140b2003200b3703c8042003200d3a00c7042003200f3a00c604200320103b01c404200320113a00c304200320123a00c204200320133b01c004200320143a00bf04200320153a00be04200320163b01bc04200320173a00bb04200320023600b704200320053600b304200320073a00b2042003201c3b01b004200341e0016a41e887c500411110940102404280ade20420032903e8017d4280ade20420032802e0011b200a5a0d0041dbeac2002105411b21020c140b200341c8016a41b793c20041111086014200212c0240024020032903d001420120032802c80122021b220b200341d8016a290300420020021b222d8450450d004200212e0c010b200341a8016a202d4200200a420010d304200341b8016a200b4200200a420010d30420034198016a42004200200b420010d304024020032903b00120032903a00184420052200341c0016a290300222c20032903a8012003290398017c7c222e202c5472450d0041f6eac2002105412721020c150b20032903b801212c0b200341d0046a200341b0046a202c202e4108109001024020032802d0044101470d0020032802d804210220032802d40421050c140b200341d0046a41106a290300212e20032903d804212c20034198076a41186a202d3703002003200b3703a8072003200a3703a0072003200a37039807200341b8076a41086a22024200370300200342003703b80741f987c5004118200341b8076a1004200341b0096a41086a2002290300370300200320032903b8073703b009200341003602d004200341b0096a4110200341d0046a1005210220032802d004220f417f460d072002450d072003200f36028c082003200236028808200341d0046a20034188086a10f10220032d00c00522054102460d0620032802bc05210420032802b805210620032802b405211820032802b005211920032802ac05210c20032802a805210d20032903a005210a200329039805210b200329039005212d200329038805212f200329038005213020032903f804213120032903f004213220032903e804213320032903e004213420032903d804213520032903d0042136200320032800c105360298062003200341c4056a28000036009b060240200f450d00200210290b2003200328029806360288082003200328009b0636008b080c120b200141386a290300211e200141306a290300211a200141c0006a290300210a200341f0036a41186a200141196a290000370300200341f0036a41106a200141116a290000370300200341f0036a41086a200141096a290000370300200320012900013703f0032002411a6a290100210b200241196a2d00002108200241186a2d00002109200241166a2f0100210c200241156a2d0000210e200241146a2d00002110200241126a2f01002111200241116a2d00002112200241106a2d000021132002410e6a2f010021142002410d6a2d00002115200241046a2d00002116200241026a2f010021172001412c6a2802002107200141286a280200210d200141246a280200210f41d588c3002105412a21040240024020022d0000450d004101210641002118410021190c010b41012106410021184100211920022d00014101470d002002410c6a2d000021192002410a6a2f01002118200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021060b201841ffff0371410874200441ff017172201941187472210202402006450d00200d0d100c110b2003200b3703c804200320083a00c704200320093a00c6042003200c3b01c4042003200e3a00c304200320103a00c204200320113b01c004200320123a00bf04200320133a00be04200320143b01bc04200320153a00bb04200320023600b704200320053600b304200320163a00b204200320173b01b004200341e0026a41e887c500411110940102404280ade20420032903e8027d4280ade20420032802e0021b200a5a0d0041dbeac2002105411b21020c0f0b200341c8026a41b793c20041111086014200211b0240024020032903d002420120032802c80222021b220b200341d8026a290300420020021b222c8450450d004200212d0c010b200341a8026a202c4200200a420010d304200341b8026a200b4200200a420010d30420034198026a42004200200b420010d304024020032903b00220032903a00284420052200341c0026a290300221b20032903a8022003290398027c7c222d201b5472450d0041f6eac2002105412721020c100b20032903b802211b0b200341d0046a200341b0046a201b202d4108109001024020032802d0044101470d0020032802d804210220032802d40421050c0f0b200341d0046a41106a290300212d20032903d804211b20034198076a41186a202c3703002003200b3703a8072003200a3703a0072003200a37039807200341b8076a41086a22024200370300200342003703b80741f987c5004118200341b8076a1004200341b0096a41086a2002290300370300200320032903b8073703b009200341003602d004200341b0096a4110200341d0046a1005210220032802d004220c417f460d082002450d082003200c36028c082003200236028808200341d0046a20034188086a10f10220032d00c00522054102460d0720032802bc05210420032802b805210620032802b405211820032802b005211920032802ac05210820032802a805210920032903a005210a200329039805210b200329039005212c200329038805212e200329038005212f20032903f804213020032903f004213120032903e804213220032903e004213320032903d804213420032903d0042135200320032800c105360298062003200341c4056a28000036009b060240200c450d00200210290b2003200328029806360288082003200328009b0636008b080c0d0b20034198066a41186a200141196a29000037030020034198066a41106a200141116a29000037030020034198066a41086a200141096a290000370300200320012900013703980620034188086a41206a200141c1006a2d00003a000020034188086a41186a200141396a29000037030020034188086a41106a200141316a29000037030020034188086a41086a200141296a2900003703002003200141216a29000037038808200341d0046a41086a2205200241096a290000370300200341d0046a41106a2204200241116a290000370300200341d0046a41186a2206200241196a290000370300200341d0046a41206a2218200241216a2d00003a0000200341bc076a2219200241266a2f01003b0100200320022900013703d0042003200241226a2801003602b807024020022d00002202450d00200341b0096a41266a20032802b807360100200341bd096a2005290300370000200341c5096a2004290300370000200341cd096a2006290300370000200341d5096a20182d00003a0000200341da096a20192f01003b0100200320023a00b409200320032903d0043700b509200341013a00b00941b1e2c200210541e90021020c1e0b200341b0096a41216a20182d00003a0000200341b0096a41196a2006290300370000200341b0096a41116a2004290300370000200341b0096a41096a2005290300370000200320032903d004220a3700b109200341003a00b00941b1e2c200210541e9002102200aa741ff0171417f6a220441014b0d1d02400240024020040e020100010b20032d0088084101470d1f20034188086a41017221044200210a0c010b20032d0088084101460d1e200341b0096a41027221044202210a0b41002105200341d0046a20034198066a200a410010a00120032d00d0042102024020032d00d8040d002003418c056a280200450d0020034188056a28020010290b200241ff01714101470d1c200341d0046a20044296014200109f01024020032802d0044101470d0020032802d804210220032802d40421050c1e0b200341d0046a41106a290300210b20032903d804211e200341f0026a41b18ac0004116108601200341f0026a41106a290300210a20032903f802211a20032802f0022102200341b8076a41086a22044200370300200342003703b80741b18ac0004116200341b8076a100420034190046a41086a2004290300370300200320032903b807370390042003427f200b200a420020021b220a7c201e201a420020021b220b7c221e200b542202ad7c220b2002200b200a54200b200a511b22021b3703c0072003427f201e20021b3703b80720034190046a4110200341b8076a411010030c1c0b200141d8006a290300210b200141d0006a290300211e200341f0036a41186a200141196a290000370300200341f0036a41106a200141116a290000370300200341f0036a41086a200141096a290000370300200320012900013703f003200341b0046a41186a200141396a290000370300200341b0046a41106a200141316a290000370300200341b0046a41086a200141296a2900003703002003200141216a2900003703b004200141c4006a2802002109200141c8006a2802002108200141cc006a28020021072002411a6a290100210a200241196a2d0000210c200241186a2d0000210d200241166a2f0100210e200241156a2d0000210f200241146a2d00002110200241126a2f01002111200241116a2d00002112200241106a2d000021132002410e6a2f010021142002410d6a2d00002115200241046a2d00002116200241026a2f0100211741d588c3002105412a21040240024020022d0000450d004101210641002118410021190c010b41012106410021184100211920022d00014101470d002002410c6a2d000021192002410a6a2f01002118200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021060b201841ffff0371410874200441ff017172201941187472210220060d092003200a3703b0072003200c3a00af072003200d3a00ae072003200e3b01ac072003200f3a00ab07200320103a00aa07200320113b01a807200320123a00a707200320133a00a607200320143b01a407200320153a00a3072003200236009f072003200536009b07200320163a009a07200320173b019807200341d0046a20034198076a108c010240024020032d00d00422054102470d0041012105413421024202210a0c010b20034190096a41086a2204200341e4046a29020037030020034190096a41106a2206200341ec046a28020036020020034188086a41086a2218200341d0046a41306a29030037030020034188086a41106a221920034188056a29030037030020034188086a41186a220c20034190056a29030037030020034188086a41206a220d20034198056a29030037030020034188086a41286a220e200341a0056a29030037030020034188086a41306a220f200341a8056a2903003703002003200341dc046a290200370390092003200341d0046a41286a29030037038808200341d0046a41086a28020021024202210a4202211a024020050d00200341d0046a41206a290300211a20034190046a41106a200628020036020020034190046a41086a200429030037030020034198066a41086a201829030037030020034198066a41106a201929030037030020034198066a41186a200c29030037030020034198066a41206a200d29030037030020034198066a41286a200e29030037030020034198066a41306a200f2903003703002003200329039009370390042003200329038808370398060b0240201a4202520d0041012105413421020c010b20034188086a41106a20034190046a41106a28020036020020034188086a41086a20034190046a41086a290300370300200341d0046a41086a20034198066a41086a290300370300200341d0046a41106a20034198066a41106a290300370300200341d0046a41186a20034198066a41186a290300370300200341d0046a41206a20034198066a41206a290300370300200341d0046a41286a20034198066a41286a290300370300200341d0046a41306a20034198066a41306a29030037030020032003290390043703880820032003290398063703d00441002105201a210a0b200341f0076a41086a220420034188086a41086a290300370300200341f0076a41106a220620034188086a41106a280200360200200341b8076a41086a2218200341d0046a41086a290300370300200341b8076a41106a2219200341d0046a41106a290300370300200341b8076a41186a220c200341d0046a41186a290300370300200341b8076a41206a220d200341d0046a41206a290300370300200341b8076a41286a220e200341d0046a41286a290300370300200341b8076a41306a220f200341d0046a41306a29030037030020032003290388083703f007200320032903d0043703b80702402005450d00419ae3c20021050c0a0b200341b0096a41206a220520032903b807370300200341bc096a2004290300370200200341c4096a2006280200360200200341b0096a41286a2018290300370300200341b0096a41306a2019290300370300200341e8096a200c290300370300200341f0096a200d290300370300200341f8096a200e290300370300200341800a6a200f290300370300200320023602b009200320032903f0073702b4092003200a3703c809200341e0036a41888dc300410d10940120032903e803420020032802e0031b211a200aa74101470d072005290300201a520d0741cee3c2002105412a21020c080b418f89c3004133104e000b418f89c3004133104e000b200341003602880a200341003a00a00a200342908080808080103702940a200342848080808080c00037028c0a200342013703800a200342013703f809200342af013703f00920034287013703e809200342013703e009200342013703d809200342013703d009200342013703c809200342013703c009200342013703b809200342013703b0092003412036029c0a0c0e0b418f89c3004133104e000b4100210d428701212f42af01212d4201210a4104210c41808004211941102118418080012106412021044201210b42012130420121314201213242012133420121344201213542012136410021050c0a0b418f89c3004133104e000b4100210941202104418080012106411021184180800421194104210842af01212c428701212e4201213542012134420121334201213242012131420121304201212f4201210b4201210a410021050c040b200341d0046a200341f0036a108c010240024020032d00d00422024102460d0020020d0120034184056a280200450d0020034180056a28020010290b418ee4c2002105412e21020c010b200320032902d40437009309200320032d00d3043a009209200320032f00d1043b0190092003200341e9046a2900003703a8092003200341e5046a2800003602a4092003200341dd046a29000037029c092003200341dc046a2d00003a009b0920032903c809210a20032903d009211b200320093602b8072003200920074105746a3602bc072003200341b0096a3602c00720034188086a200341b8076a102502400240024002400240024002400240024002400240024002402003280288080d004104210441002105410021060c010b200341d0046a41086a220220034188086a41086a29030037030020032003290388083703d004411010272204450d01200420032903d004370200200441086a200229030037020020034198066a41086a200341b8076a41086a280200360200200320032903b8073703980620034188086a20034198066a102502402003280288080d0041012105410121060c010b41012102410121060340200341d0046a41086a221820034188086a41086a29030037030020032003290388083703d0040240024020062002460d00200241016a21050c010b200241016a22052002490d1820024101742206200520052006491b220641ffffffff00712006470d18200641047422194100480d180240024020020d002019102721040c010b200420024104742019102821040b2004450d040b200420024104746a220220032903d004370200200241086a201829030037020020034188086a20034198066a1025200521022003280288080d000b0b200341e0096a280200210220032802d8092118200341003602d00420182002200341d0046a100f210d20032802d0042218417f460d0220034188086a41186a200341b0046a41186a29030037030020034188086a41106a200341b0046a41106a29030037030020034188086a41086a200341b0046a41086a290300370300200320032903b00437038808200341003602d804200342013703d004200320183602b807200341b8076a200341d0046a10300240024020032802d404220c20032802d80422026b2018490d0020032802d00421190c010b200220186a22192002490d16200c410174220e20192019200e491b220e4100480d1602400240200c0d00200e102721190c010b20032802d004200c200e102821190b2019450d042003200e3602d404200320193602d004200e210c0b201920026a200d201810ce041a02400240200220186a22020d004101210e0c010b20024100480d1620021027220e450d09200e2019200210ce041a0b0240200c450d00201910290b20024101742219200241206a220c200c2019491b220f4100480d150240024020020d00200f102721190c010b200e2002200f102821190b024020190d00200f4101102a000b201920026a2202200329038808370000200241186a20034188086a41186a290300370000200241106a20034188086a41106a290300370000200241086a20034188086a41086a290300370000200341d0046a41186a22024200370300200341d0046a41106a220e4200370300200341d0046a41086a220f4200370300200342003703d0042019200c200341d0046a100020034198066a41186a200229030037030020034198066a41106a200e29030037030020034198066a41086a200f290300370300200320032903d004370398062019102902402018450d00200d10290b024020034198066a20034190096a412010d0040d000240024020050d00410021180c010b200541047421192004410c6a2102410021180340200228020020186a2118200241106a2102201941706a22190d000b0b200320032802e40920186b3602e409411710272202450d052002410f6a41002900af9342370000200241086a41002900a89342370000200241002900a0934237000020024117413710282202450d0620022003290398073700172002412f6a20034198076a41186a290300370000200241276a20034198076a41106a2903003700002002411f6a20034198076a41086a290300370000200341d0046a41186a22184200370300200341d0046a41106a22194200370300200341d0046a41086a220c4200370300200342003703d00420024137200341d0046a1000200341b8076a41186a2018290300370300200341b8076a41106a2019290300370300200341b8076a41086a200c290300370300200320032903d0043703b807200341b8076a4120100c200210292019200b370300200341f8046a201a201b20071b370300200341d0046a41206a4201200a20071b3703002018201a3703002003418c056a20032802e40936020020034190056a20032903b00437030020034198056a200341b0046a41086a290300370300200341a0056a200341b0046a41106a290300370300200341a8056a200341b0046a41186a29030037030020034180056a200341d8096a220229030037030020034188056a200241086a2802003602002003201e3703d804200341003a00d004200341f0036a200341d0046a10d801411410272202450d07200241106a41002800bb8c40360000200241086a41002900b38c40370000200241002900ab8c4037000020024114413410282202450d0820022003290398073700142002412c6a200341b0076a290300370000200241246a20034198076a41106a2903003700002002411c6a20034198076a41086a290300370000200341c8036a20024134108401200341c8036a41106a290300210a20032903d003210b20032802c803211820021029200341d0046a20034198076a4200420010850120032903d004211a200341b0036a41b18ac0004116108601200a420020181b211b200b420020181b212c200341b0036a41106a290300420020032802b00322021b210a20032903b803420020021b210b200341d0046a41106a290300212d20032903d804211e02400240201a4200520d00200341b8076a41086a22024200370300200342003703b80741b18ac0004116200341b8076a100420034190046a41086a2002290300370300200320032903b807370390042003427f200a202d7c200b201e7c221e200b542202ad7c220b2002200b200a54200b200a511b22021b370390082003427f201e20021b3703880820034188086a21020c010b200341b8076a41086a22024200370300200342003703b80741b18ac0004116200341b8076a100420034190046a41086a2002290300370300200320032903b8073703900420034200200a202d7d200b201e54ad7d221a200b201e7d221e200b56201a200a56201a200a511b22021b3703900820034200201e20021b3703880820034188086a21020b20034190046a4110200241101003200341a0036a200341f0036a202c201b108301200341a0036a41086a290300210b20032903a003211e20034188036a41b18ac000411610860120034188036a41106a290300210a200329039003211a2003280288032102200341b8076a41086a22184200370300200342003703b80741b18ac0004116200341b8076a100420034190046a41086a2018290300370300200320032903b807370390042003427f200b200a420020021b220a7c201e201a420020021b220b7c221e200b542202ad7c220b2002200b200a54200b200a511b22021b3703d8042003427f201e20021b3703d00420034190046a4110200341d0046a4110100302402005450d0020054104742105200441046a210203400240200241046a280200450d00200228020010290b200241106a2102200541706a22050d000b0b02402006450d00200410290b4100210502402008450d00200910290b0c0e0b200420054104746a2112024020050d00200421020c0a0b2004210203400240200228020022180d00200241106a21020c0b0b200241046a2802002105200241086a28020021192002410c6a280200210c20032802e009210d20032802d809210e200341d0046a41186a220f4200370300200341d0046a41106a22104200370300200341d0046a41086a22114200370300200342003703d00420184120200341d0046a100020034190046a41186a200f29030037030020034190046a41106a201029030037030020034190046a41086a2011290300370300200320032903d00437039004200e200d20034190046a41202005200c101102402019450d00200510290b200241106a22022012470d000c0b0b0b41104104102a000b20194104102a000b41b0cfc5004138104e000b200e4101102a000b41174101102a000b41374101102a000b41144101102a000b41344101102a000b20024101102a000b20022012460d0003402002280200450d010240200241086a280200450d00200241046a28020010290b200241106a22022012470d000b0b02402006450d00200410290b41f8e3c2002105411621020b200341dc096a280200450d0020032802d80910290b2008450d00200910290b410021084101210641012118410121190c130b200320053a00c005200320043602bc05200320063602b805200320183602b405200320193602b005200320083602ac05200320093602a8052003200a3703a0052003200b370398052003202c370390052003202e370388052003202f37038005200320303703f804200320313703f004200320323703e804200320333703e004200320343703d804200320353703d004200341d0056a420037030020034180066a4200370300200341f0056a4200370300200341e0056a4200370300200341d0046a41f4006a200328008b0836000020034280888080808010370388062003428080e983b1de163703c80520034280a094a58d1d3703f80520034280a094a58d1d3703e80520034280a094a58d1d3703d80520032003280288083600c1052003200341d0046a360294062003200341d0046a3602f00720034188026a41ceecc200410d109401200329039002210a2003280288022102200341f8016a41888dc300410d109401200341e4066a4100360200200341d4066a4200370200200341c8066a41e48cc300360200200341c4066a41b8d6c500360200200341bc066a22044200370200200341b8066a418883c000360200200341fc066a200341b0046a41086a29030037020020034184076a200341c0046a29030037020020034198066a41f4006a200341b0046a41186a290300370200200342083702dc062003428080808080013702cc06200341003602b406200341003602a806200320032903b0043702f40620032802f8012105200329038002210b2003200341f0076a3602f006200320034194066a3602ec062003200341d0046a3602e8062003200b420020051b3703a0062003200a420020021b37039806200341b0096a20034198066a201a201e20034198076a200341f0036a200f200710da0141012112200341b0096a41086a22062802002102024020032802b409410020032d00b0094101461b22050d002006200429020037030020034188086a41086a200341bc096a280200360200200320032902b4063703b009200320032902b40937038808200341d80a6a20034188086a10d40120032802d006220e20032802d806220641e8006c6a210920032802d4062110200e2104024002402006450d00200341b9096a210c200e21040240034020042d0000210620034188086a200441016a41d70010ce041a20064106460d01200441d8006a2800002118200441dc006a2800002119200441e0006a2800002108200320063a00b8092003410b3a00b009200c20034188086a41d70010ce041a20182008200341b0096a10880102402019450d00201810290b200441e8006a22042009470d000c030b0b200441e8006a21040b20042009460d00034020042d000022064106460d01200441286a2800002118200441246a28000021190240200441dc006a280000450d00200441d8006a28000010290b024020064105490d002018450d00201910290b200441e8006a22042009470d000b0b410021122010450d00200e10290b200341b0046a20032903980720032903a00720032903a80720034198076a41186a290300201b202d10f80220032802dc06221120032802e406220641a8016c6a210e20032802e00621132011210402402006450d00200341b9096a2106200341b8076a4102722118200341b0096a4104722110201121040240034020034190046a41186a2208200441186a29030037030020034190046a41106a2209200441106a29030037030020034190046a41086a220c200441086a2903003703002003200429030037039004200441206a280200211920034188086a200441246a41840110ce041a20194112460d01200320193602b009201020034188086a41840110ce041a2018200329039004370000201841086a200c290300370000201841106a2009290300370000201841186a200829030037000020034180023b01b807200341f0016a200341b0096a200341b8076a10ad0220032802f00121192006200329039004370000200641086a200c290300370000200641106a2009290300370000200641186a2008290300370000200341043a00b8092003410b3a00b00920032019453a00d90941b8d6c5004100200341b0096a108801200441a8016a2204200e470d000b200e21040c010b200441a8016a21040b02402004200e460d00200341b0096a41206a210c200341b0096a41246a21100340200341b8076a41186a2218200441186a290300370300200341b8076a41106a2219200441106a290300370300200341b8076a41086a2208200441086a290300370300200320042903003703b807200441206a2802002106200341b0096a200441246a41840110ce041a20064112460d0120034190096a41186a2209201829030037030020034190096a41106a2218201929030037030020034190096a41086a22192008290300370300200320032903b8073703900920034188086a200341b0096a41840110ce041a200341b0096a41186a2009290300370300200341b0096a41106a2018290300370300200341b0096a41086a201929030037030020032003290390093703b009200320063602d009201020034188086a41840110ce041a200c103d200441a8016a2204200e470d000b0b02402013450d00201110290b024020032802a8062204450d00200341ac066a280200450d00200410290b2012450d00200341b8066a280200210420032802c00621080240024020032802bc0622180d00200421060c010b2018211920042106034020062802880b21062019417f6a22190d000b0340200420042f01064102746a41880b6a28020021042018417f6a22180d000b0b200341cc096a20042f0106360200200341c8096a4100360200200341c4096a2004360200200320083602d009200341003602c009200342003703b809200320063602b409200341003602b009200341b0096a10d901024020032802d8062206450d0020032802d0062104200641e8006c210603400240200441dc006a280200450d00200441d8006a28020010290b024020042d00004105490d00200441286a280200450d00200441246a28020010290b200441e8006a2104200641987f6a22060d000b0b20032802d406450d0020032802d00610290b200d450d010b200f10290b410021194101210641012118410121080c0f0b200320053a00c005200320043602bc05200320063602b805200320183602b405200320193602b0052003200c3602ac052003200d3602a8052003200a3703a0052003200b370398052003202d370390052003202f370388052003203037038005200320313703f804200320323703f004200320333703e804200320343703e004200320353703d804200320363703d004200341d0056a420037030020034180066a4200370300200341f0056a4200370300200341e0056a4200370300200341d0046a41f4006a200328008b0836000020034280888080808010370388062003428080e983b1de163703c80520034280a094a58d1d3703f80520034280a094a58d1d3703e80520034280a094a58d1d3703d80520032003280288083600c1052003200341d0046a3602f0072003200341d0046a3602f00320034188016a41ceecc200410d109401200329039001210a2003280288012102200341f8006a41888dc300410d109401200341e4066a4100360200200341d4066a4200370200200341c8066a41e48cc300360200200341c4066a41b8d6c500360200200341bc066a4200370200200341b8066a418883c000360200200341fc066a200341b0046a41086a29030037020020034184076a200341c0046a29030037020020034198066a41f4006a200341c8046a290300370200200342083702dc062003428080808080013702cc06200341003602b406200341003602a806200320032903b0043702f40620032802782105200329038001210b2003200341f0036a3602f0062003200341f0076a3602ec062003200341d0046a3602e8062003200b420020051b3703a0062003200a420020021b370398062003201e3703c8092003201f3a00c709200320203a00c609200320213b01c409200320223a00c309200320233a00c209200320243b01c009200320253a00bf09200320263a00be09200320273b01bc09200320283a00bb09200320293600b709200320093600b3092003202a3a00b2092003202b3b01b009200341003602c007200342013703b80720034188086a20034198066a200341b0096a201b201a20034198076a200e201d200341b8076a10e1014101211220034188086a41086a2802002102200328028c08210502402003280288084101460d0002402002450d00200510290b200341b0096a41086a200341bc066a29020037030020034188086a41086a200341bc096a280200360200200320032902b4063703b009200320032902b40937038808200341d80a6a20034188086a10d40120032802d006220d20032802d806220441e8006c6a210920032802d406210f200d2105024002402004450d00200341b9096a210c200d21050240034020052d0000210420034188086a200541016a41d70010ce041a20044106460d01200541d8006a2800002106200541dc006a2800002118200541e0006a2800002119200320043a00b8092003410b3a00b009200c20034188086a41d70010ce041a20062019200341b0096a10880102402018450d00200610290b200541e8006a22052009470d000c030b0b200541e8006a21050b20052009460d00034020052d000022044106460d01200541286a2800002106200541246a28000021180240200541dc006a280000450d00200541d8006a28000010290b024020044105490d002006450d00201810290b200541e8006a22052009470d000b0b0240200f450d00200d10290b41002105410021120b200341b0046a20032903980720032903a00720032903a80720034198076a41186a290300202c202e10f80220032802dc06221120032802e406220641a8016c6a210f20032802e00621132011210402402006450d00200341b9096a2106200341b8076a4102722118200341b0096a4104722110201121040240034020034190046a41186a2209200441186a29030037030020034190046a41106a220c200441106a29030037030020034190046a41086a220d200441086a2903003703002003200429030037039004200441206a280200211920034188086a200441246a41840110ce041a20194112460d01200320193602b009201020034188086a41840110ce041a2018200329039004370000201841086a200d290300370000201841106a200c290300370000201841186a200929030037000020034180023b01b807200341f0006a200341b0096a200341b8076a10ad02200328027021192006200329039004370000200641086a200d290300370000200641106a200c290300370000200641186a2009290300370000200341043a00b8092003410b3a00b00920032019453a00d90941b8d6c5004100200341b0096a108801200441a8016a2204200f470d000b200f21040c010b200441a8016a21040b02402004200f460d00200341b0096a41206a210d200341b0096a41246a21100340200341b8076a41186a2218200441186a290300370300200341b8076a41106a2219200441106a290300370300200341b8076a41086a2209200441086a290300370300200320042903003703b807200441206a2802002106200341b0096a200441246a41840110ce041a20064112460d0120034190096a41186a220c201829030037030020034190096a41106a2218201929030037030020034190096a41086a22192009290300370300200320032903b8073703900920034188086a200341b0096a41840110ce041a200341b0096a41186a200c290300370300200341b0096a41106a2018290300370300200341b0096a41086a201929030037030020032003290390093703b009200320063602d009201020034188086a41840110ce041a200d103d200441a8016a2204200f470d000b0b02402013450d00201110290b024020032802a8062204450d00200341ac066a280200450d00200410290b2012450d00200341b8066a280200210420032802c00621090240024020032802bc0622180d00200421060c010b2018211920042106034020062802880b21062019417f6a22190d000b0340200420042f01064102746a41880b6a28020021042018417f6a22180d000b0b200341cc096a20042f0106360200200341c8096a4100360200200341c4096a2004360200200320093602d009200341003602c009200342003703b809200320063602b409200341003602b009200341b0096a10d901024020032802d8062206450d0020032802d0062104200641e8006c210603400240200441dc006a280200450d00200441d8006a28020010290b024020042d00004105490d00200441286a280200450d00200441246a28020010290b200441e8006a2104200641987f6a22060d000b0b20032802d406450d0020032802d00610290b41002118410121062008450d0c200e10290c0c0b200341e0006a41e887c500411110940102404280ade20420032903687d4280ade20420032802601b200a5a0d0041dbeac2002105411b21020c090b200341c8006a41b793c20041111086014200211e0240024020032903504201200328024822021b220b200341d8006a290300420020021b221a8450450d004200211b0c010b200341286a201a4200200a420010d304200341386a200b4200200a420010d304200341186a42004200200b420010d30402402003290330200329032084420052200341c0006a290300221e200329032820032903187c7c221b201e5472450d0041f6eac2002105412721020c0a0b2003290338211e0b200341d0046a20034198066a201e201b4108109001024020032802d0044101470d0020032802d804210220032802d40421050c090b200341086a20032903b00942002007ad420010d3044200200a427f200329030820032903104200521b7d221e201e200a5622021b212c200341e0046a290300211b20032903d804211e02402002450d0041cde1c1002105412c21020c070b200341d0046a20092007200341b0096a108502024020032802d0044101470d00200341d8046a280200210220032802d40421050c070b20034190096a41186a2205200341d0046a410472220241186a28020036020020034190096a41106a2204200241106a29020037030020034190096a41086a2218200241086a2902003703002003200229020037039009200341d0046a41186a22024200370300200341d0046a41106a4200370300200341d0046a41086a4200370300200342003703d00420092007200341d0046a1000200341f0036a41026a20032d00d20422193a0000200341b0046a41086a220c200341e3046a290000370300200341b0046a410d6a220d2002290000370000200320032f01d004220e3b01f003200320032900db04222d3703b00420032800d304210620032800d704210220034190046a41026a20193a000020034198076a41086a200c29030037030020034198076a410d6a200d2900003700002003200e3b0190042003202d37039807200341b8076a41186a2005280200360200200341b8076a41106a2004290300370300200341b8076a41086a201829030037030020032003290390093703b807411410272205450d01200541106a410028009c9342360000200541086a410029009493423700002005410029008c934237000020054114413410282205450d02200520032f0190043b00142005200236001b20052006360017200520032903980737001f200541166a20034190046a41026a22042d00003a0000200541276a20034198076a41086a2903003700002005412c6a20034198076a410d6a290000370000200341d0046a41186a22184200370300200341d0046a41106a22194200370300200341d0046a41086a220c4200370300200342003703d00420054134200341d0046a100020034188086a41186a201829030037030020034188086a41106a201929030037030020034188086a41086a200c290300370300200320032903d00437038808200341203602d404200320034188086a3602d004200341b8076a200341d0046a105b200510290240200341b8076a41106a280200450d0020032802c40710290b2004200341f0036a41026a2d00003a0000200341b8076a41086a200341b0046a41086a290300370300200341b8076a410d6a200341b0046a410d6a290000370000200320032f01f0033b019004200320032903b0043703b807411510272205450d032005410d6a41002900ce9242370000200541086a41002900c99242370000200541002900c1924237000020054115413510282205450d04200520032f0190043b00152005200236001c20052006360018200520032903b807370020200541176a20034192046a2d00003a0000200541286a200341b8076a41086a2903003700002005412d6a200341b8076a410d6a290000370000200341d0046a41186a22044200370300200341d0046a41106a22184200370300200341d0046a41086a22194200370300200342003703d00420054135200341d0046a100020034188086a41186a200429030037030020034188086a41106a201829030037030020034188086a41086a2019290300370300200320032903d00437038808200341003602d804200342013703d004200320073602980720034198076a200341d0046a10300240024020032802d404221920032802d80422186b2007490d0020032802d00421040c010b201820076a22042018490d012019410174220c20042004200c491b220c4100480d010240024020190d00200c102721040c010b20032802d0042019200c102821040b2004450d062003200c3602d404200320043602d004200c21190b200420186a2009200710ce041a20034188086a41202004201820076a100302402019450d00200410290b2005102902402008450d00200910290b20034198076a41026a2205200341f0036a41026a2d00003a000020034188086a41086a2204200341b0046a41086a29030037030020034188086a410d6a2218200341b0046a410d6a290000370000200320032f01f0033b019807200320032903b00437038808200341d0046a41086a41023a0000200341e0046a2002360200200341dc046a20063602002003410b3a00d004200341d9046a20032f0198073b0000200341d0046a410b6a20052d00003a0000200341e4046a200329038808370200200341ec046a2004290300370200200341f1046a20182900003700004100210541b8d6c5004100200341d0046a10880120034198066a200a202c200b201a201e201b10f8020c070b102b000b41144101102a000b41344101102a000b41154101102a000b41354101102a000b200c4101102a000b02402008450d00200910290b20034198066a200a202c200b201a201e201b10f8020b41012118410021060c030b41012118410021062008450d02200910290c020b0b41012106410121180b41012119410121080b02400240024020012d0000220441064b0d00024002400240024020040e0706060001020603060b2006450d05200141086a280200450d05200141046a28020010290c050b2018450d042001412c6a280200450d04200141286a28020010290c040b2019450d03200141286a280200450d03200141246a28020010290c030b20080d010c020b200141c8006a280200450d01200141c4006a28020010290c010b200141c8006a280200450d00200141c4006a28020010290b2000200236020420002005360200200341e00a6a24000b3400200041d0f4c10036020420004100360200200041146a4101360200200041106a4180f9c100360200200041086a42043702000b130020004102360204200041dcf4c1003602000b950101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120102722060d0041204101102a000b20062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000bb014030c7f017e017f230041e0006b2201240020014100360208200142043703000240024002400240024002400240024002400240024002400240024002400240200041106a28020041246c22020d004104210341002104410021050c010b20002802082106410421034100210441002107410021050340024020062d00004101470d00200641106a2802002208417f4c0d03200641016a28000021090240024020080d004101210a0c010b200641086a280200210b20081027220a450d05200a200b200810ce041a0b200141c0006a41086a220c200141206a41086a29020037030020012001290220370340024020052007470d00024020042007460d00200421070c010b200441016a220b2004490d1020044101742207200b200b2007491b2207ad42247e220d422088a70d10200da7220b4100480d100240024020040d00200b102721030c010b2003200441246c200b102821030b2003450d062001200736020420012003360200200721040b2003200541246c6a220b2008360210200b200836020c200b200a360208200b2009360001200b41013a0000200b2001290340370214200b411c6a200c2903003702002001200541016a22053602080b200641246a21062002415c6a22020d000b0b2001410036024041ff88c3004110200141c0006a41041003200141c0006a41086a220642003703002001420037034041888dc300410d200141c0006a1004200141206a41086a220b20062903003703002001200129034037032020012000290300220d370340200141206a4110200141c0006a41081003200642003703002001420037034041aa8dc300410d200141c0006a1004200b200629030037030020012001290340370320200141103602442001200141206a3602402001200141c0006a105c200642003703002001420037034041d18fc3004111200141c0006a1004200b200629030037030020012001290340370320200141206a4110200041146a220241201003411010272206450d03200641086a41002900bf8d43370000200641002900b78d433700002006411041201028220b450d04200b200d427f7c370010200141c0006a41186a22084200370300200141c0006a41106a220a4200370300200141c0006a41086a2206420037030020014200370340200b4118200141c0006a1000200141206a41186a2008290300370300200141206a41106a200a290300370300200141206a41086a2208200629030037030020012001290340370320200141206a4120200241201003200b1029200642003703002001420037034041958dc3004115200141c0006a10042008200629030037030020012001290340370320200141206a4110200041d4006a41201003200642003703002001420037034041e28fc3004115200141c0006a10042008200629030037030020012001290340370320200141106a200141206a10ba020240200128021422060d002001410136020c4100210b4100210e410021080c070b2001200636020c20012c001021082001280218210e2001411c6a280200220b41d100490d06200141c0006a41186a220a2000412c6a290000370300200141c0006a41106a2207200041246a290000370300200141c0006a41086a22092000411c6a29000037030020012000290014370340200b20084d0d05200620084105746a22022001290340370000200241186a200a290300370000200241106a2007290300370000200241086a2009290300370000200841187441808080086a41187541d1006f21080c070b1039000b20084101102a000b200b4104102a000b41104101102a000b41204101102a000b41f88fc3002008200b1037000b200141d8006a2000412c6a290000370300200141d0006a200041246a290000370300200141c8006a2000411c6a2900003703002001200029001437034002400240200b200e460d00200128020c21060c010b200b41016a2206200b490d06200b4101742202200620062002491b220e41ffffff3f71200e470d06200e41057422024100480d0602400240200b0d002002102721060c010b200128020c200b4105742002102821060b2006450d022001200636020c0b2006200b4105746a22022001290340370000200241186a200141c0006a41186a290300370000200241106a200141c0006a41106a290300370000200241086a200141c0006a41086a290300370000200b41016a210b0b200141c0006a41086a220242003703002001420037034041e28fc3004115200141c0006a1004200141206a41086a2002290300370300200120012903403703202001410036024820014201370340410110272202450d01200220083a00002001428180808010370244200120023602402001200b360210200b4105742109200141106a200141c0006a103041002001280248220b6b2102200128024021072001280244210a03400240200a20026a411f4b0d00200b41206a2208200b490d06200a410174220c20082008200c491b22084100480d0602400240200a0d002008102721070c010b2007200a2008102821070b2007450d072008210a0b2007200b6a22082006290000370000200841186a200641186a290000370000200841106a200641106a290000370000200841086a200641086a290000370000200241606a2102200b41206a210b200641206a2106200941606a22090d000b200141206a41102007200b10030240200a450d00200710290b0240200e450d00200128020c10290b200141c0006a41086a2206420037030020014200370340418890c300410d200141c0006a1004200141206a41086a2208200629030037030020012001290340370320200141206a4110100c20064200370300200142003703404187cec5004111200141c0006a10042008200629030037030020012001290340370320200141206a4110100c41121027220b450d02200b41106a41002f00a590433b0000200b41086a410029009d9043370000200b41002900959043370000200141c0006a41186a22024200370300200141c0006a41106a220a42003703002006420037030020014200370340200b4112200141c0006a1000200141206a41186a22072002290300370300200141206a41106a200a2903003703002008200629030037030020012001290340370320412010272206450d0320062001290320370000200641186a2007290300370000200641106a200141206a41106a290300370000200641086a200141206a41086a290300370000200b102920064120100e20061029200029030010bb0202402005450d00200541246c210b2003210603400240024020062d0000220841034b0d0002400240024020080e0404000102040b2006410c6a280200450d03200641086a28020010290c030b2006410c6a280200450d02200641086a28020010290c020b2006410c6a280200450d01200641086a28020010290c010b200641086a280200450d00200641046a28020010290b200641246a2106200b415c6a220b0d000b0b02402004450d00200310290b200141e0006a24000f0b20024101102a000b41014101102a000b41124101102a000b41204101102a000b102b000b20084101102a000b9d0202057f017e230041306b220224002002410036022020014110200241206a100521010240024002400240024020022802202203417f460d0020010d010b200041003602040c010b2002200136021020022003360214200241003a0020200241206a20012003410047220410ce041a20032004490d012002200320046b3602142002200120046a3602102003450d0220022d00202103200241206a200241106a102d20022802202204450d022002410c6a41026a2002411d6a41026a2d000022053a0000200220022f001d22063b010c20022902242107200020033a0000200020063b0001200041036a20053a00002000200737020820002004360204200110290b200241306a24000f0b20042003103e000b418f89c3004133104e000b93b10108047f017e207f017e057f037e127f0c7e230041c00c6b2201240020014198056a41086a22024200370300200142003703980541aa8dc300410d20014198056a1004200141d8076a41086a200229030037030020012001290398053703d807200141003602980b200141d8076a4110200141980b6a100521020240024002400240024002400240024002400240024020012802980b2203417f460d002002450d00200120033602bc06200120023602b806200141980b6a200141b8066a104320012802980b2204450d02200129029c0b210502402003450d00200210290b20042005422088a7220641246c22076a2103200421020240200741ed00490d00200141980b6a41086a2108200421020340024020022d00004101470d00200241016a2800002107200241086a28020021092001200241106a2802003602840a200120093602800a0240200741c28289aa04460d00200142003703980b0c010b200141980b6a200141800a6a10880220012903980b4201520d00200141d8076a200841f00010ce041a200141b8066a200141d8076a41f00010ce041a200141b8066a21020c060b0240200241246a2d00004101470d00200241256a28000021072002412c6a28020021092001200241346a2802003602840a200120093602800a0240200741c28289aa04460d00200142003703980b0c010b200141980b6a200141800a6a10880220012903980b4201520d00200141d8076a200841f00010ce041a200141b8066a200141d8076a41f00010ce041a200141b8066a21020c060b0240200241c8006a2d00004101470d00200241c9006a2800002107200241d0006a28020021092001200241d8006a2802003602840a200120093602800a0240200741c28289aa04460d00200142003703980b0c010b200141980b6a200141800a6a10880220012903980b4201520d00200141d8076a200841f00010ce041a200141b8066a200141d8076a41f00010ce041a200141b8066a21020c060b0240200241ec006a2d00004101470d00200241ed006a2800002107200241f4006a28020021092001200241fc006a2802003602840a200120093602800a0240200741c28289aa04460d00200142003703980b0c010b200141980b6a200141800a6a10880220012903980b4201520d00200141d8076a200841f00010ce041a200141b8066a200141d8076a41f00010ce041a200141b8066a21020c060b200320024190016a22026b41ec004b0d000b0b20022003460d012004200641246c6a2103200141980b6a41086a21060340024020022d00004101470d00200241016a2800002107200241086a28020021092001200241106a2802003602840a200120093602800a0240200741c28289aa04460d00200142003703980b0c010b200141980b6a200141800a6a10880220012903980b4201520d00200141d8076a200641f00010ce041a200141b8066a200141d8076a41f00010ce041a200141b8066a21020c050b2003200241246a2202470d000c020b0b42002105410421040b02402005422088a72202450d00200241246c21032004210203400240024020022d0000220741034d0d00200241086a280200450d01200241046a28020010290c010b02400240024020070e0403000102030b2002410c6a280200450d02200241086a28020010290c020b2002410c6a280200450d01200241086a28020010290c010b2002410c6a280200450d00200241086a28020010290b200241246a21022003415c6a22030d000b0b2005a70d020c030b418f89c3004133104e000b20022d002f210720022d002e210920022d002d210620022d002c210820022d002b210a20022d002a210b20022d0029210c20022d0028210d20022d0027210e20022d0026210f20022d0025211020022d0024211120022d0023211220022d0022211320022d0021211420022d0020211520022d001f211620022d001e211720022d001d211820022d001c211920022d001b211a20022d001a211b20022d0019211c20022d0018211d20022d0017211e20022d0016211f20022d0015212020022d0014212120022d0013212220022d0012212320022d0011212420022d0010212520022903002126200141b8046a41e2c5c50041131094010240024020012903c004500d0020012802b8040d010b20014198056a41086a22024200370300200142003703980541e2c5c500411320014198056a1004200141d8076a41086a200229030037030020012001290398053703d807200120263703980b200141d8076a4110200141980b6a410810030b20014198056a41086a22024200370300200142003703980541f5c5c500411020014198056a1004200141d8076a41086a200229030037030020012001290398053703d807200120263703980b200141d8076a4110200141980b6a4108100320024200370300200142003703980541a7c6c500411620014198056a1004200141b8066a41086a200229030037030020012001290398053703b806200141003602980b200141b8066a4110200141980b6a100521020240024020012802980b2203417f460d002002450d00200141980b6a2003412020034120491b22276a41004100412020276b2027411f4b1b10cd041a200141980b6a2002202710ce041a2003411f4d0d04200141d8076a41186a2203200141980b6a41186a2227290000370300200141d8076a41106a2228200141980b6a41106a2229290000370300200141d8076a41086a222a200141980b6a41086a222b290000370300200120012900980b3703d8072002102920272003290300222637030020292028290300222c370300202b202a290300222d370300200120012903d807222e3703980b2026a72102202ca72103202da72127202ea7212820012d00af0b212920012d00ae0b212a20012d00ad0b212b20012d00ac0b212f20012d00ab0b213020012d00aa0b213120012d00a90b213220012d00a70b213320012d00a60b213420012d00a50b213520012d00a40b213620012d00a30b213720012d00a20b213820012d00a10b213920012d009f0b213a20012d009e0b213b20012d009d0b213c20012d009c0b213d20012d009b0b213e20012d009a0b213f20012d00990b21400c010b200141a00b6a4200370300200141a80b6a4200370300200141b00b6a4200370300200142003703980b41002102410021294100212a4100212b4100212f4100213041002131410021324100210341002133410021344100213541002136410021374100213841002139410021274100213a4100213b4100213c4100213d4100213e4100213f41002140410021280b20012002200d733a00b00b20012029200e733a00af0b2001202a200f733a00ae0b2001202b2010733a00ad0b2001202f2011733a00ac0b200120302012733a00ab0b200120312013733a00aa0b200120322014733a00a90b200120032015733a00a80b200120332016733a00a70b200120342017733a00a60b200120352018733a00a50b200120362019733a00a40b20012037201a733a00a30b20012038201b733a00a20b20012039201c733a00a10b20012027201d733a00a00b2001203a201e733a009f0b2001203b201f733a009e0b2001203c2020733a009d0b2001203d2021733a009c0b2001203e2022733a009b0b2001203f2023733a009a0b200120402024733a00990b200120282025733a00980b200120012d00b10b200c733a00b10b200120012d00b20b200b733a00b20b200120012d00b30b200a733a00b30b200120012d00b40b2008733a00b40b200120012d00b50b2006733a00b50b200120012d00b60b2009733a00b60b200120012d00b70b2007733a00b70b20014198056a41086a22024200370300200142003703980541a7c6c500411620014198056a1004200141d8076a41086a200229030037030020012001290398053703d807200141d8076a4110200141980b6a4120100302402005422088a72202450d00200241246c21032004210203400240024020022d0000220741034b0d0002400240024020070e0404000102040b2002410c6a280200450d03200241086a28020010290c030b2002410c6a280200450d02200241086a28020010290c020b2002410c6a280200450d01200241086a28020010290c010b200241086a280200450d00200241046a28020010290b200241246a21022003415c6a22030d000b0b2005a7450d010b200410290b20014198056a41086a220242003703002001420037039805418bf4c200411120014198056a100420014188066a41086a2002290300370300200120012903980537038806200141003602980b20014188066a4110200141980b6a100521020240024020012802980b2203417f460d002002450d00200120033602dc07200120023602d807200141980b6a200141d8076a104620012802980b2204450d03200129029c0b21052003450d01200210290c010b41082104420021050b20042005422088a7220641c8006c22026a21090240200241d9014f0d0041002102200421030c040b200441e0016a21034100210203400240200341a07e6a22072d00004101460d00200341a87e6a29030020005a0d060b0240200741c8006a2d00004101460d00200341f07e6a2903002000540d00200241016a21020c060b024020074190016a2d00004101460d00200341b87f6a2903002000540d00200241026a21020c060b02400240200741d8016a2d00004101460d00200329030020005a0d010b200341a0026a2103200241046a21022009200741a0026a6b41d8014d0d040c010b0b200241036a21020c040b418f89c3004133104e000b418f89c3004133104e000b200341a07e6a21030b20032009460d002004200641c8006c6a21070340024020032d00004101460d00200341086a29030020005a0d020b200241016a21022007200341c8006a2203470d000b0b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200220064b0d000240200620026b2203450d002002450d0020042004200241c8006c6a200341c8006c10cf041a0b200141003a00980b20014198056a41086a22024200370300200142003703980541fcc7c500411720014198056a100420014188066a41086a200229030037030020012001290398053703880620014188066a4110200141980b6a41011003200141d8076a109801200141980b6a41186a200141d8076a41186a290300370300200141980b6a41106a200141d8076a41106a290300370300200141980b6a41086a2202200141d8076a41086a290300370300200120012903d8073703980b200141980b6a411410960302402005a7450d00200410290b20024200370300200142003703980b41f5c5c5004110200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602980b200141e8056a4110200141980b6a1005210202400240024020012802980b2203417f470d00420021050c010b024020020d00420021050c010b200142003703980b200141980b6a20022003410820034108491b10ce041a200341074d0d0120012903980b2105200210290b42002126200141980b6a41086a22024200370300200142003703980b41e2c5c5004113200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602980b200141e8056a4110200141980b6a100521020240024020012802980b2203417f460d002002450d00200142003703980b200141980b6a20022003410820034108491b10ce041a200341074d0d0120012903980b2126200210290b4200200520267d222620262005561b42eb02540d07200141b0046a4193c8c500411410b50120012802b404211c20012802b004211d200141980b6a41086a22024200370300200142003703980b41b6c8c5004115200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602980b200141e8056a4110200141980b6a10052102024002400240024020012802980b2203417f470d00410221190c010b024020020d00410221190c010b200141003a00980b200141980b6a20022003410047220710ce041a20032007490d022003450d0120012d00980b2119200210290b41a7c8c500410f108a02211f200141980b6a41086a22024200370300200142003703980b4190e1c1004112200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602980b200141e8056a4110200141980b6a1005211a0240024002400240024002400240024002400240024002400240024020012802980b221b417f460d00201a450d002001201b3602dc052001201a3602d805200141a8046a200141d8056a102e20012802a804450d2b0240024020012802ac042218412a2018412a491b22170d004101210e0c010b201741e0006c22021027220e450d0e0b02402018450d00200141980b6a41206a2102200141b8066a41206a210920012802d805210420012802dc0521074100210b4100210a410021080340200141f8046a2007412020074120491b22036a41004100412020036b2003411f4b1b10cd041a200141f8046a2004200310ce041a2001200420036a22063602d805200720036b21040240024002402007411f4b0d00200120043602dc050c010b200141d8046a41186a2210200141f8046a41186a220c290000370300200141d8046a41106a2211200141f8046a41106a220d290000370300200141d8046a41086a2212200141f8046a41086a220f290000370300200120012900f8043703d804200141f8046a2004412020044120491b22036a41004100412020036b2003411f4b1b10cd041a200141f8046a2006200310ce041a2001200620036a22073602d805200420036b210602402004411f4b0d00200120063602dc050c010b20014198056a41086a2213200f29000037030020014198056a41106a2214200d29000037030020014198056a41186a2215200c290000370300200120012900f80422053703b8052001200537039805200141f8046a2006412020064120491b22036a41004100412020036b2003411f4b1b10cd041a200141f8046a2007200310ce041a2001200720036a22043602d805200620036b21072006411f4b0d01200120073602dc050b2017450d2e200e10290c2e0b200841016a2103200141f8086a41086a2206200f290000370300200141f8086a41106a220f200d290000370300200141f8086a41186a220d200c290000370300200141b8066a41186a220c2015290300370300200141b8066a41106a22152014290300370300200141b8066a41086a22142013290300370300200120012900f80422053703b805200120053703f80820012001290398053703b806200920012903f808370000200941086a2006290300370000200941106a200f290300370000200941186a200d290300370000200141800a6a41386a2206200141b8066a41386a290300370300200141800a6a41306a220d200141b8066a41306a290300370300200141800a6a41286a220f200141b8066a41286a290300370300200141800a6a41206a22132009290300370300200141800a6a41186a2216200c290300370300200141800a6a41106a220c2015290300370300200141800a6a41086a22152014290300370300200120012903b8063703800a200141980b6a41186a2010290300370300200141980b6a41106a2011290300370300200141980b6a41086a2012290300370300200120012903d8043703980b200220012903800a370000200241086a2015290300370000200241106a200c290300370000200241186a2016290300370000200241206a2013290300370000200241286a200f290300370000200241306a200d290300370000200241386a2006290300370000200141d8076a200141980b6a41e00010ce041a024020082017470d00200b20032003200b491b2217ad42e0007e2205422088a70d2d2005a722064100480d2d0240024020080d0020061027210e0c010b200e200a20061028210e0b200e450d050b200e200a6a200141d8076a41e00010ce041a200b41026a210b200a41e0006a210a2003210820182003470d000b200120073602dc050b200e450d2b201b450d01201a10290c010b4101210e41002118410021170b4100210702400240201841e0006c22020d004101211b4100211e0c010b200241e0006e221e41057422031027221b450d0b0b0240200e200e20026a22164622140d00201841e0006c210941002107201b2102200e2103034020022003290000370000200241186a200341186a290000370000200241106a200341106a290000370000200241086a200341086a290000370000200741016a2107200241206a2102200341e0006a2103200941a07f6a22090d000b0b200141980b6a41086a22024200370300200142003703980b41abccc1004112200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602a00b200142013703980b200120073602d807200141d8076a200141980b6a10300240024020070d0020012802a00b2103200128029c0b210420012802980b21060c010b20074105742108410020012802a00b22036b210920012802980b2106200128029c0b2104201b210203400240200420096a411f4b0d00200341206a22072003490d2b2004410174220a20072007200a491b22074100480d2b0240024020040d002007102721060c010b200620042007102821060b2006450d04200721040b200620036a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200941606a2109200341206a2103200241206a2102200841606a22080d000b2001200436029c0b200120033602a00b200120063602980b0b201c4100201d1b2102200141e8056a411020062003100302402004450d00200610290b200141c8046a200241026a10a4030240024020012802c804221a0d00200141980b6a41086a22034200370300200142003703980b41abccc1004112200141980b6a1004200141e8056a41086a2003290300370300200120012903980b3703e805200141003602980b200141e8056a4110200141980b6a100521070240024020012802980b2209417f460d002007450d00200120093602dc07200120073602d807200141980b6a200141d8076a102d20012802980b220f450d0d200141a00b6a2802002103200128029c0b21102009450d01200710290c010b4101210f41002103410021100b201f201f41ff01714102477121114100211c0c010b200141d0046a28020021034101211c20012802cc042110201a210f410121110b200141980b6a41086a22074200370300200142003703980b4193c8c5004114200141980b6a1004200141e8056a41086a2007290300370300200120012903980b3703e805410121122001200241016a22133602980b200141e8056a4110200141980b6a410410034100210b02400240200341057422020d004100211d0c010b2002410575221dad42e0007e2205422088a70d292005a722074100480d29200710272212450d090b0240200f20026a200f460d0020034105742104200141d8076a4101722107200141980b6a41206a21024100210b20122106200f21030340200341086a2900002105200341106a29000021262003290000212c200141b8066a41186a2208200341186a290000370300200141b8066a41106a220a2026370300200141b8066a41086a220c20053703002001202c3703b806200141f8086a200141b8066a108d01200141d8076a20012802f808220d200128028009108e0141002109024020012d00d8074101470d00200141800a6a41386a200741386a290000370300200141800a6a41306a200741306a290000370300200141800a6a41286a200741286a290000370300200141800a6a41206a200741206a290000370300200141800a6a41186a200741186a290000370300200141800a6a41106a200741106a290000370300200141800a6a41086a200741086a290000370300200120072900003703800a410121090b024020012802fc08450d00200d10290b0240024020090d00200141d8076a41386a4200370300200141d8076a41306a4200370300200141d8076a41286a4200370300200141d8076a41206a4200370300200141d8076a41186a4200370300200141d8076a41106a4200370300200141d8076a41086a4200370300200142003703d8070c010b200141d8076a41386a200141800a6a41386a290300370300200141d8076a41306a200141800a6a41306a290300370300200141d8076a41286a200141800a6a41286a290300370300200141d8076a41206a200141800a6a41206a290300370300200141d8076a41186a200141800a6a41186a290300370300200141d8076a41106a200141800a6a41106a290300370300200141d8076a41086a200141800a6a41086a290300370300200120012903800a3703d8070b200341206a2103200220012903d807370000200141980b6a41086a200c290300370300200141980b6a41106a200a290300370300200141980b6a41186a2008290300370300200241086a200141d8076a41086a290300370000200241106a200141d8076a41106a290300370000200241186a200141d8076a41186a290300370000200241206a200141d8076a41206a290300370000200241286a200141d8076a41286a290300370000200241306a200141d8076a41306a290300370000200241386a200141d8076a41386a290300370000200120012903b8063703980b200b41016a210b2006200141980b6a41e00010ce0441e0006a2106200441606a22040d000b0b02402010450d00200f10290b200bad42e0007e2205422088a70d072005a72202417f4c0d070240024020020d004101210c0c010b20021027220c450d070b410021090240200b450d002012200b41e0006c6a2106200141980b6a41c0006a2103200141980b6a41206a210741002109200c2104201221020340200141980b6a41186a200241186a290000370300200141980b6a41106a200241106a290000370300200141980b6a41086a200241086a290000370300200120022900003703980b2007200241206a290000370000200741086a200241286a290000370000200741106a200241306a290000370000200741186a200241386a2900003700002003200241c0006a290000370000200341086a200241c8006a290000370000200341106a200241d0006a290000370000200341186a200241d8006a290000370000200941016a21092004200141980b6a41e00010ce0441e0006a2104200241e0006a22022006470d000b0b200141980b6a41086a22024200370300200142003703980b4190e1c1004112200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141003602a00b200142013703980b200120093602d807200141d8076a200141980b6a10300240024020090d0020012802a00b2102200128029c0b210320012802980b21070c010b200c200941e0006c6a210d410020012802a00b22066b210420012802980b2107200128029c0b2103410021090340200620096a210a0240024002400240200320046a411f4b0d00200a41206a2202200a490d2e20034101742208200220022008491b22024100480d2e0240024020030d002002102721070c010b200720032002102821070b2007450d01200221030b200720066a20096a2208200c20096a2202290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200320046a41606a411f4b0d02200a41206a220f41206a2208200f490d2d2003410174220f20082008200f491b220841004e0d010c2d0b20024101102a000b0240024020030d002008102721070c010b200720032008102821070b2007450d05200821030b200720066a20096a220841386a200241386a290000370000200841306a200241306a290000370000200841286a200241286a290000370000200841206a200241206a2900003700000240200320046a41406a411f4b0d00200a41c0006a220a41206a2208200a490d2b2003410174220a20082008200a491b22084100480d2b0240024020030d002008102721070c010b200720032008102821070b2007450d06200821030b200720066a20096a220841d8006a200241d8006a290000370000200841d0006a200241d0006a290000370000200841c8006a200241c8006a290000370000200841c0006a200241c0006a290000370000200441a07f6a2104200941e0006a2109200241e0006a200d470d000b2001200336029c0b200120073602980b2001200620096a22023602a00b0b200141e8056a411020072002100302402003450d00200710290b0240200b450d00200c10290b200120113a00d807200141980b6a41086a22024200370300200142003703980b41b6c8c5004115200141980b6a1004200141e8056a41086a2002290300370300200120012903980b3703e805200141e8056a4110200141d8076a410110032001201336029c0b200141043a00980b41b8d6c5004100200141980b6a108801410810272203450d05200320163602042003200e3602002019201941ff017141024771450d110240024020140d002003200e41e0006a360200200141980b6a41186a2202200e41386a290000370300200141980b6a41106a2207200e41306a290000370300200141980b6a41086a2209200e41286a2900003703002001200e290020220537039805200120053703980b200e0d010b2003102941002102410821044108210f410021070c140b200141d8076a41186a2002290300370300200141d8076a41106a2007290300370300200141d8076a41086a2009290300370300200120012903980b3703d807200328020420032802006b41e0006e41016a2202ad42287e2205422088a70d072005a7220710272204450d04200420012903d80737030020044201370320200441186a200141d8076a41186a2213290300370300200441106a200141d8076a41106a2214290300370300200441086a200141d8076a41086a22152903003703000240200328020022072003280204470d00410121072004210f0c130b2003200741e0006a36020020014198056a41086a2218200741286a2900002205370300200141980b6a41186a2206200741386a290000370300200141980b6a41106a2208200741306a290000370300200141980b6a41086a220a200537030020012007290020220537039805200120053703980b4102210741c800210903402013200629030022053703002014200829030022263703002015200a290300222c370300200120012903980b222d3703d807200141f8046a41186a220c2005370300200141f8046a41106a220d2026370300200141f8046a41086a220f202c3703002001202d3703f80402400240024002402007417f6a2002460d00200221100c010b200328020420032802006b41e0006e20026a41016a22102002490d2c20024101742211201020102011491b2210ad42287e2205422088a70d2c2005a722114100480d2c0240024020020d002011102721040c010b2004200241286c2011102821040b2004450d010b200420096a221141606a220220012903f804370300200f2903002105200d2903002126200c290300212c20114201370300200241186a202c370300200241106a2026370300200241086a2005370300200328020022022003280204470d012004210f201021020c150b20114108102a000b2003200241e0006a3602002018200241286a29000022053703002006200241386a2900003703002008200241306a290000370300200a200537030020012002290020220537039805200120053703980b200941286a2109200741016a2107201021020c000b0b20064101102a000b20074101102a000b20084101102a000b20084101102a000b20074108102a000b41084104102a000b20024101102a000b1039000b20074101102a000b418f89c3004133104e000b20034101102a000b20024101102a000b418f89c3004133104e000b20072003103e000b418f89c3004133104e000b418f89c3004133104e000b419cb1c5001058000b200310290c020b200310290b200141b8056a41086a22034200370300200142003703b80541c6c4c500411b200141b8056a1004200141980b6a41086a2003290300370300200120012903b8053703980b200141003602d807200141980b6a4110200141d8076a100521030240024020012802d8072206417f460d002003450d00200120063602bc06200120033602b806200141d8076a200141b8066a104120012802d807220d450d14200141e0076a280200210920012802dc0721102006450d01200310290c010b4108210d41002109410021100b0240024020072009470d00200f200d460d01200741286c41286e22032007200720034b1b210c417f2106200f2103200d21090340200641016a2206200c4f0d02024020032009460d0020032009412010d0040d020b200941206a2108200341206a210a200341286a2103200941286a2109200a2903002008290300510d000b0b200141b8056a41086a22034200370300200142003703b8054199a7c1004117200141b8056a1004200141980b6a41086a2003290300370300200120012903b8053703980b200141003602d807200141980b6a4110200141d8076a1005210302400240024020012802d8072209417f460d002003450d00200142003703d807200141d8076a200320094108200941084922061b220410ce041a024020060d0020012903d8072105200142003703d807200141d8076a200320046a200920046b2209410820094108491b10ce041a200941074b0d020b418f89c3004133104e000b200120073602a00b2001200236029c0b200120043602980b200141980b6a42004200200510f6010c010b20012903d807212620031029200141980b6a4110100c200120073602a00b2001200236029c0b2001200f3602980b200141980b6a20054201202610f6010b2010450d01200d10290c010b02402010450d00200d10290b2002450d00200410290b410810272202450d10200220163602042002200e360200410810272203450d0f20032012200b41e0006c6a220f3602042003201236020020014198046a41c3c5c500410f10940120012903a00442002001280298041b220542017c222d2005540d0e200141b8056a41086a22074200370300200142003703b80541c3c5c500410f200141b8056a1004200141b8066a41086a22092007290300370300200120012903b8053703b8062001202d3703980b200141b8066a4110200141980b6a4108100320014184cac10036029c0b200120023602980b2001200141800a6a3602a00b200141d8056a200141980b6a104c200141980b6a41086a200141d8056a41086a280200360200200120012903d8053703980b20074200370300200142003703b80541d2c5c5004110200141b8056a100420092007290300370300200120012903b8053703b806200141103602dc072001200141b8066a3602d807200141980b6a200141d8076a102f0240200128029c0b450d0020012802980b10290b20014188046a41f5c5c500411010940120012903900421052001280288042102200141f8036a41e2c5c5004113109401024042002005420020021b2226200129038004420020012802f8031b22057d222c202c2026561b42eb02540d00034042002026427f200542eb027c222c202c2005541b22057d222c202c2026561b42ea02560d000b0b200141b8056a41086a22024200370300200142003703b80541e2c5c5004113200141b8056a1004200141b8066a41086a2002290300370300200120012903b8053703b806200120053703980b200141b8066a4110200141980b6a41081003202d42017c2205202d540d0d20024200370300200142003703b8054194c6c5004113200141b8056a100420014188066a41086a2002290300370300200120012903b80537038806200141003602980b20014188066a4110200141980b6a100521020240024020012802980b2207417f460d002002450d00200141f8086a2007412020074120491b22096a41004100412020096b2009411f4b1b10cd041a200141f8086a2002200910ce041a2007411f4d0d0e20014198056a41186a2207200141f8086a41186a29030037030020014198056a41106a2209200141f8086a41106a29030037030020014198056a41086a2204200141f8086a41086a290300370300200120012903f8083703980520021029200141d8076a41186a2007290300370300200141d8076a41106a2009290300370300200141d8076a41086a200429030037030020012001290398053703d8070c010b200141e0076a4200370300200141e8076a4200370300200141f0076a4200370300200142003703d8070b200141d8046a41186a200141d8076a41186a290300370300200141d8046a41106a200141d8076a41106a290300370300200141d8046a41086a200141d8076a41086a290300370300200120012903d8073703d804200141b8056a41086a22024200370300200142003703b80541a7c6c5004116200141b8056a100420014198056a41086a2002290300370300200120012903b80537039805200141003602980b20014198056a4110200141980b6a100521020240024020012802980b2207417f460d002002450d0020014188066a2007412020074120491b22096a41004100412020096b2009411f4b1b10cd041a20014188066a2002200910ce041a2007411f4d0d0d200141b8056a41186a220720014188066a41186a290300370300200141b8056a41106a220920014188066a41106a290300370300200141b8056a41086a220420014188066a41086a29030037030020012001290388063703b80520021029200141f8046a41186a2007290300370300200141f8046a41106a2009290300370300200141f8046a41086a2004290300370300200120012903b8053703f8040c010b20014180056a420037030020014188056a420037030020014190056a4200370300200142003703f8040b200141980b6a41186a200141d8046a41186a290300370300200141980b6a41106a200141d8046a41106a290300370300200141980b6a41086a2209200141d8046a41086a290300370300200141c80b6a200141f8046a41086a290300370300200141d00b6a200141f8046a41106a290300370300200141d80b6a200141f8046a41186a290300370300200120012903d8043703980b200120053703b80b200120012903f8043703c00b200141b8056a41186a22074200370300200141b8056a41106a22044200370300200141b8056a41086a22024200370300200142003703b805200141980b6a41c800200141b8056a1000200141f8086a41186a2007290300370300200141f8086a41106a2004290300370300200141f8086a41086a2002290300370300200120012903b8053703f80820024200370300200142003703b80541a7c6c5004116200141b8056a1004200141b8066a41086a22072002290300370300200120012903b8053703b806200141b8066a411041b3b4c3004120100320024200370300200142003703b8054194c6c5004113200141b8056a100420072002290300370300200120012903b8053703b806200141b8066a4110200141f8086a41201003200141e8056a41186a200141d8076a41186a2903002226370300200141e8056a41106a200141d8076a41106a290300222c370300200141e8056a41086a200141d8076a41086a290300222d370300200120012903d807222e3703e80520014188066a41186a202637030020014188066a41106a202c37030020014188066a41086a202d3703002001202e3703880620024200370300200142003703b8054185c6c500410f200141b8056a100420072002290300370300200120012903b8053703b806200141b8066a411020014188066a4120100320014184cac10036029c0b200120033602980b2001200141800a6a3602a00b200141800a6a200141980b6a104c200141e8036a41e2c5c500411310940120012903f003212620012802e803210420024200370300200142003703b8054194c6c5004113200141b8056a100420092002290300370300200120012903b8053703980b200141003602d807200141980b6a4110200141d8076a100521020240024020012802d8072203417f460d002002450d0020014198056a2003412020034120491b22076a41004100412020076b2007411f4b1b10cd041a20014198056a2002200710ce041a2003411f4d0d0c200141f8046a41186a220320014198056a41186a290300370300200141f8046a41106a220720014198056a41106a290300370300200141f8046a41086a220920014198056a41086a29030037030020012001290398053703f80420021029200141f8086a41186a2003290300370300200141f8086a41106a2007290300370300200141f8086a41086a2009290300370300200120012903f8043703f8080c010b20014180096a420037030020014188096a420037030020014190096a4200370300200142003703f8080b200141d8076a41086a200141f8086a41086a290300370300200141d8076a41106a200141f8086a41106a290300370300200141d8076a41186a200141f8086a41186a290300370300200120012903f8083703d80720012802800a210c20012802840a211020012802880a2107200141003602a00b200142013703980b410110272202450d09200142818080801037029c0b200120023602980b200241013a000020024101410910282202450d0820014289808080900137029c0b200120023602980b200220053700010240200128029c0b220920012802a00b22036b41074b0d00200341086a22062003490d1420094101742208200620062008491b22064100480d140240024020090d002006102721020c010b200220092006102821020b2002450d082001200636029c0b200120023602980b0b2001200341086a3602a00b200220036a427f2026420020041b220542eb027c222620262005541b3700000240200128029c0b220920012802a00b22036b41074b0d00200341086a22042003490d1420094101742206200420042006491b22044100480d140240024020090d002004102721020c010b200220092004102821020b2002450d072001200436029c0b200120023602980b0b2001200341086a3602a00b200220036a42eb02370000200120073602b806200141b8066a200141980b6a10300240024020070d00200128029c0b210920012802a00b21020c010b200c200741286c6a210d410020012802a00b220a6b2104200128029c0b2109410021020340200a20026a210602400240200920046a4120490d0020012802980b21070c010b200641206a22032006490d1620094101742207200320032007491b22034100480d160240024020090d002003102721070c010b20012802980b20092003102821070b2007450d082001200336029c0b200120073602980b200321090b2007200a6a20026a220841186a200c20026a220341186a290000370000200841106a200341106a290000370000200841086a200341086a2900003700002001200641206a220b3602a00b20082003290000370000200341206a29030021050240200920046a41606a41074b0d00200b41086a2208200b490d162009410174220b20082008200b491b22084100480d160240024020090d002008102721070c010b200720092008102821070b2007450d072001200836029c0b200120073602980b200821090b2001200641286a3602a00b2007200a6a20026a41206a2005370000200441586a2104200241286a2102200d200341286a470d000b200a20026a21020b02400240200920026b4120490d0020012802980b21030c010b200241206a22032002490d1420094101742207200320032007491b22074100480d140240024020090d002007102721030c010b20012802980b20092007102821030b2003450d042001200736029c0b200120033602980b0b200320026a220341086a200141d8076a41086a2903003700002001200241206a3602a00b200320012903d807370000200341106a200141d8076a41106a290300370000200341186a200141d8076a41186a290300370000200141c3066a20012802a00b360000200120012903980b3700bb06200141a40b6a200141bf066a290000370000200141c28289aa043600990b200141023a00980b200120012900b80637009d0b200141980b6a10970302402010450d00200c10290b410810272203450d02200320163602042003200e360200410810272207450d012007200f36020420072012360200200141d8036a41888dc300410d10940120012903e003210520012802d8032102200141b8056a41086a22094200370300200142003703b80541d9b0c0004111200141b8056a1004200141980b6a41086a2009290300370300200120012903b8053703980b20012005420020021b3703d807200141980b6a4110200141d8076a41081003200141d0036a4193c8c500411410b50120012802d403210220012802d0032109200141c8036a41d685c500411810b5012002410020091b21020240024020012802c8030d00200141b8056a41086a22094200370300200142003703b80541d685c5004118200141b8056a1004200141980b6a41086a2009290300370300200120012903b8053703980b200120023602d807200141980b6a4110200141d8076a410410030c010b200220012802cc036b4107490d00200141b8056a41086a22094200370300200142003703b80541d685c5004118200141b8056a1004200141980b6a41086a2009290300370300200120012903b8053703980b200120023602d807200141980b6a4110200141d8076a41041003200141c0036a4193c8c500411410b50120012802c403210220012802c0032109200141b8036a41d685c500411810b5012002410020091b2109024020012802b8030d002009109e010c010b20012802bc03220220094f0d0003402002109e012009200241016a2202470d000b0b20071029200310290240201d450d00201210290b0240201a45201c720d0020012802cc04450d00201a10290b0240201e450d00201b10290b2017450d00200e10290b024020004280ce18824200520d000240024041f586c500411f108a02220241ff01714102460d0020024101710d010b200010a503450d01200010a6031a0c010b200010a603450d00200010a5031a0b200141b0036a41e286c500411310b50120012802b403210220012802b0032103200141a8036a41c986c500411910b501024002400240024002402002410020031b220220012802ac03410020012802a8031b22034f0d00200141a40b6a210902400340200141980b6a200210a70320012802a00b22074112470d012003200241016a2202470d000c020b0b20012903980b2105200141b8066a200941940110ce041a200141800a6a200141b8066a41940110ce041a200141a80b6a22092007360200200120053703a00b200120023602980b200141ac0b6a200141800a6a41940110ce04210420052000510d012009103d0b4100212941082128410021070c010b200141f8086a41086a2209200141980b6a41086a290300370300200120012903980b3703f808200141d8076a200441940110ce041a200141b8066a41086a22042009290300370300200120012903f8083703b806200141980b6a200141d8076a41940110ce041a41a80110272228450d02202820012903b80637030020282007360210202841086a2004290300370300202841146a200141980b6a41940110ce041a0240200241016a22022003490d0041012107410121290c010b200141980b6a41106a210c200141980b6a41146a2106200141a40b6a210841012129410121070340200141980b6a200210a703024020012802a00b22094112470d002003200241016a2202470d010c020b20012903980b2105200141b8066a200841940110ce041a200141800a6a200141b8066a41940110ce041a200120093602a80b200120053703a00b200120023602980b2006200141800a6a41940110ce042104024020052000510d00200c103d0c020b20014188066a41086a220a200141980b6a41086a290300370300200120012903980b37038806200141d8076a200441940110ce041a20014198056a41086a220b200a290300370300200120012903880637039805200141980b6a200141d8076a41940110ce041a024020292007470d00202941016a22042029490d172029410174220a20042004200a491b2204ad42a8017e2205422088a70d172005a7220a4100480d170240024020290d00200a102721280c010b2028202941a8016c200a102821280b2028450d03200421290b2028200741a8016c6a2204200129039805370300200441086a200b290300370300200441106a2009360200200441146a200141980b6a41940110ce041a200741016a2107200241016a22022003490d000b0b2028200741a8016c6a2123024020070d002028211e0c140b200141b8066a41086a2127200141980b6a41086a2111200141980b6a4104722102200141c4066a21252028211e0340201e41106a2802002103201e2902082105201e2802002109200141980b6a201e41146a41940110ce041a201e41a8016a211e20034112460d14200141800a6a200141980b6a41940110ce041a200120033602c006200120053703b8062025200141800a6a41940110ce041a200141d8076a200910a80320012802d80721080240024020012802e00722030d00420021414200214242002143420021444200212e420021450c010b200341057421044200212e200821034200214542002143420021444200214142002142034020014198036a200310950120014198036a41086a2903002126200129039803210520022003290000370000200241086a200341086a290000370000200241106a200341106a290000370000200241186a200341186a290000370000200120093602980b20014190036a200141980b6a10a90320012d00900341017121070240024020012d00910322060d00200141d0026a20052026420a420010d40420012903d002222c2105200141d0026a41086a290300222d21260c010b200141f0026a202642002006ad222c420010d30420014180036a20054200202c420010d304200141e0026a420042002005420010d304427f20014180036a41086a290300222c20012903f00220012903e0027c7c222d20012903f80220012903e80284420052202d202c547222061b212d427f20012903800320061b212c0b200341206a21034200202d20071b20447c4200202c20071b224620437c2243204654ad7c2144202d420020071b20427c202c420020071b222c20417c2241202c54ad7c2142202620457c2005202e7c222e200554ad7c2145200441606a22040d000b0b024020012802dc07450d00200810290b200141d8076a200910a80320012802d807210c0240024020012802e00722030d00420021464200214742002148420021494200212d4200214a0c010b200341057421044200212d200c21034200214a42002148420021494200214642002147034020022003290000370000200241086a200341086a2207290000370000200241106a200341106a2206290000370000200241186a200341186a2208290000370000200120093602980b200141c8026a200141980b6a10a90320012d00c802210a20012d00c902210b200141980b6a41186a2008290000370300200141980b6a41106a200629000037030020112007290000370300200120032900003703980b200141a8026a2009200141980b6a200b411010aa03200141a8026a41186a290300204a7c20012903b8022205202d7c222d200554ad7c214a4200200141a8026a41086a2903002205200a41017122071b20497c420020012903a802222620071b222c20487c2248202c54ad7c21492005420020071b20477c2026420020071b220520467c2246200554ad7c2147200341206a2103200441606a22040d000b0b024020012802dc07450d00200c10290b20014198056a41086a22214200370300200142003703980541b18ac000411620014198056a1004200141b8056a41086a2210202129030037030020012001290398053703b805200141003602980b200141b8056a4110200141980b6a100521030240024020012802980b2207417f460d002003450d00200142003703a00b200142003703980b200141980b6a20032007411020074110491b10ce041a02402007410f4d0d002011290300210520012903980b2126200310290c020b418f89c3004133104e000b42002126420021050b02400240202d202e7c222c420288204a20457c202c202d54ad7c222d423e8684222e202c85202d4202882245202d8584500d00202e204584500d00410021030240034020014198026a202c202d200341046a41fe007110d204200341026a2103200129039802222e202c8520014198026a41086a2903002245202d8584500d01202e2045844200520d000b0b20014188026a202c202d200341fe007110d20420012903880220014188026a41086a29030084212e42002145024020030d00202e420052ad212e0c020b202e420052ad212e0340200141e8016a202c202d41002003417e6a2207200720034b1b220341ff007110d204200141f8016a202e420186224b420184224a2045420186202e423f88842245204a204510d304204b204a20012903f80120012903e80156200141f8016a41086a290300222e200141e8016a41086a290300224c56202e204c511b1b212e20030d000c020b0b42002145202c202d84420052ad212e0b0240024020264202882005423e8684222c2026852005420288222d20058584500d00202c202d84500d004100210302400340200141d8016a20262005200341046a41fe007110d204200341026a210320012903d801222c202685200141d8016a41086a290300222d20058584500d01202c202d844200520d000b0b200141c8016a20262005200341fe007110d20420012903c801200141c8016a41086a29030084212c4200212d024020030d00202c420052ad212c0c020b202c420052ad212c0340200141a8016a2026200541002003417e6a2207200720034b1b220341ff007110d204200141b8016a202c420186224b420184224a202d420186202c423f8884222d204a202d10d304204b204a20012903b80120012903a80156200141b8016a41086a290300222c200141a8016a41086a290300224c56202c204c511b1b212c20030d000c020b0b4200212d2026200584420052ad212c0b02400240024002400240202e20458450450d004100210c0c010b204920447c204820437c2226204854ad7c2148204720427c204620417c2205204654ad7c214602400240024020012d00d0070e03010200010b2005202656204620485620462048511b210c0c020b0340200141d8006a20262048202e204510d404202c2241202d2242844200510d04200141d8006a41086a290300212c2001290358212d200141c8006a200520462041204210d4044101210c202d2001290348224354202c200141c8006a41086a290300224a54202c204a5122031b0d0202402043202d54204a202c5420031b450d004100210c0c030b200141386a202d202c202e204510d304200141286a2043204a2041204210d304024020052001290328222c7d222d2046200141286a41086a2903007d2005202c54ad7d224a84500d002048200141386a41086a2903007d2143202620012903382205542103202620057d212c202e210520452146202d212e204a21452041212620422148202c20432003ad7d222d84500d030c010b0b4100210c0c010b03402045214a202e2141202c202d844200510d0220014188016a200520462041204a10d40420014198016a20262048202c202d10d4044101210c200129039801224220012903880122435420014198016a41086a290300222e20014188016a41086a290300224554202e20455122031b0d01024020432042542045202e5420031b450d004100210c0c020b200141f8006a2042202e202c202d10d304200141e8006a204320452041204a10d304024020052001290368222e7d22452046200141e8006a41086a2903007d2005202e54ad7d22428450450d004100210c0c020b2048200141f8006a41086a2903007d2143202620012903782205542103202620057d212e202c2105202d21462045212c2042212d20412126204a2148202e20432003ad7d2245844200520d000b0b200141980b6a200910a80320012802980b2122200128029c0b212420012802a00b2203450d022022200341057422156a2120202221030340200141f8086a41186a2216200341186a22072900002205370300200141f8086a41106a2217200341106a22042900002226370300200141f8086a41086a2218200341086a2206290000222c37030020012003290000222d3703f808200141d8076a41086a2208202c370300200141d8076a41106a220a2026370300200141d8076a41186a220b2005370300200141b8056a41186a22192007290000370300200141b8056a41106a221a2004290000370300201020062900003703002001202d3703d807200120032900003703b80520032900002105200241186a221b200729000037000020022005370000200241086a221c2006290000370000200241106a221d2004290000370000200120093602980b200141206a200141980b6a10a903410221070240200c20012d0020410171220445734101470d0020012d0021211f20014188066a41186a200b29030037030020014188066a41106a200a29030037030020014188066a41086a2008290300370300200120012903d80737038806200421070b200141e8056a41086a221220014188066a41086a220d290300370300200141e8056a41106a221320014188066a41106a220e290300370300200141e8056a41186a221420014188066a41186a220f29030037030020012001290388063703e8050240024020074102460d00200341206a21030c010b200341206a2103201541606a22150d010c040b0b0340200141f8046a41086a20122903002205370300200141f8046a41106a20132903002226370300200141f8046a41186a2014290300222c370300200120012903e805222d3703f804200141980b6a41186a202c370300200141980b6a41106a2026370300201120053703002001202d3703980b200142e4cab5fbb6ccdcb0e3003703d804200141d8046a200141980b6a201f411874411875410274419886c5006a3502004280af1a7e20007c10a60120032020460d0303402016200341186a220729000022053703002017200341106a220429000022263703002018200341086a2206290000222c37030020012003290000222d3703f80820192007290000370300201a2004290000370300201020062900003703002003290000212e2008202c370300200a2026370300200b20053703002001202e3703b8052001202d3703d807200120093602980b20062900002105200429000021262003290000212c201b2007290000370000201d2026370000201c20053700002002202c370000200141186a200141980b6a10a903410221070240200c20012d0018410171220445734101470d0020012d0019211f200f200b290300370300200e200a290300370300200d2008290300370300200120012903d80737038806200421070b2012200d2903003703002013200e2903003703002014200f29030037030020012001290388063703e805024020074102470d002020200341206a2203470d010c050b0b200341206a21030c000b0b41c4a7c1001058000b41c4a7c1001058000b02402024450d00202210290b200910ab0302400240200c0d00200141053a00a00b200141053a00980b200120093602a40b41b8d6c5004100200141980b6a10880120214200370300200142003703980541e286c500411320014198056a10042010202129030037030020012001290398053703b8052001200941016a3602980b200141b8056a4110200141980b6a410410032027103d0c010b200120093602a40b200141043a00a00b200141053a00980b41b8d6c5004100200141980b6a108801024020012903c8072205500d00200141d8076a200141b8066a41a00110ce041a20014188066a200520007c220510ac03200141980b6a200141d8076a41a00110ce041a200141f8086a201141880110ce041a02400240024002400240200128028c0622062001280290062203460d0020012802880621040c010b200341016a22072003490d1b20034101742204200720072004491b2206ad4290017e2226422088a70d1b2026a722074100480d1b0240024020030d002007102721040c010b20012802880620034190016c2007102821040b2004450d012001200636028c0620012004360288060b200420034190016c220c6a200141f8086a41880110ce044188016a20093602002001200341016a220736029006411710272203450d012003410f6a41002900ffd143370000200341086a41002900f8d143370000200341002900f0d14337000020034117412e10282203450d0220032005370017200141f8086a41186a22084200370300200141f8086a41106a220a4200370300200141f8086a41086a220b4200370300200142003703f8082003411f200141f8086a1000200141b8056a41186a2008290300370300200141b8056a41106a200a2903003703002010200b290300370300200120012903f8083703b8052001412036029c0b2001200141b8056a3602980b20014188066a200141980b6a10312003102902402007450d00200c4190016a2107200421030340024020032802004112460d002003103d0b20034190016a2103200741f07e6a22070d000b0b02402006450d00200410290b20214200370300200142003703980541e286c500411320014198056a10042010202129030037030020012001290398053703b8052001200941016a3602980b200141b8056a4110200141980b6a410410030c040b20074108102a000b41174101102a000b412e4101102a000b200141980b6a202741880110ce041a200141003b01d807200141106a200141980b6a200141d8076a10ad0220012001280210453a00a10b200141073a00a00b200141053a00980b200120093602a40b41b8d6c5004100200141980b6a10880120214200370300200142003703980541e286c500411320014198056a10042010202129030037030020012001290398053703b8052001200941016a3602980b200141b8056a4110200141980b6a410410030b201e2023470d000b2023211e0c130b200a4108102a000b41a8014108102a000b41084104102a000b41084104102a000b20074101102a000b20084101102a000b20034101102a000b20044101102a000b20064101102a000b41094101102a000b41014101102a000b418f89c3004133104e000b418f89c3004133104e000b418f89c3004133104e000b41eab3c30041c900104e000b41eab3c30041c900104e000b41084104102a000b41084104102a000b418f89c3004133104e000b0240201e2023460d00200141980b6a41106a2109200141980b6a41146a21040340200141b8056a41086a2203201e41086a2903003703002001201e2903003703b805201e41106a2802002102200141980b6a201e41146a41940110ce041a20024112460d01200141b8066a41086a22072003290300370300200120012903b8053703b806200141d8076a200141980b6a41940110ce041a200141980b6a41086a2007290300370300200120012903b8063703980b200120023602a80b2004200141d8076a41940110ce041a2009103d201e41a8016a221e2023470d000b0b02402029450d00202810290b02400240411710272202450d002002410f6a41002900ffd143370000200241086a41002900f8d143370000200241002900f0d143370000024020024117412e10282202450d0020022000370017200141f8086a41186a22034200370300200141f8086a41106a22074200370300200141f8086a41086a22094200370300200142003703f8082002411f200141f8086a1000200141b8056a41186a2003290300370300200141b8056a41106a2007290300370300200141b8056a41086a2009290300370300200120012903f8083703b805200141003602980b200141b8056a4120200141980b6a1005210702400240024020012802980b2203417f460d00200120033602dc07200120073602d807200141980b6a200141d8076a103b20012802980b22080d01418f89c3004133104e000b4100210a41082108410021030c010b200129029c0b210502402003450d00200710290b200141b8056a4120100c2005422088a721032005a7210a0b20021029200820034190016c22026a2109024020030d00200821020c030b200241f07e6a2107200141980b6a410472210620082102034020022802002103200141d8076a200241046a41840110ce041a0240024020034113460d00200141980b6a200141d8076a41840110ce041a024020034112470d0020070d02200921020c060b20024188016a2802002104200141b8066a200141980b6a41840110ce041a200120033602980b2006200141b8066a41840110ce041a200141003b01d807200141086a200141980b6a200141d8076a10ad0220012802082103200120043602a40b20012003453a00a10b200141073a00a00b200141053a00980b41b8d6c5004100200141980b6a10880120070d01200921020c050b20024190016a21020c040b20024190016a2102200741f07e6a21070c000b0b412e4101102a000b41174101102a000b024020022009460d00200141980b6a4104722107034020022802002103200141980b6a200241046a418c0110ce041a20034113460d01200141d8076a200141980b6a418c0110ce041a200120033602980b2007200141d8076a418c0110ce041a024020034112460d00200141980b6a103d0b20024190016a22022009470d000b0b0240200a450d00200810290b200010b401200141c00c6a24000f0b102b000b418f89c3004133104e000bf31605027f017e067f037e017f230041c0086b22042400200441c0056a200141a00210ce041a200441e0036a200441c0056a1086024101210502400240024002400240024002400240024002400240024002400240024020042802e0034101460d00200441e0036a41086a290300210620044190026a200441e0036a41106a41d00110ce041a20042006370338200441386a41086a20044190026a41d00110ce041a024020032802002201450d00200341086a28020021072003280204210841002109200441003602c00541ff88c3004110200441c0056a10052105024020042802c005220a417f460d002005450d00200441003602c005200441c0056a2005200a4104200a4104491b10ce041a200a41034d0d0520042802c0052109200510290b411410272205450d05200541106a4100280083ce45360000200541086a41002900fbcd45370000200541002900f3cd453700002005411441281028220a450d06200a2009360014200441e0036a41186a22054200370300200441e0036a41106a22094200370300200441e0036a41086a220b4200370300200442003703e003200a4118200441e0036a100020044190026a41186a200529030037030020044190026a41106a200929030037030020044190026a41086a200b290300370300200420042903e00337039002200441003602c805200442013703c005200420073602e003200441e0036a200441c0056a10300240024020042802c405220b20042802c80522096b2007490d0020042802c00521050c010b200920076a22052009490d09200b410174220c20052005200c491b220c4100480d0902400240200b0d00200c102721050c010b20042802c005200b200c102821050b2005450d082004200c3602c405200420053602c005200c210b0b200520096a2001200710ce041a20044190026a41202005200920076a10030240200b450d00200510290b200a1029410021052008450d00200110290b200441306a200441386a41d0006a10ac0220042d003421092004280230210a200441c0056a200441386a41d80110ce041a41002107024002400240024002400240024002400240024020042903e0054202510d00200441a0086a41186a200441c0056a41186a290300370300200441a0086a41106a200441c0056a41106a290300370300200441a0086a41086a200441c0056a41086a290300370300200420042903c0053703a00820044188066a290300210d20044180066a290300210e200441f8056a2903002106411310272207450d122007410f6a41002800d68d43360000200741086a41002900cf8d43370000200741002900c78d4337000020074113413310282207450d13200720042903a0083700132007412b6a200441b8086a290300370000200741236a200441b0086a2903003700002007411b6a200441a8086a290300370000200441206a200741331089022004290328210f2004280220210b20071029200f4200200b1b220f2006520d04411310272207450d142007410f6a41002800d68d43360000200741086a41002900cf8d43370000200741002900c78d4337000020074113413310282207450d15200720042903a0083700132007412b6a200441a0086a41186a290300370000200741236a200441a0086a41106a2903003700002007411b6a200441a0086a41086a290300370000200441e0036a41186a220b4200370300200441e0036a41106a22084200370300200441e0036a41086a220c4200370300200442003703e00320074133200441e0036a100020044190026a41186a200b29030037030020044190026a41106a200829030037030020044190026a41086a200c290300370300200420042903e003370390022004200642017c3703e00320044190026a4120200441e0036a4108100320071029200441186a41c1cdc500411710b501417f200428021c410020042802181b220720026a220b200b2007491b220b418080c002418080f001200941017122071b4b0d02200441e0036a41086a22094200370300200442003703e00341c1cdc5004117200441e0036a100420044190026a41086a22102009290300370300200420042903e003370390022004200b3602e00320044190026a4110200441e0036a41041003200441106a41a7cdc500411a10b501417f2004280214410020042802101b2208418094ebdc034180afd0e50220071b220b200a200b200a491b6a220c200c2008491b2208200b4b0d0220094200370300200442003703e00341a7cdc500411a200441e0036a100420102009290300370300200420042903e00337039002200420083602e00320044190026a4110200441e0036a41041003200441e0036a200e200d200441a0086a200a2007200210960120042d00e0034101460d012004418c046a280200210920044188046a280200210820044184046a280200210b200441fc036a280200210c200441f8036a2802002102024020044180046a2802002207450d002007410c6c210a2002210703400240200741046a280200450d00200728020010290b2007410c6a2107200a41746a220a0d000b0b0240200c450d00200210290b02402009450d002009410c6c210a200b210703400240200741046a280200450d00200728020010290b2007410c6a2107200a41746a220a0d000b0b02402008450d00200b10290b200441e0076a41086a200441a0086a41086a290300370300200441e0076a41106a200441a0086a41106a290300370300200441e0076a41186a200441a0086a41186a290300370300200420042903a0083703e007410121070b200441e0036a200441c0056a41d0006a41880110ce041a200441a0086a41186a2209200441e0076a41186a290300370300200441a0086a41106a220b200441e0076a41106a290300370300200441a0086a41086a2202200441e0076a41086a290300370300200420042903e0073703a0084102210a02402007450d0020044180086a41186a200929030037030020044180086a41106a200b29030037030020044180086a41086a2002290300370300200420042903a008370380084101210a0b2004419a026a20044180086a41086a290300370100200441a2026a20044180086a41106a290300370100200441aa026a20044180086a41186a2903003701002004200a3a009102200420042903800837019202200441003a009002200441086a200441e0036a20044190026a10ad02200428020c21092004200428020822074100473a00c105200441003a00c00541b8d6c5004100200441c0056a108801200441003602c00541ff88c3004110200441c0056a1005210b20042802c005220a417f470d074101210a0c080b20042d00e103210a20044190066a103d410321070240200a0e0706020606040500060b410021070c050b20044190066a103d0b410421070c030b20044190066a103d200f2006580d010b410121070c010b410221070b20002007360204200041013602002000410c6a4100360200200041086a41b8d6c50036020020054521000c030b200441003602c005200441c0056a200b200a4104200a4104491b10ce041a200a41034d0d0d20042802c005210a200b1029200a41016a210a0b2004200a3602c00541ff88c3004110200441c0056a410410030240024020070d004100210720004100360204200041086a20093602000c010b02402009411b470d000240200741dbeac200460d00200741dbeac200411b10d0040d010b20004104360204410121070c010b20002007360204200041086a2009360200410021070b200020073602002001450d0e20050d020c0e0b200041086a20042902e4033702002000420137020020032802002101410021000b20000d0c20010d0b0c0c0b200341046a280200450d0b200110290c0b0b418f89c3004133104e000b41144101102a000b41284101102a000b200c4101102a000b102b000b41134101102a000b41334101102a000b41134101102a000b41334101102a000b418f89c3004133104e000b200341046a280200450d00200110290b200441c0086a24000b950901087f230041106b2202240020024100360208200242013703002002410436020c2002410c6a20021030024002400240024002400240024002400240024020022802042203200228020822046b4104490d00200441046a2105200228020021030c010b200441046a22052004490d0820034101742206200520052006491b22064100480d080240024020030d002006102721030c010b200228020020032006102821030b2003450d0120022006360204200220033602000b20022005360208200320046a41eede91ab063600002002410e36020c2002410c6a200210300240024020022802042203200228020822066b410e490d002006410e6a2105200228020021040c010b2006410e6a22052006490d0820034101742204200520052004491b22074100480d080240024020030d002007102721040c010b200228020020032007102821040b2004450d022002200736020420022004360200200721030b20022005360208200420066a220641002900a8fb41370000200641066a41002900aefb413700000240200320056b41034b0d00200541046a22062005490d0820034101742207200620062007491b22064100480d080240024020030d002006102721040c010b200420032006102821040b2004450d0320022006360204200220043602000b2002200541046a360208200420056a410a360000024020022802042203200228020822056b41034b0d00200541046a22062005490d0820034101742207200620062007491b22064100480d080240024020030d002006102721040c010b200420032006102821040b2004450d0420022006360204200220043602000b2002200541046a360208200420056a41fb003600000240024020022802042205200228020822046b4104490d00200228020021050c010b200441046a22032004490d0820054101742206200320032006491b22034100480d080240024020050d002003102721050c010b200228020020052003102821050b2005450d0520022003360204200220053602000b2002200441046a360208200520046a41fd003600002002410836020c2002410c6a2002103041b8fbc10021072002280204210320022802082106034002400240200320066b4108490d00200641086a2104200228020021050c010b200641086a22042006490d0920034101742205200420042005491b22084100480d090240024020030d002008102721050c010b200228020020032008102821050b2005450d072002200836020420022005360200200821030b20022004360208200520066a2007290000370000200741086a28020021080240200320046b41034b0d00200441046a22062004490d0920034101742209200620062009491b22064100480d090240024020030d002006102721050c010b200520032006102821050b2005450d082002200636020420022005360200200621030b2002200441046a2206360208200520046a20083600002007410c6a22074198fcc100470d000b200241106a24002006ad4220862005ad840f0b20064101102a000b20074101102a000b20064101102a000b20064101102a000b20034101102a000b20084101102a000b20064101102a000b102b000bc91b05017f017e037f017e057f230041800a6b22022400024002402001450d00200220003602100c010b200241b8d6c5003602100b20022001360214200241e0076a200241106a108e02200241f0076a280200210120022903e007210320022802e807210420022802ec072105200241b0046a200241f4076a41e40010ce041a024002402004450d0020024180036a200241b0046a41e40010ce041a200241e0076a200241106a104820022802e00722000d0102402001450d00200141246c21002004210103400240024020012d0000220641034b0d0002400240024020060e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b2005450d00200410290b200241f4076a4101360200200242013702e407200241cc81c2003602e007200241023602b404200241c481c2003602b0042002200241b0046a3602f007200241e0076a41d481c2001057000b20022902e40721072002411c6a20024180036a41e40010ce041a20024190016a20013602002002418c016a20053602002002200436028801200220033703800120024194016a2002411c6a41e40010ce042101200241fc016a2007370200200220003602f80120024180016a10b902024002400240024002400240024002402002290380012203500d00200241e0076a2003427f7c108702200241e0076a2001412010d0040d004100210820022802f80121000240024020024180026a280200220141a0026c0d00410421094100210a0c010b2001410c6c220610272209450d042001210a0b02402001450d00200141a0026c2106200141057441606a2104200921010340200220003602b004200241e0076a200241b0046a10bf02200141086a200241e0076a41086a280200360200200120022903e0073702002001410c6a2101200041a0026a2100200641e07d6a22060d000b200441057641016a21080b41002106024002402008410c6c22010d004104210b4100210c0c010b2001410c6e220c41037422004100480d0220001027220b450d030b0240200920016a22052009460d0041002106200b210120092100034020002802002104200141046a200041086a28020036020020012004360200200141086a2101200641016a21062000410c6a22002005470d000b0b200241e0076a200b200610c0020240200c450d00200b10290b02402008450d002008410c6c21002009210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b0240200a450d00200910290b0240200241d4016a2201200241e0076a412010d004450d004198cec500410e1010200141201016200241e0076a412010160b02402001200241e0076a412010d0040d0020022802fc01210920022802f8012105200228028002210620024188026a20024180016a41f80010ce041a2005200641a0026c6a210020022903880221072005210102402006450d00200241b0046a41f0006a210420052101024002400340200241f8066a200141e80010ce041a200141e8006a290300210320024180036a200141f0006a41b00110ce041a20034203510d02200241b0046a200241f8066a41e80010ce041a2002200337039805200420024180036a41b00110ce041a2002200241b0046a3602d006200241e0076a200241d0066a10bf0220022802e8072106024020022802e407450d0020022802e00710290b200241e0076a200241b0046a41a00210ce041a200241003602e006200241d0066a200241e0076a2006200241e0066a10bc0220022802d0064101460d01024020022802d4062206450d00200620022802d80610100b200141a0026a22012000470d000b200021010c020b024020022802d4060e050a00000b090a0b4190fdc1001058000b200141a0026a21010b20012000460d05200241f8086a2106200241e0076a41f0006a2104034020024180036a200141e80010ce041a200141e8006a2903002103200241e0076a200141f0006a41b00110ce041a20034203510d06200241f8066a20024180036a41e80010ce041a200241b0046a200241e0076a41b00110ce041a200241e0076a200241f8066a41e80010ce041a200220033703c8082004200241b0046a41b00110ce041a2006103d200141a0026a22012000470d000c060b0b41b0fcc1001058000b4198fcc1001058000b102b000b20004104102a000b20064104102a000b02402009450d00200510290b200241086a41ff88c300411010c102200228020c210120022802082100200241e0076a41086a22064200370300200242003703e0074192cdc5004115200241e0076a1004200241b0046a41086a2006290300370300200220022903e0073703b00420022001410020001b3602e007200241b0046a4110200241e0076a41041003200710c202200241e0076a10c302200220024188026a41106a28020022093602f00620022802900221042002200241e0076a41106a28020022013602f406024020092001470d0002402009450d0020022802e807210541002106034002400240024002400240024002400240200420066a22012d00002208200520066a22002d0000470d000240024002400240024020080e050400010203040b024020042005460d00200141016a280000200041016a280000470d050b200141106a2802002208200041106a280200470d04200141086a280200220b200041086a280200220a460d09200b200a200810d0040d040c090b024020042005460d00200141016a280000200041016a280000470d040b200141106a2802002208200041106a280200470d03200141086a280200220b200041086a280200220a460d07200b200a200810d0040d030c070b024020042005460d00200141016a280000200041016a280000470d030b200141106a2802002208200041106a280200470d02200141086a280200220b200041086a280200220a460d05200b200a200810d0040d020c050b2001410c6a28020022082000410c6a280200470d01200141046a280200220b200041046a280200220a460d03200b200a200810d0040d010c030b20042005460d07200141016a200041016a412010d004450d010b41a481c00041141010200241b0046a2001104f20022802b004220820022802b8041016024020022802b404450d00200810290b200241b0046a2000104f20022802b004220820022802b8041016024020022802b404450d00200810290b20012d000020002d00002208470d05024020080e050005040302000b20042005460d060b200141016a200041016a412010d0040d040c050b2001410c6a28020022082000410c6a280200470d03200141046a2802002201200041046a2802002200460d0420012000200810d004450d040c030b024020042005460d00200141016a280000200041016a280000470d030b200141106a2802002208200041106a280200470d02200141086a2802002201200041086a2802002200460d0320012000200810d0040d020c030b024020042005460d00200141016a280000200041016a280000470d020b200141106a2802002208200041106a280200470d01200141086a2802002201200041086a2802002200460d0220012000200810d0040d010c020b024020042005460d00200141016a280000200041016a280000470d010b200141106a2802002208200041106a280200470d00200141086a2802002201200041086a2802002200460d0120012000200810d004450d010b41c0fdc1001058000b200641246a21062009417f6a22090d000b0b024020024188026a41346a2201200241e0076a41346a2200412010d004450d004198cec500410e10102001412010162000412010160b024020012000412010d004450d0041d8fdc1001058000b024020022802f0072200450d0020022802e8072101200041246c210003400240024020012d0000220641034b0d0002400240024020060e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b0240200241ec076a280200450d0020022802e80710290b02402002280298022200450d002002280290022101200041246c210003400240024020012d0000220641034b0d0002400240024020060e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b024020024194026a280200450d0020022802900210290b200241800a6a240042010f0b20024180036a41146a41033602002002418c036a411d360200200241f8066a41146a41033602002002200241f0066a3602e0062002200241f4066a3602d006200241b0046a41146a4100360200200242033702fc0620024190d1c5003602f8062002411d36028403200241b8d6c5003602c004200242013702b404200241a8fdc1003602b004200220024180036a360288072002200241b0046a360290032002200241d0066a360288032002200241e0066a36028003200241f8066a41b0fdc1001057000b41f8fcc1001058000b41e0fcc1001058000b41c8fcc1001058000bb51003067f027e067f230041206b2202240002400240024002400240024002400240024002400240024002400240024041a20210272203450d00200242a20237020420022003360200200341003b000020024102360208200228020021042002280204210502400240200128020022032903684202520d00024020054102470d0020044102410410282204450d0420024104360204200220043602000b200441023a00022002200228020841016a3602080c010b024020054102470d0020044102410410282204450d0420024104360204200220043602000b20044182013a00022002200228020841016a3602082003200210510240024020022802042206200228020822046b41c000490d00200441c0006a2101200228020021050c010b200441c0006a22012004490d1020064101742205200120012005491b22074100480d100240024020060d002007102721050c010b200228020020062007102821050b2005450d052002200736020420022005360200200721060b20022001360208200520046a22042003290024370000200441386a200341dc006a290000370000200441306a200341d4006a290000370000200441286a200341cc006a290000370000200441206a200341c4006a290000370000200441186a2003413c6a290000370000200441106a200341346a290000370000200441086a2003412c6a2900003700000240024020032903684201510d00024020062001470d00200141016a22042001490d1220014101742206200420042006491b22044100480d120240024020010d002004102721050c010b200520012004102821050b2005450d0820022004360204200220053602000b2002200141016a360208200520016a41003a00000c010b200341f8006a29030020032903702208420c882209420120094201561b8021090240200620016b41014b0d00200141026a22042001490d1120064101742207200420042007491b22044100480d110240024020060d002004102721050c010b200520062004102821050b2005450d0820022004360204200220053602000b2002200141026a360208200520016a2009a741047420087aa7417f6a22044101200441014b1b2204410f2004410f491b723b00000b20034180016a20021054200220034188016a360210200241106a200210590b20034198016a2002103220022802082103200241003602182002420137031020022003417e6a36021c2002411c6a200241106a10302002280208220441014d0d0620022802182105200228021021062002280214210a20024100360208200228020021030240024002402004417e6a2207450d004102210b2005450d0e200320062d00003a00004101210c2002200228020841016a36020820054101460d0e200620056a210d200320062d00013a00012002200228020841016a3602084102210b200641026a21014100210e2005417e6a2203450d0c2002280204220b20046b2003490d01200228020021040c020b0240024002402002280204220420054f0d0020044101742201200520052001491b22014100480d130240024020040d002001102721030c010b200320042001102821030b2003450d0c20022001360204200220033602002002280208210b0c010b4100210b2005450d010b2003200b6a220420062d00003a0000024020054101470d00200b41016a210b0c010b2005417f6a2101200641016a2103200441016a21040340200420032d00003a0000200441016a2104200341016a21032001417f6a22010d000b200b20056a210b0b2002200b3602084102210b0c0c0b200420036a220c2004490d0f200b4101742204200c200c2004491b220c4100480d0f02400240200b0d00200c102721040c010b2002280200200b200c102821040b2004450d092002200c360204200220043602000b200420056a200441026a200710cf041a024020052002280208220b460d002002280200200b6a2104200521030340024020034102470d002005210b0c0d0b200420012d00003a00002002200228020841016a360208200441016a2104200141016a2101200b2003417f6a2203470d000b200d20016b22030d004101210c2005210b0c0a0b20034100480d0e024020031027220c450d002005210b2003210e0c0a0b20034101102a000b41a2024101102a000b41044101102a000b41044101102a000b20074101102a000b20044101102a000b20044101102a000b419cb1c5001058000b20014101102a000b200c4101102a000b0240200d2001460d00200c20012d00003a00004101210f0240200141016a2203200d460d00200c41016a2104200520016b21010340200420032d00003a0000200441016a2104200d200341016a2203470d000b200620016a220f450d010b200c200f6a21050240024020022802042203200b20076a22046b200f490d00200228020021030c010b2004200f6a22012004490d0620034101742204200120012004491b22044100480d060240024020030d002004102721030c010b200228020020032004102821030b2003450d0520022004360204200220033602000b2003200f200b6a220d6a2003200b6a200710cf041a0240200d20022802082203460d00200228020020036a2104200f200b6a20036b2101200c2103034020052003460d01200420032d00003a00002002200228020841016a360208200341016a2103200441016a21042001417f6a22010d000b0b200d210b0b200e450d00200c10290b2007450d010b0240200b20022802082203460d002002280200220420036a2004200b6a200710cf041a0b2002200320076a3602080b0240200a450d00200610290b20002002290300370200200041086a200241086a280200360200200241206a24000f0b20044101102a000b102b000bd203010b7f230041206b22032400024002400240024020020d00410421040c010b2002410274220510272204450d010b0240200120024103746a22062001470d004101210741002108410021090c020b2002410374210a200141046a21052004210b0340200b2005280200360200200541086a2105200b41046a210b200a41786a220a0d000b200620016b41786a41037641016a210841012107410021094100210503402001280200210c02400240200920056b200141046a280200220b490d00200b20056a210a0c010b02402005200b6a220a2005490d002009410174220d200a200a200d491b220d4100480d000240024020090d00200d102721070c010b20072009200d102821070b02402007450d00200d21090c020b200d4101102a000b102b000b200720056a200c200b10ce041a200a2105200141086a22012006460d020c000b0b20054104102a000b200341186a22054200370300200341106a22014200370300200341086a220b42003703002003420037030020072004200820031021200041186a2005290300370000200041106a2001290300370000200041086a200b2903003700002000200329030037000002402009450d00200710290b02402002450d00200410290b200341206a24000b940101047f230041106b22032400410021042003410036020c200120022003410c6a10052105024002400240200328020c2206417f470d000c010b20034100360208200341086a20052006410420064104491b10ce041a200641034d0d01200328020821062005102920012002100c410121040b2000200436020020002006360204200341106a24000f0b418f89c3004133104e000bb15108067f027e027f017e077f027e027f037e230041a0046b2201240020014190036a41086a22024200370300200142003703900341e887c500411120014190036a1004200141b0036a41086a200229030037030020012001290390033703b003200141b0036a4110100c0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200042c0f000824200520d00200141b0036a109701411410272203450d09200341106a41002800bb8c40360000200341086a41002900b38c40370000200341002900ab8c4037000020034114413410282203450d08200320012903b0033700142003412c6a200141c8036a2204290300370000200341246a200141b0036a41106a22052903003700002003411c6a200141b0036a41086a220629030037000020014188016a2003413410840120014188016a41106a2903002107200129039001210820012802880121092003102920012007420020091b22073703a80120012008420020091b22083703a0012004200737030020052008370300200641013a00002001410a3a00b00341b8d6c5004100200141b0036a108801200141003a00b701200142003703c001200142003703b801200141b0026a41086a22034200370300200142003703b002418486c5004112200141b0026a100420014190036a41086a2003290300370300200120012903b00237039003200141003602b00320014190036a4110200141b0036a100521030240024020012802b0032209417f460d002003450d00200120093602cc01200120033602c801200141b0036a200141c8016a104520012802b003220a450d0920012902b403210b2009450d01200310290c010b4104210a4200210b0b4100210c0240200b422088a72209450d00200141b9036a210d200141f0026a210e200141b0026a41206a210f200141c8016a41086a2110200141e8036a2111410021124100210c41002103024003400240024002400240200c450d00200a20034102746a2104200a200320126a4102746a21050340200320094f0d02200141c8016a2004280200220610f20120012903c8014201520d04200141b0026a201041e00010ce041a20012903a001221320012903b002221454200141a0016a41086a2903002208200141b0026a41086a29030022075420082007511b450d03200141013a00b7010240201220036a220620094f0d0020052004280200360200200441046a2104200541046a2105200341016a22032009490d010c070b0b419481c000200620091037000b200a20034102746a21040340200320094f0d01200141c8016a2004280200220610f20120012903c8014201520d03200141b0026a201041e00010ce041a20012903a001221320012903b00222145a200141a0016a41086a2903002208200141b0026a41086a29030022075a20082007511b0d02200441046a2104200141013a00b701200341016a22032009490d000b4100210c0c050b41b880c000200320091037000b2001201320147d3703a0012001200820077d2013201454ad7d3703a801411210272204450d05200441106a41002f00c0a7413b0000200441086a41002900b8a741370000200441002900b0a74137000020044112412410282204450d0620042006360012200141b0036a41186a22054200370300200141b0036a41106a22154200370300200141b0036a41086a22164200370300200142003703b00320044116200141b0036a100020014190036a41186a200529030037030020014190036a41106a201529030037030020014190036a41086a2016290300370300200120012903b0033703900320014190036a4120100c20041029200f20012903c002200141b0026a41186a29030010ad01200141f8006a200e20142007108301200141b8016a41086a2204427f20042903002208200141f8006a41086a2903007c20012903b801221320012903787c22172013542204ad7c22132004201320085420132008511b22041b3703002001427f201720041b3703b80120112007370300200d200e290000370000200d41086a200e41086a290000370000200d41106a200e41106a290000370000200d41186a200e41186a290000370000200120143703e003200141023a00b8032001410a3a00b003200120063602dc0341b8d6c5004100200141b0036a1088010b2012417f6a2112200c41016a210c200341016a22032009490d000b0b200c450d00200320094f0d00200a20034102746a2204200c4102746b2004200920036b41027410cf041a0b200141b0026a41086a22034200370300200142003703b002418486c5004112200141b0026a100420014190036a41086a2003290300370300200120012903b00237039003200141003602b803200142013703b00320012009200c6b22033602c801200141c8016a200141b0036a10300240024020030d0020012802b803210920012802b403210620012802b00321040c010b2009410274200c4102746b211020012802b403210620012802b8032103200a210503402005280200210c02400240200620036b4104490d00200341046a210920012802b00321040c010b200341046a22092003490d1820064101742204200920092004491b22124100480d180240024020060d002012102721040c010b20012802b00320062012102821040b2004450d06200120123602b403200120043602b003201221060b200541046a2105200120093602b803200420036a200c360000200921032010417c6a22100d000b0b20014190036a411020042009100302402006450d00200410290b0240200ba7450d00200a10290b024020012d00b7010d0042002107200141e8006a20012903a0012208200141a0016a41086a2203290300221442c0843d420010d404200141d8006a20012903682213200141e8006a41086a290300220b42c0fb42427f10d304200141c8006a2013200b42a0c21e420010d304200320142014200141c8006a41086a29030020012903482213200820012903587c42018842ffffffff0f837c220b201354ad7c2213200b200856201320145620132014511b22091b22137d20082008200b20091b221454ad7d3703002001200820147d3703a001200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b00237039003200141003602b00320014190036a4110200141b0036a100521030240024020012802b0032209417f470d0042002107420021080c010b024020030d00420021080c010b200142003703b803200142003703b003200141b0036a20032009411020094110491b10ce041a2009410f4d0d06200141b8036a290300210820012903b0032107200310290b200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b00237039003200120073703b003200120083703b80320014190036a4110200141b0036a41101003200141b8016a41086a2203427f2003290300220b20082013200720147d200756200820137d2007201454ad7d221720085620172008511b22031b7c20012903b80122082007201420031b7c22172008542203ad7c220720032007200b542007200b511b22031b3703002001427f201720031b3703b801200141c8036a2013370300200141b0036a41106a2014370300200141b0036a41086a41033a00002001410a3a00b00341b8d6c5004100200141b0036a1088010b200141b0036a109701200141c8016a200141b0036a20012903b8012207200141b8016a41086a29030022084102109001024002400240024020012802c8010d00200141c8016a41106a290300211320012903d0012114200141306a41b18ac0004116108601200820137d2007201454ad7d201320087d2014200754ad7d20142007582013200858201320085122031b22091b2118200720147d201420077d20091b2119200141306a41106a2903004200200128023022091b210b2001290338420020091b21172014200756201320085620031b0d01200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b002370390032001427f200b20187c201720197c22082017542203ad7c220720032007200b542007200b511b22031b3703b8022001427f200820031b3703b002200141b0026a21030c020b41f3c8c10041ca00101042002113200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b00237039003200141003602c80120014190036a4110200141c8016a100521030240024020012802c8012209417f470d0042002113420021140c010b024020030d00420021140c010b200142003703d001200142003703c801200141c8016a20032009411020094110491b10ce041a2009410f4d0d09200141d0016a290300211420012903c8012113200310290b200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b002370390032001427f201420087c201320077c22082013542203ad7c22072003200720145420072014511b22031b3703d0012001427f200820031b3703c80120014190036a4110200141c8016a411010030c020b200141b0026a41086a22034200370300200142003703b00241b18ac0004116200141b0026a100420014190036a41086a2003290300370300200120012903b0023703900320014200200b20187d2017201954ad7d2207201720197d22082017562007200b562007200b511b22031b3703b80220014200200820031b3703b002200141b0026a21030b20014190036a41102003411010030b20012903a0012107200141c8036a200141a0016a41086a290300370300200141c0036a2007370300200141b0036a41086a41043a00002001410a3a00b00341b8d6c5004100200141b0036a1088010b20024200370300200142003703900341c1c8c100411d20014190036a1004200141b0026a41086a200229030037030020012001290390033703b002200141003602b003200141b0026a4110200141b0036a1005210920012802b0032203417f460d0c2009450d0c200120093602c801200120033602cc01200142003703b003200141b0036a20092003410820034108491b220510ce041a2001200320056b22043602cc012001200920056a22053602c8010240200341074d0d0020012903b003210b200142003703b003200141b0036a20052004410820044108491b220310ce041a2001200420036b3602cc012001200520036a3602c801200441074d0d0020012903b0032117200141b0036a200141c8016a104120012802b0032203450d0020012902b4032108200141003a00b003200141b0036a20012802c801220620012802cc012204410047220510ce041a20042005490d062001200420056b22103602cc012001200620056a22053602c8012004450d0a20012d00b0034101470d0a42002107200142003703b003200141b0036a200520104108201041084922061b220410ce041a2001201020046b3602cc012001200520046a3602c80120060d0b20012903b0032119420121070c0c0b418f89c3004133104e000b41124101102a000b41244101102a000b20124101102a000b418f89c3004133104e000b418f89c3004133104e000b20052004103e000b418f89c3004133104e000b41344101102a000b41144101102a000b420021070b0b20091029200141ec016a2008370200200141e0016a2019370300200120033602e801200120073703d801200120173703d0012001200b3703c8010240200b2000520d002008422088a72106024020074200520d002006ad42287e2207422088a70d032007a72209417f4c0d030240024020090d00410821100c010b200910272210450d050b0240024020060d00410021040c010b200641286c210541002104201021090340200341086a2903002107200341106a2903002108200341186a290300211420032903002113200941206a200341206a290300370300200941186a2014370300200941106a2008370300200941086a200737030020092013370300200941286a2109200441016a2104200341286a2103200541586a22050d000b0b200141c8036a2004360200200141c4036a2006360200200141c0036a2010360200200120173703b803200142003703b003200141b0026a200141b0036a105d2001419b036a200141b8026a280200360000200120012903b00237009303200141bc026a20014197036a290000370000200141c6a4b9da043600b102200141023a00b00220012001290090033700b502200141b0026a1097032006450d01201010290c010b2006ad42287e2207422088a70d022007a72209417f4c0d020240024020090d00410821100c010b200910272210450d050b0240024020060d00410021040c010b200641286c210541002104201021090340200341086a2903002107200341106a2903002108200341186a290300211420032903002113200941206a200341206a290300370300200941186a2014370300200941106a2008370300200941086a200737030020092013370300200941286a2109200441016a2104200341286a2103200541586a22050d000b0b200141d0036a2004360200200141cc036a2006360200200141c8036a2010360200200141c0036a2017370300200120193703b803200142013703b003200141b0026a200141b0036a105d2001419b036a200141b8026a280200360000200120012903b00237009303200141bc026a20014197036a290000370000200141c6a4b9da043600b102200141023a00b00220012001290090033700b502200141b0026a1097032006450d00201010290b02402017200b7c2000520d0020014190036a41086a22034200370300200142003703900341c6c4c500411b20014190036a1004200141b0026a41086a2204200329030037030020012001290390033703b002200141103602b4032001200141b0026a3602b003200141e8016a2209200141b0036a102f200141b0036a41086a2009290000370300200141b0036a41106a200941086a280000360200200141003602b403200141093a00b00341b8d6c5004100200141b0036a10880120034200370300200142003703900341c1c8c100411d20014190036a10042004200329030037030020012001290390033703b002200141b0026a4110100c0c010b20012802ec01450d0020012802e80110290b20014190036a41086a22034200370300200142003703900341dec8c100411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b003200141b0026a4110200141b0036a1005210320012802b0032209417f460d062003450d06200141003a00b003200141b0036a20032009410047220410ce041a20092004490d03024002402009450d0020012d00b003220541034b0d00200920046b2109200320046a21040240024020050e0403000301030b200142003703b003200141b0036a20042009410820094108491b220510ce041a200941074d0d0120012903b0032107200142003703b003200141b0036a200420056a200920056b2209410820094108491b10ce041a200941074b0d080c010b200142003703b003200141b0036a20042009410820094108491b220510ce041a200941074d0d0020012903b0032107200142003703b003200141b0036a200420056a200920056b2209410820094108491b10ce041a200941074b0d060b418f89c3004133104e000b200310290c060b1039000b20094108102a000b20094108102a000b20042009103e000b20012903b003210820031029024020072000520d00200142043703b003200120083703b803200141c8016a200141b0036a105d2001419b036a200141d0016a280200360000200120012903c80137009303200141d4016a20014197036a290000370000200141c6a4b9da043600c901200141023a00c80120012001290090033700cd01200141c8016a1097030b200820077c2000520d01200142003703b00320014190036a41086a22034200370300200142003703900341dec8c100411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141c8016a200141b0036a10e701200141b0026a411020012802c801220320012802d0011003024020012802cc01450d00200310290b200141023602b403200141093a00b00341b8d6c5004100200141b0036a1088010c010b20012903b003210820031029024020072000520d00200142033703b003200120083703b803200141c8016a200141b0036a105d2001419b036a200141d0016a280200360000200120012903c80137009303200141d4016a20014197036a290000370000200141c6a4b9da043600c901200141023a00c80120012001290090033700cd01200141c8016a1097030b200820077c2000520d00200142023703b00320014190036a41086a22034200370300200142003703900341dec8c100411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141c8016a200141b0036a10e701200141b0026a411020012802c801220320012802d0011003024020012802cc01450d00200310290b200141013602b403200141093a00b00341b8d6c5004100200141b0036a1088010b20014190036a41086a22034200370300200142003703900341a18ac000411020014190036a1004200141b0026a41086a2209200329030037030020012001290390033703b002200141206a200141b0026a109f03200129032821002001280220211020034200370300200142003703900341e1c4c500411520014190036a10042009200329030037030020012001290390033703b002200141003602b003200141b0026a4110200141b0036a100521030240024002400240024002400240024002400240024002400240024020012802b0032209417f460d002003450d00200141003a00b003200141b0036a20032009410047220410ce041a20092004490d022009450d0c20012d00b00321092003102920094102460d0020094101710d010b410810272209450d022009420037030020014190036a41086a22034200370300200142003703900341c78ac000411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b803200142013703b003200141013602c801200141c8016a200141b0036a1030200929030021070240024020012802b403220520012802b80322046b4108490d0020012802b00321030c010b200441086a22032004490d0e20054101742206200320032006491b22064100480d0e0240024020050d002006102721030c010b20012802b00320052006102821030b2003450d04200120063602b403200120033602b003200621050b2001200441086a22063602b803200320046a2007370000200141b0026a411020032006100302402005450d00200310290b20091029410810272209450d042009420037030020014190036a41086a2203420037030020014200370390034188b7c000411620014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b803200142013703b003200141013602c801200141c8016a200141b0036a1030200929030021070240024020012802b403220520012802b80322046b4108490d0020012802b00321030c010b200441086a22032004490d0e20054101742206200320032006491b22064100480d0e0240024020050d002006102721030c010b20012802b00320052006102821030b2003450d06200120063602b403200120033602b003200621050b2001200441086a22063602b803200320046a2007370000200141b0026a411020032006100302402005450d00200310290b2009102920014190036a41086a220342003703002001420037039003419eb7c000411020014190036a1004200141b0026a41086a2209200329030037030020012001290390033703b002200142003703b003200141b0026a4110200141b0036a41081003200141013a00b00320034200370300200142003703900341e1c4c500411520014190036a10042009200329030037030020012001290390033703b002200141b0026a4110200141b0036a410110030b20014190036a41086a22034200370300200142003703900341c78ac000411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b003200141b0026a4110200141b0036a100521030240024020012802b0032209417f460d002003450d00200120093602cc01200120033602c801200141b0036a200141c8016a104020012802b0032202450d0720012902b403210b2009450d01200310290c010b410821024200210b0b20014190036a41086a2203420037030020014200370390034188b7c000411620014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b003200141b0026a4110200141b0036a100521030240024020012802b0032209417f460d002003450d00200120093602cc01200120033602c801200141b0036a200141c8016a104020012802b0032206450d0820012902b403211402402009450d00200310290b2014422088a721030c010b4108210641002103420021140b200b422088a7210a024020100d00200a417f6a2209200a4b0d082009200a4f0d08200220094103746a2209450d08200929030021000b4100200a419c7f6a22092009200a41016a4b1b220e200a4b0d082002200e4103746a210c200e450d0b2003ad21082002211203402012290300210741002103024002400240024002402008a7221041014b0d0020100e020201020b20102109034020032009410176220420036a22052007200620054103746a290300541b2103200920046b220941014b0d000b0b20072006200341037422096a2903002213510d02200320072013566a21030c010b410021030b200120033602b00341d4b7c000412e200141b0036a4184b8c00010a201000b20082003ad580d0a200620096a2209200941086a2003417f7320106a41037410cf041a201442ffffffff0f832010417f6a2203ad422086842114201241086a2212200c460d0c2008427f7c21080c000b0b20042009103e000b41084108102a000b20064101102a000b41084108102a000b20064101102a000b418f89c3004133104e000b418f89c3004133104e000b41aeb7c0004126104e000b419cb1c5001058000b418080c0001058000b418f89c3004133104e000b200b42ffffffff0f8321080240200a200e6b2209450d000240200e450d002002200c200941037410cf041a2014422088a721030b2009ad42208620088421080b41002109024002400240200341014b0d00024020030e020002000b20144220882207a72103410021090c020b034020092003410176220420096a22052000200620054103746a290300541b2109200320046b220341014b0d000b0b02402000200620094103746a2903002207510d00200920002007566a21090b200920144220882207a722034d0d0041d0b1c5001058000b024002400240024002400240024002400240024020032014a7470d00200341016a22042003490d0a2007a722104101742205200420042005491b220441ffffffff01712004470d0a200441037422054100480d0a0240024020030d002005102721060c010b200620104103742005102821060b2006450d012004ad21140b200620094103746a220441086a2004200320096b41037410cf041a2004200037030002402008a72008422088220ba72203470d00200341016a22092003490d0a20034101742204200920092004491b220941ffffffff01712009470d0a200941037422044100480d0a0240024020030d002004102721020c010b200220034103742004102821020b2002450d022009ad21080b200220034103746a200037030002402007a7220d41016a220a200d4f0d004194b8c0001058000b200a4101762203200a4f0d02200620034103746a29030021130240200a4101710d002003417f6a2203200a4f0d04200620034103746a29030020137c42018821130b20014190036a41086a22034200370300200142003703900341c78ac000411520014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200141003602b803200142013703b0032001200b42017ca7220e3602c801200141c8016a200141b0036a103002400240200e0d0020012802b803211220012802b403211020012802b00321090c010b200e410374210c410020012802b80322036b210420012802b40321102002210503402005290300210702400240201020046a4108490d0020012802b00321090c010b200341086a22092003490d0c20104101742212200920092012491b22124100480d0c0240024020100d002012102721090c010b20012802b00320102012102821090b2009450d07200120123602b403200120093602b003201221100b200541086a21052001200341086a22123602b803200920036a2007370000200441786a210420122103200c41786a220c0d000b0b200141b0026a411020092012100302402010450d00200910290b02402008a7450d00200210290b20014190036a41086a2203420037030020014200370390034188b7c000411620014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200142013703b003200141003602b8032001200a3602c801200d41037441086a2112200141c8016a200141b0036a1030410020012802b80322036b210420012802b40321102006210503402005290300210702400240201020046a4108490d0020012802b00321090c010b200341086a22092003490d0b2010410174220c20092009200c491b220c4100480d0b0240024020100d00200c102721090c010b20012802b0032010200c102821090b2009450d072001200c3602b403200120093602b003200c21100b200541086a21052001200341086a220c3602b803200920036a2007370000200441786a2104200c2103201241786a22120d000b200141b0026a41102009200c100302402010450d00200910290b02402014a7450d00200610290b20014190036a41086a220342003703002001420037039003419eb7c000411020014190036a1004200141b0026a41086a200329030037030020012001290390033703b002200120133703b003200141b0026a4110200141b0036a410810030240200e41e500470d00200141106a41888dc300410d1094012013429a087c2001290318420020012802101b560d0020014190036a41086a2209420037030020014200370390034199a7c100411720014190036a1004200141b0026a41086a200929030037030020012001290390033703b002410810272209450d07200942e40037000020094108411010282209450d0820092013370008200141b0026a4110200941101003200910290b20034200370300200142003703900341cfa2c400411720014190036a1004200141b0036a41086a200329030037030020012001290390033703b0030240200141b0036a411041b8d6c50041004100100b417f470d00200141ceecc200410d109401200129030821072001280200210320014190036a41086a22094200370300200142003703900341cfa2c400411720014190036a1004200141b0036a41086a200929030037030020012001290390033703b00320012007420020031b3703c801200141b0036a4110200141c8016a410810030b20014190036a41086a22034200370300200142003703900341dbecc200411120014190036a1004200141b0036a41086a2209200329030037030020012001290390033703b003200141b0036a4110100c20034200370300200142003703900341fcc7c500411720014190036a10042009200329030037030020012001290390033703b003200141b0036a4110100c41bdcbc5004113108a02220341ff01714102460d082003410171450d08200141a0046a24000f0b20054108102a000b20044108102a000b41acb8c0002003200a1037000b41acb8c0002003200a1037000b20124101102a000b200c4101102a000b41084101102a000b41104101102a000b41d4e9c2001058000b102b000bd91a08017f017e047f027e047f017e037f017e23004190026b2201240042002102200141d0016a41086a22034200370300200142003703d0014192cdc5004115200141d0016a100420014190016a41086a2003290300370300200120012903d0013703900120014190016a4110100c200141286a41a7cdc500411a10b501200128022c21042001280228210520034200370300200142003703d00141d8cdc500411b200141d0016a1004200141f0016a41086a2003290300370300200120012903d0013703f001200141003602d001200141f0016a4110200141d0016a10052103024002400240024002400240024002400240024020012802d0012206417f460d002003450d00200142003703d001200141d0016a20032006410820064108491b10ce041a200641074d0d0120012903d0012102200310290b200141186a4180e59af7002004410020051b220320034180e59af7004922061b20034180e59af70020061b6b2206ad220742002007420010d304200742a8c30180210742ffffffffffffffffff00428080808080808080807f20061b2001290318220820012903202008423f87521b42808090bbbad6adf00d7f210802400240200341ffe49af7004b0d0042ffffffffffffffffff00428080808080808080807f2002200720087d22087d22074200531b20072002427f5522032008427f554720032007427f5547711b22024280ec94a37c20024280ec94a37c551b21020c010b42ffffffffffffffffff00428080808080808080807f2002200720087c22087c22074200531b20072002427f5522032008427f554620032007427f5547711b21020b200141d0016a41086a22034200370300200142003703d00141d8cdc500411b200141d0016a100420014190016a41086a22062003290300370300200120012903d00137039001410810272204450d012004200237000020014190016a41102004410810032004102920034200370300200142003703d00141a7cdc500411a200141d0016a100420062003290300370300200120012903d0013703900120014190016a4110100c20034200370300200142003703d00141c1cdc5004117200141d0016a100420062003290300370300200120012903d0013703900120014190016a4110100c20034200370300200142003703d00141888dc300410d200141d0016a100420062003290300370300200120012903d00137039001200141086a20014190016a109f03200129031021022001280208210920034200370300200142003703d00141d18fc3004111200141d0016a100420062003290300370300200120012903d00137039001200141003602f00120014190016a4110200141f0016a100521030240024020012802f0012206417f460d002003450d00200141f0016a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200141f0016a2003200410ce041a2006411f4d0d04200141d0016a41186a2206200141f0016a41186a2204290000370300200141d0016a41106a2205200141f0016a41106a220a290000370300200141d0016a41086a220b200141f0016a41086a220c290000370300200120012900f0013703d00120031029200141b0016a41186a22032006290300370300200141b0016a41106a22062005290300370300200141b0016a41086a2205200b290300370300200120012903d0013703b00120014190016a4110100c200420032903002207370300200a20062903002208370300200c2005290300220d370300200141306a41086a200d370300200141306a41106a2008370300200141306a41186a2007370300200120012903b00122073703f001200120073703300c010b200141f0016a41186a200141b0016a41186a290300370300200141f0016a41106a200141b0016a41106a290300370300200141f0016a41086a200141b0016a41086a290300370300200141306a41086a4200370300200141306a41106a4200370300200141306a41186a4200370300200120012903b0013703f001200142003703300b200141d0016a41086a22034200370300200142003703d00141aa8dc300410d200141d0016a1004200141f0016a41086a2003290300370300200120012903d0013703f001200141003602d001200141f0016a4110200141d0016a100521030240024020012802d0012206417f460d002003450d00200120063602b401200120033602b001200141d0016a200141b0016a104320012802d001220a450d0520012902d401210702402006450d00200310290b200141f0016a4110100c2007422088a721032007a7210b0c010b4104210a410021034100210b0b200141d0016a41086a22064200370300200142003703d00141958dc3004115200141d0016a100420014190016a41086a2006290300370300200120012903d00137039001200141003602d00120014190016a4110200141d0016a100521050240024020012802d0012206417f460d00200141f0016a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a200141f0016a2005200410ce041a2006411f4d0d06200141d0016a41186a2206200141f0016a41186a2204290000370300200141d0016a41106a220c200141f0016a41106a220e290000370300200141d0016a41086a220f200141f0016a41086a2210290000370300200120012900f0013703d00120051029200141b0016a41186a22052006290300370300200141b0016a41106a2206200c290300370300200141b0016a41086a220c200f290300370300200120012903d0013703b00120014190016a4110100c200420052903002207370300200e200629030022083703002010200c290300220d370300200141d0006a41086a200d370300200141d0006a41106a2008370300200141d0006a41186a2007370300200120012903b00122073703f001200120073703500c010b200141f0016a41086a200141b0016a41086a290300370300200141f0016a41106a200141b0016a41106a290300370300200141f0016a41186a200141b0016a41186a290300370300200141d0006a41086a4200370300200141d0006a41106a4200370300200141d0006a41186a4200370300200120012903b0013703f001200142003703500b02402002420020091b220242fb01540d00200242857e7c2207500d00411010272206450d06200641086a41002900bf8d43370000200641002900b78d4337000020064110412010282206450d0720062007370010200141b0016a41186a22044200370300200141b0016a41106a22054200370300200141b0016a41086a22094200370300200142003703b00120064118200141b0016a1000200141f0016a41186a2004290300370300200141f0016a41106a2005290300370300200141f0016a41086a2009290300370300200120012903b0013703f001200141f0016a4120100c200610290b200141b0016a41186a22064200370300200141b0016a41106a22044200370300200141b0016a41086a22054200370300200142003703b001200141b0016a101e200141f0006a41186a2006290300370300200141f0006a41106a2004290300370300200141f0006a41086a2005290300370300200120012903b001370370200141f0016a41186a2209200141306a41186a290300370300200141f0016a41106a220c200141306a41106a290300370300200141f0016a41086a220e200141306a41086a290300370300200120012903303703f001200642003703002004420037030020054200370300200142003703b0010240200141f0016a4120200141b0016a101f450d0020014190016a41086a2005290300220737030020014190016a41106a2004290300220837030020014190016a41186a2006290300220d370300200120012903b001221137039001200e2007370300200c20083703002009200d370300200120113703f00102402003200b470d00200341016a22062003490d0a20034101742204200620062004491b220bad42247e2207422088a70d0a2007a722064100480d0a0240024020030d0020061027210a0c010b200a200341246c20061028210a0b200a450d090b200a200341246c6a220641003a0000200620012903f001370001200641096a200141f8016a290300370000200641116a20014180026a290300370000200641196a20014188026a290300370000200620012f00d0013b0021200641236a200141d2016a2d00003a0000200341016a21030b2000200129033037001420002002370300200020012903703700342000412c6a200141306a41186a290300370000200041246a200141306a41106a2903003700002000411c6a200141306a41086a2903003700002000413c6a200141f0006a41086a290300370000200041c4006a200141f0006a41106a290300370000200041cc006a200141f0006a41186a290300370000200041106a20033602002000410c6a200b3602002000200a360208200041ec006a200141d0006a41186a290300370000200041e4006a200141d0006a41106a290300370000200041dc006a200141d0006a41086a2903003700002000200129035037005420014190026a24000f0b418f89c3004133104e000b41084101102a000b418f89c3004133104e000b418f89c3004133104e000b418f89c3004133104e000b41104101102a000b41204101102a000b20064104102a000b102b000bf90201027f23004180026b22022400024002402001450d00200220003602000c010b200241b8d6c5003602000b2002200136020420024180016a2002108e020240200228028801450d00200241086a20024180016a41f80010ce041a200241086a10b9020240200241186a2802002200450d0020022802102101200041246c210003400240024020012d0000220341034b0d0002400240024020030e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b0240200241146a280200450d00200228021010290b20024180026a240042010f0b2002411c6a41013602002002420137020c200241cc81c200360208200241023602fc01200241d082c2003602f8012002200241f8016a360218200241086a41d481c2001057000be40b01087f230041206b2202240020024100360218200242013703100240024002400240024002400240024002400240410410272203450d0020024284808080c00037021420022003360210200341edcad18b0636000002400240200228021420022802182203460d00200228021021040c010b200341016a22042003490d0a20034101742205200420042005491b22054100480d0a0240024020030d002005102721040c010b200228021020032005102821040b2004450d0220022005360214200220043602100b2002200341016a360218200420036a41073a00004112200241106a10c60241002103034020034184e7c1006a28020020034188e7c1006a280200200241106a10c702024002402003418ce7c1006a22052802004102470d0002400240200228021420022802182204460d00200228021021050c010b200441016a22052004490d0d20044101742206200520052006491b22064100480d0d0240024020040d002006102721050c010b200228021020042006102821050b2005450d0620022006360214200220053602100b2002200441016a360218200520046a41003a00000c010b02400240200228021420022802182204460d00200228021021060c010b200441016a22062004490d0c20044101742207200620062007491b22074100480d0c0240024020040d002007102721060c010b200228021020042007102821060b2006450d0620022007360214200220063602100b2002200441016a360218200620046a41013a00002005200241106a10c8020b02400240200341ace7c1006a22052802004102470d0002400240200228021420022802182204460d00200228021021050c010b200441016a22052004490d0d20044101742206200520052006491b22064100480d0d0240024020040d002006102721050c010b200228021020042006102821050b2005450d0820022006360214200220053602100b2002200441016a360218200520046a41003a00000c010b02400240200228021420022802182204460d00200228021021060c010b200441016a22062004490d0c20044101742207200620062007491b22074100480d0c0240024020040d002007102721060c010b200228021020042007102821060b2006450d0820022007360214200220063602100b2002200441016a360218200620046a41013a00002005200241106a10c9020b02400240200341bce7c1006a22052802004102470d0002400240200228021420022802182204460d00200228021021050c010b200441016a22052004490d0d20044101742206200520052006491b22064100480d0d0240024020040d002006102721050c010b200228021020042006102821050b2005450d0a20022006360214200220053602100b2002200441016a360218200520046a41003a00000c010b02400240200228021420022802182204460d00200228021021060c010b200441016a22062004490d0c20044101742207200620062007491b22074100480d0c0240024020040d002007102721060c010b200228021020042007102821060b2006450d0a20022007360214200220063602100b2002200441016a360218200620046a41013a00002005200241106a10ca020b200341cce7c1006a200241106a10cb02200341dc006a220341f80c470d000b20022802142107200228021021062002280218210320024100360218200242013703102002200336020c2002410c6a200241106a10300240024020022802142205200228021822046b2003490d00200228021021050c010b200420036a22082004490d0a20054101742209200820082009491b22084100480d0a0240024020050d002008102721050c010b200228021020052008102821050b2005450d0920022008360214200220053602100b200520046a2006200310ce041a200420036a210302402007450d00200610290b200241206a24002003ad4220862005ad840f0b41044101102a000b20054101102a000b20064101102a000b20074101102a000b20064101102a000b20074101102a000b20064101102a000b20074101102a000b20084101102a000b102b000b920701037f0240024002400240024002402000413f4b0d0002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0620024101742204200320032004491b22044100480d060240024020020d002004102721030c010b200128020020022004102821030b2003450d0220012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000f0b200041808001490d032000418080808004490d020c010b20044101102a000b0240024002400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0520024101742204200320032004491b22044100480d050240024020020d002004102721030c010b200128020020022004102821030b2003450d0120012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a000002400240200141046a2802002203200428020022026b4104490d00200128020021030c010b200241046a22042002490d0520034101742202200420042002491b22024100480d050240024020030d002002102721030c010b200128020020032002102821030b2003450d0220012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b20044101102a000b20024101102a000b024002400240200141046a2802002203200141086a28020022026b4104490d00200128020021030c010b200241046a22042002490d0320034101742202200420042002491b22024100480d030240024020030d002002102721030c010b200128020020032002102821030b2003450d0120012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b20024101102a000b024002400240200141046a2802002203200141086a28020022026b4102490d00200128020021030c010b200241026a22042002490d0220034101742202200420042002491b22024100480d020240024020030d002002102721030c010b200128020020032002102821030b2003450d0120012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20024101102a000b102b000bc60801037f0240024002400240024002400240024002402001413f4b0d0002400240200241046a280200200241086a2802002203460d00200228020021040c010b200341016a22042003490d0920034101742205200420042005491b22054100480d090240024020030d002005102721040c010b200228020020032005102821040b2004450d0220022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000c050b200141808001490d032001418080808004490d020c010b20054101102a000b0240024002400240200241046a280200200241086a2802002203460d00200228020021040c010b200341016a22042003490d0820034101742205200420042005491b22054100480d080240024020030d002005102721040c010b200228020020032005102821040b2004450d0120022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a000002400240200241046a2802002204200528020022036b4104490d00200228020021040c010b200341046a22052003490d0820044101742203200520052003491b22034100480d080240024020040d002003102721040c010b200228020020042003102821040b2004450d0220022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c040b20054101102a000b20034101102a000b024002400240200241046a2802002204200241086a28020022036b4104490d00200228020021040c010b200341046a22052003490d0620044101742203200520052003491b22034100480d060240024020040d002003102721040c010b200228020020042003102821040b2004450d0120022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c020b20034101102a000b02400240200241046a2802002204200241086a28020022036b4102490d00200228020021040c010b200341026a22052003490d0420044101742203200520052003491b22034100480d040240024020040d002003102721040c010b200228020020042003102821040b2004450d0220022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000b02400240200241046a2802002204200241086a28020022036b2001490d00200228020021040c010b200320016a22052003490d0320044101742203200520052003491b22034100480d030240024020040d002003102721040c010b200228020020042003102821040b2004450d0220022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a2000200110ce041a0f0b20034101102a000b20034101102a000b102b000b860201037f230041206b220224000240024020002802004101460d00200220002802041101002002280204200241086a280200200110c7022002410c6a200110b004200228020c450d01200241106a28020021030240200241186a2802002200450d00200041d8006c21044100210103400240200320016a220041346a280200450d002000413c6a280200450d00200041386a28020010290b0240200041c4006a280200450d00200041cc006a280200450d00200041c8006a28020010290b2004200141d8006a2201470d000b0b200241146a280200450d01200310290c010b200041086a2802002000410c6a280200200110c702200041106a200110b0040b200241206a24000bae0201047f230041106b220224000240024020002802004101460d00200241086a200028020411010020022802082103200228020c2200200110c6022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c7022000410c6a200110af04200041206a28020020032005412841242000411c6a2802004101461b6a6a280200200110ad0420042005412c6a2205470d000c020b0b200028020421032000410c6a2802002200200110c6022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c7022000410c6a200110af04200041206a28020020032005412841242000411c6a2802004101461b6a6a280200200110ad0420042005412c6a2205470d000b0b200241106a24000be60201047f230041106b220224000240024020002802004101460d00200241086a200028020411010020022802082103200228020c2200200110c6022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c702200041106a28020020032005411841142000410c6a2802004101461b6a6a280200200110ad04200041206a28020020032005412841242000411c6a2802004101461b6a6a280200200110ad0420042005412c6a2205470d000c020b0b200028020421032000410c6a2802002200200110c6022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c702200041106a28020020032005411841142000410c6a2802004101461b6a6a280200200110ad04200041206a28020020032005412841242000411c6a2802004101461b6a6a280200200110ad0420042005412c6a2205470d000b0b200241106a24000b880401057f230041206b220224000240024020002802004101460d00200241086a200028020411010020022802082103200228020c2200200110c6022000450d01200041386c2104410021050340200320056a220041046a280200200041086a280200200110c702200041106a280200200041146a280200200110c70202400240200041186a2802004101460d00200241106a2000411c6a280200200041206a28020028020c110000200228021022062002280218200110c7022002280214450d01200610290c010b2000411c6a280200200041246a280200200110c7020b2000412c6a2802002003200541344130200041286a2802004101461b6a6a280200200110ad042004200541386a2205470d000c020b0b200028020421032000410c6a2802002200200110c6022000450d00200041386c2104410021050340200320056a220041046a280200200041086a280200200110c702200041106a280200200041146a280200200110c70202400240200041186a2802004101460d00200241106a2000411c6a280200200041206a28020028020c110000200228021022062002280218200110c7022002280214450d01200610290c010b2000411c6a280200200041246a280200200110c7020b2000412c6a2802002003200541344130200041286a2802004101461b6a6a280200200110ad042004200541386a2205470d000b0b200241206a24000ba80301027f230041a0076b22022400024002402001450d00200220003602080c010b200241b8d6c5003602080b2002200136020c200241f0046a200241086a104902400240024020022903d8054203510d00200241106a200241f0046a41a00210ce041a200241b0026a200241106a41a00210ce041a2002200241b0026a3602f004200241d0046a200241f0046a10bf0220022802d8042101200241f0046a200241b0026a41a00210ce041a20024198076a20022802d804360200200220022903d00437039007200241e0046a200241f0046a200120024190076a10bc02410121000240024020022802e0044101460d004100210020022802e40441004721030c010b4280828898f01f20022802e404410374ad88a721030b410110272201450d01200120003a000020014101410210282201450d02200120033a0001200241a0076a24002001ad428080808020840f0b200241c4026a4101360200200242013702b402200241cc81c2003602b00220024102360214200241e882c2003602102002200241106a3602c002200241b0026a41d481c2001057000b41014101102a000b41024101102a000bee1003097f017e037f230041e0016b22022400200241206a41ff88c300411010c1022002280224210320022802202104200241a0016a41086a22054200370300200242003703a0014192cdc5004115200241a0016a1004200241286a41086a2005290300370300200220022903a0013703284100210620022003410020041b3602c00141042107200241286a4110200241c0016a41041003200241106a41888dc300410d1094012002290318420020022802101b10c202200241086a4192cdc500411510b5014104210841002109024002400240200228020c410020022802081b220a450d00200aad420c7e220b422088a70d01200ba722034100480d01200310272208450d02200821034100210c034002400240024002400240411410272204450d00200441106a4100280083ce45360000200441086a41002900fbcd45370000200441002900f3cd4537000020044114412810282205450d012005200c360014200241286a41186a22044200370300200241286a41106a220d4200370300200241286a41086a220942003703002002420037032820054118200241286a1000200241c0016a41186a2004290300370300200241c0016a41106a200d290300370300200241c0016a41086a2009290300370300200220022903283703c00120024100360228200241c0016a4120200241286a1005210d20022802282209417f460d03200d450d03200220093602b4012002200d3602b001200241286a200241b0016a104420022802282204450d02200229022c210b02402009450d00200d10290b200241c0016a4120100c0c040b41144101102a000b41284101102a000b418f89c3004133104e000b410021040b2005102920032004410120041b360200200341046a200ba7410020041b360200200341086a200b422088a7410020041b3602002003410c6a2103200a200c41016a220c470d000b200a21090b0240024002400240024002402009410c6c2203450d002003410c6e220641037422044100480d06200410272207450d010b410021050240200820036a220d2008460d00200721032008210403402004280200210c200341046a200441086a2802003602002003200c360200200341086a2103200541016a21052004410c6a2204200d470d000b0b200241c0016a2007200510c00202402006450d00200710290b02402009450d002009410c6c21042008210303400240200341046a280200450d00200328020010290b2003410c6a2103200441746a22040d000b0b0240200a450d00200810290b200241286a41186a200241c0016a41186a290300370300200241286a41106a200241c0016a41106a290300370300200241286a41086a200241c0016a41086a290300370300200220022903c001370328200241a0016a41086a22034200370300200242003703a00141958dc3004115200241a0016a1004200241b0016a41086a2003290300370300200220022903a0013703b001200241b0016a4110200241286a41201003200241286a10c302200241003602b801200242013703b001412010272203450d01200242a080808080043702b401200220033602b0012003200229023c370000200341086a200241c4006a290200370000200341106a200241cc006a290200370000200341186a200241d4006a290200370000200241286a200241b0016a10540240024020022802b401220520022802b801220c6b4120490d00200c41206a210320022802b00121040c010b200c41206a2203200c490d0620054101742204200320032004491b220d4100480d060240024020050d00200d102721040c010b20022802b0012005200d102821040b2004450d032002200d3602b401200220043602b001200d21050b200220033602b8012004200c6a220c200229025c370000200c41086a200241e4006a290200370000200c41106a200241ec006a290200370000200c41186a200241f4006a2902003700000240200520036b411f4b0d00200341206a220c2003490d062005410174220d200c200c200d491b220c4100480d060240024020050d00200c102721040c010b20042005200c102821040b2004450d042002200c3602b401200220043602b0010b200420036a220441086a20024184016a290200370000200441106a2002418c016a290200370000200441186a20024194016a2902003700002002200341206a3602b8012004200229027c3700002002280230210e2002200241286a41106a28020022063602c001200241c0016a200241b0016a10300240024020060d0020022802b801210420022802b00121050c010b200641246c210820022802b401210920022802b8012103200e210c0340200241c0016a200c104f20022802c001210a02400240200920036b20022802c801220d490d002003200d6a210420022802b00121050c010b2003200d6a22042003490d0820094101742205200420042005491b22074100480d080240024020090d002007102721050c010b20022802b00120092007102821050b2005450d07200220073602b401200220053602b001200721090b200220043602b801200520036a200a200d10ce041a024020022802c401450d00200a10290b200c41246a210c200421032008415c6a22080d000b2006450d00200641246c210c200e210303400240024020032d0000220d41034b0d00024002400240200d0e0404000102040b2003410c6a280200450d03200341086a28020010290c030b2003410c6a280200450d02200341086a28020010290c020b2003410c6a280200450d01200341086a28020010290c010b200341086a280200450d00200341046a28020010290b200341246a2103200c415c6a220c0d000b0b0240200241346a280200450d00200e10290b200241e0016a24002004ad4220862005ad840f0b20044104102a000b41204101102a000b200d4101102a000b200c4101102a000b20074101102a000b102b000b20034104102a000b900c03017f027e097f230041b0026b22022400024002402001450d00200220003602100c010b200241b8d6c5003602100b20022001360214200241286a200241106a10fb010240024020022802282201450d002002200229022c37021c20022001360218200241286a200241186a10cf02024020022802284101470d002002200229022c3703c80141beefc2004128200241c8016a4188eec20010a201000b200241286a41086a2903002103200241ceecc200410d109401200229030821042002280200210141a002102722050d0141a0024108102a000b2002413c6a41013602002002420137022c200241cc81c200360228200241023602cc012002418083c2003602c8012002200241c8016a360238200241286a41d481c2001057000b2005200241c8016a41e80010ce04220642023703682006410236029801200620022903a001370370200641f8006a200241a0016a41086a29030037030020064180016a200241b0016a29030037030020064188016a200241b8016a29030037030020064190016a200241c0016a29030037030020062003200442b9067c42b90620011b220420042003541b3703a001200641a8016a200241286a41f80010ce041a200241186a2101200228021c21070240024003402001280200220841086a210020082f0106220941037421014100210a0240024003402001450d0141c8e2c1002000410810d004220b450d02200141786a2101200a41016a210a200041086a2100200b417f4a0d000b200a417f6a21090b024020070d0041d0e2c1002101412821000c030b2007417f6a2107200820094102746a41e4016a21010c010b0b2008200a410c6c6a220141e0006a2802002100200141e8006a280200210120024200370328200241286a20002001410820014108491b10ce041a200141074b0d0141fec4c5002101412921000b2002200036022c2002200136022841f88cc000412b200241286a41e88cc00010a201000b20022903282103200241286a41086a220142003703002002420037032841c78ac0004115200241286a1004200241c8016a41086a2001290300370300200220022903283703c8014100210120024100360228200241c8016a4110200241286a1005210a02400240024002400240024020022802282200417f460d00200220003602a4012002200a3602a001200241286a200241a0016a10402002280228220b450d02200241306a2802002101200228022c21082000450d01200a10290c010b4108210b410021080b4100210002402001417f6a220a20014b0d00200a20014f0d00200b200a4103746a2201450d00200129030020035221000b02402008450d00200b10290b0240024020000d004101210c0c010b200641a00241c00410282205450d02200541a0026a200241c8016a41e80010ce041a2005420237038803200520033703c0032005410c3602b803200520022903a0013703900320054198036a200241a8016a290300370300200541a0036a200241b0016a290300370300200541a8036a200241b8016a290300370300200541b0036a200241c0016a290300370300200541c8036a200241286a41f80010ce041a4102210c0b2002280218200228021c200228022010fc01200241003602d001200242013703c8012002200c360228200c41a0026c210d200241286a200241c8016a103020022802cc01210820022802d00121014100210a034020022005200a6a3602a001200241286a200241a0016a10bf022002280228210702400240200820016b20022802302206490d00200120066a210020022802c801210b0c010b200120066a22002001490d052008410174220b20002000200b491b22094100480d050240024020080d0020091027210b0c010b20022802c801200820091028210b0b200b450d04200220093602cc012002200b3602c801200921080b200220003602d001200b20016a2007200610ce041a0240200228022c450d00200710290b20002101200d200a41a0026a220a470d000b200c41a0026c210a410021010340200520016a4198016a103d200a200141a0026a2201470d000b20051029200241b0026a24002000ad422086200bad840f0b418f89c3004133104e000b41c0044108102a000b20094101102a000b102b000bad0201077f230041106b2202240020012802042103024002400240024003402001280200220441086a210520042f01062206410374210141002107024003402001450d0141e4cac5002005410810d0042208450d03200141786a2101200741016a2107200541086a21052008417f4a0d000b2007417f6a21060b02402003450d002003417f6a2103200420064102746a41e4016a21010c010b0b200041eccac500360204200041086a41283602000c010b20042007410c6c6a220141e0006a2802002105200141e8006a280200210120024200370308200241086a20052001410820014108491b10ce041a200141074b0d0120004194cbc500360204200041086a41293602000b410121010c010b200041086a2002290308370300410021010b20002001360200200241106a24000bb91e08067f017e057f017e047f027e027f017e230041b0026b22022400024002402001450d00200220003602100c010b200241b8d6c5003602100b20022001360214200241c8006a200241106a108e020240024020022802502203450d00200241d8006a280200210420022802542105200241c8006a200241106a1048200228024822060d0102402004450d00200441246c21002003210103400240024020012d0000220741034b0d0002400240024020070e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b2005450d00200310290b200241dc006a41013602002002420137024c200241cc81c200360248200241023602d4012002419c83c2003602d0012002200241d0016a360258200241c8006a41d481c2001057000b200229024c2108200241c8006a200241106a10fb01024020022802482201450d002002200229024c37021c20022001360218200241013b01342002420037022c2002418883c000360228200241286a41086a21090240024002400240024002402008422088a7220a450d002006200a41a0026c6a210b200241d0016a410272210c2006210d0340200d41e8006a2903004202520d010240024002400240024002400240024002400240024002400240200d2802980122014102470d00200d2903a001210e200241186a2101200228021c210f024002400240024003402001280200221041086a210020102f010622114103742101410021070240024003402001450d0141f6c4c5002000410810d0042212450d02200141786a2101200741016a2107200041086a21002012417f4a0d000b2007417f6a21110b200f450d02200f417f6a210f201020114102746a41e4016a21010c010b0b20102007410c6c6a220141e0006a2802002100200141e8006a280200210120024200370348200241c8006a20002001410820014108491b10ce041a0240200141074b0d00201342808080807083422984210e41fec4c50021110c020b200e42f20c8020022903482213510d0341a08fc30021114131210f0c020b201342808080807083421c84210e41a7c5c50021110b200ea7210f0b024002400240024020022d0035450d00413121014195fac10021000c010b2002280228200228022c200228023010fc012002420037022c2002418883c000360228200242e2c289abb68edbb7f400370338200241d0016a410272410041da0010cd041a200241c8006a410041840110cd041a41e40110272212450d0520124100360200201241046a200241d0016a41dc0010ce041a201241e0006a200241c8006a41840110ce041a2002410036022c2002201236022820122f0106220d4103742110417f210041002101024002400340024020102001470d00200d21000c020b200241386a201220016a41086a410810d0042207450d02200141086a2101200041016a2100200741004e0d000b0b200242e2c289abb68edbb7f40037025c20022009360258200220003602542002201236024c200241003602482002200241286a360250200241003602d801200242013703d0012002200f360238200241386a200241d0016a103020022802d401220020022802d80122016b200f490d0220022802d00121000c030b412d210141c6fac10021000b2002200136024c2002200036024841f3fac1004122200241c8006a4198fbc10010a201000b2001200f6a22072001490d1220004101742212200720072012491b22074100480d120240024020000d002007102721000c010b20022802d00120002007102821000b2000450d04200220073602d401200220003602d0010b20022001200f6a3602d801200020016a2011200f10ce041a200241386a41086a20022802d801360200200220022903d001370338200241c8006a200241386a10fd0120024180023b0134200241d0016a41086a200241286a41086a290300370300200220022903283703d0010c100b200d2802980121010b20014102470d0b200d2903a0012114200241c8006a200241186a10cf020240024020022802484101470d002002350250210e200228024c2115410121160c010b2002290350210e200241ceecc200410d10940102402014200e423c7c560d00410021162014200229030842b9067c42b90620022802001b220e540d010c0d0b201742808080807083422584210e410121164199efc20021150b024020022d0035450d00413121014195fac10021000c050b02402016450d002002280228200228022c200228023010fc012002420037022c2002418883c000360228200242f4d2b59bc7ae98b8303703380c030b20022802282112200242f4d2b59bc7ae98b8303703382012418883c000460d02200228022c210f0c030b41e4014104102a000b20074101102a000b200c410041da0010cd041a200241c8006a410041840110cd041a41e40110272212450d034100210f20124100360200201241046a200241d0016a41dc0010ce041a201241e0006a200241c8006a41840110ce041a2002410036022c200220123602280b034020122f010622114103742110417f210041002101024002400340024020102001470d00201121000c020b200241386a201220016a41086a410810d0042207450d02200141086a2101200041016a21002007417f4a0d000b0b200f450d03200f417f6a210f201220004102746a41e4016a28020021120c010b0b412d210141c6fac10021000b2002200136024c2002200036024841f3fac1004122200241c8006a4198fbc10010a201000b200242f4d2b59bc7ae98b83037025c20022009360258200220003602542002201236024c200241003602482002200241286a360250200241003602d801200242013703d0014101102721010240024020160d002001450d03200141003a000020024281808080103702d401200220013602d00120014101410910282201450d042001200e3700012002428980808090013702d401200220013602d0010c010b2001450d04200141013a000020024281808080103702d401200220013602d0012002200ea72201360238200241386a200241d0016a10300240024020022802d401220720022802d80122006b2001490d0020022802d00121070c010b200020016a22122000490d0b20074101742210201220122010491b22124100480d0b0240024020070d002012102721070c010b20022802d00120072012102821070b2007450d06200220123602d401200220073602d0010b2002200020016a3602d801200720006a2015200110ce041a0b200241386a41086a200241d0016a41086a280200360200200220022903d001370338200241c8006a200241386a10fd01200220163a0035200241003a0034200e21172016450d05200241d0016a41086a200241286a41086a290300370300200220022903283703d0010c080b41e4014104102a000b41014101102a000b41094101102a000b41014101102a000b20124101102a000b200d41a0026a220d200b470d000b0b200241d0016a41086a2009290300370300200220022903283703d0010b2002280218200228021c200228022010fc0102402004450d00200441246c21002003210103400240024020012d0000220741034b0d0002400240024020070e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b02402005450d00200310290b2008a721070240200a450d00200a41a0026c210020064198016a210103402001103d200141a0026a2101200041e07d6a22000d000b0b02402007450d00200610290b2002410036025020024201370348410110272201450d03200242818080801037024c20022001360248200120022d00dc013a000020014101410210282201450d02200242828080802037024c20022001360248200120022d00dd013a000120022802d801210d20014102410610282212450d0120024286808080e00037024c200220123602482012200d36000220022802d00122072100024020022802d4012210450d002010210120072100034020002802e40121002001417f6a22010d000b0b0240024002400240200d0d004280808080e000210e0c010b41062110200241d0016a210b4106210f41002111034002400240201120002f01064f0d0020002011410c6c6a41e0006a2101200020114103746a41086a2107201141016a21110c010b02400240200028020022010d00201742808080807083200bad84211741002107410021010c010b2000330104422086200bad842117410121070b201721142017210e02402017422088a7220020012f0106490d000340200e221442ffffffff0f83210e200741016a210720012f01042200200128020022012f01064f0d000b0b20012000410c6c6a2111200120004103746a2116200041027420016a41e8016a28020021002014a7210b02402007417f6a2201450d00034020002802e40121002001417f6a22010d000b0b201141e0006a2101201641086a2107410021110b02402010200f6b41074b0d00200f41086a2216200f490d0520104101742204201620162004491b22164100480d050240024020100d002016102721120c010b201220102016102821120b2012450d032002201636024c200220123602480b2002200f41086a3602502012200f6a200729000037000020012802002116200220012802082201360228200241286a200241c8006a103002400240200228024c2210200228025022076b2001490d00200228024821120c010b200720016a22122007490d052010410174220f20122012200f491b220f4100480d050240024020100d00200f102721120c010b20022802482010200f102821120b2012450d042002200f36024c20022012360248200f21100b2002200720016a220f360250201220076a2016200110ce041a200d417f6a220d0d000b200fad422086210e20022802d401211020022802d00121070b2007201020022802d80110fc01200241b0026a2400200e2012ad840f0b20164101102a000b200f4101102a000b102b000b41064101102a000b41024101102a000b41014101102a000b200241dc006a41013602002002420137024c200241cc81c200360248200241023602d4012002419c83c2003602d0012002200241d0016a360258200241c8006a41d481c2001057000b7701027f230041206b22022400200241b8d6c500410010db0102404120102722030d0041204101102a000b20032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241206a24002003ad42808080808004840bcf4c040b7f027e127f067e230041c00a6b22022400024002402001450d00200220003602400c010b200241b8d6c5003602400b20022001360244200241e8066a200241c0006a104902400240024002400240024002400240024002400240024002400240024002400240024020022903d0074203510d00200241c8006a200241e8066a41a00210ce041a200241e8026a200241c8006a41a00210ce041a2002200241e8026a36028805200241e8066a20024188056a10bf0220022802f0062100024020022802ec06450d0020022802e80610290b200241e8066a200241e8026a41a00210ce041a20024188056a200241e8066a10860202402002280288054101470d00200228029005416b6a220141054b0d10200228028c05210002400240024020010e06001313131301000b4102210341f601210120004184efc200460d0120004184efc200411510d004450d010c120b410021010240200041a981c200470d00410021030c130b41002103200041a981c200411a10d0040d110b0c110b200241e8066a20024190056a41d80110ce041a200241386a200241b8076a220410ac020240024002402002290388074202520d0041c00110272201450d04200141013a00b801200142003703b00120014280808080c0003703a801200142043703a0012001427f3703980120014200370390012001420137038801200142003703800120014280808080c000370378200142043703702001427f37036820014200370360200142013703582001420037035020014280808080c000370348200142043703402001427f37033820014200370330200142013703282001420037032020014280808080c000370318200142043703102001427f37030820014200370300200141bc016a20024188056a41036a28000036000020012002280088053600b9012002200141c0016a36028c0a200220013602880a200241043602840a200220013602800a200241900a6a41206a22054200370300200241900a6a41186a22064280808080c000370300200241013a00b80a200242043703a00a2002427f3703980a200242003703900a200241c8096a41086a22072001290308370300200241c8096a41106a22082001290310370300200241c8096a41186a22032001290318370300200241c8096a41206a22092001290320370300200220012903003703c809200220012800293602f80920022001412c6a2800003600fb09200141306a210020012d0028220a4102460d1020024188096a41286a220b200241900a6a41286a220c29030037030020024188096a41206a200529030037030020024188096a41186a200629030037030020024188096a41106a200241900a6a41106a29030037030020024188096a41086a200241900a6a41086a290300370300200220022903900a3703880920024188056a41206a200929030037030020024188056a41186a200329030037030020024188056a41106a200829030037030020024188056a41086a2007290300370300200220022903c809370388052002200a3a00b005200241b1056a220a20022802f809360000200a41036a20022800fb09360000200241900a6a20024188096a20024188056a10d3022007200041086a2903003703002008200041106a2903003703002003200041186a2903003703002009200041206a290300370300200220002903003703c809200220012800593602f8092002200141dc006a2800003600fb09200141e0006a210020012d005822074102470d010c100b20022d003c21032002280238210841c00110272205450d0420022903a007210d411310272201450d052001410f6a41002800d68d43360000200141086a41002900cf8d43370000200141002900c78d4337000020014113413310282201450d06200120022903e8063700132001412b6a20024180076a290300370000200141236a200241f8066a2903003700002001411b6a200241e8066a41086a290300370000200241286a200141331089022002290330210e20022802282106200110290240024002400240200e420020061b220e200d560d00410c10272206450d0b412010272201450d0c200120022903e806370000200141186a200241e8066a41186a290300370000200141106a200241e8066a41106a290300370000200141086a200241e8066a41086a2903003700002001412041c00010282201450d0d2001200d37002041042107200641046a42c0808080800537020020062001360200410021010240200e200d5a0d00410c10272207450d0f412010272201450d10200120022903e806370000200141186a200241e8066a41186a290300370000200141106a200241e8066a41106a290300370000200141086a200241e8066a41086a2903003700002001412041c00010282201450d112001200d427f7c370020200742c0808080800537020420072001360200410121010b20022002280088053602800a20022002418b056a220b2800003600830a200220022802800a3602f809200220022800830a3600fb09200241206a41c1cdc500411710b501417f2002280224410020022802201b220920006a220a200a2009491b418080c002418080f001200341017122031b4b0d01200241186a41a7cdc500411a10b501417f200228021c410020022802181b220a418094ebdc034180afd0e50220031b2209200820092008491b6a220c200c200a491b20094b0d0120022002280088053602900a20022002418b056a2800003600930a200220022802900a3602c809200220022800930a3600cb0920024188056a20022903a807200241b0076a290300200241e8066a20082003200010960120022d0088054101460d02200541013a005820054281808080103703502005200636024c2005200136024820052001360244200520073602402005427f37033820052008ad220d370330200542013703282005420037032020054280808080c000370318200542043703102005427f37030820054200370300200520022802f809360059200541dc006a220f20022800fb09360000200541013a008801200542003703800120054280808080c000370378200542043703702005427f3703682005427f200d20031b370360200520022802c809360089012005418c016a20022800cb0936000020052002290390053703900120054198016a20024188056a41106a2200290300370300200541a0016a20024188056a41186a2206290300370300200541a8016a20024188056a41206a2207290300370300200541b0016a20024188056a41286a2208290300370300200541b8016a20024188056a41306a2903003703002002200541c0016a36028c0a200220053602880a200241043602840a200220053602800a200241900a6a41206a22034200370300200241900a6a41186a22094280808080c000370300200241013a00b80a200242043703a00a2002427f3703980a200242003703900a200241c8096a41086a220a2005290308370300200241c8096a41106a220b2005290310370300200241c8096a41186a220c2005290318370300200241c8096a41206a22102005290320370300200220052903003703c809200220052800293602f80920022005412c6a2800003600fb09200541306a210120052d002822114102460d1120024188096a41286a200241900a6a41286a29030037030020024188096a41206a200329030037030020024188096a41186a200929030037030020024188096a41106a200241900a6a41106a29030037030020024188096a41086a200241900a6a41086a290300370300200220022903900a37038809200720102903003703002006200c2903003703002000200b29030037030020024188056a41086a200a290300370300200220022903c80937038805200220113a00b005200241b1056a221120022802f809360000201141036a221220022800fb09360000200241900a6a20024188096a20024188056a10d302200a200141086a290300370300200b200141106a290300370300200c200141186a2903003703002010200141206a290300370300200220012903003703c809200220052800593602f8092002200f2800003600fb09200541e0006a210120052d0058220a4102470d050c110b20022002280088053602800a20022002418b056a2800003600830a20024181083b0188092005102941012101410421080c020b20022002280088053602900a2002200b2800003600930a20024181023b01880902402001450d002001410c6c21002007210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b200710290b0240200641046a280200450d00200628020010290b200610292005102941012108410121010c100b200220022d00890522083a008909200241013a00880902402001450d002001410c6c21002007210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b200710290b0240200641046a280200450d00200628020010290b2006102920051029410121010b0c0e0b200b200c29030037030020024188096a41206a220c200241900a6a41206a221029030037030020024188096a41186a2211200241900a6a41186a220f29030037030020024188096a41106a2212200241900a6a41106a221329030037030020024188096a41086a2214200241900a6a41086a2215290300370300200220022903900a3703880920024188056a41206a2216200241c8096a41206a220829030037030020024188056a41186a2217200241c8096a41186a220329030037030020024188056a41106a2218200241c8096a41106a220929030037030020024188056a41086a2219200241c8096a41086a220b290300370300200220022903c80937038805200220073a00b005200a20022802f809360000200a41036a220720022800fb09360000200241900a6a20024188096a20024188056a10d302200b200041086a2903003703002009200041106a2903003703002003200041186a2903003703002008200041206a290300370300200220002903003703c80920022001280089013602f80920022001418c016a2800003600fb0920014190016a210020012d008801221a4102460d0e20024188096a41286a221b200241900a6a41286a221c290300370300200c20102903003703002011200f2903003703002012201329030037030020142015290300370300200220022903900a370388092016200829030037030020172003290300370300201820092903003703002019200b290300370300200220022903c809370388052002201a3a00b005200a20022802f809360000200720022800fb09360000200241900a6a20024188096a20024188056a10d302200b200041086a2903003703002009200041106a2903003703002003200041186a2903003703002008200041206a290300370300200220002903003703c809200220012800b9013602f8092002200141bc016a2800003600fb09200141c0016a210020012d00b80122014102460d0e201b201c29030037030020024188096a41206a200241900a6a41206a29030037030020024188096a41186a200241900a6a41186a29030037030020024188096a41106a200241900a6a41106a29030037030020024188096a41086a200241900a6a41086a290300370300200220022903900a3703880920024188056a41206a200241c8096a41206a29030037030020024188056a41186a200241c8096a41186a29030037030020024188056a41106a200241c8096a41106a29030037030020024188056a41086a200241c8096a41086a290300370300200220022903c80937038805200220013a00b005200a20022802f809360000200a41036a20022800fb09360000200241900a6a20024188096a20024188056a10d3020c0e0b20024188096a41286a2213200241900a6a41286a221429030037030020024188096a41206a2215200241900a6a41206a221629030037030020024188096a41186a2217200241900a6a41186a221829030037030020024188096a41106a2219200241900a6a41106a221a29030037030020024188096a41086a221b200241900a6a41086a221c290300370300200220022903900a3703880920024188056a41206a221d200241c8096a41206a220b29030037030020024188056a41186a221e200241c8096a41186a220c29030037030020024188056a41106a221f200241c8096a41106a221029030037030020024188056a41086a2220200241c8096a41086a220f290300370300200220022903c809370388052002200a3a00b005201120022802f809360000201220022800fb09360000200241900a6a20024188096a20024188056a10d302200f200141086a2903003703002010200141106a290300370300200c200141186a290300370300200b200141206a290300370300200220012903003703c80920022005280089013602f80920022005418c016a2800003600fb0920054190016a210120052d008801220a4102460d0b2013201429030037030020152016290300370300201720182903003703002019201a290300370300201b201c290300370300200220022903900a37038809201d200b290300370300201e200c290300370300201f20102903003703002020200f290300370300200220022903c809370388052002200a3a00b005201120022802f809360000201141036a220a20022800fb09360000200241900a6a20024188096a20024188056a10d302200f200141086a2903003703002010200141106a290300370300200c200141186a290300370300200b200141206a290300370300200220012903003703c809200220052800b9013602f8092002200541bc016a2800003600fb09200541c0016a210120052d00b80122054102460d0b20024188096a41286a200241900a6a41286a29030037030020024188096a41206a200241900a6a41206a29030037030020024188096a41186a200241900a6a41186a29030037030020024188096a41106a200241900a6a41106a29030037030020024188096a41086a200241900a6a41086a290300370300200220022903900a3703880920024188056a41206a200241c8096a41206a29030037030020024188056a41186a200241c8096a41186a29030037030020024188056a41106a200241c8096a41106a29030037030020024188056a41086a200241c8096a41086a290300370300200220022903c80937038805200220053a00b005201120022802f809360000200a20022800fb09360000200241900a6a20024188096a20024188056a10d3020c0b0b200241fc026a4101360200200242013702ec02200241cc81c2003602e8022002410236024c200241b483c2003602482002200241c8006a3602f802200241e8026a41d481c2001057000b41c0014108102a000b41c0014108102a000b41134101102a000b41334101102a000b410c4104102a000b41204101102a000b41c0004101102a000b410c4104102a000b41204101102a000b41c0004101102a000b20024188056a41086a2205200241900a6a41086a2903003703002000200241900a6a41106a29030037030020062009290300370300200720032903003703002008200241900a6a41286a290300370300200220013602880a200220022903900a37038805200241800a6a103a20024188096a41086a200229038805222137030020024188096a41106a2005290300220e37030020024188096a41186a2000290300220d37030020024188096a41206a200629030037030020024188096a41286a200729030037030020024188096a41306a200829030037030041002101200241003a008809200da7210c20022d00890921080b200241b8096a2d0000210f200241b4096a2802002109200241b0096a2802002110200241ac096a280200210b200241a8096a280200210a200241a4096a2802002111024020010d00410121030c020b42bcf7ea858cf8afdfbd7f2008410473ad42078342038688a72101410021030c010b20024188056a41086a2201200241900a6a41086a29030037030020024188056a41106a2207200241900a6a41106a29030037030020024188056a41186a2208200629030037030020024188056a41206a2206200529030037030020024188056a41286a2205200241900a6a41286a290300370300200220003602880a200220022903900a37038805200241800a6a103a20024188096a41106a2001290300220d37030020024188096a41186a2201200729030037030020024188096a41206a2200200829030037030020024188096a41286a2208200629030037030020024188096a41306a220620052903003703002002200229038805220e37039009200241003a008809200241800a6a41086a200d3703002002200e3703800a20024188096a412c6a28020021072008280200210b200241ac096a280200210920002802002108200241a4096a280200210c2001280200210a024002400240024002400240024020022802b8074111470d002006290300210d20024188056a41086a22014200370300200242003703880541d2c5c500411020024188056a1004200241900a6a41086a200129030037030020022002290388053703900a2002410036028805200241900a6a411020024188056a10052101024002402002280288052200417f460d002001450d00200220003602cc09200220013602c80920024188056a200241c8096a10412002280288052210450d0320024190056a2802002111200228028c05210f2000450d01200110290c010b41082110410021114100210f0b200241e4076a21002010201141286c6a210320102101024003400240200320016b41f8004b0d00024020032001460d002010201141286c6a2103200241e4076a210503404101210620052001460d0420012000412010d004450d042003200141286a2201470d000b0b410021060c020b4101210620012000460d0120012000412010d004450d01200141286a22052000460d0120052000412010d004450d01200141d0006a22052000460d0120052000412010d004450d01200141f8006a22052000460d01200141a0016a210120052000412010d0040d000b0b0240200f450d00201010290b2006450d00200241106a4193c8c500411410b50120024188056a2002280214410020022802101b200010b201200228028805220520022802900541b8d6c50041004100100b21010240200228028c05450d00200510290b2001417f470d0020024190086a28020041c000470d00200228028808220141086a290000210e200141106a2900002121200141186a2900002122200141206a2900002123200141286a2900002124200141306a29000021252001290000212620024188056a41386a200141386a29000037030020024188056a41306a202537030020024188056a41286a202437030020024188056a41206a202337030020024188056a41186a202237030020024188056a41106a202137030020024188056a41086a200e3703002002202637038805200241003602980a200242013703900a20022903c007210e410810272201450d022001200e3700002002428880808080013702940a200220013602900a200241c8076a200241900a6a1061200241e0076a28020021100240024020022802940a220520022802980a22066b4104490d0020022802900a21010c010b200641046a22012006490d0b20054101742203200120012003491b22034100480d0b0240024020050d002003102721010c010b20022802900a20052003102821010b2001450d04200220033602940a200220013602900a200321050b2002200641046a22033602980a200120066a201036000002400240200520036b411f4d0d00200521100c010b200341206a22102003490d0b20054101742211201020102011491b22104100480d0b0240024020050d002010102721010c010b200120052010102821010b2001450d05200220103602940a200220013602900a0b200120036a22052000290000370000200541186a200041186a290000370000200541106a200041106a290000370000200541086a200041086a29000037000002402001200641246a220520024188056a200010140d00200241086a4193c8c500411410b50120022802e007200228020c410020022802081b490d00410c102722000d06410c4104102a000b2010450d00200110290b02402008450d002008410c6c2100200a210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b0240200c450d00200a10290b02402007450d002007410c6c21002009210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b42002121427f210e4104210c0240200b450d00200910290b4100210a4101210f410121094101211041002111410021030c050b418f89c3004133104e000b41084101102a000b20034101102a000b20104101102a000b200020053602082000201036020420002001360200200220022802f8093602c009200220022800fb093600c309200241900a6a41206a428180808010370300200241900a6a41186a4100360200200241bc0a6a20022800c30936000041012103200241013a00b80a200220003602ac0a200242043703a00a2002427f3703980a200242003703900a200220022802c0093600b90a20024188056a41246a200736020020024188056a41206a200b36020020024188056a41186a200836020020024188056a41146a200c36020020024188056a41086a200241800a6a41086a2903003703002002200d3703b005200220093602a4052002200a36029805200220022903800a37038805200241c8096a200241900a6a20024188056a10d302200241c8096a41146a2802002111200241c8096a41186a280200210a200241c8096a41206a2802002110200241c8096a41246a280200210920022903c809212120022903d009210e20022802d809210c20022802e409210b20022d00f009210f0b410021010b2004103d0c010b4100210341810121010b200241003602f0064201210d200242013703e806024002400240024002400240024002400240024002400240200341024d0d004200210e0c010b024002400240024020030e03000102000b410110272200450d04200241013602ec06200220022802f006220541016a3602f006200220003602e806200020056a41003a00000240024020022802ec0620022802f0062200460d0020022802e80621050c010b200041016a22052000490d0f20004101742204200520052004491b22044100480d0f0240024020000d002004102721050c010b20022802e80620002004102821050b2005450d06200220043602ec06200220053602e80620022802f00621000b2002200041016a3602f006200520006a20013a00000c020b410110272201450d05200241013602ec06200220022802f006220041016a3602f006200220013602e806200120006a41013a00000240024020022802ec06220020022802f00622016b4108490d0020022802e80621000c010b200141086a22052001490d0e20004101742201200520052001491b22014100480d0e0240024020000d002001102721000c010b20022802e80620002001102821000b2000450d07200220013602ec06200220003602e80620022802f00621010b2002200141086a3602f006200020016a20213700002002200a3602e802200241e8026a200241e8066a10300240200a450d00200c200a410c6c6a2108200c21050340200528020021062002200541086a28020022013602e802200241e8026a200241e8066a10300240024020022802ec06220420022802f00622006b2001490d0020022802e80621040c010b200020016a22072000490d1020044101742200200720072000491b22004100480d100240024020040d002000102721040c010b20022802e80620042000102821040b2004450d0a200220003602ec06200220043602e80620022802f00621000b2002200020016a3602f006200420006a2006200110ce041a2005410c6a22052008470d000b0b200220093602e802200241e8026a200241e8066a103002402009450d00200b2009410c6c6a2108200b21050340200528020021062002200541086a28020022013602e802200241e8026a200241e8066a10300240024020022802ec06220420022802f00622006b2001490d0020022802e80621040c010b200020016a22072000490d1020044101742200200720072000491b22004100480d100240024020040d002000102721040c010b20022802e80620042000102821040b2004450d0b200220003602ec06200220043602e80620022802f00621000b2002200020016a3602f006200420006a2006200110ce041a2005410c6a22052008470d000b0b0240024020022802ec06220020022802f00622016b4108490d0020022802e80621000c010b200141086a22052001490d0e20004101742201200520052001491b22014100480d0e0240024020000d002001102721000c010b20022802e80620002001102821000b2000450d0a200220013602ec06200220003602e80620022802f00621010b2002200141086a3602f006200020016a200e3700000240024020022802ec0620022802f0062201460d0020022802e80621000c010b200141016a22002001490d0e20014101742205200020002005491b22054100480d0e0240024020010d002005102721000c010b20022802e80620012005102821000b2000450d0b200220053602ec06200220003602e80620022802f00621010b2002200141016a3602f006200020016a200f3a00000c010b410110272200450d0a200241013602ec06200220022802f006220541016a3602f006200220003602e806200020056a41023a00000240024020022802ec0620022802f0062200460d0020022802e80621050c010b200041016a22052000490d0d20004101742204200520052004491b22044100480d0d0240024020000d002004102721050c010b20022802e80620002004102821050b2005450d0c200220043602ec06200220053602e80620022802f00621000b2002200041016a3602f006200520006a20013a00000b20023502f006422086210e20023502e806210d0b024020034101470d000240200a450d00200a410c6c2100200c210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b02402011450d00200c10290b02402009450d002009410c6c2100200b210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b2010450d00200b10290b200241c00a6a2400200e200d840f0b41014101102a000b20044101102a000b41014101102a000b20014101102a000b20004101102a000b20004101102a000b20014101102a000b20054101102a000b41014101102a000b20044101102a000b102b000b980505017f027e077f017e017f230041106b220324002002290300210420012903002105200141106a21062002280210210702400240024002400240200141146a2802002208200141186a28020022096b200241186a280200220a490d00200628020021080c010b2009200a6a220b2009490d032008410174220c200b200b200c491b220bad420c7e220d422088a70d03200da7220c4100480d030240024020080d00200c102721080c010b20062802002008410c6c200c102821080b2008450d0120012008360210200141146a200b3602000b20082009410c6c6a2007200a410c6c10ce041a200141186a2009200a6a36020020024100360218200341086a200641086a280200360200200320062902003703002001411c6a2106200228021c210b02400240200141206a2802002208200141246a28020022096b200241246a280200220a490d00200628020021080c010b2009200a6a220c2009490d032008410174220e200c200c200e491b220cad420c7e220d422088a70d03200da7220e4100480d030240024020080d00200e102721080c010b20062802002008410c6c200e102821080b2008450d022001200836021c200141206a200c3602000b20082009410c6c6a200b200a410c6c10ce041a200141246a2009200a6a360200200241003602242000427f200520047c220420042005541b37030020002003290300370210200041186a200341086a2802003602002000200629020037021c200041246a200641086a280200360200200020022d0028410020012d00281b3a00282000200229030822052001290308220420042005561b3703080240200241146a280200450d00200710290b0240200241206a280200450d00200b10290b200341106a24000f0b200c4104102a000b200e4104102a000b102b000be41807017f027e027f017e017f017e0e7f23004180046b2202240020024200370368200241e8006a200041b8d6c50020011b2001410820014108491b10ce041a0240024002400240024002400240024002400240024002400240024002400240024002400240200141074d0d0020022903682103200241186a41d9b0c0004111109401200229032021042002280218210041002105200241003602684101210641014185b1c000411c200241e8006a101721012004420020001b2107024002400240024020022802682200417f470d0041012100410121060c010b2000ad2204422086200484210420014521002001450d00200241003a0068200241e8006a20012004422088a72206410047220510ce041a20062005490d042006450d0120022d0068210820024200370368200241e8006a200120056a200620056b2206410820064108491b10ce041a200641074d0d01200229036822092007542009200354200841ff01711b2106200121050b0240200720035a0d0020060d020b20002004a745720d14200510290c140b02402004a7450d00200110290b41b284c500412d10100c130b410110272201450d02200141003a000020014101410910282201450d032001200337000141014185b1c000411c4100200520001b22062004422088a7417f20061b200141091018210620011029024020002004a745720d00200510290b20060d12200241003602484201200241c8006a1019210020022802482201417f460d1220022000360288032002200136028c03200241003a0068200241e8006a20002001410047220610ce041a20012006490d042002200120066b36028c032002200020066a360288032001450d124100210a0240024020022d0068450d000c010b200241e8006a20024188036a10440240200228026822010d000c010b200229026c21042001210a0b20001029200a450d1241002106200241e8006a2004422088a72200412020004120491b22016a41004100412020016b2001411f4b1b10cd041a200241e8006a200a200110ce041a2004a7210b2000411f4d0d11200241306a200241f1006a290000370300200241386a200241f9006a2900003703002002413f6a20024180016a2900003700002002200229006937032820022d0068210c20024100360248200241c8006a101a210020022802482201417f460d1020022000360288032002200136028c03200241003a0068200241e8006a20002001410047220610ce041a20012006490d052002200120066b36028c032002200020066a3602880302400240024002402001450d0020022d0068220641014b0d004100210d024020060e020003000b200241e8006a20024188036a10442002280268220d450d00200229026c2109200241106a20024188036a102e2009a7210e02402002280210450d00024002402002280214220f41d502200f41d502491b22100d00410421110c010b2010410c6c220610272211450d0c0b0240200f450d004100211241002106410021080340200241e8006a20024188036a10440240200228026822130d0002402008450d002011210503400240200541046a280200450d00200528020010290b2005410c6a2105200641746a22060d000b0b2010450d03201110290c030b200841016a2105200229026c2104024020082010470d002012200520052012491b2210ad420c7e2207422088a70d152007a722144100480d150240024020080d002014102721110c010b201120062014102821110b2011450d0f0b201120066a22082013360200200841046a2004370200201241026a21122006410c6a210620052108200f2005470d000b0b20110d020b200e450d00200d10290b4100210d0c020b200fad4220862010ad8421042009422088a7210f0b2004422088a721142004a721150b02402001450d00200010290b200d450d10200241086a4193c8c500411410b501200241c8006a41086a200241286a41086a290300370300200241c8006a41106a200241286a41106a290300370300200241c8006a41176a200241286a41176a29000037000020022002290328370348200228020c2116200228020821172002420137036820024100360270410810272201450d0820024288808080800137026c20022001360268200120033700002002200f3602880320024188036a200241e8006a103002400240200228026c2200200228027022016b200f490d00200228026821000c010b2001200f6a22062001490d0e20004101742205200620062005491b22064100480d0e0240024020000d002006102721000c010b200228026820002006102821000b2000450d0a2002200636026c200220003602680b20022001200f6a360270200020016a200d200f10ce041a200220143602880320024188036a200241e8006a10300240024020140d00200228026c2105200228027021130c010b20112014410c6c6a2110201121000340200028020021122002200041086a28020022013602880320024188036a200241e8006a103002400240200228026c2205200228027022066b2001490d00200228026821080c010b200620016a22082006490d1020054101742213200820082013491b22134100480d100240024020050d002013102721080c010b200228026820052013102821080b2008450d0d2002201336026c20022008360268201321050b2002200620016a2213360270200820066a2012200110ce041a2000410c6a22002010470d000b0b02400240200520136b4104490d00200228026821010c010b201341046a22012013490d0e20054101742200200120012000491b22004100480d0e0240024020050d002000102721010c010b200228026820052000102821010b2001450d0c2002200036026c20022001360268200021050b2002201341046a2200360270200120136a2016410020171b220836000002400240200520006b411f4d0d00200521060c010b200041206a22062000490d0e20054101742212200620062012491b22064100480d0e0240024020050d002006102721010c010b200120052006102821010b2001450d0d2002200636026c200220013602680b200120006a2200200c3a000020002002290348370001200041096a200241d0006a290300370000200041116a200241d8006a290300370000200041186a200241df006a2900003700002002410036026842012001201341246a200241e8006a101b2100024002400240024020022802682205417f470d0020060d010c020b02402000450d0002402006450d00200110290b200241e8006a2002418e036a41e80010ce041a200241ac026a200c3a0000200241a8026a2008360200200241a4026a2014360200200241a0026a20153602002002419c026a201136020020024198026a200f36020020024194026a200e36020020024190026a200d36020020024188026a2003370300200241b5026a200241d0006a290300370000200241bd026a200241d8006a290300370000200241c4026a200241df006a2900003700002002411136028002200242023703d001200220022903483700ad02200241d8026a2005360200200241d4026a2005360200200241d0026a20003602002002200241e8006a3602fc0320024188036a200241fc036a10bf022002280288032200200228029003101c21010240200228028c03450d00200010290b2001450d0320024180026a103d410521060c150b2006450d010b200110290b0240200e450d00200d10290b02402014450d002014410c6c21002011210103400240200141046a280200450d00200128020010290b2001410c6a2101200041746a22000d000b0b410321062015450d12201110290c120b410110272201450d0e200141013a000020014101410910282201450d0f2001200337000141014185b1c000411c20014109101d2001102920024180026a103d200b450d12200a10290c120b200241fc006a41013602002002420137026c200241cc81c2003602682002410236028c03200241d083c20036028803200220024188036a360278200241e8006a41d481c2001057000b20052006103e000b41014101102a000b41094101102a000b20062001103e000b20062001103e000b20064104102a000b20144104102a000b41084101102a000b20064101102a000b20134101102a000b20004101102a000b20064101102a000b102b000b41014101102a000b41094101102a000b410421060b0240200b450d00200a10290b02400240024002400240024020060e06010203040500010b41d883c500412e10100c050b418684c500412c10100c040b41b284c500412d10100c030b41df84c500412a10100c020b418985c500411f10100c010b41a885c500412e10100b20024180046a240042010be60905027f027e027f017e067f230041d0006b22022400024002402001450d00200220003602080c010b200241b8d6c5003602080b2002200136020c200241206a200241086a1043024002400240024002400240024020022802202203450d002002200229022422043702142002200336021020024101360248200241d6a1c10036024c200241206a200241106a200241c8006a105f02400240200229032022054205510d00200241386a2802002101200241306a280200210620022802342107024020054200520d0020022903282108200621090c020b2005a7220041014b0d000240024020000e020001000b2007450d01200610290c010b200228023c450d00200110290b41002106410021090b200241003602282002420137032041011027210a0240024020090d00200a450d0320024281808080103702242002200a360220200a41003a000042808080801021050c010b200a450d0320024281808080103702242002200a360220200a41013a000020022001360248200241c8006a200241206a10300240024020010d002002280224210b200228022821000c010b2009200141286c6a210c2002280224210b2002280228210020092101034002400240200b20006b4120490d00200041206a210d2002280220210a0c010b200041206a220d2000490d0a200b410174220a200d200d200a491b220e4100480d0a02400240200b0d00200e1027210a0c010b2002280220200b200e1028210a0b200a450d072002200e3602242002200a360220200e210b0b200a20006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002002200d36022820002001290000370000200141206a290300210502400240200b200d6b4108490d00200d41086a21000c010b200d41086a2200200d490d0a200b410174220e20002000200e491b220e4100480d0a02400240200b0d00200e1027210a0c010b200a200b200e1028210a0b200a450d082002200e3602242002200a360220200e210b0b20022000360228200a200d6a2005370000200c200141286a2201470d000b0b02400240200b20006b4108490d002002280220210a0c010b200041086a22012000490d08200b410174220d20012001200d491b22014100480d0802400240200b0d0020011027210a0c010b2002280220200b20011028210a0b200a450d07200220013602242002200a3602200b2002200041086a2201360228200a20006a20083700002001ad42208621052009450d002007450d00200610290b2004a7210b02402004422088a72201450d00200141246c21002003210103400240024020012d0000220d41034b0d00024002400240200d0e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b0240200b450d00200310290b200241d0006a24002005200aad840f0b200241346a410136020020024201370224200241cc81c20036022020024102360214200241e883c2003602102002200241106a360230200241206a41d481c2001057000b41014101102a000b41014101102a000b200e4101102a000b200e4101102a000b20014101102a000b102b000ba90a03027f047e077f230041d0006b22022400024002402001450d00200220003602080c010b200241b8d6c5003602080b2002200136020c200241206a200241086a10430240024002400240024002400240024020022802202203450d002002200229022422043702142002200336021020024101360248200241d6a1c10036024c200241206a200241106a200241c8006a105f42002105024002400240200229032022064205520d0042002107410021080c010b200241386a2802002108200241306a2802002100200228023c210920022802342101024020064201520d002001ad42208621052000ad2107200241c0006a280200210020022903282106200821010c020b02402006a7220a41014b0d0002400240200a0e020001000b2001450d01200010290c010b2009450d00200810290b41002108420021070b410021010b200241003602282002420137032041011027210b0240024020010d00200b450d034101210c200241013602242002200b360220200b41003a00000c010b200b450d0320024281808080103702242002200b360220200b41013a0000200b410141091028220a450d042002428980808090013702242002200a360220200a200637000120022000360248200241c8006a200241206a10300240024020000d002002280224210b2002280228210c0c010b2001200041286c6a210d2002280224210b2002280228210c034002400240200b200c6b4120490d00200c41206a21002002280220210a0c010b200c41206a2200200c490d0b200b410174220a20002000200a491b220e4100480d0b02400240200b0d00200e1027210a0c010b2002280220200b200e1028210a0b200a450d082002200e3602242002200a360220200e210b0b200a200c6a220c41186a200141186a290000370000200c41106a200141106a290000370000200c41086a200141086a29000037000020022000360228200c2001290000370000200141206a29030021060240200b20006b41074b0d00200041086a220c2000490d0b200b410174220e200c200c200e491b220c4100480d0b02400240200b0d00200c1027210a0c010b200a200b200c1028210a0b200a450d092002200c3602242002200a360220200c210b0b2002200041086a220c360228200a20006a2006370000200d200141286a2201470d000b0b02400240200b200c6b4108490d002002280220210b0c010b200c41086a2201200c490d09200b4101742200200120012000491b22014100480d0902400240200b0d0020011027210b0c010b2002280220200b20011028210b0b200b450d08200220013602242002200b3602200b200b200c6a2005200784370000200c41086a210c2009450d00200810290b2004a7210e02402004422088a72201450d00200141246c21002003210103400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a28020010290c030b2001410c6a280200450d02200141086a28020010290c020b2001410c6a280200450d01200141086a28020010290c010b200141086a280200450d00200141046a28020010290b200141246a21012000415c6a22000d000b0b0240200e450d00200310290b200241d0006a2400200cad422086200bad840f0b200241346a410136020020024201370224200241cc81c200360220200241023602142002418884c2003602102002200241106a360230200241206a41d481c2001057000b41014101102a000b41014101102a000b41094101102a000b200e4101102a000b200c4101102a000b20014101102a000b102b000bb405020a7f017e230041306b2202240041082103200241186a41086a220442003703002002420037031841c6c4c500411b200241186a1004200241086a41086a2004290300370300200220022903183703084100210520024100360218200241086a4110200241186a100521060240024020022802182207417f460d002002200736022c20022006360228200241186a200241286a1041024020022802182203450d00200241206a2802002104200228021c21052007450d02200610290c020b418f89c3004133104e000b410021040b200241003602202002420137031820022004360208200241086a200241186a10300240024002400240024020040d0020022802202107200228021821080c010b2003200441286c6a2109200228021c210a2002280220210720032104034002400240200a20076b4120490d00200741206a2106200228021821080c010b200741206a22062007490d05200a4101742208200620062008491b220b4100480d0502400240200a0d00200b102721080c010b2002280218200a200b102821080b2008450d032002200b36021c20022008360218200b210a0b200820076a220741186a200441186a290000370000200741106a200441106a290000370000200741086a200441086a2900003700002002200636022020072004290000370000200441206a290300210c02400240200a20066b4108490d00200641086a21070c010b200641086a22072006490d05200a410174220b20072007200b491b220b4100480d0502400240200a0d00200b102721080c010b2008200a200b102821080b2008450d042002200b36021c20022008360218200b210a0b20022007360220200820066a200c3700002009200441286a2204470d000b0b02402005450d00200310290b200241306a24002007ad4220862008ad840f0b200b4101102a000b200b4101102a000b102b000b7101017f024002400240410810272202450d00200242f20c37000020024108411010282202450d01200242960237000820024110412010282202450d02200242e807370018200242e8073700102002ad42808080808004840f0b41084101102a000b41104101102a000b41204101102a000b870d05017f017e067f017e077f230041f0006b22022400200241106a41e2c5c50041131094012002290318210320022802102104200241d0006a41086a220542003703002002420037035041d2c5c5004110200241d0006a1004200241206a41086a2005290300370300200220022903503703204100210620024100360250200241206a4110200241d0006a100521050240024020022802502207417f460d002005450d002002200736023420022005360230200241d0006a200241306a1041024020022802502206450d00200241d8006a2802002108200228025421092007450d02200510290c020b418f89c3004133104e000b0b200241c3c5c500410f1094012002290308210a2002280200210b200241d0006a41086a22054200370300200242003703504185c6c500410f200241d0006a1004200241206a41086a20052903003703002002200229035037032020024100360250200241206a4110200241d0006a10052105024002400240024002400240024002400240024020022802502207417f460d002005450d00200241d0006a2007412020074120491b220c6a410041004120200c6b200c411f4b1b10cd041a200241d0006a2005200c10ce041a2007411f4d0d02200241306a41186a2207200241d0006a41186a220c290000370300200241306a41106a220d200241d0006a41106a220e290000370300200241306a41086a220f200241d0006a41086a22102900003703002002200229005037033020051029200c2007290300370300200e200d2903003703002010200f290300370300200220022903303703500c010b200241d8006a4200370300200241e0006a4200370300200241e8006a4200370300200242003703500b200241306a41186a200241d0006a41186a290300370300200241306a41106a200241d0006a41106a290300370300200241306a41086a200241d0006a41086a290300370300200220022903503703302002410036025820024201370350410810272205450d01200242888080808001370254200220053602502005200a4200200b1b37000020054108411010282205450d0220024290808080800237025420052003420020041b3700082002200536025002404110200228025822076b41074b0d00200741086a22042007490d084110410174220b20042004200b491b22044100480d080240024041100d002004102721050c010b200541102004102821050b2005450d0420022004360254200220053602500b2006410820061b21102002200741086a360258200520076a42eb0237000020022008410020061b2205360220200241206a200241d0006a1030200228025421082002280258210e02402005450d002010200541286c6a21114100200e6b210b410021050340200e20056a210c024002402008200b6a4120490d00200228025021040c010b200c41206a2207200c490d0a20084101742204200720072004491b22074100480d0a0240024020080d002007102721040c010b200228025020082007102821040b2004450d072002200736025420022004360250200721080b2004200e6a20056a220d41186a201020056a220741186a290000370000200d41106a200741106a290000370000200d41086a200741086a2900003700002002200c41206a220f360258200d2007290000370000200741206a290300210302402008200b6a41606a41074b0d00200f41086a220d200f490d0a2008410174220f200d200d200f491b220d4100480d0a0240024020080d00200d102721040c010b20042008200d102821040b2004450d082002200d36025420022004360250200d21080b2002200c41286a3602582004200e6a20056a41206a2003370000200b41586a210b200541286a21052011200741286a470d000b200e20056a210e0b024002402008200e6b4120490d00200228025021050c010b200e41206a2205200e490d0820084101742207200520052007491b22074100480d080240024020080d002007102721050c010b200228025020082007102821050b2005450d0720022007360254200220053602500b2005200e6a22072002290330370000200741186a200241306a41186a290300370000200741106a200241306a41106a290300370000200741086a200241306a41086a290300370000200e41206a210702402006450d002009450d00201010290b200241f0006a24002007ad4220862005ad840f0b418f89c3004133104e000b41084101102a000b41104101102a000b20044101102a000b20074101102a000b200d4101102a000b20074101102a000b102b000b800603097f037e027f230041306b22022400200241186a41086a220342003703002002420037031841d2c5c5004110200241186a1004200241086a41086a2003290300370300200220022903183703084100210420024100360218200241086a4110200241186a100521050240024002400240024020022802182206417f460d002002200636022c20022005360228200241186a200241286a104120022802182207450d01200241206a2802002103200228021c210802402006450d00200510290b410021040240200341286c22060d00410121094100210a0c030b200641286d220a41ffffff3f71200a470d04200a41057422064100480d042006102722090d0220064101102a000b410121094100210a0c020b418f89c3004133104e000b02402003450d00200341286c21054100210420092103200721060340200641086a290000210b200641106a290000210c2006290000210d200341186a200641186a290000370000200341106a200c370000200341086a200b3700002003200d370000200441016a2104200341206a2103200641286a2106200541586a22050d000b0b2008450d00200710290b200241003602202002420137031820022004360208200241086a200241186a103002400240024020040d0020022802202106200228021821080c010b2004410574210e4100200228022022066b210520022802182108200228021c21072009210303400240200720056a411f4b0d00200641206a22042006490d042007410174220f20042004200f491b22044100480d040240024020070d002004102721080c010b200820072004102821080b2008450d03200421070b200820066a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a290000370000200541606a2105200641206a2106200341206a2103200e41606a220e0d000b2002200736021c20022006360220200220083602180b0240200a450d00200910290b200241306a24002006ad4220862008ad840f0b20044101102a000b102b000b860601087f230041106b2202240020024100360208200242013703002000280200210302400240024002400240410410272204450d0020024284808080c00037020420022004360200200420033600002000280204210320044104410810282204450d012002428880808080013702042004200336000420022004360200200028020821042002200041106a280200220336020c2002410c6a2002103002402003450d00200341057421052002280204210620022802082103034002400240200620036b4120490d00200341206a2107200228020021080c010b200341206a22072003490d0720064101742208200720072008491b22094100480d070240024020060d002009102721080c010b200228020020062009102821080b2008450d052002200936020420022008360200200921060b200820036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a290000370000200220073602082003200429000037000020072103200441206a2104200541606a22050d000b0b2000280214210420022000411c6a280200220336020c2002410c6a200210300240024020030d002002280208210320022802042105200228020021080c010b200341057421094100200228020822036b210620022802042105034002400240200520066a4120490d00200228020021080c010b200341206a22072003490d0720054101742208200720072008491b22074100480d070240024020050d002007102721080c010b200228020020052007102821080b2008450d062002200736020420022008360200200721050b200820036a220741086a200441086a290000370000200741106a200441106a290000370000200741186a200441186a2900003700002002200341206a220336020820072004290000370000200641606a2106200441206a2104200941606a22090d000b0b2001280200200128020420082003100302402005450d00200810290b200241106a24000f0b41044101102a000b41084101102a000b20094101102a000b20074101102a000b102b000bb60201037f230041106b22022400200241003602082002420137030020002d000021034101102721040240024002400240024020034101460d002004450d02200441003a0000200242818080801037020420022004360200200041086a200210dd02200228020445210020022802082103200228020021040c010b2004450d02200441013a00002002428180808010370204200220043602004121210320044101412110282204450d0320042000290001370001200441096a200041096a290000370000200441116a200041116a290000370000200441196a200041196a290000370000200242a1808080900437020420022004360200410021000b20012802002001280204200420031003024020000d00200410290b200241106a24000f0b41014101102a000b41014101102a000b41214101102a000bfd0b02067f027e230041106b22022400200028022821032002200041306a280200220436020c2002410c6a2001103002400240024002400240024002400240024002400240200141046a2802002205200141086a28020022066b2004490d00200128020021050c010b200620046a22072006490d0920054101742206200720072006491b22064100480d090240024020050d002006102721050c010b200128020020052006102821050b2005450d0120012005360200200141046a2006360200200141086a28020021060b200141086a2207200620046a360200200520066a2003200410ce041a2000280234210502400240200141046a2802002206200728020022046b4104490d00200128020021060c010b200441046a22032004490d0920064101742204200320032004491b22044100480d090240024020060d002004102721060c010b200128020020062004102821060b2006450d0220012006360200200141046a2004360200200141086a28020021040b200141086a2203200441046a360200200620046a200536000002400240200141046a2802002206200328020022046b4120490d00200128020021060c010b200441206a22052004490d0920064101742204200520052004491b22044100480d090240024020060d002004102721060c010b200128020020062004102821060b2006450d0320012006360200200141046a2004360200200141086a28020021040b200141086a2205200441206a360200200620046a220441186a200041d0006a290000370000200441106a200041c8006a290000370000200441086a200041c0006a29000037000020042000290038370000200041086a29030021082000290300210902400240200141046a2802002206200528020022046b4110490d00200128020021060c010b200441106a22052004490d0920064101742204200520052004491b22044100480d090240024020060d002004102721060c010b200128020020062004102821060b2006450d0420012006360200200141046a2004360200200141086a28020021040b200141086a2205200441106a360200200620046a22042008370008200420093700002000290310210802400240200141046a2802002206200528020022046b4108490d00200128020021060c010b200441086a22052004490d0920064101742204200520052004491b22044100480d090240024020060d002004102721060c010b200128020020062004102821060b2006450d0520012006360200200141046a2004360200200141086a28020021040b200141086a2205200441086a360200200620046a20083700000240024020002903184201510d0002400240200141046a28020020052802002200460d00200128020021040c010b200041016a22042000490d0b20004101742206200420042006491b22064100480d0b0240024020000d002006102721040c010b200128020020002006102821040b2004450d0820012004360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200420006a41003a00000c010b02400240200141046a28020020052802002204460d00200128020021060c010b200441016a22062004490d0a20044101742205200620062005491b22054100480d0a0240024020040d002005102721060c010b200128020020042005102821060b2006450d0820012006360200200141046a2005360200200141086a28020021040b200141086a2205200441016a360200200620046a41013a00002000290320210802400240200141046a2802002204200528020022006b4108490d00200128020021040c010b200041086a22062000490d0a20044101742200200620062000491b22004100480d0a0240024020040d002000102721040c010b200128020020042000102821040b2004450d0920012004360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200420006a20083700000b200241106a24000f0b20064101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20064101102a000b20054101102a000b20004101102a000b102b000b130020004106360204200041a894c2003602000b3400200041e087c20036020420004100360200200041146a4107360200200041106a418cacc200360200200041086a42083702000b02000b3701017f02404110102722020d0041104101102a000b2002420037000820024201370000200042908080808002370204200020023602000b5d01027f230041106b22022400200241003602082002420137030002404101102722030d0041014101102a000b200341003a0000200041086a4101360200200241013602042002200336020020002002290300370200200241106a24000bc70101017f23004190016b22022400200241003a00782002428080848080023703682002420137035820024201370350200242af0137034820024287013703402002420137033820024201370330200242013703282002420137032020024201370318200242013703102002420137030820024280808080c00037036020024280808180800437037020024100360288012002420137038001200241086a20024180016a109302200041086a200228028801360200200020022903800137020020024190016a24000b130020004110360204200041c4b5c2003602000b3301017f02404108102722020d0041084101102a000b2000428880808080013702042000200236020020024280ade2043700000b3201017f02404104102722020d0041044101102a000b20004284808080c000370204200020023602002002418080013600000b3101017f02404104102722020d0041044101102a000b20004284808080c0003702042000200236020020024180083600000b3101017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242e8073700000b3c01017f02404110102722020d0041104101102a000b2002420037000820024280a094a58d1d370000200042908080808002370204200020023602000b3b01017f02404110102722020d0041104101102a000b2002420037000820024280c8afa025370000200042908080808002370204200020023602000b3801017f02404110102722020d0041104101102a000b200242003700082002429601370000200042908080808002370204200020023602000b3801017f02404110102722020d0041104101102a000b20024200370008200242e807370000200042908080808002370204200020023602000b3701017f02404110102722020d0041104101102a000b2002420037000820024204370000200042908080808002370204200020023602000b3001017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241083600000b3701017f02404110102722020d0041104101102a000b2002420037000820024210370000200042908080808002370204200020023602000b3001017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242023700000be80c03067f0b7e047f230041106b2202240020024100360208200241086a2001280200220320012802042204410420044104491b220510ce041a2001200420056b22063602042001200320056a220536020002400240200441034b0d00200041023a00700c010b2002280208210720024200370308200241086a20052006410820064108491b220410ce041a2001200620046b22033602042001200520046a22043602000240200641074b0d00200041023a00700c010b2002290308210820024200370308200241086a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041023a00700c010b2002290308210920024200370308200241086a20042006410820064108491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641074b0d00200041023a00700c010b2002290308210a20024200370308200241086a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041023a00700c010b2002290308210b20024200370308200241086a20042006410820064108491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641074b0d00200041023a00700c010b2002290308210c20024200370308200241086a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041023a00700c010b2002290308210d20024200370308200241086a20042006410820064108491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641074b0d00200041023a00700c010b2002290308210e20024200370308200241086a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041023a00700c010b2002290308210f20024200370308200241086a20042006410820064108491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641074b0d00200041023a00700c010b2002290308211020024200370308200241086a20042003410820034108491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341074b0d00200041023a00700c010b2002290308211120024200370308200241086a20042006410820064108491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641074b0d00200041023a00700c010b2002290308211220024100360208200241086a20042003410420034104491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341034b0d00200041023a00700c010b2002280208211320024100360208200241086a20042006410420064104491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641034b0d00200041023a00700c010b2002280208211420024100360208200241086a20042003410420034104491b220510ce041a2001200320056b22063602042001200420056a22043602000240200341034b0d00200041023a00700c010b2002280208211520024100360208200241086a20042006410420064104491b220510ce041a2001200620056b22033602042001200420056a22043602000240200641034b0d00200041023a00700c010b20022802082116200241003a0008200241086a20042003410047220510ce041a024020032005490d002001200320056b22063602042001200420056a2204360200024020030d00200041023a00700c020b20022d0008210320024100360208200241086a20042006410420064104491b220510ce041a2001200620056b3602042001200420056a3602000240200641034b0d00200041023a00700c020b20022802082101200020033a00702000200136026c2000201636026820002015360264200020143602602000201336025c200020073602582000201237035020002011370348200020103703402000200f3703382000200e3703302000200d3703282000200c3703202000200b3703182000200a370310200020093703082000200837030020002002280008360071200041f4006a200241086a41036a2800003600000c010b20052003103e000b200241106a24000b970402067f017e230041e0006b2202240002400240024002400240411a10272203450d00200341186a41002f00cfce423b0000200341106a41002900c7ce42370000200341086a41002900bfce42370000200341002900b7ce423700002003411a413a10282203450d012003200129000037001a200341326a200141186a2900003700002003412a6a200141106a290000370000200341226a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003413a200241c0006a1000200241186a41186a2001290300370300200241186a41106a2004290300370300200241186a41086a20052903003703002002200229034037031820024100360240200241186a4120200241c0006a1005210420022802402201417f460d032002200136023c20022004360238200241c0006a200241386a10f30220022802482205450d02200241086a2206200241c0006a41146a290200370300200241106a2207200241c0006a411c6a2802003602002002200229024c3703002002290340210802402001450d00200410290b20002005360208200020083702002000200229030037020c200041146a20062903003702002000411c6a20072802003602000c040b411a4101102a000b413a4101102a000b418f89c3004133104e000b200041003602080b20031029200241e0006a24000bc60202067f017e230041106b220224002002410036020020022001280200220320012802042204410420044104491b220510ce0421022001200420056b22063602042001200320056a220536020002400240200441034b0d00200041003602080c010b2002280200210720024100360200200220052006410420064104491b220310ce0421042001200620036b3602042001200520036a3602000240200641034b0d00200041003602080c010b2004280200210620042001102d0240200428020022050d00200041003602080c010b2004290204210820042001102d2008a721010240200428020022030d00200041003602082001450d01200510290c010b200041186a2004290204370200200041146a2003360200200041106a20084220883e02002000200136020c2000200536020820002006360204200020073602000b200241106a24000b130020004104360204200041d4cec2003602000b3400200041cad6c20036020420004100360200200041146a4105360200200041106a41e0d6c200360200200041086a42133702000b340020004194ddc20036020420004100360200200041146a4105360200200041106a41a8ddc200360200200041086a42133702000bf02105027f017e027f017e067f230041f0016b22012400024002400240024002400240024041880110272202450d000240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002802000e12000102030405060708090a0b0c0d0e0f1011000b200141e8006a200041086a10960220024100360200200241106a200141e8006a41086a290300370300200220012903683703080c110b109702000b200041086a290300210320024102360200200220033703080c0f0b200141e8006a200041046a1038200241033602002002410c6a200141f0006a280200360200200220012903683702040c0e0b109802000b0240024002400240200041086a280200417f6a220441014b0d0020040e020102010b41e4bdc0001058000b41012104024002402000410c6a22052d00004101460d00200141026a200541036a2d00003a0000200141f0006a2000411c6a290200370300200141e8006a41106a200041246a29020037030020014180016a2000412c6a2d00003a0000200120052f00013b01002001200041146a290200370368200041106a2802002105410021040c010b200041106a28020021050b200141246a41026a200141026a2d00003a0000200141286a41086a200141e8006a41086a290300370300200141286a41106a200141e8006a41106a290300370300200141286a41186a200141e8006a41186a280200360200200120012f01003b012420012001290368370328200041386a29030021032000290330210641012107200141106a21000c010b41012104024002402000410c6a22052d00004101460d00200141ee016a200541036a2d00003a0000200141f0006a2000411c6a290200370300200141e8006a41106a200041246a29020037030020014180016a2000412c6a2d00003a0000200120052f00013b01ec012001200041146a290200370368200041106a2802002105410021040c010b200041106a28020021050b41022107200141246a41026a200141ec016a41026a2d00003a0000200141286a41086a200141e8006a41086a290300370300200141286a41106a200141e8006a41106a290300370300200141286a41186a200141e8006a41186a280200360200200120012f01ec013b012420012001290368370328200120002903303703102001200041386a290300370318200041c8006a290300210320002903402106200121000b2000200637030020002003370308200220043a000c20022007360208200220012f01243b000d2002410f6a200141266a2d00003a000020022005360210200220012903283702142002411c6a200141286a41086a290300370200200241246a200141386a2903003702002002412c6a200141c0006a280200360200200241386a200141106a41086a2903003703002002200129031037033020022001290300370340200241c8006a200141086a290300370300200241053602000c0c0b200141e8006a200041086a10990220024106360200200241386a200141e8006a41306a290300370300200241306a200141e8006a41286a290300370300200241286a200141e8006a41206a290300370300200241206a200141e8006a41186a290300370300200241186a200141e8006a41106a290300370300200241106a200141e8006a41086a290300370300200220012903683703080c0b0b200141e8006a41186a200041286a290000370300200141e8006a41106a200041206a290000370300200141f0006a200041186a290000370300200141e8006a41286a200041386a290000370300200141e8006a41306a200041c0006a290000370300200141e8006a41386a200041c8006a2900003703002001200041106a2900003703682001200041306a290000370388012000410c6a2802002204417f4c0d0c0240024020040d00410121000c010b20002802042105200410272200450d0e20002005200410ce041a0b200141286a41386a2205200141e8006a41386a290300370300200141286a41306a2207200141e8006a41306a290300370300200141286a41286a2208200141e8006a41286a290300370300200141286a41206a2209200141e8006a41206a290300370300200141286a41186a220a200141e8006a41186a290300370300200141286a41106a220b200141e8006a41106a290300370300200141286a41086a220c200141e8006a41086a290300370300200120012903683703282002200436020c200220043602082002200036020420022001290328370210200241186a200c290300370200200241206a200b290300370200200241286a200a290300370200200241306a2009290300370200200241386a2008290300370200200241c0006a2007290300370200200241c8006a2005290300370200200241073602000c0a0b200141e8006a200041086a109a0220024108360200200241386a200141e8006a41306a290300370300200241306a200141e8006a41286a290300370300200241286a200141e8006a41206a290300370300200241206a200141e8006a41186a290300370300200241186a200141e8006a41106a290300370300200241106a200141e8006a41086a290300370300200220012903683703080c090b02400240024002400240024020002d0004417f6a220441034b0d0020040e0401020304010b41c893c2001058000b200041106a280200220741ffffff3f712007470d0e20074105742204417f4c0d0e200041086a2802002109410121004101210802402004450d00200410272208450d110b024020070d0041002104410021070c040b20074105742105416020096b210a2008210020092104034020002004290000370000200041186a200441186a290000370000200041106a200441106a290000370000200041086a200441086a290000370000200041206a2100200441206a2104200541606a22050d000b41012100200920074105746a200a6a41057641016a21040c030b200041086a10f7022108410221000c020b200041086a28020021082000410c6a10f7022107410321000c010b2001412a6a200041046a220441036a2d00003a0000200141e8006a41086a2000411c6a290000370300200141e8006a41106a200041246a2d00003a0000200120042f00013b01282001200041146a29000037036820002d00254100472109200041286a2802002105200041106a28000021042000410c6a2800002107200041086a2800002108410421000b200220003a0004200220012f01283b0005200220043602102002200736020c200220083602082002200129036837021420022005360228200220093a002520024109360200200241076a2001412a6a2d00003a00002002411c6a200141f0006a290300370200200241246a200141f8006a2d00003a00000c080b02400240024002400240024020002d0004417f6a220441034b0d0020040e0401020304010b41c893c2001058000b200041106a280200220741ffffff3f712007470d0d20074105742204417f4c0d0d200041086a2802002109410121004101210802402004450d00200410272208450d110b024020070d0041002104410021070c040b20074105742105416020096b210a2008210020092104034020002004290000370000200041186a200441186a290000370000200041106a200441106a290000370000200041086a200441086a290000370000200041206a2100200441206a2104200541606a22050d000b41012100200920074105746a200a6a41057641016a21040c030b200041086a10f7022108410221000c020b200041086a28020021082000410c6a10f7022107410321000c010b2001412a6a200041046a220441036a2d00003a0000200141e8006a41086a2000411c6a290000370300200141e8006a41106a200041246a2d00003a0000200120042f00013b01282001200041146a29000037036820002d00254100472109200041286a2802002105200041106a28000021042000410c6a2800002107200041086a2800002108410421000b200220003a0004200220012f01283b0005200220043602102002200736020c200220083602082002200129036837021420022005360228200220093a00252002410a360200200241076a2001412a6a2d00003a00002002411c6a200141f0006a290300370200200241246a200141f8006a2d00003a00000c070b200141e8006a200041086a10c8012002410b360200200241c0006a200141e8006a41386a290300370300200241386a200141e8006a41306a290300370300200241306a200141e8006a41286a290300370300200241286a200141e8006a41206a290300370300200241206a200141e8006a41186a290300370300200241186a200141e8006a41106a290300370300200241106a200141e8006a41086a290300370300200220012903683703080c060b200041086a29030021032002410c360200200220033703080c050b2000410c6a2802002204417f4c0d060240024020040d00410121000c010b20002802042105200410272200450d0b20002005200410ce041a0b2002200436020c20022004360208200220003602042002410d3602000c040b024002400240024002400240200041086a280200417f6a220441024b0d0020040e03010203010b4190a9c1001058000b200041386a2903002103200041306a290300210641012104024002402000410c6a2d00004101460d00200141f0006a2000411c6a290200370300200141e8006a41106a200041246a29020037030020014180016a2000412c6a2d00003a00002001200041146a29020037036820002f000d2000410f6a2d0000411074722105200041106a2802002100410021040c010b200041106a28020021000b200141286a41186a200141e8006a41186a280200360200200141286a41106a200141e8006a41106a290300370300200141286a41086a200141e8006a41086a29030037030020012001290368370328410121070c030b2000410c6a28020022044108762105410221070c010b2000410c6a28020022044108762105410321070b0b200220063703302002200036021020022007360208200220012903283702142002410e360200200241386a200337030020022005410874200441ff01717236020c2002411c6a200141286a41086a290300370200200241246a200141386a2903003702002002412c6a200141c0006a2802003602000c030b200141e8006a200041086a109c02200241086a200141e8006a41800110ce041a2002410f3602000c020b02400240024002402000280204417f6a220441014b0d0020040e020102010b41f8e2c1001058000b41880110272204450d0a2004200041086a280200109502410121000c010b4101210402400240200041086a2d00004101460d00200141e8006a41086a200041186a290200370300200141e8006a41106a200041206a290200370300200141e8006a41186a200041286a2d00003a00002001200041106a29020037036820002f00092000410b6a2d00004110747221072000410c6a2802002105410021040c010b2000410c6a28020021050b200141286a41186a200141e8006a41186a280200360200200141286a41106a200141e8006a41106a290300370300200141286a41086a200141e8006a41086a2903003703002001200129036837032820042007410874722104410221000b2002200536020c20022004360208200220003602042002200129032837021020024110360200200241186a200141306a290300370200200241206a200141286a41106a290300370200200241286a200141286a41186a2802003602000c010b200141e8006a200041086a10b101200241086a200141e8006a41d80010ce041a200241113602000b200141f0016a240020020f0b4188014108102a000b1039000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b4188014108102a000bc50401047f230041f0006b22072400200741086a200242002003200410d304200741c0006a41e887c50041111094012007290348210320072802402108200741e0006a41086a220942003703002007420037036041e887c5004111200741e0006a1004200741d0006a41086a220a2009290300370300200720072903603703502007200120027d2003420020081b7c370360200741d0006a4110200741e0006a41081003200741306a20002007290308200741086a41086a290300108301200741306a41086a290300210120072903302102200741186a41b18ac0004116108601200520027d200220057d2002200558200120065820012006511b22001b2103200620017d2005200254ad7d200120067d2002200554ad7d20001b2106200741186a41106a2903004200200728021822081b21052007290320420020081b2102024002402000450d00200942003703002007420037036041b18ac0004116200741e0006a1004200a20092903003703002007200729036037035020074200200520067d2002200354ad7d2206200220037d2201200256200620055620062005511b22091b37036820074200200120091b370360200741e0006a21090c010b200942003703002007420037036041b18ac0004116200741e0006a1004200a2009290300370300200720072903603703502007427f200520067c200220037c22062002542209ad7c22022009200220055420022005511b22091b3703682007427f200620091b370360200741e0006a21090b200741d0006a4110200941101003200741f0006a24000bcd0101047f200020014105746a210320002104024003400240200320046b41e0004b0d00024020042003460d00200020014105746a210503404101210620022004460d0420042002412010d004450d042005200441206a2204470d000b0b41000f0b4101210620042002460d0120042002412010d004450d01200441206a22052002460d0120052002412010d004450d01200441c0006a22052002460d0120052002412010d004450d01200441e0006a22052002460d0120044180016a210420052002412010d0040d000b0b20060bbd0101047f230041a0026b2202240020024100360290012001412020024190016a100521030240024002402002280290012204417f470d00411221050c010b2002200436029c02200220033602980220024190016a20024198026a103c20022802900122054112460d012002410c6a20024190016a41047241840110ce041a02402004450d00200310290b20014120100c0b20002005360200200041046a2002410c6a41840110ce041a200241a0026a24000f0b418f89c3004133104e000b970402067f017e230041e0006b2202240002400240024002400240411a10272203450d00200341186a41002f009de7423b0000200341106a4100290095e742370000200341086a410029008de74237000020034100290085e7423700002003411a413a10282203450d012003200129000037001a200341326a200141186a2900003700002003412a6a200141106a290000370000200341226a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003413a200241c0006a1000200241186a41186a2001290300370300200241186a41106a2004290300370300200241186a41086a20052903003703002002200229034037031820024100360240200241186a4120200241c0006a1005210420022802402201417f460d032002200136023c20022004360238200241c0006a200241386a10f30220022802482205450d02200241086a2206200241c0006a41146a290200370300200241106a2207200241c0006a411c6a2802003602002002200229024c3703002002290340210802402001450d00200410290b20002005360208200020083702002000200229030037020c200041146a20062903003702002000411c6a20072802003602000c040b411a4101102a000b413a4101102a000b418f89c3004133104e000b200041003602080b20031029200241e0006a24000ba40b03087f017e017f23004180026b22022400200241e0016a41186a22034200370300200241e0016a41106a22044200370300200241e0016a41086a22054200370300200242003703e001200241e0016a2001280200220620012802042207412020074120491b220810ce041a2001200720086b22093602042001200620086a22083602000240024002400240024002402007411f4d0d00200241c0016a41186a2003290300370300200241c0016a41106a2004290300370300200241c0016a41086a2005290300370300200220022903e0013703c001200241003a00e001200241e0016a20082009410047220710ce041a20092007490d022001200920076b22063602042001200820076a22073602002009450d0020022d00e00122034106490d010b200041023a00210c040b200241186a200241c0016a41186a290300370300200241106a200241c0016a41106a290300370300200241086a200241c0016a41086a290300370300200220022903c001370300200241003a00e001200241e0016a20072006410047220810ce041a20062008490d012001200620086b22093602042001200720086a220736020002402006450d0020022d00e001220841014b0d00410021060240024020080e020100010b200241e0016a2009412020094120491b22086a41004100412020086b2008411f4b1b10cd041a200241e0016a2007200810ce041a2001200920086b22043602042001200720086a22073602002009411f4d0d01200241a0016a41086a200241e0016a41086a290000220a37030020024180016a41186a200241e0016a41186a29000037030020024180016a41106a200241e0016a41106a29000037030020024180016a41086a200a370300200220022900e001220a3703a0012002200a3703800141012106200421090b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a2903003703002002200229038001370360200241003a00e001200241e0016a20072009410047220810ce041a20092008490d032001200920086b22043602042001200720086a22073602002009450d0020022d00e001220841014b0d00410021090240024020080e020100010b200241e0016a2004412020044120491b22086a41004100412020086b2008411f4b1b10cd041a200241e0016a2007200810ce041a2001200420086b3602042001200720086a3602002004411f4d0d01200241a0016a41086a200241e0016a41086a290000220a37030020024180016a41186a200241e0016a41186a29000037030020024180016a41106a200241e0016a41106a29000037030020024180016a41086a200a370300200220022900e001220a3703a0012002200a37038001410121090b200241206a41186a220120024180016a41186a290300370300200241206a41106a220720024180016a41106a290300370300200241206a41086a220820024180016a41086a290300370300200241c0006a41086a2204200241e0006a41086a290300370300200241c0006a41106a2205200241e0006a41106a290300370300200241c0006a41186a220b200241e0006a41186a290300370300200220022903800137032020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200020063a0021200020033a0020200041c2006a20093a0000200020022903403700222000412a6a2004290300370000200041326a20052903003700002000413a6a200b290300370000200041c3006a2002290320370000200041cb006a2008290300370000200041d3006a2007290300370000200041db006a20012903003700000c040b200041023a00210c030b20072009103e000b20082006103e000b20082009103e000b20024180026a24000b3400200041e6efc20036020420004100360200200041146a4102360200200041106a41f0efc200360200200041086a42073702000bd60401097f230041d0006b220224000240410f10272203450d00200341076a41002900f3ec42370000200341002900ecec4237000002402003410f411e10282204450d002004200036000f200241306a41186a22034200370300200241306a41106a22004200370300200241306a41086a220542003703002002420037033020044113200241306a1000200241086a41186a2003290300370300200241086a41106a2000290300370300200241086a41086a20052903003703002002200229033037030820024100360238200242013703302001280200210620022001280208220336022c2002412c6a200241306a10300240024020030d002002280238210520022802342107200228023021080c010b2003410574210920022802302108200228023421072002280238210020062103034002400240200720006b4120490d00200041206a21050c010b0240200041206a22052000490d002007410174220a20052005200a491b220a4100480d000240024020070d00200a102721080c010b20082007200a102821080b02402008450d00200a21070c020b200a4101102a000b102b000b200820006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200941606a22090d000b2002200736023420022005360238200220083602300b200241086a412020082005100302402007450d00200810290b200410290240200141046a280200450d00200610290b200241d0006a24000f0b411e4101102a000b410f4101102a000bd06704167f017e087f017e23004180036b2204240041002105200441003602f002200420023602ec02200420013602e8020240024002400240024002400240200241034b0d0041012106200441013a00d002200441ec016a4101360200200442013702dc0120044180c0c5003602d8012004411f3602b4022004200441b0026a3602e8012004200441d0026a3602b00220044180016a200441d8016a10e6032004280280012107200428028401210820042802880121094105210a4100210b0c010b200441043602f002024020012800004180c2cdeb06460d004101210a410121060c010b024002402002417c714104460d00200241074b0d0141082002107f000b41012106200441013a00d002200441ec016a4101360200200442013702dc0120044180c0c5003602d8012004411f3602b4022004200441b0026a3602e8012004200441d0026a3602b00220044180016a200441d8016a10e6032004280280012107200428028401210820042802880121094105210a410021054100210b0c010b200441083602f002410121060240200128000422074101460d004102210a0c010b200441d8016a200441e8026a10f20302400240024020042802d8014101470d00410421084100210c410021090c010b200441d8016a410572210d410421084128210a410021054100210c410021094100210b02400340200441d0026a41026a2201200d41026a2d00003a00002004200d2f00003b01d002200428028402210e200428028002210f20042802fc01211020042802f801211120042802f401211220042802f001211320042802ec01211420042802e801211520042802e401211620042802e0012117024020042d00dc012206417e6a41ff0171410a4b0d004100211802400240024002400240024002400240024002400240024020060e0f0b0b000102030405060708090a0b0b0b0b410121180c0a0b410221180c090b410321180c080b410421180c070b410521180c060b410621180c050b410721180c040b410821180c030b410921180c020b410a21180c010b410b21180b0240200b41ff0171221920184d0d004113210a0c030b4100211802400240024002400240024002400240024002400240024020060e0f0b0b000102030405060708090a0b0b0b0b410121180c0a0b410221180c090b410321180c080b410421180c070b410521180c060b410621180c050b410721180c040b410821180c030b410921180c020b410a21180c010b410b21180b024020192018470d004114210a0c030b4100210b0240024002400240024002400240024002400240024020060e0f0b0b000102030405060708090a0b0b0b0b4101210b0c0a0b4102210b0c090b4103210b0c080b4104210b0c070b4105210b0c060b4106210b0c050b4107210b0c040b4108210b0c030b4109210b0c020b410a210b0c010b410b210b0b20044180016a41026a221820012d00003a0000200420042f01d0023b01800102400240200c2009470d00200c41016a2201200c490d072005200120012005491b2209ad422c7e221a422088a70d07201aa722014100480d0702400240200c0d002001102721080c010b2008200a41586a2001102821080b2008450d010b2008200a6a220141586a20063a00002001200e3602002001417c6a200f360200200141786a2010360200200141746a2011360200200141706a20123602002001416c6a2013360200200141686a2014360200200141646a2015360200200141606a20163602002001415c6a2017360200200141596a220120042f0180013b0000200141026a20182d00003a0000200541026a2105200a412c6a210a200c41016a210c200441d8016a200441e8026a10f20320042802d8014101460d030c010b0b20014104102a000b024002402006410d4b0d00024002400240024002400240024002400240024002400240024020060e0e0001020304050607080e090a0b0c000b2016450d0d201710290c0d0b02402016450d00201710290b2013450d0c201410290c0c0b02402015450d00201541047421062017210103400240200141046a280200450d00200128020010290b200141106a2101200641706a22060d000b0b2016450d0b201710290c0b0b02402015450d00201541286c21062017210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200641586a22060d000b0b2016450d0a201710290c0a0b2016450d09201710290c090b2016450d08201710290c080b2016450d07201710290c070b02402015450d00201720154104746a210d201721050340024020052802082206450d0020052802002101200641047421060340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200641706a22060d000b0b200541106a21010240200541046a280200450d00200528020010290b200121052001200d470d000b0b2016450d06201710290c060b02402015450d00201541146c21062017210103400240200141046a280200450d00200128020010290b200141146a21012006416c6a22060d000b0b2016450d05201710290c050b02402015450d0020172015411c6c6a210d20172105034002402005410c6a2802002206450d0020052802042101200641047421060340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200641706a22060d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b200121052001200d470d000b0b2016450d04201710290c040b02402015450d002017201541186c6a210d2017210503400240200541046a280200450d00200528020010290b0240200541146a2802002206450d00200528020c2101200641047421060340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200641706a22060d000b0b200541186a21010240200541106a280200450d00200528020c10290b200121052001200d470d000b0b2016450d03201710290c030b02402015450d0020172015411c6c6a210d20172105034002402005410c6a2802002206450d0020052802042101200641047421060340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200641706a22060d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b200121052001200d470d000b0b2016450d02201710290c020b0240201741ff0171220141024b0d0002400240024020010e03000102000b2015450d04201610290c040b02402013450d002013410c6c2106201521010340024020012802002205450d00200141046a280200450d00200510290b2001410c6a2101200641746a22060d000b0b2014450d03201510290c030b02402013450d00201520134104746a21162015211703402017220d41106a21170240200d2802042201450d000240200d410c6a2802002206450d002006410c6c21060340024020012802002205450d00200141046a280200450d00200510290b2001410c6a2101200641746a22060d000b0b200d41086a280200450d00200d28020410290b20172016470d000b0b2014450d02201510290c020b2015450d01201610290c010b02402016450d00201710290b02402013450d002012450d00201310290b200f450d00201010290b0c010b024020042d00dc010d00200c412c6c210641002105410021010240034020062001460d01200820016a210a2001412c6a220b2101200a2d0000410b470d000b2008200b6a41606a28020021050b200c412c6c21064100210d410021010240034020062001460d01200820016a210a2001412c6a220b2101200a2d00004104470d000b200441f8006a2008200b6a41586a108003200428027c210d0b02402005200d470d004100210a4101210741e100210b41f3da012105410021060c030b0240200c450d00200c412c6c210a20082101034020011088032001412c6a2101200a41546a220a0d000b0b410121064119210a024020090d000c030b200810290c020b20042802dc01220a4110762105200a410876210b200441d8016a41106a280200210d200441e4016a2802002117200441d8016a41086a28020021070b0240200c450d00200c412c6c210620082101034020011088032001412c6a2101200641546a22060d000b0b4101210602402009450d00200810290b200d2109201721080b02402006450d00200821060c040b20042802f0022002470d022005411074200b41ff017141087472200a41ff017172211b2008200c412c6c6a210a20082101024002400340200a2001460d0120012d000021022001412c6a2206210120024102470d000b200441f0006a200641586a1080034104211c200428027021024100211002400240024002400240200428027422010d004100211d0c010b2001410474220a4100480d06200a1027221c450d012001211d0b02402001450d002001410474210641002110201c21010340200241086a280200220a417f4c0d032002410c6a2d0000210b2002280200210502400240200a0d004101210d0c010b200a1027220d450d050b200d2005200a10ce0421052001410d6a2002410d6a2d00003a00002001410c6a200b3a0000200141086a200a360200200141046a200a36020020012005360200200141106a2101201041016a2110200241106a2102200641706a22060d000b0b201c450d030c040b200a4104102a000b1039000b200a4101102a000b4100211d4104211c410021100b2008200c412c6c6a210a20082101024003404100210641b8d6c500210b0240200a2001470d00410021010c020b20012d000021022001412c6a2205210120024103470d000b200441e8006a200541586a1080034100210120042802682202450d00200428026c21012002210b0b0240024020010d0041012112410021134100210a4100210e410421154100210b4100211e41042114410421174100210241002105410021164100211f410121190c010b200141286c210d200b411c6a2101410421154100210641002113410121124100210a4100210e4100210b4100211e41042114410421174100210241002105410021164100211f41012119024002400240024002400340024002400240024002402001417c6a2d00000e0400010203000b2001280200210f0240024020052002460d00200521110c010b200241016a22112002490d0c20024101742218201120112018491b221841ffffffff03712018470d0c201841027422114100480d0c0240024020020d002011102721170c010b201720024102742011102821170b2017450d0620022111201821020b201720114102746a200f360200200541016a21050c030b200441d8016a41086a220f200141086a280200360200200420012902003703d8010240200a200e470d00200a41016a220e200a490d0b200a4101742211200e200e2011491b220ead420c7e221a422088a70d0b201aa722114100480d0b02400240200a0d002011102721150c010b2015200a410c6c2011102821150b2015450d060b2015200a410c6c6a221120042903d801370200201141086a200f280200360200200a41016a210a0c020b200441d8016a41086a220f200141086a280200360200200420012902003703d8010240200b201e470d00200b41016a2211200b490d0a200b4101742218201120112018491b221ead420c7e221a422088a70d0a201aa722114100480d0a02400240200b0d002011102721140c010b2014200b410c6c2011102821140b2014450d060b2014200b410c6c6a221120042903d801370200201141086a200f280200360200200b41016a210b0c010b2001417e6a220f2d000021112001417d6a22182d00002120024020062013470d00200641016a22132006490d0920064101742221201320132021491b221320136a22222013490d0920224100480d090240024020060d002022102721120c010b201220212022102821120b2012450d060b201220064101746a222220114101713a0001202220203a0000200f2d0000210f20182d000021110240201f2016470d00201641016a22182016490d0920164101742220201820182020491b221f201f6a2218201f490d0920184100480d090240024020160d002018102721190c010b201920202018102821190b2019450d070b200641016a2106201920164101746a2218200f4101713a0001201820113a0000201641016a21160b200141286a2101200d41586a220d450d060c000b0b20114104102a000b20114104102a000b20114104102a000b20224101102a000b20184101102a000b2008200c412c6c6a210f200821010240024002400240024002400240024002400240024002400240024003400240200f2001470d002002210d0c020b20012d0000210d2001412c6a22112101200d4104470d000b200441e0006a201141586a10800302402004280264220d0d002002210d0c010b20042802602101200d410274210f0340200128020021110240024020052002460d002002210d200521180c010b200241016a220d2002490d1020024101742218200d200d2018491b220d41ffffffff0371200d470d10200d41027422184100480d100240024020020d002018102721170c010b201720024102742018102821170b2017450d0320022118200d21020b200141046a2101201720184102746a2011360200200541016a2105200f417c6a220f0d000b0b2008200c412c6c6a210f20082101024002400340200f2001460d0120012d000021022001412c6a2211210120024105470d000b200441d8006a201141586a108003200428025c410c6c2218450d0020042802582101200a410174210f200a410c6c21020340200141086a2111024002400240200141046a2802004101470d002004201128020022203602c0022001280200222220204b0d010b20044100360280010c010b200441023602ec01200442023702dc01200441dc9cc5003602d801200441013602f402200441013602ec02200420223602d0022004200441e8026a3602e8012004200441d0026a3602f0022004200441c0026a3602e80220044180016a200441d8016a10e603200428028001450d0020044180016a21010c0e0b2001290200211a200441d8016a41086a222020112802003602002004201a3703d8010240200a200e470d00200a41016a220e200a490d11200f200e200e200f491b220ead420c7e221a422088a70d11201aa722114100480d1102400240200a0d002011102721150c010b201520022011102821150b2015450d030b2001410c6a2101201520026a221120042903d801370200201141086a2020280200360200200f41026a210f2002410c6a2102200a41016a210a201841746a22180d000b0b2008200c412c6c6a210f20082101024002400340200f2001460d0120012d000021022001412c6a2211210120024106470d000b200441d0006a201141586a10800320042802542202450d00200428025021012002410c6c2111200b410174210f200b410c6c21020340200441d8016a200110f503024020042802d801450d00200441d8016a21010c0f0b2001290200211a200441d8016a41086a2218200141086a2802003602002004201a3703d8010240200b201e470d00200b41016a221e200b490d12200f201e201e200f491b221ead420c7e221a422088a70d12201aa722204100480d1202400240200b0d002020102721140c010b201420022020102821140b2014450d030b2001410c6a2101201420026a222020042903d801370200202041086a2018280200360200200f41026a210f2002410c6a2102200b41016a210b201141746a22110d000b0b2008200c412c6c6a210f20082101024002400240024002400340200f2001460d0120012d000021022001412c6a2211210120024107470d000b200441c8006a201141586a108003200428024c2202450d002004280248220120024104746a212220064101742102200441d8016a41047221200340200441d8016a20012019201610f60302400240024020042d00d8014101460d00200420042d00d901220f3a00c0020240200f2001410c6a2d00002211470d0020044100360280010c030b200441023602ec01200442023702dc01200441f09dc5003602d801200441203602f402200441203602ec02200420113a00d0022004200441e8026a3602e8012004200441c0026a3602f0022004200441d0026a3602e80220044180016a200441d8016a10e6030c010b20044180016a41086a202041086a28020036020020042020290200370380010b0240200428028001450d0020044180016a21010c140b2001410c6a2d0000210f0b2001410d6a2d00002111024020062013470d00200641016a22132006490d162002201320132002491b221320136a22182013490d1620184100480d160240024020060d002018102721120c010b201220022018102821120b2012450d030b201220026a2218200f3a0000201841016a20114101713a0000200241026a2102200641016a2106200141106a22012022470d000b0b200441b8016a2005360200200441b4016a200d36020020044180016a412c6a2010360200200441a8016a201d360200200441a0016a20063602002004419c016a201336020020044194016a200a36020020044190016a200e360200200420173602b0012004201c3602a40120042012360298012004201536028c012004200b360288012004201e3602840120042014360280012008200c412c6c6a210a20082101024003400240200a2001470d004100210b0c020b20012d000021022001412c6a2206210120024104470d000b200441c0006a200641586a1080032004280244210b0b2004200b3602bc012008200c412c6c6a210a20082101024003400240200a2001470d00410021010c020b20012d000021022001412c6a220621012002410b470d000b200641606a28020021010b200420013602c001200b2001470d0d0240200b450d002008200c412c6c6a210a200821010340200a2001460d0520012d000021022001412c6a2206210120024104470d000b2008200c412c6c6a210b200821010340200b2001460d0420012d000021022001412c6a220a21012002410b470d000b200441386a200641586a108003200428023c2201450d002004280238220d20014102746a2115200a41606a2117200a41586a211620044191026a2111410021050340200420053602c4012017280200210120162802002102200442013702dc01200441f492c5003602d801200441013602d402200441013602ec012004200441d0026a3602e8012004200441c4016a3602d002200441e8026a200441d8016a10e60320042802e802210a20042902ec02211a200120054d0d110240201aa7450d00200a10290b2004200d28020022013602d002024002400240024020042802ac0120014b0d00200441013602ec01200442023702dc01200441e8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e60320042902ec02221a422088a7210120042802e802210a201aa721020c010b0240024002402002200541186c6a22022802142210450d0020042802a40120014104746a220a2d000d2113200a280200210e200228020c210120022802002114200a280208220f2106024020022802082212450d002012410374210b200f21022014210a034002402002200a2802006a220620024f0d00024041201027220a0d0041204101102a000b200a41186a41002900b8a345370000200a41106a41002900b0a345370000200a41086a41002900a8a345370000200a41002900a0a3453700000c040b200a41086a210a20062102200b41786a220b0d000b0b0240410810272202450d0020022013ad42ff0183422886370200200441d0026a41026a220a200441e8026a41026a2d00003a0000200420042f00e8023b01d002200420133a00900220044180800136028c022004428180808010370284022004200236028002200442808080808080103703f801200442013703f001200420063602ec01200420123602e801200420143602e4012004200f3602e0012004200e3602dc01200420044180016a3602d801201120042f01d0023b0000201141026a200a2d00003a0000201041047441706a41047641016a210641002102034020042002360298022004200136029c02200441b0026a200441d8016a200110f803024020042802b002450d00200441c0026a41086a200441b0026a41086a280200360200200420042903b0023703c002200441033602e402200442033702d402200441e88ac5003602d002200441213602fc02200441013602f402200441223602ec022004200441e8026a3602e0022004200441c0026a3602f802200420044198026a3602f00220042004419c026a3602e802200441a0026a200441d0026a10e603024020042802c402450d0020042802c00210290b20042802a002220a450d0020042902a402211a024020042802f401450d0020042802f00110290b201a42208821230240200428028402450d0020042802800210290b2023a72101201aa721020c070b200141106a21012006200241016a2202470d000b02402004280288020d00024020042802f401450d0020042802f00110290b200428028402450d0720042802800210290c070b41808bc5001058000b41084104102a000b41201027220a450d01200a41186a41002900de8a45370000200a41106a41002900d68a45370000200a41086a41002900ce8a45370000200a41002900c68a453700000b41202102412021010c010b41204101102a000b200a450d010b2004200a3602d00220042001ad4220862002ad843702d4022004200441d0026a3602c002200441023602ec01200442023702dc01200441fc92c5003602d801200441233602f402200441013602ec022004200441e8026a3602e8012004200441c0026a3602f0022004200441c4016a3602e802200441c8016a200441d8016a10e603024020042802d402450d0020042802d00210290b20042802c801220a450d0020042902cc01211a0c120b200541016a2105200d41046a220d2015470d000b0b2008200c412c6c6a210a2008210102400340200a2001460d0120012d000021022001412c6a2206210120024109470d000b2004200641586a28020022013602b002024020042802b80120014b0d00200441ec016a4101360200200442023702dc01200441d8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441b0026a3602c002200441e8026a200441d8016a10e6030c0d0b200420042802b00120014102746a28020022013602d002024020042802ac0120014b0d00200441ec016a4101360200200442023702dc01200441e8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e6030c0d0b024020042802a40120014104746a22013502084200520d00200131000d4220864280808080f000834280808080c000510d010b412d1027220a450d02200a41256a41002900b19345370000200a41206a41002900ac9345370000200a41186a41002900a49345370000200a41106a410029009c9345370000200a41086a41002900949345370000200a410029008c934537000042ad808080d005211a0c100b2008200c412c6c6a210a200821010340200a2001460d0b20012d000021022001412c6a2206210120024108470d000b200441306a200641586a2201108003200441d8016a200428023410fb03200441e8026a41086a200441e4016a290200370300200441e8026a41106a200441d8016a41146a280200360200200420042902dc013703e802200441286a2001108003200428022c2201450d0920042802282215200141146c6a210e034020152217450d0a410021022017280208220d210120172802002216210a0240200d4104490d004100210220162101200d210a0340200128000020024105777341b9f3ddf1796c2102200141046a2101200a417c6a220a41034b0d000b200d417c6a22012001417c71220a6b2101200a20166a41046a210a0b02400240200141014b0d00200a21060c010b200a41026a21062001417e6a21012002410577200a2f00007341b9f3ddf1796c21020b02402001450d00200241057720062d00007341b9f3ddf1796c21020b201741146a2115200241057741ff017341b9f3ddf1796c22024119762213410874201372220141107420017221054100210f20042802f002211220042802e802210b20042802ec0221062002210103400240200b200120067122016a2800002214200573220a417f73200a41fffdfb776a7141808182847871220a450d00024003400240200d2012200a6841037620016a2006714103746a221041046a280200470d00201620102802002210460d0220162010200d10d004450d020b200a417f6a200a71220a450d020c000b0b200441ec016a4101360200200442013702dc01200441bc93c5003602d801200441023602b4022004200d3602c402200420163602c0022004200441b0026a3602e8012004200441c0026a3602b002200441d0026a200441d8016a10e6030c0a0b200f41046a220f20016a2101201420144101747141808182847871450d000b024020042802f8020d00200441e8026a10fc0320042802e802210b20042802ec0221060b200620027121024104210103402002220a20016a2006712102200141046a2101200b200a6a280000418081828478712205450d000b0240200b200568410376200a6a20067122016a2c000022024100480d00200b200b280200418081828478716841037622016a2d000021020b200b20016a20133a00002001417c6a200671200b6a41046a20133a000020042802f00220014103746a200dad4220862016ad84370200200420042802f40241016a3602f402200420042802f80220024101716b3602f802024002400240024002400240201728020c0e0400030201000b2004201728021022013602a002024020042802b80120014b0d00200441ec016a4101360200200442023702dc01200441d8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441a0026a3602c002200441d0026a200441d8016a10e6030c0e0b200420042802b00120014102746a28020022013602b00220042802ac0120014b0d03200441013602ec01200442023702dc01200441e8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441b0026a3602c002200441d0026a200441d8016a10e6030c0d0b2004201728021022013602a002024020042802a00120014b0d00200441ec016a4101360200200442023702dc0120044188a1c5003602d801200441013602c4022004200441c0026a3602e8012004200441a0026a3602c002200441d0026a200441d8016a10e6030c0d0b20042802980120014101746a2d0001450d02200441ec016a4101360200200442023702dc01200441a8a1c5003602d801200441013602c4022004200441c0026a3602e8012004200441a0026a3602c002200441d0026a200441d8016a10e6030c0c0b2004201728021022013602b00220042802880120014b0d01200441013602ec01200442023702dc0120044188a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441b0026a3602c002200441d0026a200441d8016a10e60320042802d002220a0d0c0c010b2004201728021022013602b00220042802940120014d0d010b2015200e470d010c0b0b0b200441ec016a4101360200200442023702dc01200441b8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441b0026a3602c002200441d0026a200441d8016a10e6030c070b20184101102a000b412d4101102a000b41aa92c50041c800104e000b418c92c500411e104e000b20204104102a000b20114104102a000b20184104102a000b20042802d002210a0b20042902d402211a2006450d060240200641016a220141ffffffff01712001470d00200641086a417c712202200641056a490d00200220014103746a2002491a0b200b10290c060b20042802ec022201450d000240200141016a220241ffffffff01712002470d00200141086a417c71220a200141056a490d00200a20024103746a200a491a0b20042802e80210290b2008200c412c6c6a210a2008210102400340200a2001460d0120012d000021022001412c6a2206210120024103470d000b200441206a200641586a10800320042802242201450d0020042802202106200141286c210b41002101034002400240024002400240200620016a220241186a2d00000e0400030201000b20042002411c6a28020022023602d00220042802ac0120024b0d03200441ec016a4101360200200442023702dc01200441e8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e6030c060b2002411a6a2d0000450d022002410c6a2802002101200241146a2802002102200441d8016a41146a4101360200200420023602d402200420013602d002200441023602c402200442013702dc01200441c493c5003602d8012004200441d0026a3602c0022004200441c0026a3602e801200441e8026a200441d8016a10e6030c050b200441d8016a2002411c6a10f50320042802d801220a450d0120042902dc01211a0c080b200241206a2802004101470d002002411c6a280200210a2004200241246a28020022023602b002200a20024d0d00200441023602ec01200442023702dc01200441dc9cc5003602d801200441013602f402200441013602ec022004200a3602c0022004200441e8026a3602e8012004200441c0026a3602f0022004200441b0026a3602e802200441d0026a200441d8016a10e60320042802d002220a0d060b200b200141286a2201470d000b0b024002400240200428029401220141014b0d00200428028801220141014b0d012008200c412c6c6a210a2008210102400240024002400340200a2001460d0120012d000021022001412c6a220621012002410c470d000b200441186a200641586a10800320042802182201200428021c411c6c6a2106034020012006460d012004200128020022023602d002024020042802880120024b0d00200441013602ec01200442023702dc0120044188a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e60320042802e802220a450d0020042902ec02211a0c0d0b200441d8016a200141046a220120042802980120042802a00110f60320042d00d8014101460d02200141186a210120042d00d901450d000b41201027220a450d06200a41186a41002900f49345370000200a41106a41002900ec9345370000200a41086a41002900e49345370000200a41002900dc934537000042a08080808004211a0c0b0b2008200c412c6c6a210a2008210102400340200a2001460d0120012d000021022001412c6a220621012002410a470d000b200441106a200641586a10800320042802142201450d002004280210220b2001411c6c6a21050340200b450d012004200b28020022013602d00220042802940120014d0d03200441d8016a200b41046a20042802980120042802a00110f60320042d00d8014101460d0420042d00d9010d09200441086a200b10fd0302400240200428020c2201450d00200428020821022001410274210a20042802b801210603402004200228020022013602b0020240200620014b0d00200441ec016a4101360200200442023702dc01200441d8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441b0026a3602c002200441e8026a200441d8016a10e6030c0c0b200420042802b00120014102746a28020022013602d00220042802ac0120014d0d02200241046a2102200a417c6a220a0d000b0b200b411c6a220b2005460d020c010b0b200441013602ec01200442023702dc01200441e8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e6030c070b0240200428028401450d0020042802800110290b0240200428029001450d00200428028c0110290b0240200428029c01450d0020042802980110290b024020042802ac012202450d0020042802a40121012002410474210203400240200141046a280200450d00200128020010290b200141106a2101200241706a22020d000b0b024020042802a801450d0020042802a40110290b024020042802b401450d0020042802b00110290b201f450d0d201910290c0d0b200441e0016a290300211a20042802dc01210a0c090b200441ec016a4101360200200442023702dc01200441b8a0c5003602d801200441013602c4022004200441c0026a3602e8012004200441d0026a3602c002200441e8026a200441d8016a10e6030c040b200441e0016a290300211a20042802dc01210a0c070b200441ec016a4101360200200442013702dc01200441cc93c5003602d801200441013602d402200420013602c0022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10e6030c020b200441ec016a4101360200200442013702dc01200441d493c5003602d801200441013602d402200420013602c0022004200441d0026a3602e8012004200441c0026a3602d002200441e8026a200441d8016a10e6030c010b41204101102a000b20042802e802210a20042902ec02211a0c030b024041201027220a450d00200a41186a41002900f49345370000200a41106a41002900ec9345370000200a41086a41002900e49345370000200a41002900dc934537000042a08080808004211a0c030b41204101102a000b200441ec016a4102360200200441f4026a4101360200200442023702dc01200441fc91c5003602d801200441013602ec022004200441e8026a3602e8012004200441c0016a3602f0022004200441bc016a3602e802200441d0026a200441d8016a10e60320042802d002210a0b20042902d402211a0b0240200428028401450d0020042802800110290b0240200428029001450d00200428028c0110290b0240200428029c01450d0020042802980110290b024020042802ac012202450d0020042802a40121012002410474210203400240200141046a280200450d00200128020010290b200141106a2101200241706a22020d000b0b024020042802a801450d0020042802a40110290b024020042802b401450d0020042802b00110290b201f450d0120191029200a0d040c020b2001290204211a2001280200210a0240201f450d00201910290b0240201e450d00201410290b0240200e450d00201510290b02402013450d00201210290b02402010450d0020104104742102201c210103400240200141046a280200450d00200128020010290b200141106a2101200241706a22020d000b0b0240201d450d00201c10290b200d450d00201710290b200a0d020b2000201b36020420004100360200200041186a2003360200200041146a200c360200200041106a20093602002000410c6a2008360200200041086a20073602000c040b102b000b0240201aa7450d00200a10290b200041f48cc50036020420004101360200200041086a41133602000240200c450d00200c412c6c210220082101034020011088032001412c6a2101200241546a22020d000b0b2009450d02200810290c020b200441003a00d002200441ec016a4101360200200442013702dc0120044180c0c5003602d8012004411f3602b4022004200441b0026a3602e8012004200441d0026a3602b00220044180016a200441d8016a10e603200428028001210720042802840121060240200c450d00200c412c6c210220082101034020011088032001412c6a2101200241546a22020d000b0b4105210a2009450d00200810290b02402006450d00200a41ff01714105470d00200710290b200041de8cc50036020420004101360200200041086a41163602000b20044180036a24000b160020002001280208360204200020012802003602000bd41301177f23004190026b2202240002400240024002400240024020002802002203418883c000460d00200028020421040c010b41002104200241b8016a410041d80010cd041a2002411f6a220542003700002002420037011a41ec0010272203450d0120034100360200200320022902183702042003410b6a2005290000370000200341136a200241b7016a41d90010ce041a20004100360204200020033602000b200141ff01712106024003402003410c6a2107200341086a210820032f010621094100210502400240034020092005460d01200820056a210a200741086a2107200541016a210502404100417f4101200a2d0000220a20064b1b200a2006461b41016a0e03000301000b0b2005417f6a21090b2004450d022004417f6a2104200320094102746a41ec006a28020021030c010b0b200742013702000c030b2000200028020841016a360208024002400240024020032f01062205410b490d00200241276a41016a410041d80010cd041a200241003a001941ec0010272204450d03200441003602002004410036000f20044200370007200420022f01183b0005200441136a200241276a41d90010ce041a2003410e6a2d0000210b2003280248210c2003280244210d200441086a2003410f6a20032f010641796a220510ce042107200441146a200341cc006a200541037410ce042106200341063b0106200420053b010620094107490d0120072009417a6a220a6a2007200941796a22096a2207200541ffff037120096b10cf041a200720013a00002006200a4103746a200620094103746a2207200441066a22052f010020096b41037410cf041a2007410136020020052f010021070c020b200341086a2207200941016a22066a200720096a2207200520096b220a10cf041a200720013a0000200341146a220720064103746a200720094103746a2207200a41037410cf041a200741013602002003200541016a3b01060c050b200341086a2205200941016a22066a200520096a220a200341066a22052f0100220720096b220810cf041a200a20013a0000200341146a220a20064103746a200a20094103746a2209200841037410cf041a200941013602000b2005200741016a3b01002003280200220a450d02200341046a2105200241276a41016a210e200241a8016a210f200241a0016a211020024198016a211120024190016a211220024180016a41086a2113034020052f0100210602400240024002400240200a2f01062205410b490d00200e410041d80010cd041a200241003a0019200220022f01183b0108200241b7016a200241276a41d90010ce041a200f4200370300201042003703002011420037030020124200370300201342003703002002420037038001419c0110272207450d03200741003602002007410036000f20074200370007200720022f01083b0005200741136a200241b7016a41d90010ce041a20074194016a200f2903003702002007418c016a201029030037020020074184016a2011290300370200200741fc006a2012290300370200200741f4006a2013290300370200200720022903800137026c200a41c8006a2802002114200a41c4006a2802002115200a410e6a2d00002116200741086a200a410f6a200a2f0106220341796a220510ce042117200741146a200a41cc006a200541037410ce042118200741ec006a200a4188016a2003417a6a220841027410ce042101200a41063b0106200720053b010602402008450d00410021052001210303402003280200220920053b010420092007360200200341046a21032008200541016a2205470d000b0b20064107490d0120172006417a6a22036a2017200641796a22056a220920072f010620056b10cf041a2009200b3a0000201820034103746a201820054103746a220920072f010620056b41037410cf041a2009200d3602002009200c360204200720072f010641016a22093b01062006410274220b20016a416c6a200120034102746a2208200941ffff0371220620036b41027410cf041a2008200436020020062003490d022007200b6a41d4006a2103034020032802002209200541016a22053b010420092007360200200341046a210320052006490d000c030b0b200a41086a2207200641016a22036a200720066a2207200520066b220910cf041a2007200b3a0000200a41146a220720034103746a200720064103746a2207200941037410cf041a2007200d3602002007200c360204200a200541016a22053b01062006410274200a41ec006a22076a41086a200720034102746a2207200541ffff0371220920036b41027410cf041a20072004360200200620094f0d08200a2003417f6a22054102746a41f0006a2103034020032802002207200541016a22053b01042007200a360200200341046a210320052009490d000c090b0b200a41086a2203200641016a22056a200320066a2203200a2f0106220920066b220810cf041a2003200b3a0000200a41146a220320054103746a200320064103746a2203200841037410cf041a2003200d3602002003200c360204200a200941016a22033b010620064102742201200a41ec006a22096a41086a200920054102746a2208200341ffff0371220920056b41027410cf041a20082004360200200620094f0d00200a20016a41f0006a2105034020052802002203200641016a22063b01042003200a360200200541046a210520092006470d000b0b200a28020022030d01200721042014210c2015210d2016210b0c050b419c014104102a000b200a41046a21052003210a2016210b2015210d2014210c200721040c000b0b41ec004104102a000b41ec004104102a000b200241b7016a41016a410041d80010cd041a2002411f6a220542003700002002420037011a200220022902183703082002200529000037000f200241276a200241b7016a41d90010ce041a200241a8016a22034200370300200241a0016a2207420037030020024180016a41186a2209420037030020024190016a2206420037030020024180016a41086a220a42003703002002420037038001419c0110272205450d0120054100360200200520022903083702042005410b6a200229000f370000200541136a200241276a41d90010ce041a20054194016a20032903003702002005418c016a200729030037020020054184016a2009290300370200200541fc006a2006290300370200200541f4006a200a290300370200200520022903800137026c20052000280200220336026c200020053602002000200028020441016a360204200341003b010420032005360200200520052f010622034103746a220741186a200c360200200741146a200d360200200520036a41086a200b3a0000200541ec006a200341016a22034102746a2004360200200520033b0106200420033b0104200420053602000b20024190026a24000f0b419c014104102a000bd11e01387f23004190016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a280200210320024180016a210420012802082105024002400240200141106a28020022060d00410421014100210741002108410021094100210a4104210b4100210c4100210d4104210e4100210f41002110410421114100211241002113410421144100210641002115410421164100211741002118410421194100211a4100211b4104211c4100211d4100211e4104211f41002120410021210c010b410021224100211f41002123410021244100211c410021254100212641002127410021284100212941002107024003402001212a2007211520052006417f6a2206412c6c6a2201280024211720012800202119200128001821182001280014211420012800102116200128000c210c2001280008210b200128000421094101210741012112024002400240024002400240024020012d0000220a417e6a2208410d4d0d00410121130c010b4101211341012110410121114101210f4101210d4101210e20092101024002400240024002400240024002400240024020080e0e000102030405060f0708090e0e11000b02402029450d000240202b450d00202b41047421072029210103400240200141046a280200450d00200128020010290b200141106a2101200741706a22070d000b0b202c450d00202910290b4101211341002112200c212b200b212c200921290c090b02402028450d000240202d450d00202d41286c21072028210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200741586a22070d000b0b202e450d00202810290b4100211341012112200c212d200b212e200921280c080b0240202f450d002027450d00202710290b20152107202a210120092127200b212f200c21300c0c0b02402031450d002026450d00202610290b20152107202a210120092126200b2131200c21320c0b0b02402033450d002025450d00202510290b20152107202a210120092125200b2133200c21340c0a0b0240201c450d000240201a450d00201c201a4104746a210d201c21080340024020082802082207450d0020082802002101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b200841106a21010240200841046a280200450d00200828020010290b200121082001200d470d000b0b2035450d00201c10290b4100211041012112200c211a200b21352009211c410121130c050b02402024450d000240201e450d00201e41146c21072024210103400240200141046a280200450d00200128020010290b200141146a21012007416c6a22070d000b0b2036450d00202410290b4100211141012112200c211e200b21362009212441012113410121100c050b02402023450d000240201d450d002023201d411c6c6a210d20232108034002402008410c6a2802002207450d0020082802042101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200d470d000b0b2037450d00202310290b4100210f41012112200c211d200b2137200921234101211341012110410121110c050b0240201f450d000240201b450d00201f201b41186c6a210d201f210803400240200841046a280200450d00200828020010290b0240200841146a2802002207450d00200828020c2101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b200841186a21010240200841106a280200450d00200828020c10290b200121082001200d470d000b0b2020450d00201f10290b4100210d41012112200c211b200b21202009211f4101211341012110410121114101210f4101210e0c050b02402022450d0002402038450d0020222038411c6c6a210d20222108034002402008410c6a2802002207450d0020082802042101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200d470d000b0b2039450d00202210290b4100210e41012112200c2138200b2139200921224101211341012110410121114101210f4101210d0c040b410121100b410121110b4101210f0b4101210d4101210e0b02400240024002400240200a410d4b0d0020152107202a210102400240024002400240024002400240024002400240200a0e0e080900010202020304100506070a080b2012450d0e0240200c450d00200c41047421072009210103400240200141046a280200450d00200128020010290b200141106a2101200741706a22070d000b0b200b450d0e0c0d0b2013450d0d200c450d00200c41286c21072009210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200741586a22070d000b0b200b0d0b0c0c0b2010450d0b0240200c450d002009200c4104746a210a200921080340024020082802082207450d0020082802002101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b200841106a21010240200841046a280200450d00200828020010290b200121082001200a470d000b0b200b0d0a0c0b0b2011450d0a0240200c450d00200c41146c21072009210103400240200141046a280200450d00200128020010290b200141146a21012007416c6a22070d000b0b200b0d090c0a0b200f450d090240200c450d002009200c411c6c6a210a20092108034002402008410c6a2802002207450d0020082802042101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200a470d000b0b200b0d080c090b200d450d080240200c450d002009200c41186c6a210a2009210803400240200841046a280200450d00200828020010290b0240200841146a2802002207450d00200828020c2101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b200841186a21010240200841106a280200450d00200828020c10290b200121082001200a470d000b0b200b0d070c080b200e450d07200c450d002009200c411c6c6a210a20092108034002402008410c6a2802002207450d0020082802042101200741047421070340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200741706a22070d000b0b0240200841086a280200450d00200828020410290b2008411c6a21010240200841146a280200450d00200828021010290b200121082001200a470d000b0b200b0d050c060b0240200b450d00200910290b2014450d05201610290c050b0240200941ff0171220141024b0d0002400240024020010e03000102000b200c450d070c050b02402014450d002014410c6c2107200c21010340024020012802002208450d00200141046a280200450d00200810290b2001410c6a2101200741746a22070d000b0b2016450d060c030b02402014450d00200c20144104746a210b200c210a0340200a220941106a210a024020092802042201450d0002402009410c6a2802002207450d002007410c6c21070340024020012802002208450d00200141046a280200450d00200810290b2001410c6a2101200741746a22070d000b0b200941086a280200450d00200928020410290b200a200b470d000b0b20160d020c050b200c0d020c040b0240200b450d00200910290b02402014450d002018450d00201410290b2017450d03201910290c030b200c10290c020b200b10290c010b200910290b20152107202a21010b20060d000b410021062001212a200721150b201b4100201f1b210720204100201f1b2108201d410020231b21212037410020231b2120201e410020241b21092036410020241b210a201a4100201c1b211e20354100201c1b211d2034410020251b210c2033410020251b210d2032410020261b211b2031410020261b211a2030410020271b210f202f410020271b2110202d410020281b2118202e410020281b2117202b410020291b2112202c410020291b2113201f4104201f1b21012023410420231b211f2024410420241b210b201c4104201c1b211c2025410420251b210e2026410420261b21192027410420271b21112028410420281b21162029410420291b211420220d010b4104212241002139410021380b200410a4040240200228028401450d0020022802800110290b200241d8006a202a3602002002200636028801200220033602840120022005360280012002203836027c2002203936027820022022360274200220073602702002200836026c2002200136026820022021360264200220203602602002201f36025c20022015360254200220093602502002200a36024c2002200b3602482002201e3602442002201d3602402002201c36023c2002200c3602382002200d3602342002200e3602302002201b36022c2002201a360228200220193602242002200f3602202002201036021c2002201136021820022018360214200220173602102002201636020c20022012360208200220133602042002201436020020002002418c0110ce041a20024190016a24000bc30a01107f230041106b220224000240024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042108200241086a200010800320022802082201200228020c22094104746a210a4100210b20094104490d01200341ff0171210c024002400340024020012d000c200c470d0020012802082004470d002001280200210d200421092008210e024003402009450d012009417f6a2109200e2d0000210f200d2d00002110200e41016a210e200d41016a210d2010200f460d000c020b0b20012d000d2209410446220f200741ff0171220d410446220e470d002009200d460d06200e0d06200f0d060b024002402001411c6a2d0000200c470d00200141186a2802002004470d002001280210210d200421092008210e024003402009450d012009417f6a2109200e2d0000210f200d2d00002110200e41016a210e200d41016a210d2010200f460d000c020b0b20012d001d2209410446220f200741ff0171220d410446220e470d002009200d460d01200e0d01200f0d010b02402001412c6a2d0000200c470d00200141286a2802002004470d002001280220210d200421092008210e024003402009450d012009417f6a2109200e2d0000210f200d2d00002110200e41016a210e200d41016a210d2010200f460d000c020b0b20012d002d2209410446220f200741ff0171220d410446220e470d002009200d460d03200e0d03200f0d030b02402001413c6a2d0000200c470d00200141386a2802002004470d002001280230210d200421092008210e024003402009450d012009417f6a2109200e2d0000210f200d2d00002110200e41016a210e200d41016a210d2010200f460d000c020b0b20012d003d2209410446220f200741ff0171220d410446220e470d002009200d460d04200e0d04200f0d040b200b41046a210b200a200141c0006a22016b41304d0d050c010b0b200b410172210b0c040b200b410272210b0c030b200b410372210b0c020b2001280204210b0c030b2001200a460d0102400240200741ff017122114104460d00200341ff0171210c0c010b200341ff0171210c0340024020012d000c200c470d0020012802082004470d002001280200210d200421092008210e024003402009450d012009417f6a2109200e2d0000210f200d2d00002110200e41016a210e200d41016a210d2010200f460d000c020b0b20012d000d4104460d030b200b41016a210b200141106a2201200a470d000c030b0b0340024020012d000c200c470d0020012802082004470d002001280200210e200421092008210d024003402009450d012009417f6a2109200d2d0000210f200e2d00002110200d41016a210d200e41016a210e2010200f460d000c020b0b20012d000d22092011470d0020094104470d020b200b41016a210b200141106a2201200a460d020c000b0b2005450d01200810290c010b02400240200041046a28020020002802082201460d00200028020021090c010b02400240200141016a22092001490d002001410174220d20092009200d491b220d41ffffffff0071200d470d00200d410474220e4100480d000240024020010d00200e102721090c010b20002802002001410474200e102821090b2009450d0120002009360200200041046a200d360200200028020821010c020b102b000b200e4104102a000b200920014104746a220120063b010e200120073a000d200120033a000c2001200436020820012005360204200120083602002000200028020841016a360208200220001080032002280204417f6a210b0b200241106a2400200b0bcc21032d7f017e017f230041306b2202240020012802042103200128020021044101210502400240024002400240024002400240024002400240024002400240024002400240200128020822060d004104210741002108410121090c010b412c10272207450d01200741023a0000200720022f002d3b00012007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002109410121080b200141106a280200210a200128020c210b02400240200141146a280200220c0d002008210d0c010b2008410174220d200841016a220e200e200d491b220d412c6c210e0240024020080d00200e102721070c010b20072008412c6c200e102821070b2007450d0220072008412c6c6a220e41033a0000200e20022f002d3b0001200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a2108410021050b2001411c6a280200210f200128021821104100211102400240200141206a28020022120d00410021130c010b0240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22142014200e491b220ead422c7ea722144100480d0e02400240200d0d002014102721070c010b2007200d412c6c2014102821070b2007450d04200e210d0b20072008412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a28020036020041012113200841016a21080b200141286a28020021122001280224211502402001412c6a2802002214450d000240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22112011200e491b220ead422c7ea722114100480d0e02400240200d0d002011102721070c010b2007200d412c6c2011102821070b2007450d05200e210d0b20072008412c6c6a220e41053a0000200e201436000c200e2012360008200e2015360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a28020036020041012111200841016a21080b200141346a28020021142001280230211602400240200141386a28020022170d00410021180c010b0240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22192019200e491b220ead422c7ea722194100480d0e02400240200d0d002019102721070c010b2007200d412c6c2019102821070b2007450d06200e210d0b20072008412c6c6a220e41063a0000200e201736000c200e2014360008200e2016360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a28020036020041012118200841016a21080b200141c0006a280200211a200128023c211b4101211702400240200141c4006a280200221c0d004101211d0c010b0240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22192019200e491b220ead422c7ea722194100480d0e02400240200d0d002019102721070c010b2007200d412c6c2019102821070b2007450d07200e210d0b20072008412c6c6a220e41073a0000200e201c36000c200e201a360008200e201b360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a21084100211d0b200141cc006a280200211e2001280248211f0240200141d0006a2802002220450d000240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22172017200e491b220ead422c7ea722174100480d0e02400240200d0d002017102721070c010b2007200d412c6c2017102821070b2007450d08200e210d0b20072008412c6c6a220e41083a0000200e202036000c200e201e360008200e201f360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241086a41086a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a2108410021170b41012119024020012802544101470d00200141d8006a28020021210240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22222022200e491b220ead422c7ea722224100480d0e02400240200d0d002022102721070c010b2007200d412c6c2022102821070b2007450d09200e210d0b20072008412c6c6a220e41093a0000200e2021360204200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370208200e41106a200241106a290200370200200e41186a200241086a41106a290200370200200e41206a200241086a41186a290200370200200e41286a200241086a41206a280200360200200841016a21080b200141e0006a2802002123200128025c21220240200141e4006a2802002224450d000240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22192019200e491b220ead422c7ea722194100480d0e02400240200d0d002019102721070c010b2007200d412c6c2019102821070b2007450d0a200e210d0b20072008412c6c6a220e410a3a0000200e202436000c200e2023360008200e2022360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a2108410021190b200141ec006a2802002125200128026821264101212102400240200141f0006a28020022270d00410121280c010b0240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22292029200e491b220ead422c7ea722294100480d0e02400240200d0d002029102721070c010b2007200d412c6c2029102821070b2007450d0b200e210d0b20072008412c6c6a220e410b3a0000200e202736000c200e2025360008200e2026360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a2108410021280b200141f8006a280200212a200128027421290240200141fc006a280200222b450d000240200d2008470d0041000d0e41000d0e200d410174220e200d41016a22212021200e491b220ead422c7ea722214100480d0e02400240200d0d002021102721070c010b2007200d412c6c2021102821070b2007450d0c200e210d0b20072008412c6c6a220e410c3a0000200e202b36000c200e202a360008200e2029360004200e20022f002d3b0001200e41036a2002412f6a2d00003a0000200e2002290208370210200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200841016a2108410021210b20014184016a280200212c200128028001210e02400240200d20086b20014188016a280200412c6c222d412c6d2201490d00200820016a21010c010b200820016a22012008490d0d200d410174222e20012001202e491b222ead422c7e222f422088a70d0d202fa722304100480d0d02400240200d0d002030102721070c010b2007200d412c6c2030102821070b2007450d0c202e210d0b20072008412c6c6a200e202d10ce041a0240202c450d00200e10290b41c00510272208450d0d2000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200836021020024280c2cdeb16370308200241106a10a404200810292021450d0e0240202b450d002029202b411c6c6a210d20292107034002402007410c6a2802002208450d0020072802042101200841047421080340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200841706a22080d000b0b0240200741086a280200450d00200728020410290b2007411c6a21010240200741146a280200450d00200728021010290b200121072001200d470d000b0b202a450d0e202910290c0e0b412c4104102a000b200e4104102a000b20144104102a000b20114104102a000b20194104102a000b20194104102a000b20174104102a000b20224104102a000b20194104102a000b20294104102a000b20214104102a000b20304104102a000b102b000b41c0054104102a000b02402028450d0002402027450d002026202741186c6a210d2026210703400240200741046a280200450d00200728020010290b0240200741146a2802002208450d00200728020c2101200841047421080340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200841706a22080d000b0b200741186a21010240200741106a280200450d00200728020c10290b200121072001200d470d000b0b2025450d00202610290b02402019450d0002402024450d0020222024411c6c6a210d20222107034002402007410c6a2802002208450d0020072802042101200841047421080340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200841706a22080d000b0b0240200741086a280200450d00200728020410290b2007411c6a21010240200741146a280200450d00200728021010290b200121072001200d470d000b0b2023450d00202210290b02402017450d0002402020450d00202041146c2108201f210103400240200141046a280200450d00200128020010290b200141146a21012008416c6a22080d000b0b201e450d00201f10290b0240201d450d000240201c450d00201b201c4104746a210d201b21070340024020072802082208450d0020072802002101200841047421080340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200841706a22080d000b0b200741106a21010240200741046a280200450d00200728020010290b200121072001200d470d000b0b201a450d00201b10290b02402014410047201841017371450d00201610290b02402012410047201141017371450d00201510290b0240200f410047201341017371450d00201010290b02402005450d000240200c450d00200c41286c2108200b210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200841586a22080d000b0b200a450d00200b10290b02402009450d0002402006450d00200641047421082004210103400240200141046a280200450d00200128020010290b200141106a2101200841706a22080d000b0b2003450d00200410290b200241306a24000b860501017f411021010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041ff01710eac010001020202020202020202020202020303030404050506060707080809090a0a0b0b0c0d0d0e0e0f0f1010111213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f2020212122222323242425252627272828292a2a2b2b2c2d2d2e2e2f2f303031313232333434353536363737383839393a3a3b3b3c3c3d3d3e3e3f3f40404141424243434444454546464747484a4a4a4a49494a4a4a4a4a4a4a4a4a4a4a4a4a4a4b4b4b4b000b41110f0b41120f0b410a0f0b41080f0b41080f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41050f0b41130f0b41140f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41000f0b41010f0b41020f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41020f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410e0f0b410e0f0b410f21010b20010bfe0101057f02400240024002400240200041086a28020022032001490d002003200041046a280200460d01200341016a2104200028020021050c020b41d0b1c5001058000b200341016a22042003490d0220034101742205200420042005491b220641ffffffff00712006470d02200641047422074100480d020240024020030d002007102721050c010b200028020020034104742007102821050b2005450d0120002005360200200041046a20063602000b200520014104746a220541106a2005200320016b41047410cf041a200541086a200241086a29030037030020052002290300370300200041086a20043602000f0b20074108102a000b102b000b800502067f017e230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a1083032103024002400240024002402000411c6a280200200041206a2802002204460d00200028021821050c010b200441016a22052004490d0320044101742206200520052006491b220641ffffffff03712006470d03200641027422074100480d030240024020040d002007102721050c010b200028021820044102742007102821050b2005450d01200020053602182000411c6a2006360200200028022021040b200520044102746a20033602002000200028022041016a360220200241186a41106a200241106a290300370300200241186a41086a200241086a2903003703002002200229030037031802400240200041ec006a280200200041f0006a2802002204460d00200028026821050c010b200441016a22052004490d0320044101742203200520052003491b2203ad42187e2208422088a70d032008a722064100480d030240024020040d002006102721050c010b2000280268200441186c2006102821050b2005450d0220002005360268200041ec006a2003360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000f0b20074104102a000b20064104102a000b102b000bcf0d01067f0240024020002d00002201410d4b0d00024002400240024002400240024002400240024002400240024020010e0e0001020304050607080e090a0b0c000b200041086a280200450d0d200041046a28020010290f0b0240200041086a280200450d00200041046a28020010290b200041146a280200450d0c200041106a28020010290f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d00200128020010290b200141106a2101200241706a22020d000b0b200041086a280200450d0b200028020410290f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200241586a22020d000b0b200041086a280200450d0a200028020410290f0b200041086a280200450d09200041046a28020010290f0b200041086a280200450d08200041046a28020010290f0b200041086a280200450d07200041046a28020010290f0b02402000410c6a2802002201450d00200041046a280200220320014104746a21040340024020032802082202450d0020032802002101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b200341106a21010240200341046a280200450d00200328020010290b2001210320012004470d000b0b200041086a280200450d06200028020410290f0b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d00200128020010290b200141146a21012002416c6a22020d000b0b200041086a280200450d05200028020410290f0b02402000410c6a2802002201450d00200041046a28020022032001411c6c6a2104034002402003410c6a2802002202450d0020032802042101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b0240200341086a280200450d00200328020410290b2003411c6a21010240200341146a280200450d00200328021010290b2001210320012004470d000b0b200041086a280200450d04200028020410290f0b02402000410c6a2802002201450d00200041046a2802002203200141186c6a210403400240200341046a280200450d00200328020010290b0240200341146a2802002202450d00200328020c2101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b200341186a21010240200341106a280200450d00200328020c10290b2001210320012004470d000b0b200041086a280200450d03200028020410290f0b02402000410c6a2802002201450d00200041046a28020022032001411c6c6a2104034002402003410c6a2802002202450d0020032802042101200241047421020340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200241706a22020d000b0b0240200341086a280200450d00200328020410290b2003411c6a21010240200341146a280200450d00200328021010290b2001210320012004470d000b0b200041086a280200450d02200028020410290f0b0240200041046a2d0000220141024b0d0002400240024020010e03000102000b2000410c6a280200450d04200041086a28020010290f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002203450d00200141046a280200450d00200310290b2001410c6a2101200241746a22020d000b0b200041106a280200450d03200028020c10290f0b0240200041146a2802002201450d002000410c6a280200220520014104746a210603402005220441106a2105024020042802042201450d0002402004410c6a2802002202450d002002410c6c21020340024020012802002203450d00200141046a280200450d00200310290b2001410c6a2101200241746a22020d000b0b200441086a280200450d00200428020410290b20052006470d000b0b200041106a280200450d02200028020c10290c020b2000410c6a280200450d01200041086a28020010290f0b0240200041086a280200450d00200041046a28020010290b0240200041146a2802002201450d00200041186a280200450d00200110290b200041246a280200450d00200041206a28020010290f0b0b907f05087f017e1d7f037e187f23002203210420034180096b41607122032400024002400240024002400240024002400240024002400240024002400240411010272205450d00200541063a0000412010272206450d01200641063a00104100210720064100360204200620032f00f0053b00012006412d3a0000200641036a200341f2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d00200528020410290b20051029200141106a2802002208412c6c21092001280208210a02400340024020092007470d00411010272205450d0520054180023b010c200542828080802037020420052006360200200520032f01d0033b010e02402001410c6a2802002008470d00200841016a22072008490d0f20084101742209200720072009491b2207ad422c7e220b422088a70d0f200ba722094100480d0f0240024020080d0020091027210a0c010b200a2008412c6c20091028210a0b200a450d072001200a3602082001410c6a20073602000b2001200841016a220c360210200a2008412c6c6a220741073a0000200720032f00e0043b0001200742818080801037000820072005360004200720032902f005370210200741036a200341e2046a2d00003a0000200741186a200341f8056a290200370200200741206a20034180066a290200370200200741286a200341f0056a41186a2802003602004100210d0c020b200a20076a21052007412c6a220e210720052d00004107470d000b200320032f01d0033b01f005200a200e6a220541586a210a024002402005415c6a220c280200200541606a22092802002207460d00200a280200210e0c010b200741016a220e2007490d0d20074101742208200e200e2008491b220841ffffffff00712008470d0d2008410474220d4100480d0d0240024020070d00200d1027210e0c010b200541586a2802002007410474200d1028210e0b200e450d06200c2008360200200541586a200e360200200928020021070b200e20074104746a22074180023b010c200742828080802037020420072006360200200720032f01f0053b010e2009200928020041016a360200200341c0006a200a1080032003280244417f6a210d2001280210210c2001280208210a0b200c412c6c2107200a41586a210502400340410021062007450d01200741546a2107200541286a21092005412c6a220e210520092d00004103470d000b200e41086a2802002207450d00200741286c2105200e28020041186a2107410021060340200620072d0000456a2106200741286a2107200541586a22050d000b0b200c412c6c2107200a41586a210502400340410021092007450d01200741546a2107200541286a210e2005412c6a22082105200e2d00004103470d000b200841086a2802002207450d00200741286c2105200828020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b200c412c6c2107200a41606a210502400340024020070d00410021070c020b200741546a2107200541206a210e2005412c6a220a2105200e2d00004104470d000b200a28020021070b200720096a220f41ffffffff0371200f470d0c200f4102742207417f4c0d0c0240024020070d00410421100c010b2007107c2210450d060b024002400240024002400240200f450d002010200f4102746a211141002112201021130340024020122006490d0020012802102214412c6c220921072001280208221541586a220e2105024003404100210a2007450d01200741546a2107200541286a21082005412c6a220c210520082d00004103470d000b200c41086a2802002207450d00200741286c2105200c28020041186a21074100210a0340200a20072d0000456a210a200741286a2107200541586a22050d000b0b2012200a6b220a20124b0d0303402009450d05200941546a2109200e41286a2107200e412c6a2205210e20072d0000410b470d000b200541086a280200200a4d0d052005280200200a41186c6a2802082105200341f0056a200a200110960420032802f405210720032802f0054101460d072013200720056a3602000b201241016a2112201341046a22132011470d000b0b20012802102114200128020821150c0f0b412c10272207450d0a200741286a4100280092ac45360000200741206a410029008aac45370000200741186a4100290082ac45370000200741106a41002900faab45370000200741086a41002900f2ab45370000200741002900eaab4537000042ac808080c005210b0c020b412c10272207450d0a200741286a41002800beac45360000200741206a41002900b6ac45370000200741186a41002900aeac45370000200741106a41002900a6ac45370000200741086a410029009eac4537000020074100290096ac4537000042ac808080c005210b0c010b411e10272207450d0a200741166a41002900d8ac45370000200741106a41002900d2ac45370000200741086a41002900caac45370000200741002900c2ac45370000429e808080e003210b0b201010290c0a0b20032903f805210b2010102920070d09410021100c0a0b41104108102a000b41204108102a000b41104104102a000b20094104102a000b200d4104102a000b20074104102a000b412c4101102a000b412c4101102a000b411e4101102a000b410021100c030b02402014450d0020152014412c6c6a2116200341e0046a41146a2117200341e0076a2118200341f0056a41017221190340024020152d0000410b470d00201528020c2207450d002015280204220a200741186c6a211a03400240200a41146a220c2802002207450d00200a410c6a21124100210e0240024002400240024002400340200e20074f0d014101210702402012280200200e41047422136a22052d0000410b470d002003200541046a22053602c0022010450d04200f200528020022054d0d03201020054102746a2802002209450d00201920032f00e0043b0000201941026a200341e0046a41026a2d00003a0000200341123a00f0052003200d3602d407200341133a00d007200341d7003a00c007200320093602b4072003412d3a00b0072003200d3602a407200341123a00a00720032005360294072003410b3a009007200341063a008007200341003a00f00620034184083b01e006200341373a00d006200320023602c4062003412d3a00c0062003200d3602b406200341123a00b0062003200d3602a406200341133a00a006200341d6003a00900620032009360284062003412d3a0080062003200d3602f405200c2802002211200e4d0d05200c200e360200200a28020c2107200320183602f804200320123602f0042003200720136a220841106a22063602e8042003200e41016a22143602e0042003201120146b221b3602e404200320072014410474221c6a221d3602ec042003200341f0056a3602f40420062107024020082d0000220941ac01460d004100210702400340200820076a21050240200941ff01714109470d00200541086a28020041ffffffff0371450d00200541046a28020010290b2007450d012003200541206a3602e804200741106a2107200541106a2d0000220941ac01470d000b200820076a41106a21070c010b200541106a21070b02402007201d460d00034020032007220541106a22073602e8040240024020052d000022094109460d00200941ac01470d010c030b200541086a28020041ffffffff0371450d00200541046a28020010290b20062007470d000b0b0240024002400240201b450d0002402014200a2802142207470d00200341f0056a2107201821080c030b2013200741047422076b2109200a28020c20076a2105200341f0056a21072018210603400240024020072006470d00410021070c010b2003200741106a3602f4040b200341d0036a2007109c0420032d00d00341ac01460d04200520032903d003370300200541086a200341d0036a41086a290300370300200a200a28021441016a3602142009450d02200541106a2105200941706a210920032802f804210620032802f40421070c000b0b20122017109d040c020b20032802f804210820032802f40421070b0240200820076b2205450d000240024020032802f004220641046a221d280200221320116b20054104762209490d00200628020021050c010b201120096a22052011490d1020134101742211200520052011491b221141ffffffff00712011470d102011410474221e4100480d100240024020130d00201e102721050c010b20062802002013410474201e102821050b2005450d0920062005360200201d20113602000b2005201420096a22134104746a2005201c6a201b41047410cf041a200320133602e004201320062802082205460d00200e20096a410474200541047422056b2109200628020020056a210503400240024020072008470d00410021070c010b2003200741106a3602f4040b200341d0036a2007109c0420032d00d00341ac01460d02200520032903d003370300200541086a200341d0036a41086a2903003703002006200628020841016a3602082009450d01200541106a2105200941706a210920032802f804210820032802f40421070c000b0b200341003602d803200342083703d003200341d0036a2017109d0420032802d003221b20032802d803220541047422086a210620032802d403211c201b210702402005450d000240024020032802f004221341046a221d280200220720032802e404221420032802e00422056a22116b20084104752209490d00201328020021070c010b201120096a221e2011490d1020074101742211201e201e2011491b221141ffffffff00712011470d102011410474221e4100480d100240024020070d00201e102721070c010b20132802002007410474201e102821070b2007450d0a20132007360200201d20113602000b2007200520096a220941047422116a200720054104746a201441047410cf041a200320093602e004201b2107200920132802082205460d002013280200220720116a211d200720054104746a2109201b21050340024020080d00200621070c020b200341d0036a41026a2207200541036a2d00003a0000200320052f00013b01d003024020052d0000221441ac01470d00200541106a21070c020b200541046a290200210b2005410c6a2802002111200920143a00002009410c6a2011360200200941046a200b37020020032f01d0032114200941036a20072d00003a0000200941016a20143b00002013201328020841016a360208200841706a2108200541106a22072105200941106a2209201d470d000b0b024020072006460d0003400240024020072d000022054109460d00200541ac01470d010c030b200741086a28020041ffffffff0371450d00200741046a28020010290b200741106a22072006470d000b0b201c450d00201b10290b024020032802e804220720032802ec042206460d00034020032007220541106a22073602e8040240024020052d000022094109460d00200941ac01470d010c030b200541086a28020041ffffffff0371450d00200541046a28020010290b20062007470d000b0b024020032802e4042207450d00024020032802e004220620032802f004220841086a22092802002205460d002008280200220820054104746a200820064104746a200741047410cf041a0b2009200720056a3602000b024020032d00f0054109470d0020032802f80541ffffffff0371450d0020032802f40510290b024020032d0080064109470d0020032802880641ffffffff0371450d0020032802840610290b024020032d0090064109470d0020032802980641ffffffff0371450d0020032802940610290b024020032d00a0064109470d0020032802a80641ffffffff0371450d0020032802a40610290b024020032d00b0064109470d0020032802b80641ffffffff0371450d0020032802b40610290b024020032d00c0064109470d0020032802c80641ffffffff0371450d0020032802c40610290b024020032d00d0064109470d0020032802d80641ffffffff0371450d0020032802d40610290b024020032d00e0064109470d0020032802e80641ffffffff0371450d0020032802e40610290b024020032d00f0064109470d0020032802f80641ffffffff0371450d0020032802f40610290b024020032d0080074109470d0020032802880741ffffffff0371450d0020032802840710290b024020032d0090074109470d0020032802980741ffffffff0371450d0020032802940710290b024020032d00a0074109470d0020032802a80741ffffffff0371450d0020032802a40710290b024020032d00b0074109470d0020032802b80741ffffffff0371450d0020032802b40710290b024020032d00c0074109470d0020032802c80741ffffffff0371450d0020032802c40710290b024020032d00d0074109470d0020032802d80741ffffffff0371450d0020032802d40710290b410f21070b2007200e6a220e200c2802002207490d000c070b0b41e0acc500200e20071037000b2003410136028406200342013702f405200341f0acc5003602f005200341243602d4032003200341d0036a360280062003200341c0026a3602d003200341e0046a200341f0056a10e60320032802e0042207450d0420032902e404210b0c0b0b419eabc50041cc00104e000b419cb1c5001058000b201e4108102a000b201e4108102a000b200a41186a220a201a470d000b0b2015412c6a22152016470d000b0b200341c8006a41106a200141106a280200221f360200200341c8006a41086a200141086a290200220b37030020032001290200370348201f412c6c2107200ba7222041586a210502400340024020070d00410021090c020b200741546a2107200541286a21092005412c6a220e210520092d00004108470d000b200341386a200e10800320032802382109200328023c21070b2007410020091b2106201f412c6c2107202041586a2105200941b8d6c50020091b210e02400340024020070d00410021090c020b200741546a2107200541286a21092005412c6a220a210520092d0000410a470d000b200341306a200a10800320032802302109200328023421070b2007410020091b2108201f412c6c2107202041586a2105200941b8d6c50020091b211e02400340024020070d00410021210c020b200741546a2107200541286a21092005412c6a220a210520092d00004109470d000b200a2802002105410121210b200342003702742003418883c000360270201e2008411c6c6a2122200e200641146c6a2106200341e0046a410272222341266a2124202341186a2125202341086a21264100211741002127410021284100210c4100211c4104211a410421110240024002400240410041ff01710e03000102000b410021070c020b410221070c010b410121070b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e03000104040b0240201741ff01710e03020300020b20284101470d05410021070c080b2021450d0e41022119410021214100211d200521070c1b0b0340024002400240024002402006200e22076b413c4b0d0020072006470d012007210e0c020b200728020c0d03200741146a210e200741106a28020021070c1e0b200741106a21090340200728020c450d02200941146a2109200741146a22072006470d000b2006210e0b20284101470d05410021070c0a0b200941046a210e200928020021070c1b0b200741206a280200450d19200741346a280200450d18200741d0006a210e200741c8006a280200450d170c000b0b03400240024002402006200e22076b413c4b0d004101211720072006470d012007210e0c1f0b200728020c0d01200741146a210e200741106a28020021070c170b200741106a210902400340200728020c450d01200941146a2109200741146a22072006470d000b2006210e0c1e0b200941046a210e200928020021070c160b200741206a280200450d14200741346a280200450d13200741d0006a210e200741c8006a280200450d120c000b0b0240024002400240201741ff01710e03010200010b20284101470d02410021070c090b0340024002400240024002402006200e22076b413c4b0d0020072006470d012007210e0c020b200728020c0d03200741146a210e200741106a28020021070c160b200741106a21090340200728020c450d02200941146a2109200741146a22072006470d000b2006210e0b20284101470d07410021070c080b200941046a210e200928020021070c130b200741206a280200450d11200741346a280200450d10200741d0006a210e200741c8006a280200450d0f0c000b0b03400240024002402006200e22076b413c4b0d0020072006460d10200741106a21090340200728020c450d02200941146a2109200741146a22072006470d000c110b0b200728020c0d01200741146a210e200741106a28020021070c0e0b200941046a210e200928020021070c0d0b200741206a280200450d0b200741346a280200450d0a200741d0006a210e200741c8006a280200450d090c000b0b410121070c060b410121070c040b410121070c020b410121070b0340024002400240024020070e020001010b20182027470d01410121070c030b201e2022460d0a200341206a201e10fd0320032802202218450d0a201e411c6a211e201820032802244102746a21270c010b2018450d092018280200210741012119410221172005211d201841046a2118410121280c160b410021070c000b0b0340024002400240024020070e020001010b20182027470d014101212820272118410121070c030b41022117201e2022460d17200341186a201e10fd03201e411c6a211e20032802182207450d182007200328021c4102746a2127200721180c010b201841046a2109024020180d004101212841022117200921180c180b201828020021074101212841022117410021192005211d200921180c150b410021070c000b0b0340024002400240024020070e020001010b20182027470d014101212820272118410121070c030b41022117201e2022460d16200341106a201e10fd03201e411c6a211e20032802102207450d17200720032802144102746a2127200721180c010b201841046a2109024020180d004101212841022117200921180c170b201828020021074101212841022117410021192005211d200921180c140b410021070c000b0b0340024002400240024020070e020001010b20182027470d01410121070c030b201e2022460d07200341286a201e10fd0320032802282218450d07201e411c6a211e2018200328022c4102746a21270c010b2018450d062018280200210741012119410221172005211d201841046a2118410121280c130b410021070c000b0b200741cc006a28020021070c020b2007413c6a210e200741386a28020021070c010b200741286a210e200741246a28020021070b410121192005211d410121170c0d0b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360201f412c6c2107202041586a210502400340410021092007450d01200741546a2107200541286a210e2005412c6a220a2105200e2d00004103470d000b200a41086a2802002207450d00200741286c2105200a28020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b201f412c6c2107202041606a210502400340024020070d00410021070c020b200741546a2107200541206a210e2005412c6a220a2105200e2d00004104470d000b200a28020021070b200341f0056a41106a200341c8006a41106a280200360200200341f0056a41086a200341c8006a41086a290300370300200320032903483703f005200341b0016a200341f0056a1082030240200c450d002011200c4102746a2118200720096a211b200341e0076a2112200341e7046a211703402011220741046a21112007280200210a200341e0006a21072003280264210803402007280200220641086a210520062f0106220c4102742107417f210902400340024020070d00200c21090c020b2005280200210e2007417c6a2107200941016a2109200541046a210502404100417f4101200e200a4b1b200e200a461b41016a0e03020001020b0b200641346a20094105746a22132802182105201328021c21072003200d3602d407200341133a00d007200341d7003a00c007200320073602b4072003412d3a00b0072003200d3602a407200341123a00a00720032005360294072003410b3a009007200341063a008007200341003a00f00620034184083b01e006200341373a00d006200320023602c4062003412d3a00c0062003200d3602b406200341123a00b0062003200d3602a406200341133a00a006200341d6003a00900620032007360284062003412d3a0080062003200d3602f405200341123a00f0052013280208220a41106a220e41ffffffff0071200e470d15200e4104742207417f4c0d15201341086a21190240024002400240024020070d004108210c0c010b20071027220c450d012019280200210a0b0240200a0d00410021050c030b4100210941002107034002402007200e470d00200e41016a2205200e490d19200e4101742206200520052006491b220541ffffffff00712005470d19200541047422064100480d1902400240200e0d0020061027210c0c010b200c200e41047420061028210c0b200c450d032005210e0b200c20096a2205410f3a0000200541046a2007360200200541016a20032f01d0033b0000200541036a200341d0036a41026a2d00003a0000200941106a2109200741016a22052107200a2005460d030c000b0b20074108102a000b20064108102a000b02400240024002400240024002400240200e20056b410f4f0d002005410f6a22072005490d1c200e4101742209200720072009491b220741ffffffff00712007470d1c200741047422094100480d1c02400240200e0d0020091027210c0c010b200c200e41047420091028210c0b200c450d012007210e0b200c20054104746a2107200341f0056a2109034020052108024002400240024020092d00002205414f6a41fb004f0d000c010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e312c2c0001022c2c0304052c06072c2c08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292c0b20092d00012106410221050c2b0b20092d00012106410321050c2a0b20092d00012106410421050c290b200941046a280200210a410721050c270b200941046a280200210a410821050c260b2009280208221d41ffffffff0371201d470d44201d4102742205417f4c0d440240024020050d004104210a0c010b20051027220a450d2a0b0240201d450d0020092802042105201d4102742114200a2106034020062005280200360200200641046a2106200541046a21052014417c6a22140d000b0b200935020c422086201dad84210b410921050c250b200941046a280200210a410b21050c240b200941046a280200210a20092d00012106410c21050c240b200941046a280200210a410f21050c220b200941046a280200210a411021050c210b200941046a280200210a411121050c200b200941046a280200210a411221050c1f0b200941046a280200210a411321050c1e0b200941046a280200210a2009350208210b411421050c1d0b200941046a280200210a2009350208210b411521050c1c0b200941046a280200210a2009350208210b411621050c1b0b200941046a280200210a2009350208210b411721050c1a0b200941046a280200210a2009350208210b411821050c190b200941046a280200210a2009350208210b411921050c180b200941046a280200210a2009350208210b411a21050c170b200941046a280200210a2009350208210b411b21050c160b200941046a280200210a2009350208210b411c21050c150b200941046a280200210a2009350208210b411d21050c140b200941046a280200210a2009350208210b411e21050c130b200941046a280200210a2009350208210b411f21050c120b200941046a280200210a2009350208210b412021050c110b200941046a280200210a2009350208210b412121050c100b200941046a280200210a2009350208210b412221050c0f0b200941046a280200210a2009350208210b412321050c0e0b200941046a280200210a2009350208210b412421050c0d0b200941046a280200210a2009350208210b412521050c0c0b200941046a280200210a2009350208210b412621050c0b0b200941046a280200210a2009350208210b412721050c0a0b200941046a280200210a2009350208210b412821050c090b200941046a280200210a2009350208210b412921050c080b200941046a280200210a2009350208210b412a21050c070b20092d00012106412b21050c070b20092d00012106412c21050c060b200941046a280200210a412d21050c040b2009290308210b412e21050c020b200941046a280200210a412f21050c020b2009290308210b413021050b0b0b200720063a0001200720053a0000200741086a200b370300200741046a200a360200200841016a2105200741106a2107200941106a22092012470d000b02400240200e2005460d00200e21090c010b200e41016a2207200e490d1c200e4101742205200720072005491b220941ffffffff00712009470d1c200941047422074100480d1c02400240200e0d0020071027210c0c010b200c200e41047420071028210c0b200c450d03200e21050b200c20054104746a220741063a0000200720032900e004370001200741086a2017290000370000200341e0046a200341b0016a418c0110ce041a411010272205450d03200541063a0000200341d0036a200341e0046a418c0110ce041a20192802002207417f4c0d1c0240024020070d004101210a41014101200710ce041a2007ad210b410021070c010b2013280200210e20071027220a450d05200a200e200710ce04210e20071027220a450d06200a200e200710ce041a200e10292007ad210b0b200341e0046a200341d0036a418c0110ce041a201331000d2129200341d0036a200341e0046a418c0110ce041a200341e0046a200341d0036a418c0110ce041a200341c0026a200341e0046a418c0110ce041a41101027220e450d06200841026a2106202a428080808080804083222a200b842029422886844280808080800c84210b200e41063a0000200e1029200341d0036a200341c0026a418c0110ce041a200341e0046a200341d0036a418c0110ce041a024020052d00004109470d00200528020841ffffffff0371450d00200528020410290b20051029200341c0026a200341e0046a418c0110ce041a200341e0046a200341c0026a418c0110ce041a200341003602fc03200320063602f803200320093602f4032003200c3602f003200341003602ec03200342043702e4032003200b3702dc03200320073602d8032003200a3602d403200341013602d003200341e0046a200341d0036a108703200341b0016a200341e0046a418c0110ce041a201341013602102013201b360214024020032d00f0054109470d0020032802f80541ffffffff0371450d0020032802f40510290b024020032d0080064109470d0020032802880641ffffffff0371450d0020032802840610290b024020032d0090064109470d0020032802980641ffffffff0371450d0020032802940610290b024020032d00a0064109470d0020032802a80641ffffffff0371450d0020032802a40610290b024020032d00b0064109470d0020032802b80641ffffffff0371450d0020032802b40610290b024020032d00c0064109470d0020032802c80641ffffffff0371450d0020032802c40610290b024020032d00d0064109470d0020032802d80641ffffffff0371450d0020032802d40610290b024020032d00e0064109470d0020032802e80641ffffffff0371450d0020032802e40610290b024020032d00f0064109470d0020032802f80641ffffffff0371450d0020032802f40610290b024020032d0080074109470d0020032802880741ffffffff0371450d0020032802840710290b024020032d0090074109470d0020032802980741ffffffff0371450d0020032802940710290b024020032d00a0074109470d0020032802a80741ffffffff0371450d0020032802a40710290b024020032d00b0074109470d0020032802b80741ffffffff0371450d0020032802b40710290b024020032d00c0074109470d0020032802c80741ffffffff0371450d0020032802c40710290b024020032d00d0074109470d0020032802d80741ffffffff0371450d0020032802d40710290b202a4280808080808c0184212a201b41016a211b20112018470d090c0a0b20094108102a000b20054104102a000b20074108102a000b41104108102a000b20074101102a000b20074101102a000b41104108102a000b02402008450d002008417f6a2108200620094102746a4194036a21070c010b0b0b41b0b2c500418001104e000b0240201c450d00201a10290b200341f0056a200341b0016a418c0110ce041a200341e0046a200341f0056a1084030240200341e0046a41106a2802002207450d0020032802e80422192007412c6c6a211d0340024020192d000041786a220741024b0d0002400240024020070e03000102000b201928020c2207450d0220192802042209200741146c6a211203400240200928020c0d002009280210210c2003280264210d200341e0006a210703402007280200220841286a210e200841086a210520082f010622134102742107417f210a02400340024020070d002013210a0c020b200528020021062007417c6a2107200a41016a210a200e41206a210e200541046a210502404100417f41012006200c4b1b2006200c461b41016a0e03020001020b0b0240200e417c6a280200450d002009200e2802003602100c030b41b0b3c5004135104e000b200d450d01200d417f6a210d2008200a4102746a4194036a21070c000b0b200941146a22092012470d000c030b0b201928020421082003280264210c200341e0006a210703402007280200220641286a2109200641086a210520062f0106220d4102742107417f210e02400340024020070d00200d210e0c020b2005280200210a2007417c6a2107200e41016a210e200941206a2109200541046a210502404100417f4101200a20084b1b200a2008461b41016a0e03020001020b0b02402009417c6a280200450d00201920092802003602040c040b41b0b3c5004135104e000b200c450d02200c417f6a210c2006200e4102746a4194036a21070c000b0b201928020c2207450d00201928020422112007411c6c6a211b0340024020112802182207450d002011280210220d20074102746a21140340200d221241046a210d201228020021082003280264210c200341e0006a210703402007280200220641286a2109200641086a210520062f010622134102742107417f210e024002400340024020070d002013210e0c020b2005280200210a2007417c6a2107200e41016a210e200941206a2109200541046a210502404100417f4101200a20084b1b200a2008461b41016a0e03020001020b0b02402009417c6a280200450d00201220092802003602000c020b41b0b3c5004135104e000b200c450d00200c417f6a210c2006200e4102746a4194036a21070c010b0b200d2014470d000b0b2011411c6a2211201b470d000b0b2019412c6a2219201d470d000b0b200341ec046a290200210b20032802e004210720032902e404212a200328026020032802642003280268109f04200041106a200b370200200041086a202a37020020002007360204200041003602002010450d13200f450d1320101029200424000f0b200741cc006a28020021070c020b2007413c6a210e200741386a28020021070c010b200741286a210e200741246a28020021070b41002117410121192005211d0c080b200741cc006a28020021070c020b2007413c6a210e200741386a28020021070c010b200741286a210e200741246a28020021070b41012117410021192005211d0c040b200741cc006a28020021070c020b2007413c6a210e200741386a28020021070c010b200741286a210e200741246a28020021070b410021192005211d410021170b2003200736027c0240024002400240024002400240024002402010450d000240200f20074b0d002003410136028406200342023702f405200341a0b2c5003602f005200341013602d4032003200341d0036a360280062003200341fc006a3602d003200341e0046a200341f0056a10e60320032902e404220b422088a7210920032802e0042113200ba721160c090b201020074102746a2802002205450d0402400240201c200c470d00200c41016a2209200c490d0e200c410174220a20092009200a491b221c41ffffffff0371201c470d0e201c41027422094100480d0e02400240200c0d0020091027211a0c010b201a200c41027420091028211a0b201a450d01201a21110b2011200c4102746a2007360200200341f0056a200328027c2208200341c8006a109b0420032802f805211620032802f4052113024020032802f00522014101470d0020032802fc0521090c0a0b20132802082207417f4c0d0e20132d000c210a02400240024020070d00410121090c010b20132802002112200710272209450d0120092012200710ce041a0b2003200a3a008c0120032007360288012003200736028401200320093602800120132d000d21072003200536029c012003200328027c360298012003410036029001200320073a008d0102400240024020032802702207418883c000460d002003280274211b0c010b20244200370100202341206a420037010020254200370100202341106a42003701002026420037010020234200370100200341f0056a410041e00210cd041a41940310272207450d014100211b20074100360200200720032903e0043702042007410c6a200341e0046a41086a290300370200200741146a200341e0046a41106a2903003702002007411c6a200341e0046a41186a290300370200200741246a200341e0046a41206a2903003702002007412c6a200341e0046a41286a290300370200200741346a200341f0056a41e00210ce041a20034100360274200320073602700b200c41016a210c0340200741146a210920072f010622154102742114417f210a4100210502400340024020142005470d002015210a0c020b200720056a2112200541046a2105200a41016a210a200941206a210902404100417f4101201241086a280200221220084b1b20122008461b41016a0e03020001020b0b2009290200210b2009200329038001370200200941186a200329039801370200200941106a2207290200212a2007200329039001370200200941086a200329038801370200202a42ffffffff0f83420285500d08200b42808080807083500d08200ba710290c080b0240201b450d00201b417f6a211b2007200a4102746a4194036a28020021070c010b0b2003200328027841016a360278200329039801210b200329039001212a2003290388012129200329038001212b20072f01062209410b490d0420244200370100202341206a222c420037010020254200370100202341106a222d42003701002026420037010020234200370100200341f0056a410041e00210cd041a024041940310272205450d0020054100360200200520032903e0043702042005410c6a200341e0046a41086a222e290300370200200541146a200341e0046a41106a222f2903003702002005411c6a200341e0046a41186a2230290300370200200541246a200341e0046a41206a22312903003702002005412c6a200341e0046a41286a2232290300370200200541346a200341f0056a41e00210ce042112200341f0056a41086a221b200741fc016a290200370300200341f0056a41106a221520074184026a290200370300200341f0056a41186a22332007418c026a290200370300200320072902f4013703f00520072802202134200541086a200741246a20072f010641796a220941027410ce042114201220074194026a200941057410ce042112200741063b0106200520093b010620302033290300370300202f2015290300370300202e201b290300370300200320032903f0053703e00402400240200a4107490d002014200a417a6a22354102746a2014200a41796a220a4102746a2214200941ffff0371200a6b41027410cf041a20142008360200201220354105746a2012200a4105746a2209200541066a22122f0100200a6b41057410cf041a200941186a200b3702002009202a370210200920293702082009202b37020020122f010021140c010b200741086a2209200a41016a22354102746a2009200a4102746a2209200741066a22122f01002214200a6b223641027410cf041a20092008360200200741346a220920354105746a2009200a4105746a2209203641057410cf041a200941186a200b3702002009202a370210200920293702082009202b3702000b2012201441016a3b0100200341d0036a41186a22372030290300220b370300200341d0036a41106a2238202f290300222a370300200341d0036a41086a2239202e2903002229370300200341b0016a41186a223a200b370300200341b0016a41106a223b202a370300200341b0016a41086a223c2029370300200320032903e004220b3703d0032003200b3703b0010240200728020022120d00200521090c070b20072f010421352005213d0340200341c0026a41186a223e203a290300370300200341c0026a41106a223f203b290300370300200341c0026a41086a2240203c290300370300200320032903b0013703c002203541ffff037121080240024002400240024020122f01062207410b490d0020244200370100202c420037010020254200370100202d420037010020264200370100202342003701002039202e2903003703002038202f29030037030020372030290300370300200341d0036a41206a22072031290300370300200341d0036a41286a22052032290300370300200320032903e0043703d003200341f0056a410041900310cd041a41c40310272209450d0320094100360200200920032903d0033702042009410c6a2039290300370200200941146a20382903003702002009411c6a2037290300370200200941246a20072903003702002009412c6a2005290300370200200941346a200341f0056a41900310ce042105201241206a280200214120332012418c026a290200370300201520124184026a290200370300201b201241fc016a2902003703002003201241f4016a2902003703f005200941086a201241246a20122f0106220a41796a220741027410ce042142200520124194026a200741057410ce04214320094194036a201241b0036a200a417a6a221441027410ce042136201241063b0106200920073b010602402014450d00410021072036210503402005280200220a20073b0104200a2009360200200541046a21052014200741016a2207470d000b0b20302033290300220b370300202f2015290300222a370300202e201b2903002229370300200320032903f005222b3703e0042033200b3703002015202a370300201b20293703002003202b3703f005203541ffff037122054107490d0120422008417a6a220a41027422146a2042200841796a22074102746a220520092f010620076b41027410cf041a200520343602002043200a4105746a204320074105746a220520092f010620076b41057410cf041a200541186a203e290300370200200541106a203f290300370200200541086a2040290300370200200520032903c002370200200920092f010641016a22053b01062008410274223520366a416c6a203620146a2214200541ffff03712208200a6b41027410cf041a2014203d3602002008200a490d02200920356a41fc026a210503402005280200220a200741016a22073b0104200a2009360200200541046a210520072008490d000c030b0b201241086a2205200841016a2209410274220a6a2005200841027422146a2205200720086b221b41027410cf041a20052034360200201241346a220520094105746a200520084105746a2205201b41057410cf041a200541186a203e290300370200200541106a203f290300370200200541086a2040290300370200200520032903c0023702002012200741016a22073b0106201420124194036a22056a41086a2005200a6a2205200741ffff0371220a20096b41027410cf041a2005203d3602002008200a4f0d0c20122009417f6a22074102746a4198036a2105034020052802002209200741016a22073b010420092012360200200541046a21052007200a490d000c0d0b0b201241086a2207200841016a2214410274220a6a2007200841027422356a220720122f0106223620086b224241027410cf041a20072034360200201241346a220720144105746a200720084105746a2207204241057410cf041a200741186a203e290300370200200741106a203f290300370200200741086a2040290300370200200720032903c0023702002012203641016a22073b0106203520124194036a22366a41086a2036200a6a2236200741ffff0371220a20146b41027410cf041a2036203d3602002005200a4f0d00201220356a4198036a2107034020072802002205200841016a22083b010420052012360200200741046a2107200a2008470d000b0b203a2033290300370300203b2015290300370300203c201b290300370300200320032903f0053703b001201228020022070d01204121340c090b41c4034104102a000b20122f0104213520072112204121342009213d0c000b0b4194034104102a000b4194034104102a000b20074101102a000b20094104102a000b419eabc50041cc00104e000b200741086a2205200a41016a22124102746a2005200a4102746a22052009200a6b221441027410cf041a20052008360200200741346a220520124105746a2005200a4105746a2205201441057410cf041a200541186a200b3702002005202a370210200520293702082005202b3702002007200941016a3b01060c010b20244200370100202c420037010020254200370100202d420037010020264200370100202342003701002039202e2903003703002038202f29030037030020372030290300370300200341d0036a41206a22052031290300370300200341d0036a41286a220a2032290300370300200320032903e0043703d003200341f0056a410041900310cd041a41c40310272207450d0220074100360200200720032903d0033702042007410c6a2039290300370200200741146a20382903003702002007411c6a2037290300370200200741246a20052903003702002007412c6a200a290300370200200741346a200341f0056a41900310ce04210820072003280270220536029403200320073602702003200328027441016a36027420052007360200200541003b0104200820072f0106220a4105746a220520032903b001370200200541186a203a290300370200200541106a203b290300370200200541086a203c2903003702002007200a4102746a41086a203436020020074194036a200a41016a22054102746a2009360200200720053b0106200920053b0104200920073602000b2001450d002016450d00201310290b201d2105201941ff01710e03010205010b41c4034104102a000b410021070c040b410221070c030b200328027020032802742003280278109f040240201c450d00201a10290b0240201f450d00201f412c6c210520202107034020071088032007412c6a2107200541546a22050d000b0b0240200341d4006a280200450d00202010290b2000201336020420004101360200200041086a2009ad4220862016ad843702002010450d06200f450d0620101029200424000f0b2022211e0b410121070c000b0b102b000b1039000b2000200736020420004101360200200041086a200b37020002402010450d00200f450d00201010290b20012802082105024020012802102203450d002003412c6c210720052103034020031088032003412c6a2103200741546a22070d000b0b2001410c6a280200450d00200510290b200424000ba6810204117f017e037f017e230041e0006b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0f0100021211100f0e0d0c0b0a080706010b200141186a2802002104200141146a2802002105200141106a28020021062001410c6a2802002107200141086a2802002108200141046a28020021090240200241046a280200200241086a280200220a460d002002280200210b0c180b200a41016a220c200a490d14200a410174220d200c200c200d491b220c4100480d1402400240200a0d00200c1027210b0c010b2002280200200a200c1028210b0b200b450d042002200b360200200241046a200c360200200241086a280200210a0c170b2001410c6a280200210c200141086a2802002104200141046a280200210b20012d0001210502400240200241046a280200200241086a280200220a460d002002280200210d0c010b200a41016a220d200a490d14200a4101742206200d200d2006491b22064100480d1402400240200a0d0020061027210d0c010b2002280200200a20061028210d0b200d450d032002200d360200200241046a2006360200200241086a280200210a0b200241086a2206200a41016a360200200d200a6a20053a000002400240200241046a280200220d2006280200220a6b200c490d002002280200210d0c010b200a200c6a2205200a490d14200d410174220a20052005200a491b220a4100480d1402400240200d0d00200a1027210d0c010b2002280200200d200a1028210d0b200d450d022002200d360200200241046a200a360200200241086a280200210a0b200241086a200a200c6a360200200d200a6a200b200c10ce041a4100210c41012107024020040d004101210d0c220b200b10294101210d0c210b2001410c6a2802002106200141086a280200210e200141046a280200210f024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d14200a410174220d200c200c200d491b220d4100480d1402400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41013a0000200f20064104746a21104100210d4100210c41002105410121042006210a024003400240200c2005470d00200d200c41016a220b200b200d491b22054100480d1602400240200d0d002005102721040c010b2004200c2005102821040b2004450d020b2004200c6a200a41807f72200a41ff0071200a410776220b1b3a0000200d41026a210d200c41016a210c200b210a200b0d000b024020060d00200f21080c130b200f210a02400340200a41106a2108200a2d000d22114105460d14200a2d000c210d200a2802082109200a2802042112200a28020021130240024002400240024002402005200c470d00200c41016a220a200c490d1c200c410174220b200a200a200b491b22054100480d1c02400240200c0d002005102721040c010b2004200c2005102821040b2004450d010b2004200c6a200d3a0000200c41016a210a200c410174220c41046a2107200c41026a210d2009210c0340200721060240200a2005470d00200a41016a220b200a490d1d200d200b200b200d491b22054100480d1d02400240200a0d002005102721040c010b2004200a2005102821040b2004450d030b2004200a6a200c41807f72200c41ff0071200c410776220b1b3a0000200641026a2107200d41026a210d200a41016a210a200b210c200b0d000b0240024020090d00200a210c0c010b4100210d0340200a200d6a210c41fc00210b02400240024002402013200d6a2d00000e050200010305020b41fe00210b0c020b41fd00210b0c010b41ff00210b0b0240200c2005470d00200c41016a2205200c490d1e2006200520052006491b22054100480d1e02400240200c0d002005102721040c010b2004200c2005102821040b2004450d050b2004200a6a200d6a200b3a0000200641026a21062009200d41016a220d470d000b200a200d6a210c0b20120d030c040b20054101102a000b20054101102a000b20054101102a000b201310290b4100210a024020114104460d0002402005200c470d00200c41016a220a200c490d18200c410174220d200a200a200d491b22054100480d1802400240200c0d002005102721040c010b2004200c2005102821040b2004450d030b2004200c6a41013a0000200c41016a210c201141077141ff0073210a0b024002402005200c470d00200c41016a220d200c490d18200c410174220b200d200d200b491b22054100480d1802400240200c0d002005102721040c010b2004200c2005102821040b2004450d010b2004200c6a200a3a0000200c41016a210c2008210a20082010470d010c160b0b20054101102a000b20054101102a000b20054101102a000b200d4101102a000b200a4101102a000b20064101102a000b200c4101102a000b200141286a2802002104200141246a2802002111200141206a28020021092001411c6a2802002106200141186a2802002113200141146a28020021082001410c6a2902002114200141086a280200210d200141046a280200210b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d22200a4101742205200c200c2005491b22054100480d2202400240200a0d0020051027210c0c010b2002280200200a20051028210c0b200c450d012002200c360200200241046a2005360200200241086a280200210a0b200241086a200a41016a36020041002105200c200a6a41003a0000200341dc006a41003602002003420137025420032002360250200320143e02482003200d3602442003200b360240200341086a200341c0006a200341d0006a10ed03024020032d0008220a411a460d0020032f000920032d000b41107472210c200341086a41086a2903002114200328020c21044100210d0c1e0b2014422088a7210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d23200a410174220b200d200d200b491b220b4100480d2302400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d032003200b3602582003200d3602540b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b4101211202402008450d00200320063602482003201336024420032008360240200341086a200341c0006a200341d0006a10ed03024020032d0008220a411a460d0020032f000920032d000b41107472210c200341106a2903002114200328020c21044100210d410121050c1f0b410021120b200920044104746a21062004210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d23200a410174220b200d200d200b491b220b4100480d2302400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d042003200b3602582003200d3602540b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b024020040d002009210b0c1d0b200441047441706a21072009210d0340200d41106a210b200d410c6a2802002102200d41086a280200210a200d280204210c0240024002400240024002400240024002400240200d2802000e09000102030405060727000b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2c200d4101742205200420042005491b22054100480d2c02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d0e20032005360258200320043602540b2003200d41016a36025c2004200d6a41003a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2d200d4101742205200420042005491b22054100480d2d02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1020032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2d200c4101742204200d200d2004491b22044100480d2d02400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d11200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000c080b0b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2b200d4101742205200420042005491b22054100480d2b02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1020032005360258200320043602540b2003200d41016a36025c2004200d6a41013a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2c200d4101742205200420042005491b22054100480d2c02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1220032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2c200c4101742204200d200d2004491b22044100480d2c02400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d13200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000c070b0b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2a200d4101742205200420042005491b22054100480d2a02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1220032005360258200320043602540b2003200d41016a36025c2004200d6a41023a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2b200d4101742205200420042005491b22054100480d2b02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1420032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2b200c4101742204200d200d2004491b22044100480d2b02400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d15200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000c060b0b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d29200d4101742205200420042005491b22054100480d2902400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1420032005360258200320043602540b2003200d41016a36025c2004200d6a41033a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d2a200d4101742205200420042005491b22054100480d2a02400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1620032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d2a200c4101742204200d200d2004491b22044100480d2a02400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d17200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000b200341086a2002200341d0006a10e10320032d0008220a411a460d0520032f000920032d000b41107472210c0c220b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d28200d4101742205200420042005491b22054100480d2802400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1620032005360258200320043602540b2003200d41016a36025c2004200d6a41043a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d29200d4101742205200420042005491b22054100480d2902400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1820032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d29200c4101742204200d200d2004491b22044100480d2902400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d19200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000b200341086a2002200341d0006a10e10320032d0008220a411a460d0420032f000920032d000b41107472210c0c210b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d27200d4101742205200420042005491b22054100480d2702400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1820032005360258200320043602540b2003200d41016a36025c2004200d6a41053a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d28200d4101742205200420042005491b22054100480d2802400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1a20032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d28200c4101742204200d200d2004491b22044100480d2802400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d1b200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000b200341086a2002200341d0006a10e10320032d0008220a411a460d0320032f000920032d000b41107472210c0c200b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d26200d4101742205200420042005491b22054100480d2602400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1a20032005360258200320043602540b2003200d41016a36025c2004200d6a41063a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d27200d4101742205200420042005491b22054100480d2702400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1c20032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d27200c4101742204200d200d2004491b22044100480d2702400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d1d200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000c020b0b024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d25200d4101742205200420042005491b22054100480d2502400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1c20032005360258200320043602540b2003200d41016a36025c2004200d6a41073a00000340024002402003280258200328025c220d460d00200328025421040c010b200d41016a2204200d490d26200d4101742205200420042005491b22054100480d2602400240200d0d002005102721040c010b2003280254200d2005102821040b2004450d1e20032005360258200320043602540b2003200d41016a36025c2004200d6a200c41807f72200c41ff0071200c410776220d1b3a0000200d210c200d0d000b0340024002402003280258200328025c220c460d002003280254210d0c010b200c41016a220d200c490d26200c4101742204200d200d2004491b22044100480d2602400240200c0d0020041027210d0c010b2003280254200c20041028210d0b200d450d1f200320043602582003200d3602540b2003200c41016a36025c200d200c6a200a41807f72200a41ff0071200a410776220c1b3a0000200c210a200c0d000b0b2003411a3a00080b200741706a2107200b210d200b2006470d000b2006210b0c1c0b20054101102a000b200b4101102a000b200b4101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20054101102a000b20054101102a000b20044101102a000b20032903102114200328020c2104024003402007450d01200741706a2107200b280200210d200b41106a210b200d4108470d000b0b02402011450d00200910290b20124521054101210d0c010b024003402006200b460d01200b280200210a200b41106a210b200a4108470d000b0b02402011450d00200910290b20032802582109200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d08200a4101742206200d200d2006491b22064100480d0802400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d07200c410174220a200d200d200a491b220a4100480d0702400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402009450d00200210290b41002110410121072008450d032012450d032013450d03200810290c030b20064101102a000b200a4101102a000b02402003280258450d00200328025410290b02402008452005720d002013450d00200810290b0240200d201145720d00200910290b200a411a470d1141002110410121070b4101210c4101210d4101210b4101210841012109410121044101210541012113410121064101210241012111410121120c350b200141146a280200210f200141106a28020021112001410c6a2802002113200141086a2802002110200141056a2d0000210d200141046a2d00002109024002400240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d0c200a410174220b200c200c200b491b220b4100480d0c02400240200a0d00200b1027210c0c010b2002280200200a200b1028210c0b200c450d012002200c360200200241046a200b360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41003a00000240410410272212450d00201241eec2b5ab06360000024020090e0400050403000b410121064100210a4100210c2011210d034002400240200a200c460d00200a21070c010b200a41016a220c200a490d0e200a410174220b200c200c200b491b22074100480d0e02400240200a0d002007102721060c010b2006200a2007102821060b02402006450d00200a210c2007210a0c010b20074101102a000b2006200c6a200d41807f72200d41ff0071200d410776220b1b3a0000200c41016a210c200b210d200b0d000b0240024002402007200c6b20114f0d00200c20116a220a200c490d0f2007410174220d200a200a200d491b220a4100480d0f0240024020070d00200a102721060c010b20062007200a102821060b2006450d01200a21070b2006200c6a2010201110ce041a200c20116a21084101210e20130d010c080b200a4101102a000b201010290c060b41044101102a000b200b4101102a000b410021154101210e20102106201321072011210841012116410121170c040b2003410036024820034201370340410121044100210d4100210a2010210c02400240024002400240024003400240200a200d470d00200d41016a220b200d490d10200d4101742205200b200b2005491b220b4100480d1002400240200d0d00200b102721040c010b2004200d200b102821040b2004450d022003200b36024420032004360240200b210d0b2003200a41016a22053602482004200a6a200c41807f72200c41ff0071200c410776220b1b3a00002005210a200b210c200b0d000b2013200f4104746a21060240200f0d002013210b0c040b2013210b2010450d03200641706a21162010210e4100210a2013210803402008210b02400340200b41046a28020022070d01200a41016a210a2006200b41106a220b470d000c070b0b200b41106a2108200a41016a2115200e417f6a210e200b41086a2902002114200b28020021172003280244210d2003280248210c02400240034002400240200c200d460d00200328024021040c010b200d41016a2204200d490d13200d4101742205200420042005491b22054100480d1302400240200d0d002005102721040c010b2003280240200d2005102821040b2004450d0220032005360244200320043602402005210d0b2003200c41016a22053602482004200c6a200a41807f72200a41ff0071200a41077622041b3a00002005210c2004210a20040d000b200320143703102003200736020c20032017360208200341d0006a200341086a200341c0006a10ea0320032d00502204411a460d010c040b20054101102a000b2016200b460d032015210a200e0d000c030b0b200b4101102a000b20032d0053210e20032f0051211720032802542105200329035821140240200641706a200b460d00200b41106a210b0340200b220a41106a210b0240200a2802042207450d00200a28020821080240200a410c6a280200220a450d00200a410c6c210c2007210a03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b2008450d00200710290b200b2006470d000b0b02402011450d00201310290b2004411a460d03200e411074210a02402003280244450d00200328024010290b2017200a72210a02400240200941024b0d000240024020090e03000109000b2013450d080c020b0240200f450d00200f410c6c210d2013210c03400240200c280200220b450d00200c41046a280200450d00200b10290b200c410c6a210c200d41746a220d0d000b0b02402011450d00201310290b2004411a470d074100210541012104410021080c0a0b2013450d060b201010290c050b200b41106a210b0b200b2006460d000340200b220a41106a210b0240200a2802042204450d00200a28020821050240200a410c6a280200220a450d00200a410c6c210c2004210a03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b2005450d00200410290b200b2006470d000b0b2011450d00201310290b2003280248210820032802442107200328024021064102210d410021164101210e41002117410021150c030b4100210e2003410036024820034201370340200341146a200f360200200341086a41086a20113602002003201336020c20032010360208200341d0006a200341086a200341c0006a10ea03024020032d00502204411a460d0020032d0053411074210a20032f0051210c200341d0006a41086a29030021142003280254210502402003280244450d00200328024010290b200c200a72210a0c010b2003280248210820032802442107200328024021064101211641002117410021154101210d0c020b200041086a2014370200200041046a20053602002000200a410874200472360200201210290c030b4100211741012116410121154100210d0b024002400240410110272204450d002004200d3a00004102210d4101210a410121052008210c03400240200a2005470d00200d200a41016a220b200b200d491b22054100480d092004200a200510282204450d030b2004200a6a200c41807f72200c41ff0071200c410776220b1b3a0000200d41026a210d200a41016a210a200b210c200b0d000b02402005200a6b20084f0d00200a20086a220c200a490d082005410174220d200c200c200d491b220c4100480d080240024020050d00200c102721040c010b20042005200c102821040b2004450d03200c21050b2004200a6a2006200810ce041a02402007450d00200610290b2008200a6a21080240200941024b0d00024002400240024020090e03000102000b2015201345720d07201010290c070b200e450d060240200f450d00200f410c6c210c2013210a03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b20110d010c060b2016450d050240200f450d002013200f4104746a21072013210603402006220b41106a21060240200b280204220a450d000240200b410c6a280200220c450d00200c410c6c210c03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b200b41086a280200450d00200b28020410290b20062007470d000b0b2011450d050b201310290c040b2017201345720d03201010290c030b41014101102a000b20054101102a000b200c4101102a000b2003411c6a2008360200200341186a20053602002003200436021420034284808080c00037020c20032012360208200341d0006a200341086a200210f103200320032900513703402003200341d0006a41086a29000037004720032d0050220a411a460d012000200a3a000020002003290340370001200041086a20032900473700000b410021094101210d4101210c4101210b410121044101210541012106410121074101210241012108410121130c1a0b41002112410121074101210c4101210d4101210b41012108410121094101210441012105410121134101210641012102410121110c330b2001410c6a2802002105200141086a2802002113200141046a28020021090240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d15200a410174220d200c200c200d491b220d4100480d1502400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a410b3a0000200341dc006a4100360200200342013702542003200236025020092005411c6c6a21074100210a4100210c2005210d034002400240200a200c460d002003280254210a0c010b200a41016a220b200a490d16200a4101742204200b200b2004491b220b4100480d1602400240200a0d00200b1027210a0c010b2003280254200a200b1028210a0b200a450d032003200b3602582003200a3602540b2003200c41016a36025c200a200c6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280258210a200328025c210c200d210d0c010b0b200921042005450d062009210a0340200a411c6a2104200a2802042202450d07200a41186a2802002105200a41146a2802002108200a41086a2902002114200a280200210c200a28021021060340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d17200a410174220b200d200d200b491b220b4100480d1702400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d052003200b3602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b2003201437024420032002360240200341086a200341c0006a200341d0006a10de03024020032d0008220d411a470d002005210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d18200a410174220b200d200d200b491b220b4100480d1802400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d072003200b3602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b024002402003280258220c200328025c220a6b2005490d002003280254210c0c010b200a20056a220d200a490d0b200c410174220a200d200d200a491b220a4100480d0b02400240200c0d00200a1027210c0c010b2003280254200c200a1028210c0b200c450d072003200a3602582003200c360254200328025c210a0b2003200a20056a36025c200c200a6a2006200510ce041a02402008450d00200610290b2004210a20042007470d010c090b0b20032d000b211220032f0009211020032903102114200328020c21112008450d05200610290c050b200d4101102a000b200b4101102a000b200b4101102a000b200b4101102a000b200a4101102a000b024020042007460d0003402004280204220b450d01200441146a2802002105200441086a28020021062004280210210202402004410c6a280200220a450d00200a410474210c200b210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b02402006450d00200b10290b2004411c6a210402402005450d00200210290b20042007470d000b0b2012411074210a02402013450d00200910290b2010200a72210a02402003280258450d00200328025410290b2000200a3b00012000200d3a0000200041036a200a4110763a0000200041086a2014370000200041046a2011360000410021084101210d4101210c4101210b41012104410121054101210641012107410121020c190b20042007460d0003402004280204220d450d01200441146a280200210b200441086a28020021052004280210210602402004410c6a280200220a450d00200a410474210c200d210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b02402005450d00200d10290b2004411c6a21040240200b450d00200610290b20042007470d000b0b02402013450d00200910290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d04200a4101742206200d200d2006491b22064100480d0402400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d03200c410174220a200d200d200a491b220a4100480d0302400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002111410121074101210c4101210d4101210b41012108410121094101210441012105410121134101210641012102410121120c340b20064101102a000b200a4101102a000b102b000b2001410c6a2802002105200141086a2802002117200141046a280200210e024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d0f200a410174220d200c200c200d491b220d4100480d0f02400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a410a3a00002003412c6a41003602002003420137022420032002360220200e200541186c6a210f4100210a4100210c2005210d0240034002400240200a200c460d002003280224210a0c010b200a41016a220b200a490d11200a4101742204200b200b2004491b220b4100480d1102400240200a0d00200b1027210a0c010b2003280224200a200b1028210a0b200a450d022003200b3602282003200a3602240b2003200c41016a36022c200a200c6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280228210a200328022c210c200d210d0c010b0b200e21092005450d03200341086a4101722102200341086a41026a2107200e210a02400340200a41186a2109200a2802002208450d05200a41146a2802002111200a41106a2802002112200a28020c2113200a29020421144100210c2003410036024c2003420137024420082014422088a7220d4103746a21062003200341206a3602402014a721104100210a024002400240024002400240034002400240200c200a460d002003280244210c0c010b200c41016a220a200c490d19200c410174220b200a200a200b491b220a4100480d1902400240200c0d00200a1027210c0c010b2003280244200c200a1028210c0b200c450d022003200a3602482003200c360244200328024c210a0b2003200a41016a36024c200c200a6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280248210c200328024c210a200d210d0c010b0b0240024020062008470d00200821040c010b2008210a0340200a41086a2104200a2902002214422088a7220a41ff01714104460d01200a41187441187521052014a7210c0340024002402003280248200328024c220a460d002003280244210d0c010b200a41016a220d200a490d1b200a410174220b200d200d200b491b220b4100480d1b02400240200a0d00200b1027210d0c010b2003280244200a200b1028210d0b200d450d052003200b3602482003200d360244200328024c210a0b2003200a41016a36024c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b024002402003280248200328024c220a460d002003280244210c0c010b200a41016a220c200a490d1a200a410174220d200c200c200d491b220d4100480d1a02400240200a0d00200d1027210c0c010b2003280244200a200d1028210c0b200c450d052003200d3602482003200c360244200328024c210a0b2003200a41016a36024c200c200a6a2005417f73220a413f7141c00072200a2005417f4a1b3a00002004210a20042006470d000b200621040b0240034020062004460d0120042d0004210a200441086a2104200a4104470d000b0b02402010450d00200810290b20132011410474220a6a210b024020110d002013210a0c050b201341186a210c200a41706a21042013210a0340200a2d0000210d2007200a41036a2d00003a00002003200a41016a2f00003b01080240200d41ac01470d00200a41106a210a0c060b200341306a41026a20072d000022053a0000200320032f010822063b0130200a41046a2902002114200a410c6a2802002108200220063b0000200241026a20053a00002003200d3a0008200320083602142003201437020c200341d0006a200341086a200341c0006a10e80320032d00502205411a46220d450d04200c41106a210c200441706a2104200a41106a220a200b470d000c060b0b200a4101102a000b200b4101102a000b200d4101102a000b20032d0053210820032f00512111200328025421062003290358211402402004450d00034002400240200c41786a220a2d000022044109460d00200441ac01470d010c030b200c28020041ffffffff0371450d00200a41046a28020010290b200c41106a210c200a41106a200b470d000b0b02402012450d00201310290b02402003280248450d00200328024410290b200d450d062009210a2009200f470d020c080b200a200b460d00034002400240200a2d0000220c4109460d00200c41ac01470d010c030b200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a220a200b470d000b0b02402012450d00201310290b20032802482111200328024421132003280240210d200328024c2208210c0240034002400240200d41086a2205280200200d410c6a2204280200220a460d00200d280204210b0c010b200a41016a220b200a490d14200a4101742206200b200b2006491b22064100480d1402400240200a0d0020061027210b0c010b200d280204200a20061028210b0b200b450d02200d200b360204200520063602002004280200210a0b2004200a41016a360200200b200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b024002402005280200220c2004280200220a6b2008490d00200d280204210c0c010b200a20086a220b200a490d13200c410174220a200b200b200a491b220a4100480d1302400240200c0d00200a1027210c0c010b200d280204200c200a1028210c0b200c450d03200d200c3602042005200a3602002004280200210a0b2004200a20086a360200200c200a6a2013200810ce041a02402011450d00201310290b2009210a2009200f470d010c070b0b20064101102a000b200a4101102a000b200b4101102a000b200d4101102a000b02402009200f460d0003402009280200220c450d01200941146a280200210a200941106a280200210b200928020c210d02402009280204450d00200c10290b0240200a450d00200a410474210c200d210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200941186a21090240200b450d00200d10290b2009200f470d000b0b2008411074210a02402017450d00200e10290b2011200a72210a02402003280228450d00200328022410290b2000200a3b0001200020053a0000200041036a200a4110763a0000200041086a2014370000200041046a2006360000410021024101210d4101210c4101210b410121044101210541012106410121070c160b2009200f460d0003402009280200220c450d01200941146a280200210a200941106a280200210b200928020c210d02402009280204450d00200c10290b0240200a450d00200a410474210c200d210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200941186a21090240200b450d00200d10290b2009200f470d000b0b02402017450d00200e10290b20032802282108200328022421022003280220220441086a210b200441046a2105200328022c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d0e200a4101742206200d200d2006491b22064100480d0e02400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d0d200c410174220a200d200d200a491b220a4100480d0d02400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002102410121074101210c4101210d4101210b4101210841012109410121044101210541012113410121060c220b20064101102a000b200a4101102a000b2001410c6a2802002105200141086a2802002113200141046a28020021090240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d12200a410174220d200c200c200d491b220d4100480d1202400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41093a0000200341dc006a4100360200200342013702542003200236025020092005411c6c6a21024100210a4100210c2005210d034002400240200a200c460d002003280254210a0c010b200a41016a220b200a490d13200a4101742204200b200b2004491b220b4100480d1302400240200a0d00200b1027210a0c010b2003280254200a200b1028210a0b200a450d032003200b3602582003200a3602540b2003200c41016a36025c200a200c6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280258210a200328025c210c200d210d0c010b0b200921062005450d062009210a0340200a411c6a2106200a2802042205450d07200a41186a2802002104200a41146a2802002108200a41086a2902002114200a2802102107200a280200210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d14200a410174220b200d200d200b491b220b4100480d1402400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d052003200b3602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b2003201437024420032005360240200341086a200341c0006a200341d0006a10de03024020032d0008220d411a470d00200720044102746a21052004210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d15200a410174220b200d200d200b491b220b4100480d1502400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d072003200b3602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02402004450d002007210403402004280200210c0340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d17200a410174220b200d200d200b491b220b4100480d1702400240200a0d00200b1027210d0c010b2003280254200a200b1028210d0b200d450d0a2003200b3602582003200d360254200328025c210a0b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b200441046a22042005470d000b0b02402008450d00200710290b2006210a20062002470d010c090b0b20032d000b211220032f0009211020032903102114200328020c21112008450d05200710290c050b200d4101102a000b200b4101102a000b200b4101102a000b200b4101102a000b200b4101102a000b024020062002460d0003402006280204220b450d01200641146a2802002104200641086a28020021052006280210210702402006410c6a280200220a450d00200a410474210c200b210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b02402005450d00200b10290b2006411c6a210602402004450d00200710290b20062002470d000b0b2012411074210a02402013450d00200910290b2010200a72210a02402003280258450d00200328025410290b2000200a3b00012000200d3a0000200041036a200a4110763a0000200041086a2014370000200041046a2011360000410021074101210d4101210c4101210b4101210441012105410121060c140b20062002460d0003402006280204220d450d01200641146a280200210b200641086a28020021042006280210210502402006410c6a280200220a450d00200a410474210c200d210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b02402004450d00200d10290b2006411c6a21060240200b450d00200510290b20062002470d000b0b02402013450d00200910290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d0d200a4101742206200d200d2006491b22064100480d0d02400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d0c200c410174220a200d200d200a491b220a4100480d0c02400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002106410121074101210c4101210d4101210b41012108410121094101210441012105410121130c200b20064101102a000b200a4101102a000b200141046a280200210a0240024002400240024002400240200241046a280200200241086a280200220c460d002002280200210d0c010b200c41016a220d200c490d0e200c410174220b200d200d200b491b220b4100480d0e02400240200c0d00200b1027210d0c010b2002280200200c200b1028210d0b200d450d012002200d360200200241046a200b360200200241086a280200210c0b200241086a200c41016a360200200d200c6a41083a0000410121064100210b4100210c03400240200c200b470d00200b410174220d200b41016a22042004200d491b220d4100480d0f02400240200b0d00200d102721060c010b2006200b200d102821060b2006450d05200d210b0b2006200c6a200a41807f72200a41ff0071200a410776220d1b3a0000200c41016a210c200d210a200d0d000b200c417f6a2109200241086a2105200241046a2107200c210d03400240024020072802002005280200220a460d00200228020021040c010b200a41016a2204200a490d0f200a4101742208200420042008491b22084100480d0f02400240200a0d002008102721040c010b2002280200200a2008102821040b2004450d0320022004360200200720083602002005280200210a0b2005200a41016a3602002004200a6a200d41807f72200d41ff0071200d410776220a1b3a0000200a210d200a0d000b02400240200241046a280200220d200241086a280200220a6b20094d0d002002280200210d0c010b200a200c6a2204200a490d0e200d410174220a20042004200a491b220a4100480d0e02400240200d0d00200a1027210d0c010b2002280200200d200a1028210d0b200d450d032002200d360200200241046a200a360200200241086a280200210a0b200241086a200a200c6a360200200d200a6a2006200c10ce041a41012107200b450d04200610290c040b200b4101102a000b20084101102a000b200a4101102a000b200d4101102a000b4101210c4101210d0c160b2001410c6a2802002109200141086a2802002113200141046a280200210802400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d0e200a410174220d200c200c200d491b220d4100480d0e02400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41073a0000200341dc006a410036020020034201370254200320023602502008200941146c6a2107410121044100210d4100210a2009210c03400240200a200d470d00200d41016a220b200d490d0f200d4101742205200b200b2005491b220b4100480d0f02400240200d0d00200b102721040c010b2004200d200b102821040b2004450d032003200b36025820032004360254200b210d0b2003200a41016a220536025c2004200a6a200c41807f72200c41ff0071200c410776220b1b3a00002005210a200b210c200b0d000b200821062009450d042008210a0340200a41146a2106200a28020c22054104460d05200a41106a280200210c200a29020021142003200a28020836024820032014370340200341086a200341c0006a200341d0006a10ed0320032d0008220a411a470d04024002402003280258220d200328025c220b460d00200328025421040c010b200b41016a220a200b490d0f200b410174220d200a200a200d491b220d4100480d0f02400240200b0d00200d102721040c010b2003280254200b200d102821040b2004450d042003200d360258200320043602540b2003200b41016a220a36025c2004200b6a20053a0000024003400240200a200d470d00200d41016a220b200d490d11200d4101742205200b200b2005491b220b4100480d1102400240200d0d00200b102721040c010b2004200d200b102821040b2004450d02200b210d0b2004200a6a200c41807f72200c41ff0071200c410776220b1b3a0000200a41016a210a200b210c200b0d000b2003200d3602582003200a36025c200320043602542006210a20062007470d010c070b0b200b4101102a000b200d4101102a000b200b4101102a000b200d4101102a000b20032d000b210c20032f0009210d20032903102114200328020c210b024020062007460d0003402006410c6a2802004104460d010240200641046a280200450d00200628020010290b200641146a22062007470d000b0b200c411074210c02402013450d00200810290b200d200c72210c02402003280258450d00200328025410290b2000200c3b00012000200a3a0000200041036a200c4110763a0000200041086a2014370000200041046a200b360000410021064101210d4101210c4101210b41012104410121050c110b20062007460d0003402006410c6a2802004104460d010240200641046a280200450d00200628020010290b200641146a22062007470d000b0b02402013450d00200810290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d0b200a4101742206200d200d2006491b22064100480d0b02400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d0a200c410174220a200d200d200a491b220a4100480d0a02400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002113410121074101210c4101210d4101210b410121084101210941012104410121050c1d0b20064101102a000b200a4101102a000b2001410c6a2802002109200141086a2802002113200141046a2802002108024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d0e200a410174220d200c200c200d491b220d4100480d0e02400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41063a0000200341dc006a41003602002003420137025420032002360250200820094104746a21054100210a4100210c2009210d034002400240200a200c460d002003280254210a0c010b200a41016a220b200a490d0f200a4101742204200b200b2004491b220b4100480d0f02400240200a0d00200b1027210a0c010b2003280254200a200b1028210a0b200a450d032003200b3602582003200a3602540b2003200c41016a36025c200a200c6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280258210a200328025c210c200d210d0c010b0b2008210d2009450d054100210d0340200341086a41086a220a2008200d6a220c41086a2802003602002003200c2902003703080240200c410d6a2d000022044102470d00200c41106a210d0c070b200341306a41086a200a280200220a360200200320032903082214370330200c410c6a2d00002106200341206a41086a2207200a36020020032014370320024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0f200a4101742202200b200b2002491b22024100480d0f02400240200a0d0020021027210b0c010b2003280254200a20021028210b0b200b450d04200320023602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a41fdf9ff77200641037441187141107376413f7141c000723a0000024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0f200a4101742206200b200b2006491b22064100480d0f02400240200a0d0020061027210b0c010b2003280254200a20061028210b0b200b450d05200320063602582003200b360254200328025c210a0b2003200a41016a36025c200b200a6a20044100473a0000200341c0006a41086a200728020036020020032003290320370340200341086a200341c0006a200341d0006a10de0320032d0008220b411a470d05200d41106a210d200c41106a2005470d000c070b0b200d4101102a000b200b4101102a000b20024101102a000b20064101102a000b20032d000b210720032f00092102200328020c2111200329031021140240200941047441706a200d460d00200c41106a210d0340200d410d6a2d00004102460d01200d2802042106200d28020021040240200d280208220a450d00200a410474210c2004210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41106a210d02402006450d00200410290b200d2005470d000b0b2007411074210a02402013450d00200810290b2002200a72210a02402003280258450d00200328025410290b2000200a3b00012000200b3a0000200041036a200a4110763a0000200041086a2014370000200041046a2011360000410021054101210d4101210c4101210b410121040c0f0b200d2005460d000340200d410d6a2d00004102460d01200d2802042104200d280200210b0240200d280208220a450d00200a410474210c200b210a03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41106a210d02402004450d00200b10290b200d2005470d000b0b02402013450d00200810290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d0a200a4101742206200d200d2006491b22064100480d0a02400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d09200c410174220a200d200d200a491b220a4100480d0902400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002105410121074101210c4101210d4101210b4101210841012109410121040c1b0b20064101102a000b200a4101102a000b2001410c6a2802002107200141086a2802002108200141046a280200210602400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d09200a410174220d200c200c200d491b220d4100480d0902400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41053a0000200341d0006a410c6a4100360200200342013702542003200236025020062007410c6c6a2102410121044100210d4100210a2007210c03400240200a200d470d00200d41016a220b200d490d0a200d4101742205200b200b2005491b220b4100480d0a02400240200d0d00200b102721040c010b2004200d200b102821040b2004450d032003200b36025820032004360254200b210d0b2003200a41016a220536025c2004200a6a200c41807f72200c41ff0071200c410776220b1b3a00002005210a200b210c200b0d000b2006210a2007450d022007410c6c210b4100210c034002402006200c6a220a41046a280200220d4102470d00200a410c6a210a0c040b200341086a200a280200200d200a41086a280200200341d0006a10eb03024020032d00082204411a460d0020032f000920032d000b41107472210520032903102114200328020c2107200a410c6a210d200b200c6b41746a210a02400340200a450d01200a41746a210a200d280204210c200d410c6a210d200c4102470d000b0b02402008450d00200610290b02402003280258450d00200328025410290b200020053b0001200020043a0000200041036a20054110763a0000200041086a2014370000200041046a2007360000410021044101210d4101210c4101210b0c100b200b200c410c6a220c470d000b2002210a0c020b200d4101102a000b200b4101102a000b200a410020076b410c6c6a210c024003402006200c460d01200c410c6a210c200a280204210d200a410c6a210a200d4102470d000b0b02402008450d00200610290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d09200a4101742206200d200d2006491b22064100480d0902400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d08200c410174220a200d200d200a491b220a4100480d0802400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002104410121074101210c4101210d4101210b41012108410121090c190b20064101102a000b200a4101102a000b2001410c6a2802002109200141086a2802002113200141046a2802002106024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d09200a410174220d200c200c200d491b220d4100480d0902400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41043a0000200341d0006a410c6a4100360200200342013702542003200236025020062009410c6c6a2111410121044100210d4100210a2009210c03400240200a200d470d00200d41016a220b200d490d0a200d4101742205200b200b2005491b220b4100480d0a02400240200d0d00200b102721040c010b2004200d200b102821040b2004450d032003200b36025820032004360254200b210d0b2003200a41016a220536025c2004200a6a200c41807f72200c41ff0071200c410776220b1b3a00002005210a200b210c200b0d000b2006210a2009450d032009410c6c21084100210d034002402006200d6a220c41046a28020022044102470d00200c410c6a210a0c050b200c2802002105200c41086a2802002107024002402003280258200328025c220a460d002003280254210b0c010b200a41016a220b200a490d0a200a4101742202200b200b2002491b22024100480d0a02400240200a0d0020021027210b0c010b2003280254200a20021028210b0b200b450d04200320023602582003200b3602540b2003200a41016a36025c200b200a6a41f0003a0000200341086a200520042007200341d0006a10eb03024020032d0008220b411a460d0020032f000920032d000b41107472210420032903102114200328020c2105200c410c6a210c2008200d6b41746a210a02400340200a450d01200a41746a210a200c280204210d200c410c6a210c200d4102470d000b0b02402013450d00200610290b02402003280258450d00200328025410290b200020043b00012000200b3a0000200041036a20044110763a0000200041086a2014370000200041046a20053600004100210b4101210d4101210c0c0f0b2008200d410c6a220d470d000b2011210a0c030b200d4101102a000b200b4101102a000b20024101102a000b200a410020096b410c6c6a210c024003402006200c460d01200c410c6a210c200a280204210d200a410c6a210a200d4102470d000b0b02402013450d00200610290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d08200a4101742206200d200d2006491b22064100480d0802400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d07200c410174220a200d200d200a491b220a4100480d0702400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b41002109410121074101210c4101210d4101210b410121080c170b20064101102a000b200a4101102a000b2001410c6a2802002106200141086a2802002109200141046a280200210802400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d0a200a410174220d200c200c200d491b220d4100480d0a02400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41033a0000200820064102746a21074100210d4100210a41002105410121042006210c03400240200a2005470d00200d200a41016a220b200b200d491b22054100480d0b02400240200d0d002005102721040c010b2004200a2005102821040b2004450d050b2004200a6a200c41807f72200c41ff0071200c410776220b1b3a0000200d41026a210d200a41016a210a200b210c200b0d000b02402006450d00200821060340200a410174210d2006280200210c03400240200a2005470d00200a41016a220b200a490d0d200d200b200b200d491b22054100480d0d02400240200a0d002005102721040c010b2004200a2005102821040b2004450d080b2004200a6a200c41807f72200c41ff0071200c410776220b1b3a0000200d41026a210d200a41016a210a200b210c200b0d000b200641046a22062007470d000b0b02402009450d00200810290b200241086a2106200241046a2107200a210d03400240024020072802002006280200220c460d002002280200210b0c010b200c41016a220b200c490d0b200c4101742208200b200b2008491b22084100480d0b02400240200c0d0020081027210b0c010b2002280200200c20081028210b0b200b450d032002200b360200200720083602002006280200210c0b2006200c41016a360200200b200c6a200d41807f72200d41ff0071200d410776220c1b3a0000200c210d200c0d000b02400240200241046a280200220d200241086a280200220c6b200a490d002002280200210d0c010b200c200a6a220b200c490d0a200d410174220c200b200b200c491b220c4100480d0a02400240200d0d00200c1027210d0c010b2002280200200d200c1028210d0b200d450d032002200d360200200241046a200c360200200241086a280200210c0b200241086a200c200a6a360200200d200c6a2004200a10ce041a41002108410121072005450d05200410290c050b200d4101102a000b20084101102a000b200c4101102a000b20054101102a000b20054101102a000b4101210c4101210d4101210b0c130b2001410c6a2802002106200141086a2802002111200141046a28020021130240024002400240024002400240024002400240024002400240024002400240200241046a280200200241086a280200220a460d002002280200210c0c010b200a41016a220c200a490d11200a410174220d200c200c200d491b220d4100480d1102400240200a0d00200d1027210c0c010b2002280200200a200d1028210c0b200c450d012002200c360200200241046a200d360200200241086a280200210a0b200241086a200a41016a360200200c200a6a41023a0000200341dc006a410036020020034201370254200320023602502013200641286c6a21054100210a4100210c2006210d034002400240200a200c460d002003280254210a0c010b200a41016a220b200a490d12200a4101742204200b200b2004491b220b4100480d1202400240200a0d00200b1027210a0c010b2003280254200a200b1028210a0b200a450d032003200b3602582003200a3602540b2003200c41016a36025c200a200c6a200d41807f72200d41ff0071200d410776220d1b3a00000240200d450d002003280258210a200328025c210c200d210d0c010b0b2013210b2006450d0c2013210b0340200341086a41086a220d200b220a41086a2802003602002003200a290200370308200a41286a210b200a2d001822074104460d0d200a411b6a2d00002108200a41196a2f00002109200a41206a2900002114200a411c6a280000210c200a41146a2802002102200a41106a2802002104200a28020c2106200341206a41086a200d280200220a360200200320032903082218370320200341c0006a41086a200a36020020032018370340200341086a200341c0006a200341d0006a10ed03024020032d0008220a411a460d0020032f000920032d000b41107472210720032903102114200328020c21022004450d0d200610290c0d0b200320023602482003200436024420032006360240200341086a200341c0006a200341d0006a10ed03024020032d0008220a411a460d0020032f000920032d000b411074722107200328020c2102200329031021140c0d0b2014422088a7210a2014a7210d0240024002400240024020070e0400010203000b024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d16200a4101742204200d200d2004491b22044100480d1602400240200a0d0020041027210d0c010b2003280254200a20041028210d0b200d450d08200320043602582003200d3602540b2003200a41016a36025c200d200a6a41003a00000340024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d17200a4101742204200d200d2004491b22044100480d1702400240200a0d0020041027210d0c010b2003280254200a20041028210d0b200d450d0a200320043602582003200d3602540b2003200a41016a36025c200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000c040b0b024002402003280258200328025c2204460d00200328025421060c010b200441016a22062004490d1520044101742207200620062007491b22074100480d150240024020040d002007102721060c010b200328025420042007102821060b2006450d0920032007360258200320063602540b2003200441016a36025c200620046a41013a0000024002402003280258200328025c2204460d00200328025421060c010b200441016a22062004490d1520044101742207200620062007491b22074100480d150240024020040d002007102721060c010b200328025420042007102821060b2006450d0a20032007360258200320063602540b2003200441016a36025c200620046a41f0003a0000200341086a200c200d200a200341d0006a10eb0320032d0008220a411a460d0220032f000920032d000b4110747221070c0e0b024002402003280258200328025c2204460d00200328025421060c010b200441016a22062004490d1420044101742207200620062007491b22074100480d140240024020040d002007102721060c010b200328025420042007102821060b2006450d0a20032007360258200320063602540b2003200441016a36025c200620046a41023a0000200341086a200c200d200a200341d0006a10eb0320032d0008220a411a460d0120032f000920032d000b4110747221070c0d0b024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d13200a410174220d200c200c200d491b220d4100480d1302400240200a0d00200d1027210c0c010b2003280254200a200d1028210c0b200c450d0a2003200d3602582003200c3602540b2003200a41016a36025c200c200a6a41033a0000024002402003280258200328025c220a460d002003280254210c0c010b200a41016a220c200a490d13200a410174220d200c200c200d491b220d4100480d1302400240200a0d00200d1027210c0c010b2003280254200a200d1028210c0b200c450d0b2003200d3602582003200c3602540b2003200a41016a36025c200c200a6a2009200841107472220c417f73220a413f7141c00072200a200c411874411875417f4a1b3a0000024002402003280258200328025c220a460d002003280254210d0c010b200a41016a220d200a490d13200a4101742204200d200d2004491b22044100480d1302400240200a0d0020041027210d0c010b2003280254200a20041028210d0b200d450d0c200320043602582003200d3602540b2003200a41016a36025c200d200a6a200c4180fe03714100473a00000b200b2005470d000c0e0b0b200d4101102a000b200b4101102a000b20044101102a000b20044101102a000b20074101102a000b20074101102a000b20074101102a000b200d4101102a000b200d4101102a000b20044101102a000b20032903102114200328020c21020b0240200b2005460d000340200b41186a2d00004104460d01200b41106a280200210c200b410c6a280200210d0240200b41046a280200450d00200b28020010290b0240200c450d00200d10290b200b41286a220b2005470d000b0b02402011450d00201310290b02402003280258450d00200328025410290b200020073b00012000200a3a0000200041036a20074110763a0000200041086a2014370000200041046a20023600004100210c4101210d0c080b200b2005460d000340200b41186a2d00004104460d01200b41106a280200210a200b410c6a280200210c0240200b41046a280200450d00200b28020010290b0240200a450d00200c10290b200b41286a220b2005470d000b0b02402011450d00201310290b20032802582108200328025421022003280250220441086a210b200441046a2105200328025c2207210c024002400340024002402005280200200b280200220a460d002004280200210d0c010b200a41016a220d200a490d06200a4101742206200d200d2006491b22064100480d0602400240200a0d0020061027210d0c010b2004280200200a20061028210d0b200d450d022004200d36020020052006360200200b280200210a0b200b200a41016a360200200d200a6a200c41807f72200c41ff0071200c410776220a1b3a0000200a210c200a0d000b02400240200441046a280200220c200441086a280200220a6b2007490d002004280200210c0c010b200a20076a220d200a490d05200c410174220a200d200d200a491b220a4100480d0502400240200c0d00200a1027210c0c010b2004280200200c200a1028210c0b200c450d022004200c360200200441046a200a360200200441086a280200210a0b200441086a200a20076a360200200c200a6a2002200710ce041a02402008450d00200210290b4100210b410121074101210c4101210d0c130b20064101102a000b200a4101102a000b20082010460d0003402008410d6a2d00004105460d010240200841046a280200450d00200828020010290b200841106a22082010470d000b0b0240200e450d00200f10290b200241086a2106200241046a2107200c210d0240024003400240024020072802002006280200220a460d002002280200210b0c010b200a41016a220b200a490d04200a4101742208200b200b2008491b22084100480d0402400240200a0d0020081027210b0c010b2002280200200a20081028210b0b200b450d022002200b360200200720083602002006280200210a0b2006200a41016a360200200b200a6a200d41807f72200d41ff0071200d410776220a1b3a0000200a210d200a0d000b02400240200241046a280200220d200241086a280200220a6b200c490d002002280200210d0c010b200a200c6a220b200a490d03200d410174220a200b200b200a491b220a4100480d0302400240200d0d00200a1027210d0c010b2002280200200d200a1028210d0b200d450d022002200d360200200241046a200a360200200241086a280200210a0b200241086a200a200c6a360200200d200a6a2004200c10ce041a4100210d410121072005450d03200410290c030b20084101102a000b200a4101102a000b102b000b4101210c0c0c0b2000200c3b00012000200a3a0000200041036a200c4110763a0000200041086a2014370000200041046a2004360000410021134101210d4101210c4101210b410121044101210541012106410121074101210241012108410121090c090b4101210c200241086a200a41016a3602004100210d200b200a6a41003a00002003411c6a2004360200200341186a200536020020032006360214200320073602102003200836020c20032009360208200341d0006a200341086a200210f103200320032900513703402003200341d0006a41086a29000037004720032d0050220a411a460d092000200a3a000020002003290340370001200041086a20032900473700000b4101210b0b410121040b410121050b410121060b410121070b410121020b410121080b41012109410121130b20012d0000220a410e4b0d18200a0e0f0a0b0c0d0e0f1011121813141516170a0b4101210c410021074101210d0b4101210b0b410121080b410121090b410121040b410121050b410121130b410121060b410121020b41012111410121120c0f0b200141086a280200450d10200141046a28020010290c100b200d450d0f0240200141086a280200450d00200141046a28020010290b200141146a280200450d0f200141106a28020010290c0f0b02402001410c6a280200220c450d00200141046a280200210a200c410474210c03400240200a41046a280200450d00200a28020010290b200a41106a210a200c41706a220c0d000b0b200141086a280200450d0e200128020410290c0e0b200c450d0d02402001410c6a280200220c450d00200141046a280200210a200c41286c210c03400240200a41046a280200450d00200a28020010290b0240200a41106a280200450d00200a410c6a28020010290b200a41286a210a200c41586a220c0d000b0b200141086a280200450d0d200128020410290c0d0b200141086a280200450d0c200141046a28020010290c0c0b200b450d0b200141086a280200450d0b200141046a28020010290c0b0b2004450d0a200141086a280200450d0a200141046a28020010290c0a0b2005450d0902402001410c6a280200220a450d00200141046a280200220d200a4104746a210b03400240200d280208220c450d00200d280200210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41106a210a0240200d41046a280200450d00200d28020010290b200a210d200a200b470d000b0b200141086a280200450d09200128020410290c090b2006450d0802402001410c6a280200220c450d00200141046a280200210a200c41146c210c03400240200a41046a280200450d00200a28020010290b200a41146a210a200c416c6a220c0d000b0b200141086a280200450d08200128020410290c080b2007450d0702402001410c6a280200220a450d00200141046a280200220d200a411c6c6a210b03400240200d410c6a280200220c450d00200d280204210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b0240200d41086a280200450d00200d28020410290b200d411c6a210a0240200d41146a280200450d00200d28021010290b200a210d200a200b470d000b0b200141086a280200450d07200128020410290c070b2002450d0602402001410c6a280200220a450d00200141046a280200220d200a41186c6a210b03400240200d41046a280200450d00200d28020010290b0240200d41146a280200220c450d00200d28020c210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41186a210a0240200d41106a280200450d00200d28020c10290b200a210d200a200b470d000b0b200141086a280200450d06200128020410290c060b2008450d0502402001410c6a280200220a450d00200141046a280200220d200a411c6c6a210b03400240200d410c6a280200220c450d00200d280204210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b0240200d41086a280200450d00200d28020410290b200d411c6a210a0240200d41146a280200450d00200d28021010290b200a210d200a200b470d000b0b200141086a280200450d05200128020410290c050b2009450d040240200141046a2d0000220a41024b0d00024002400240200a0e03000102000b2001410c6a280200450d07200141086a28020010290c070b0240200141146a280200220c450d002001410c6a280200210a200c410c6c210c03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b200141106a280200450d06200128020c10290c060b0240200141146a280200220a450d002001410c6a2802002204200a4104746a210503402004220b41106a21040240200b280204220a450d000240200b410c6a280200220c450d00200c410c6c210c03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b200b41086a280200450d00200b28020410290b20042005470d000b0b200141106a280200450d05200128020c10290c050b2001410c6a280200450d04200141086a28020010290c040b2013450d030240200141086a280200450d00200141046a28020010290b0240200141146a280200220a450d00200141186a280200450d00200a10290b200141246a280200450d03200141206a28020010290c030b20011088030c020b410121100b2000411a3a0000024020012d0000220a410e4b0d0002400240024002400240024002400240024002400240024002400240200a0e0f0001020304050607080e090a0b0c0d000b200c450d0e200141086a280200450d0e200141046a28020010290c0e0b2007450d0d0240200141086a280200450d00200141046a28020010290b200141146a280200450d0d200141106a28020010290c0d0b200d450d0c02402001410c6a280200220c450d00200141046a280200210a200c410474210c03400240200a41046a280200450d00200a28020010290b200a41106a210a200c41706a220c0d000b0b200141086a280200450d0c200128020410290c0c0b200b450d0b02402001410c6a280200220c450d00200141046a280200210a200c41286c210c03400240200a41046a280200450d00200a28020010290b0240200a41106a280200450d00200a410c6a28020010290b200a41286a210a200c41586a220c0d000b0b200141086a280200450d0b200128020410290c0b0b2008450d0a200141086a280200450d0a200141046a28020010290c0a0b2009450d09200141086a280200450d09200141046a28020010290c090b2004450d08200141086a280200450d08200141046a28020010290c080b2005450d0702402001410c6a280200220a450d00200141046a280200220d200a4104746a210b03400240200d280208220c450d00200d280200210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41106a210a0240200d41046a280200450d00200d28020010290b200a210d200a200b470d000b0b200141086a280200450d07200128020410290c070b2013450d0602402001410c6a280200220c450d00200141046a280200210a200c41146c210c03400240200a41046a280200450d00200a28020010290b200a41146a210a200c416c6a220c0d000b0b200141086a280200450d06200128020410290c060b2006450d0502402001410c6a280200220a450d00200141046a280200220d200a411c6c6a210b03400240200d410c6a280200220c450d00200d280204210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b0240200d41086a280200450d00200d28020410290b200d411c6a210a0240200d41146a280200450d00200d28021010290b200a210d200a200b470d000b0b200141086a280200450d05200128020410290c050b2002450d0402402001410c6a280200220a450d00200141046a280200220d200a41186c6a210b03400240200d41046a280200450d00200d28020010290b0240200d41146a280200220c450d00200d28020c210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b200d41186a210a0240200d41106a280200450d00200d28020c10290b200a210d200a200b470d000b0b200141086a280200450d04200128020410290c040b2011450d0302402001410c6a280200220a450d00200141046a280200220d200a411c6c6a210b03400240200d410c6a280200220c450d00200d280204210a200c410474210c03400240200a2d00004109470d00200a41086a28020041ffffffff0371450d00200a41046a28020010290b200a41106a210a200c41706a220c0d000b0b0240200d41086a280200450d00200d28020410290b200d411c6a210a0240200d41146a280200450d00200d28021010290b200a210d200a200b470d000b0b200141086a280200450d03200128020410290c030b2012450d020240200141046a2d0000220a41024b0d00024002400240200a0e03000102000b2001410c6a280200450d05200141086a28020010290c050b0240200141146a280200220c450d002001410c6a280200210a200c410c6c210c03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b200141106a280200450d04200128020c10290c040b0240200141146a280200220a450d002001410c6a2802002204200a4104746a210503402004220b41106a21040240200b280204220a450d000240200b410c6a280200220c450d00200c410c6c210c03400240200a280200220d450d00200a41046a280200450d00200d10290b200a410c6a210a200c41746a220c0d000b0b200b41086a280200450d00200b28020410290b20042005470d000b0b200141106a280200450d03200128020c10290c030b2001410c6a280200450d02200141086a28020010290c020b2010450d010240200141086a280200450d00200141046a28020010290b0240200141146a280200220a450d00200141186a280200450d00200a10290b200141246a280200450d01200141206a28020010290c010b20011088030b200341e0006a24000b13002000410136020420004198f8c2003602000b3400200041f7fbc20036020420004100360200200041146a4102360200200041106a4180fcc200360200200041086a42093702000b2f01017f02404101102722020d0041014101102a000b200042818080801037020420002002360200200241003a00000b130020004101360204200041b4fec2003602000b3101017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242b9063700000b130020004101360204200041d881c3003602000b3400200041e182c30036020420004100360200200041146a4103360200200041106a41ec82c300360200200041086a420a3702000bb00a02067f017e230041106b220324002003200136020c2003410c6a200210300240024002400240024002400240024002402001450d00200141c8006c2104200241086a2101200241046a210503400240024020002d00004101460d0002400240200528020020012802002206460d00200228020021070c010b200641016a22072006490d0c20064101742208200720072008491b22084100480d0c0240024020060d002008102721070c010b200228020020062008102821070b2007450d052002200736020020052008360200200128020021060b2001200641016a360200200720066a41003a0000200041086a29030021090240024020052802002207200128020022066b4108490d00200228020021070c010b200641086a22082006490d0c20074101742206200820082006491b22064100480d0c0240024020070d002006102721070c010b200228020020072006102821070b2007450d062002200736020020052006360200200128020021060b2001200641086a360200200720066a20093700000c010b02400240200528020020012802002206460d00200228020021070c010b200641016a22072006490d0b20064101742208200720072008491b22084100480d0b0240024020060d002008102721070c010b200228020020062008102821070b2007450d062002200736020020052008360200200128020021060b2001200641016a360200200720066a41013a00000240024020052802002207200128020022066b4120490d00200228020021070c010b200641206a22082006490d0b20074101742206200820082006491b22064100480d0b0240024020070d002006102721070c010b200228020020072006102821070b2007450d072002200736020020052006360200200128020021060b2001200641206a360200200720066a220641186a200041196a290000370000200641106a200041116a290000370000200641086a200041096a2900003700002006200041016a2900003700000240200041216a2d00004101460d0002400240200528020020012802002206460d00200228020021070c010b200641016a22072006490d0c20064101742208200720072008491b22084100480d0c0240024020060d002008102721070c010b200228020020062008102821070b2007450d092002200736020020052008360200200128020021060b2001200641016a360200200720066a41003a00000c010b02400240200528020020012802002206460d00200228020021070c010b200641016a22072006490d0b20064101742208200720072008491b22084100480d0b0240024020060d002008102721070c010b200228020020062008102821070b2007450d092002200736020020052008360200200128020021060b2001200641016a360200200720066a41013a00000240024020052802002207200128020022066b4120490d00200228020021070c010b200641206a22082006490d0b20074101742206200820082006491b22064100480d0b0240024020070d002006102721070c010b200228020020072006102821070b2007450d0a2002200736020020052006360200200128020021060b2001200641206a360200200720066a220641186a200041226a220741186a290000370000200641106a200741106a290000370000200641086a200741086a290000370000200620072900003700000b200041c8006a2100200441b87f6a22040d000b0b200341106a24000f0b20084101102a000b20064101102a000b20084101102a000b20064101102a000b20084101102a000b20084101102a000b20064101102a000b102b000bf10703037f047e067f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042005370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a00102402008a741ff01714101460d0020004100360220200324000f0b200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a001370300024002400240411210272204450d00200441106a41002f00f6a2443b0000200441086a41002900eea244370000200441002900e6a24437000020044112413210282204450d0120042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41186a220a4200370300200241a0016a41106a220b4200370300200241a0016a41086a220c4200370300200242003703a00120044132200241a0016a100020024180016a41186a200a29030037030020024180016a41106a200b29030037030020024180016a41086a200c290300370300200220022903a00137038001200241003602a00120024180016a4120200241a0016a1005210b20022802a001220a417f460d022002200a3602ec012002200b3602e801200241f0016a200241e8016a102d0240024020022802f001220c450d00200241f8016a280200210d20022802f401210e200241206a200241e8016a10940320022d00204102470d01200e450d00200c10290b418f89c3004133104e000b200241a0016a200241206a41017241c10010ce041a200241206a200241a0016a41c30010ce041a0240200a450d00200b10290b200241a0016a200241206a41c30010ce041a200241206a200241a0016a41c10010ce041a200141246a200241e0006a2d00003a00002001411c6a200241d8006a290000370000200141146a200241d0006a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370000200041086a200241086a290300370000200041106a200241106a290300370000200041176a200241176a290000370000200041286a200d3602002000200e3602242000200c360220200020093a001f20041029200324000f0b41124101102a000b41324101102a000b41b6b7c30041d700104e000be90703067f017e027f230041a0016b22022400200241003a00800120024180016a2001280200220320012802042204410047220510ce041a024002400240024020042005490d002001200420056b22063602042001200320056a22053602000240024002402004450d0020022d008001220441014b0d00410021030240024020040e020100010b20024180016a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd041a20024180016a2005200410ce041a2001200620046b22073602042001200520046a22053602002006411f4d0d01200241c0006a41086a20024180016a41086a2900002208370300200241206a41186a20024180016a41186a290000370300200241206a41106a20024180016a41106a290000370300200241206a41086a2008370300200220022900800122083703402002200837032041012103200721060b200241186a200241206a41186a290300370300200241106a200241206a41106a290300370300200241086a200241206a41086a29030037030020022002290320370300200241003a00800120024180016a20052006410047220410ce041a20062004490d042001200620046b22073602042001200520046a22043602002006450d0520022d008001220541014b0d054100210620050e020201020b200041023a00000c050b20024180016a2007412020074120491b22056a41004100412020056b2005411f4b1b10cd041a20024180016a2004200510ce041a2001200720056b3602042001200420056a3602002007411f4d0d03200241c0006a41086a20024180016a41086a2900002208370300200241206a41186a20024180016a41186a290000370300200241206a41106a20024180016a41106a290000370300200241206a41086a20083703002002200229008001220837034020022008370320410121060b200241e0006a41186a2201200241206a41186a290300370300200241e0006a41106a2204200241206a41106a290300370300200241e0006a41086a2205200241206a41086a29030037030020024180016a41086a2207200241086a29030037030020024180016a41106a2209200241106a29030037030020024180016a41186a220a200241186a290300370300200220022903203703602002200229030037038001200020033a0000200041216a20063a00002000200229038001370001200041096a2007290300370000200041116a2009290300370000200041196a200a290300370000200041226a20022903603700002000412a6a2005290300370000200041326a20042903003700002000413a6a20012903003700000c030b20052004103e000b20042006103e000b200041023a00000b200241a0016a24000ba72207017f027e077f017e017f017e107f230041d0066b22032400200241d8006a2903002104200241d0006a290300210520022802002106200341c4006a200241046a41cc0010ce041a20034190016a200341c4006a41046a41c80010ce041a2001280200210720034190036a41186a2208200341c8016a29030037030020034190036a41106a2209200341c0016a29030037030020034190036a41086a220a200341b8016a290300370300200320032903b00137039003024002400240024041c80010272202450d002002420037030020022006360220200241186a4200370300200241106a4200370300200241086a42003703002002200341b0016a220b2902003702242002412c6a200b41086a290200370200200241346a200b41106a2902003702002002413c6a200b41186a290200370200200341286a41b18ac0004116108601200341186a2003290330200341286a41106a290300427f420010d404200341086a20052004200329031842002003280228220c1b220d4201200d420156200341186a41086a2903004200200c1b220d420052200d501b220c1b200d4200200c1b10d404200341e0026a41086a200a290300370300200341e0026a41106a2009290300370300200341e0026a41186a200829030037030020032003290390033703e0022003290308210d0240024002400240200741046a28020020072802082208460d00200728020021090c010b200841016a22092008490d012008410174220a20092009200a491b220aad42d0007e2204422088a70d012004a7220c4100480d010240024020080d00200c102721090c010b2007280200200841d0006c200c102821090b2009450d0220072009360200200741046a200a360200200728020821080b2009200841d0006c6a22084200370310200842003703082008200d37030020082002360220200820032903e00237022c200841186a4200370300200841246a428180808010370200200841346a200341e0026a41086a22022903003702002008413c6a200341e0026a41106a220a290300370200200841c4006a200341e0026a41186a22082903003702002007200728020841016a3602082001280208210c200341a0026a41186a200b41186a290000370300200341a0026a41106a200b41106a290000370300200341a0026a41086a200b41086a2900003703002003200b2900003703a002024002400240200c2802002201418883c000460d00200c28020421090c010b4100210920034190036a410041e00210cd041a20034188036a220b410036020020034180036a2207420037030020084200370300200a420037030020024200370300200342003703e00241940310272201450d01200141003b010620014100360200200141086a20034190036a41e00210ce041a20014190036a200b28020036020020014188036a200729030037020020014180036a200341f8026a290300370200200141f8026a200341f0026a290300370200200141f0026a200341e0026a41086a290300370200200120032903e0023702e802200c4100360204200c20013602000b02400340200141086a2108200141066a210e20012f0106220a41057421024100210b0240024003402002450d01200341a0026a2008412010d0042207450d02200241606a2102200b41016a210b200841206a21082007417f4a0d000b200b417f6a210a0b2009450d022009417f6a21092001200a4102746a4194036a28020021010c010b0b2001200b4102746a41e8026a20063602000c060b200341d8016a41186a200341a0026a41186a2202290300220d370300200341d8016a41106a200341a0026a41106a22082903002204370300200341d8016a41086a200341a0026a41086a220b2903002205370300200320032903a002220f3703d801200c200c28020841016a3602082002200d37030020082004370300200b20053703002003200f3703a0020240024002400240200e2f01002209410b490d0020034190036a410041e00210cd041a20034188036a2202410036020020034180036a22084200370300200341e0026a41186a4200370300200341e0026a41106a4200370300200341e0026a41086a4200370300200342003703e00241940310272210450d03201041003b010620104100360200201041086a20034190036a41e00210ce04210b20104190036a200228020036020020104188036a200829030037020020104180036a200341e0026a41186a290300370200201041f8026a200341e0026a41106a290300370200201041f0026a200341e0026a41086a290300370200201020032903e0023702e802200320012f00c8013b01dc022003200141ca016a2d00003a00de02200141cb016a2800002111200141cf016a2800002112200141d3016a2800002113200141d7016a28000021142003200141e0016a2900003700cd02200320012900db013703c8022001280280032115200b200141e8016a20012f010641796a220241057410ce04210b201041e8026a20014184036a200241027410ce042107200141063b0106201020023b0106200320032f01dc023b01c402200320032d00de023a00c602200320032903c8023703e002200320032900cd023700e502200a4107490d01201041066a210e200b200a417a6a22094105746a200b200a41796a22084105746a220b200241ffff037120086b41057410cf041a200b41186a200341a0026a41186a290300370000200b41106a200341a0026a41106a290300370000200b41086a200341a0026a41086a290300370000200b20032903a002370000200720094102746a210b200720084102746a21020c020b200141086a2207200a41016a220c4105746a2007200a4105746a22072009200a6b41057410cf041a200741186a2002290300370000200741106a2008290300370000200741086a200b290300370000200720032903a002370000200141e8026a2202200c4102746a2002200a4102746a220220012f0106200a6b41027410cf041a20022006360200200120012f010641016a3b01060c080b200141086a2202200a41016a22084105746a2002200a4105746a2202200e2f0100200a6b41057410cf041a200241186a200341a0026a41186a290300370000200241106a200341a0026a41106a290300370000200241086a200341a0026a41086a290300370000200220032903a002370000200141e8026a220b200a4102746a2102200b20084102746a210b200a21080b200b2002200e2f010020086b41027410cf041a20022006360200200e200e2f010041016a3b0100200341c0026a41026a221620032d00c60222023a00002003418c026a41026a221720023a0000200320032900e50237009502200320032903e00237039002200320032f01c40222023b01c00220032003290095023700fd0120032003290390023703f801200320023b018c0220012802002209450d0520012f0104210e20034190036a41027221180340201620172d00003a0000200320032f018c023b01c002200320032903f8013703a002200320032900fd013700a502200e41ffff037121010240024002400240024020092f01062202410b490d002018410041be0310cd041a41c40310272207450d0320074100360200200741046a20034190036a41c00310ce041a200320092f00c8013b01dc022003200941ca016a2d00003a00de022003200941db016a2900003703c8022003200941e0016a2900003700cd02200941cb016a2800002119200941cf016a280000211a200941d3016a280000211b200941d7016a280000211c20094180036a280200211d200741086a200941e8016a20092f0106220841796a220241057410ce04211e200741e8026a20094184036a200241027410ce04211f20074194036a200941b0036a2008417a6a220a41027410ce042106200941063b0106200720023b01060240200a450d00410021022006210803402008280200220b20023b0104200b2007360200200841046a2108200a200241016a2202470d000b0b200320032d00de0222023a00c602200320032f01dc0222083b01c402200320032903c8023703e002200320032900cd023700e50220034190026a41026a220a20023a0000200320083b019002200320032903e00237039003200320032900e50237009503200e41ffff037122084107490d01201e2001417a6a220b4105746a201e200141796a22024105746a220820072f010620026b41057410cf041a200841186a20032900a5023700002008201436000f2008201336000b2008201236000720082011360003200841026a20162d00003a0000200820032f01c0023b0000200820032903a002370013201f200b41027422086a201f20024102746a220e20072f0106221120026b41027410cf041a200e20153602002007201141016a220e3b01062001410274221120066a416c6a200620086a2208200e41ffff03712201200b6b41027410cf041a200820103602002001200b490d02200720116a41fc026a210803402008280200220b200241016a22023b0104200b2007360200200841046a210820022001490d000c030b0b200941086a2208200141016a220b4105746a200820014105746a2208200220016b41057410cf041a200841186a20032900a5023700002008201436000f2008201336000b2008201236000720082011360003200841026a200341c0026a41026a2d00003a0000200820032f01c0023b0000200820032903a002370013200941e8026a2202200b41027422086a2002200141027422076a220220092f0106220a20016b41027410cf041a200220153602002009200a41016a22023b0106200720094194036a22016a41086a200120086a2208200241ffff03712207200b6b41027410cf041a20082010360200200e41ffff037120074f0d0b2009200b417f6a22024102746a4198036a210803402008280200220b200241016a22023b0104200b2009360200200841046a210820022007490d000c0c0b0b200941086a2202200141016a220e4105746a200220014105746a220220092f010620016b41057410cf041a200241186a20032900a5023700002002201436000f2002201336000b2002201236000720022011360003200241026a20162d00003a0000200220032f01c0023b0000200220032903a002370013200941e8026a220b200e41027422066a200b200141027422026a220b20092f0106221120016b41027410cf041a200b20153602002009201141016a220b3b0106200220094194036a22116a41086a201120066a2206200b41ffff0371220b200e6b41027410cf041a200620103602002008200b4f0d00200920026a4198036a2102034020022802002208200141016a22013b010420082009360200200241046a2102200b2001470d000b0b2017200a2d00003a0000200320032f0190023b018c0220032003290390033703f80120032003290095033700fd01200928020022020d0120192111201c2114201b2113201a211220072110201d21150c080b41c4034104102a000b20092f0104210e20192111201c2114201b2113201a211220022109201d2115200721100c000b0b4194034104102a000b4194034104102a000b102b000b200c4108102a000b41c8004108102a000b20034190036a410272410041be0310cd041a41c40310272202450d0120024100360200200241046a20034190036a41c00310ce041a2002200c280200220836029403200c2002360200200c200c28020441016a360204200841003b010420082002360200200220022f0106220b4105746a220841086a20032f018c023b00002008410a6a2003418c026a41026a2d00003a0000200841176a2014360000200841136a20133600002008410f6a20123600002008410b6a20113600002008411b6a20032903f801370000200841206a20032900fd0137000020024194036a200b41016a22084102746a20103602002002200b4102746a41e8026a2015360200200220083b0106201020083b0104201020023602000b200020034190016a41c80010ce041a200341d0066a24000f0b41c4034104102a000bcc0b03087f017e037f230041306b22022400200241186a41086a220342003703002002420037031841cdf8c4004116200241186a1004200241086a41086a20032903003703002002200229031837030820024100360218200241086a4110200241186a100521030240024002400240024002400240024020022802182204417f460d002003450d002002200436022c20022003360228200241186a200241286a102d20022802182205450d02200241206a2802002106200228021c21072004450d01200310290c010b4101210541002106410021070b200520064105746a210820052103410021060240024003400240200820036b41e0004b0d0020032008460d03034020002003460d03200620032000412010d00422044100476a21062004450d032008200341206a2203470d000c040b0b20032000460d01200620032000412010d00422044100476a21062004450d01200341206a22042000460d01200620042000412010d00422044100476a21062004450d01200341c0006a22042000460d01200620042000412010d00422044100476a21062004450d01200341e0006a22042000460d01200620042000412010d00422044100476a210620034180016a210320040d000b0b200241186a41086a220342003703002002420037031841bec7c5004119200241186a1004200241086a41086a20032903003703002002200229031837030820024100360218200241086a4110200241186a1005210002400240024020022802182203417f460d002000450d00200220003602282002200336022c20024100360218200241186a20002003410420034104491b220410ce041a2002200320046b36022c2002200020046a3602280240200341034d0d0020022802182103200241186a200241286a1045200228021822090d020b418f89c3004133104e000b410421094100210041002108410021030c010b200229021c210a20001029200a422088a72100200aa721080b02400240200320016a220420034f0d002008210b200321040c010b02400240200020064d0d002008210b0c010b02400240200820006b200641016a2000200020064d1b220c20006b220d490d002008210b0c010b2000200d6a22032000490d092008410174220b20032003200b491b220b41ffffffff0371200b470d09200b41027422034100480d090240024020080d002003102721090c010b200920084102742003102821090b2009450d050b200920004102746a210302400240200d4102490d002000417f73200c6a2100034020034100360200200341046a21032000417f6a22000d000b200c417f6a21000c010b200d450d010b20034100360200200041016a21000b200020064d0d04200920064102746a2203200328020020016a3602000b200241186a41086a220342003703002002420037031841bec7c5004119200241186a1004200241086a41086a2003290300370300200220022903183703082002410036022020024201370318410410272203450d042003200436000020024284808080c00037021c2002200336021820022000360228200241286a200241186a10300240024020000d0020022802202101200228021c2108200228021821060c010b2000410274210d4100200228022022036b2100200228021c21082009210403402004280200210c02400240200820006a4104490d00200228021821060c010b200341046a22062003490d0920084101742201200620062001491b22014100480d090240024020080d002001102721060c010b200228021820082001102821060b2006450d082002200136021c20022006360218200121080b200441046a21042002200341046a2201360220200620036a200c3600002000417c6a210020012103200d417c6a220d0d000b0b200241086a411020062001100302402008450d00200610290b200b450d00200910290b02402007450d00200510290b200241306a24000f0b418f89c3004133104e000b20034104102a000b41e4f8c400200620001037000b41044101102a000b20014101102a000b102b000bde0605017f017e047f027e017f230041d0006b2201240042002102200141286a41086a220342003703002001420037032841aa8dc300410d200141286a1004200141186a41086a2003290300370300200120012903283703184100210320014100360228200141186a4110200141286a100521040240024002400240024020012802282205417f460d002001200536020c20012004360208200141286a200141086a104320012802282206450d02200129022c210202402005450d00200410290b2002422088a721032002a721050c010b41042106410021050b200141286a41206a200041206a280200360200200141286a41186a200041186a290200370300200141286a41106a200041106a290200370300200141286a41086a200041086a29020037030020012000290200370328024020032005470d00024020032002a7470d00200341016a22002003490d0420034101742205200020002005491bad220742247e2208422088a70d042008a722004100480d040240024020030d002000102721060c010b2006200341246c2000102821060b2006450d0320024280808080708320078421020b2002422088a721030b2006200341246c22096a22002001290328370200200041206a200141286a41206a280200360200200041186a200141286a41186a290300370200200041106a200141286a41106a290300370200200041086a200141286a41086a22002903003702002001200242ffffffff0f83200341016a2205ad4220868437020c20012006360208200042003703002001420037032841aa8dc300410d200141286a1004200141186a41086a2000290300370300200120012903283703182001411036022c2001200141186a360228200141086a200141286a105c2002a72104024020052003490d00200941246a21002006210303400240024020032d0000220541034b0d0002400240024020050e0404000102040b2003410c6a280200450d03200341086a28020010290c030b2003410c6a280200450d02200341086a28020010290c020b2003410c6a280200450d01200341086a28020010290c010b200341086a280200450d00200341046a28020010290b200341246a21032000415c6a22000d000b0b02402004450d00200610290b200141d0006a24000f0b418f89c3004133104e000b20004104102a000b102b000bd20601077f230041106b22022400024002400240024002400240024020002802704101460d0002400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0720034101742205200420042005491b22054100480d070240024020030d002005102721040c010b200128020020032005102821040b2004450d0320012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000280274210602400240200141046a2802002204200528020022036b4104490d00200128020021040c010b200341046a22052003490d0720044101742203200520052003491b22034100480d070240024020040d002003102721040c010b200128020020042003102821040b2004450d0420012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a20063600000c010b02400240200141046a280200200141086a2802002203460d00200128020021040c010b200341016a22042003490d0620034101742205200420042005491b22054100480d060240024020030d002005102721040c010b200128020020032005102821040b2004450d0420012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00000b20002001109d0220002802782103200220004180016a280200220036020c2002410c6a2001103002402000450d0020004105742106200141086a2105200141046a210703400240024020072802002204200528020022006b4120490d00200128020021040c010b200041206a22082000490d0720044101742200200820082000491b22004100480d070240024020040d002000102721040c010b200128020020042000102821040b2004450d062001200436020020072000360200200528020021000b2005200041206a360200200420006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000b0b200241106a24000f0b20054101102a000b20034101102a000b20054101102a000b20004101102a000b102b000be70101017f024020002d0000417b6a220141064b0d00024002400240024020010e0700040401020403000b200041086a2d00004101470d03200041146a280200450d03200041106a28020010290c030b200041046a2d00004103470d0202402000410c6a280200450d00200041086a28020010290b200041186a280200450d02200041146a28020010290c020b200041046a2802000d012000410c6a280200450d01200041086a28020010290c010b200041086a2d00004105490d00200041306a280200450d002000412c6a28020010290b0240200041fc006a280200450d00200028027810290b0b130020004106360204200041f890c3003602000b34002000418d97c30036020420004100360200200041146a410f360200200041106a419497c300360200200041086a42063702000b950101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120102722060d0041204101102a000b20062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000b7401027f230041106b22022400200241003602082002420137030002404101102722030d0041014101102a000b200341003a00002002428180808010370204200220033602002002410036020c2002410c6a20021030200041086a200228020836020020002002290300370200200241106a24000b130020004100360204200041b8d6c5003602000b980104037f017e017f017e230041106b220224002002410036020c200141102002410c6a10052103024002400240200228020c2204417f470d00420021050c010b20024200370300200220032004410820044108491b10ce042106200441074d0d01200629030021072003102920014110100c420121050b2000200537030020002007370308200241106a24000f0b418f89c3004133104e000b0a0041c88ac3001058000b0a0041b88bc3001058000bf30c020b7f067e23004180016b22082400024002400240024002400240200728021c41016a220941004c0d002007411c6a210a2007200936021c200741246a280200210b200741206a220c210d024002400340200d280200220e41086a210f200e2f01062210410574210d41002111024002400340200d450d012004200f412010d0042212450d02200d41606a210d201141016a2111200f41206a210f2012417f4a0d000b2011417f6a21100b200b450d02200b417f6a210b200e20104102746a41880b6a210d0c010b0b200e201141e0006c6a220d41e8026a280200450d00200d41f8026a2903002113200d41f0026a29030021140c010b200841286a2007412c6a2802002004200741306a28020028021c110200200841306a2903002113200728021c2109200829032821140b20072009417f6a36021c200141186a29030021152007280250210d20012903102116024002400240024041004101410220142013842217501b20021b0e03010200010b200d41a8016a210d0c020b200d4188016a210d0c010b200d4198016a210d0b20162015844200510d01200841186a200d290300200d41086a2903002016201510d40420014200200129030822152008290318427f200841186a41086a290300501b7d22162016201556220d1b3703080240200d450d0041c6b5c300210d4122210f0c060b200a28020041016a220141004c0d022007200136021c2007280224210b024002400340200c280200220e41086a210f200e2f01062210410574210d41002111024002400340200d450d012003200f412010d0042212450d02200d41606a210d201141016a2111200f41206a210f2012417f4a0d000b2011417f6a21100b200b450d02200b417f6a210b200e20104102746a41880b6a210c0c010b0b200e201141e0006c6a220d41e8026a280200450d00200d41f8026a2903002115200d41f0026a29030021160c010b200841086a2007412c6a2802002003200741306a28020028021c110200200841106a2903002115200728021c2101200829030821160b200a2001417f6a3602000240201620057d2218201656201520067d2016200554ad7d221620155620162015511b4101470d0041e8b5c300210d411d210f0c060b024020174200520d002007280250220d290378200556200d4180016a290300221520065620152006511b450d004185b6c300210d411f210f0c060b2008200341022018201610910102402008280200220d450d002008280204210f0c060b0240201420057c2217201454220d201320067c200dad7c221520135420152013511b450d0041a4b6c300210d412d210f0c060b4100210d024020032004470d000c060b024020032004412010d0040d000c060b200a20032018201610f401200a20042017201510f401200841e0006a41086a200341086a290000370300200841e0006a41106a200341106a290000370300200841e0006a41186a200341186a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a290000370300200820032900003703602008200429000037034002400240200741c0006a280200220f2007413c6a280200460d00200728023821110c010b200f41016a220d200f490d05200f4101742211200d200d2011491b220dad42e8007e2215422088a70d052015a722124100480d0502400240200f0d002012102721110c010b2007280238200f41e8006c2012102821110b2011450d04200720113602382007413c6a200d3602002007280240210f0b4100210d2011200f41e8006c6a220f41003a0000200f2008290360370001200f41096a200841e0006a41086a290300370000200f41116a200841e0006a41106a290300370000200f41196a200841e0006a41186a290300370000200f41216a2008290340370000200f41296a200841c0006a41086a290300370000200f41316a200841c0006a41106a290300370000200f41396a200841c0006a41186a290300370000200f41c4006a2008413c6a280000360000200f41c1006a2008280039360000200f41e0006a4100360200200f4201370358200f41d0006a2006370300200f41c8006a20053703002007200728024041016a3602400c050b41d8a8c1004118200841e0006a4180a9c10010a201000b41fcecc2001058000b41d8a8c1004118200841e0006a4180a9c10010a201000b20124108102a000b102b000b2000200f3602042000200d36020020084180016a24000bc50101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a28020022040d00200321000c010b2004210520032100034020002802880b21002005417f6a22050d000b0340200320032f01064102746a41880b6a28020021032004417f6a22040d000b0b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a10d901200141306a24000b85e3010b047f017e037f017e097f017e037f097e027f0a7e2e7f230041c0176b2202240041d7c7c5004113108a02210302400240024002400240024002402001417f6a2204410670450d002003200341ff017141024771450d010b200241f80b6a41086a22034200370300200242003703f80b41abccc1004112200241f80b6a100420024198106a41086a2003290300370300200220022903f80b37039810200241003602b80d20024198106a4110200241b80d6a100521030240024002400240024020022802b80d2201417f460d002003450d00200220013602b40b200220033602b00b200241b80d6a200241b00b6a102d20022802b80d2205450d0220022902bc0d21062001450d01200310290c010b41012105420021060b410021070240024002402006422088a7220141057422030d0041082108410021090c010b20034105752209ad42d0007e220a422088a70d09200aa7220b4100480d09200b10272208450d010b2006a7210c0240200520036a2005460d002001410574210b20024198106a41206a2103410021072008210d200521010340200241b00b6a41086a220e200141086a290000370300200241b00b6a41106a220f200141106a290000370300200241b00b6a41186a2210200141186a290000370300200220012900003703b00b200241b80d6a200241b00b6a104d20024198106a41186a201029030037030020024198106a41106a200f29030037030020024198106a41086a200e290300370300200320022903b80d370300200341086a200241b80d6a41086a290300370300200341106a200241b80d6a41106a290300370300200341186a200241b80d6a41186a290300370300200341206a200241b80d6a41206a290300370300200341286a200241b80d6a41286a290300370300200220022903b00b37039810200741016a2107200d20024198106a41d00010ce0441d0006a210d200141206a2101200b41606a220b0d000b0b0240200c450d00200510290b200241f80b6a41086a22034200370300200242003703f80b41bec7c5004119200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d2002410036029810200241b80d6a411020024198106a100521030240024002402002280298102201417f460d002003450d00200220033602b00b200220013602b40b200241003602981020024198106a20032001410420014104491b220b10ce041a20022001200b6b3602b40b20022003200b6a3602b00b0240200141034d0d00200228029810210f20024198106a200241b00b6a104520022802981022110d020b418f89c3004133104e000b410421114100210e410021124100210f0c010b200229029c10210620031029200241b80d6a4110100c2006422088a7210e2006a721120b200241800a6a41ceecc200410d10940120022903880a210620022802800a2103200241f0096a41cfa2c400411710940120022903f809210a20022802f0092101200241f80b6a41086a220c4200370300200242003703f80b41cfa2c4004117200241f80b6a1004200241b80d6a41086a2213200c290300370300200220022903f80b3703b80d20022006420020031b220637039810200241b80d6a411020024198106a4108100302402006200a420020011b7d221450450d00410021150c040b200c4200370300200242003703f80b41cdf8c4004116200241f80b6a10042013200c290300370300200220022903f80b3703b80d2002410036029810200241b80d6a411020024198106a100521030240024002402002280298102201417f460d002003450d00200220013602b40b200220033602b00b20024198106a200241b00b6a102d2002280298102216450d02200241a0106a280200210d200228029c1021172001450d01200310290c010b410121164100210d410021170b200241d8096a41c8f9c4004111108601200241d8096a41106a290300211820022903e009211920022802d8092103200241c0096a41b18ac0004116108601200241b0096a20022903c809420020022802c00922011b221a200241c0096a41106a290300420020011b428094ebdc03420010d404200241a0096a20022903b0092206200241b0096a41086a290300220a4280ec94a37c427f10d30420024190096a2019420020031b2018420020031b200dad420010d304201442ffffffff0f8342ffffffff0f2014428080808010541b211b20022903a009201a7c211420024190096a41086a290300211c4100210b41d0dec1002101200229039009211d02400240034002404190e1c100200122036b41304b0d0020034190e1c100460d03200220032802002201360298102002418094ebdc0336029c1020024180096a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d3042002290380092219201820147e428094ebdc038042ffffffff0f837c2218201d5a20024180096a41086a2903002018201954ad7c2218201c5a2018201c511b0d03200241f0086a41086a21100c020b200220032802002201360298102002418094ebdc0336029c10200241e0086a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d30420022903e0082219201820147e428094ebdc038042ffffffff0f837c2218201d5a200241e0086a41086a2903002018201954ad7c2218201c5a2018201c511b0d02200220032802102201360298102002418094ebdc0336029c10200241d0086a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d304024020022903d0082219201820147e428094ebdc038042ffffffff0f837c2218201d5a200241d0086a41086a2903002018201954ad7c2218201c5a2018201c511b450d002003210b0c030b200220032802202201360298102002418094ebdc0336029c10200241c0086a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d304024020022903c0082219201820147e428094ebdc038042ffffffff0f837c2218201d5a200241c0086a41086a2903002018201954ad7c2218201c5a2018201c511b450d00200341106a210b0c030b200220032802302201360298102002418094ebdc0336029c10200241b0086a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d304200341c0006a2101200341306a210b20022903b0082219201820147e428094ebdc038042ffffffff0f837c2218201d54200241b0086a41086a2903002018201954ad7c2218201c542018201c511b0d000b200341206a210b0c010b03404180e1c1002003220b460d01200b41106a21032002200b41106a2802002201360298102002418094ebdc0336029c10200241f0086a2006200a20024198106a2001418094ebdc034b4102746a3502002218420010d30420022903f0082219201820147e428094ebdc038042ffffffff0f837c2218201d5a20102903002018201954ad7c2218201c5a2018201c511b450d000b0b4200211e20024190086a201d201c428094ebdc03420010d40420024180086a200229039008221920024190086a41086a290300221a4280ec94a37c427f10d304200b41d0dec100200b1b2203410c6a2d00002101200341046a280200210b200341086a28020021032002418094ebdc0336029c10200220033602981020024198106a2003418094ebdc034b4102746a35020021182002418094ebdc0336029c102002200b36029810200241f0076a2019201a20024198106a200b418094ebdc034b4102746a350200221f420010d304200241a0086a2006200a2018420010d304200241e0076a420020022903a008220a201820147e428094ebdc038042ffffffff0f837c220620022903f0072218201f200229038008201d7c7e428094ebdc038042ffffffff0f837c22147d22192019200656200241a0086a41086a2903002006200a54ad7c220a200241f0076a41086a2903002014201854ad7c22197d2006201454ad7d2218200a562018200a511b22031b427f200620147c22142014200654220b200a20197c200bad7c2206200a542006200a511b220b1b20011b4200201820031b427f2006200b1b20011b201b420010d304200241d0076a20022903e007200241e0076a41086a29030042e08f860f420010d4040240200d41057422030d00420021200c040b2011200e4102746a2121201620036a2122200241d0076a41086a290300212320022903d0072124200fad21252011210e4200211e420021202016210d024002400340200e2021460d0602400240200e2802002203450d00024002400240024002400240200f450d00200241c0076a202420232025420010d404200241b0076a20022903c0072206200241c0076a41086a290300220a2025420010d304200241a0076a2006200a200f20032003200f4b1bad2214420010d304202420022903b0077d20147e202580210620022903a0072114200241a0076a41086a290300211a411210272203450d01200341106a41002f0088a3443b0000200341086a4100290080a344370000200341002900f8a24437000020034112413210282203450d022003200d2900003700122003412a6a200d41186a290000370000200341226a200d41106a2900003700002003411a6a200d41086a290000370000200241c00a6a41186a22014200370300200241c00a6a41106a220b4200370300200241c00a6a41086a22104200370300200242003703c00a20034132200241c00a6a1000200241b80d6a41186a2001290300370300200241b80d6a41106a200b290300370300200241b80d6a41086a22052010290300370300200220022903c00a3703b80d2002410036029810200241b80d6a412020024198106a10052101200228029810220b417f460d042001450d042002200b36029c10200220013602981020024198076a20024198106a102e200228029807450d0320024180076a20024198106a1053200229038007a7450d0320024180076a41106a290300210a2002290388072119200b450d05200110290c050b41dcf9c4001058000b41124101102a000b41324101102a000b418f89c3004133104e000b420021194200210a0b2003102942002118200242003703c00d200242003703b80d024002402014200642ffffffff0f837c2206201920062019200654200a201a2006201454ad7c221454200a2014511b22031b22267d22272014200a201420031b22287d2006202654ad7d22298450450d00420021060c010b20024198106a200d104d20024198106a41086a29030022064200200229039810220a42015620064200522006501b22031b2106200a420120031b210a20022802b81021100240024020022802c01022030d00200241f8056a200a2006428094ebdc03420010d404200241f8056a41086a290300212a20022903f805212b0c010b2010200341306c6a210b200241f0066a200a2006428094ebdc03420010d404200241d0066a20272029428094ebdc03420010d404200241e0066a20272029428094ebdc03420010d504200241f0066a41086a290300222a420020022903f006222b420156202a420052202a501b22031b2118202b420120031b2119200241d0066a41086a290300211b20022903d006211f20022903e006212c201021030340200241c0066a200a200329030022142014200a56200341086a290300221420065620142006511b22011b2006201420011b2019201810d40420022903c006221a428080808010544100200241c0066a41086a290300501b450d04200241b0066a200a20062019201810d40420022903b0062214428080808010544100200241b0066a41086a290300501b450d0602402014a7450d0020024188066a201f201b201a42ffffffff0f83428094ebdc037e201442ffffffff0f838042ffffffff0f832214420010d30420024198066a200341106a200229038806221a2014202c7e428094ebdc038042ffffffff0f837c221420024188066a41086a2903002014201a54ad7c10d603200241b80d6a20022903980620022903a00620024198066a41106a29030010eb01200341306a2203200b460d020c010b0b41c489c3001058000b200241e8056a200a20022903a81022142014200a5620024198106a41186a290300221420065620142006511b22031b2006201420031b202b4201202b420156202a420052202a501b22031b2214202a420020031b221810d40420022903e8052219428080808010544100200241e8056a41086a290300501b450d02200241d8056a200a20062014201810d40420022903d8052206428080808010544100200241d8056a41086a290300501b450d042006a7450d05200241c8056a20272029428094ebdc03420010d404200241b8056a20022903c805220a200241c8056a41086a29030022144280ec94a37c427f10d304200241a8056a200a2014201942ffffffff0f83428094ebdc037e200642ffffffff0f838042ffffffff0f832206420010d30420022903a805220a2006202720022903b8057c7e428094ebdc038042ffffffff0f837c2218200a54ad2106200241a8056a41086a290300210a024020022802bc10450d00201010290b200a20067c21060b20024190056a200d201820267c220a200620287c200a201854ad7c10d603200241b80d6a20022903900520022903980520024190056a41106a29030010eb01427f202020052903007c201e20022903b80d7c220a201e542203ad7c22062003200620205420062020511b22031b2120427f200a20031b211e0b200e41046a210e200d41206a220d2022470d010c070b0b10a003000b10a103000b41c489c3001058000b418f89c3004133104e000b200b4108102a000b418f89c3004133104e000b02402012450d00201110290b200241b0106a202037030020024198106a41106a201e37030020024198106a41086a41003a0000200241033a00981041b8d6c500410020024198106a108801200241f8046a41b18ac0004116108601200241f8046a41106a2903002106200229038005210a20022802f8042103200241f80b6a41086a22014200370300200242003703f80b41b18ac0004116200241f80b6a1004200241b80d6a41086a2001290300370300200220022903f80b3703b80d2002427f2006420020031b220620207c200a420020031b220a201e7c2214200a542203ad7c220a2003200a200654200a2006511b22031b3703a0102002427f201420031b37039810200241b80d6a411020024198106a411010030240201e202084500d00201d201c84500d0042002106200241b00b6a41086a22034200370300200242003703b00b41b18ac0004116200241b00b6a1004200241b80d6a41086a2003290300370300200220022903b00b3703b80d2002410036029810200241b80d6a411020024198106a100521030240024002400240024002402002280298102201417f470d00420021064200210a0c010b024020030d004200210a0c010b200242003703a010200242003703981020024198106a20032001411020014110491b10ce041a2001410f4d0d01200241a0106a290300210a2002290398102106200310290b2006201d7d2214200656200a201c7d2006201d54ad7d2206200a562006200a511b0d04200241e8046a20142006201d201c10d404200241b8046a200241e8046a41086a29030022064200201e420010d304200241c8046a2020420020022903e804220a420010d304200241d8046a200a4200201e420010d304200642005220204200527120022903c0044200527220022903d00442005272200241d8046a41086a290300220620022903b80420022903c8047c7c2214200654720d0420022903d8042118200241b00b6a41086a22034200370300200242003703b00b41b18ac0004116200241b00b6a1004200241b80d6a41086a2003290300370300200220022903b00b3703b80d2002410036029810200241b80d6a411020024198106a100521032002280298102201417f460d022003450d02200242003703a010200242003703981020024198106a20032001411020014110491b10ce041a2001410f4d0d01200241a0106a290300210a2002290398102106200310290c030b418f89c3004133104e000b418f89c3004133104e000b420021064200210a0b200241b00b6a41086a22014200370300200242003703b00b41b18ac0004116200241b00b6a1004200241b80d6a41086a220b2001290300370300200220022903b00b3703b80d2002427f200a20147c200620187c221a2006542203ad7c221920032019200a542019200a511b22031b3703a0102002427f201a20031b37039810200241b80d6a411020024198106a4110100320024198106a109701200241a8046a20024198106a2006427f85201820031b2206200a427f85201420031b2214108301200241a8046a41086a290300211820022903a804210a20024190046a41b18ac00041161086012006200a7d200a20067d200a2006582018201458201820145122031b220d1b211b201420187d2006200a54ad7d201820147d200a200654ad7d200d1b211f20024190046a41106a2903004200200228029004220d1b21192002290398044200200d1b211a02400240200a200656201820145620031b0d00200b4200370300200242003703b80d41b18ac0004116200241b80d6a10042001200b290300370300200220022903b80d3703b00b200242002019201f7d201a201b54ad7d2206201a201b7d220a201a56200620195620062019511b22031b3703c00d20024200200a20031b3703b80d200241b80d6a21030c010b200241f80b6a41086a22034200370300200242003703f80b41b18ac0004116200241f80b6a100420012003290300370300200220022903f80b3703b00b2002427f2019201f7c201a201b7c220a201a542203ad7c22062003200620195420062019511b22031b3703c00d2002427f200a20031b3703b80d200241b80d6a21030b200241b00b6a41102003411010030b410121152017450d00201610290b20024188046a4189c7c500411210b5012002280288042103200228028c042101200c4200370300200242003703f80b4189c7c5004112200241f80b6a10042013200c290300370300200220022903f80b3703b80d2002200141016a410120031b221636029810200241b80d6a411020024198106a4104100320024180046a419bc7c500412310b501200c4200370300200242003703f80b419bc7c5004123200241f80b6a10042013200c290300370300200220022903f80b3703b80d2002200436029810200241b80d6a411020024198106a41041003024002400240024002400240024002400240024002400240024002400240201641a105490d00200241f80b6a41086a22034200370300200242003703f80b41eac7c5004112200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d2002410036029810200241b80d6a411020024198106a1005212d024002400240024002400240200228029810222e417f460d00202d450d002002202e36029c102002202d36029810200241f8036a20024198106a102e20022802f803450d1a024002400240024020022802fc0322224180042022418004491b220c0d00410421050c010b200c410374220310272205450d010b02402022450d00200228029810210e200228029c1021014100210f4100210d4100210b0340200241003602b00b200241b00b6a200e20014104200141044922211b221010ce041a2002200120106b220336029c102002200e20106a220e360298100240024020210d0020022802b00b2121200241003602b00b200241b00b6a200e2003410420034104491b221010ce041a2002200320106b220136029c102002200e20106a220e36029810200341034b0d010b200c450d1f200510290c1f0b200b41016a210320022802b00b21100240200b200c470d00200f20032003200f491b220c41ffffffff0171200c470d1e200c41037422134100480d1e02400240200b0d002013102721050c010b2005200d2013102821050b2005450d040b2005200d6a220b2021360200200b41046a2010360200200f41026a210f200d41086a210d2003210b20222003470d000b0b2005450d1c2022ad422086200cad842206422088a721032006a721170240202e450d00202d10290b20172003470d040c030b20034104102a000b20134104102a000b41042105410021170b2017220341016a22012003490d172003410174220b20012001200b491b221741ffffffff01712017470d17201741037422014100480d170240024020030d002001102721050c010b200520034103742001102821050b2005450d010b201641e07a6a2101200520034103746a220b2004360204200b20163602002005200341016a220f4103746a210d410021030240200f41044f0d002005210b0c020b2005210e02400340200e220b28020020014f0d040240200b41086a2802002001490d00200341016a21030c050b0240200b41106a2802002001490d00200341026a21030c050b200b41186a28020020014f0d01200341046a2103200d200b41206a220e6b41184b0d000b200b41206a210b0c020b200341036a21030c020b20014104102a000b200b200d460d000340200b28020020014f0d01200341016a2103200d200b41086a220b470d000b0b024002400240024002400240200f2003490d0041002101200f20036b2210450d0502402003450d002005200520034103746a201041037410cf041a0b2005280204210c200241f80b6a41086a22034200370300200242003703f80b419fcac5004113200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d20024198106a200241b80d6a411010bb0102402002280298104101470d00024020024198106a41086a2802002221200c2021200c491b220f200228029c1022014f0d002001210f0c050b02402001200f4f0d000340411a10272203450d04200341186a41002f00e8b3433b0000200341106a41002900e0b343370000200341086a41002900d8b343370000200341002900d0b3433700002003411a413410282203450d052003200136001a200241c00a6a41186a220b4200370300200241c00a6a41106a220d4200370300200241c00a6a41086a220e4200370300200242003703c00a2003411e200241c00a6a1000200241e00a6a41186a200b290300370300200241e00a6a41106a200d290300370300200241e00a6a41086a200e290300370300200220022903c00a3703e00a200241e00a6a4120100c20031029200141016a22032101200f2003470d000b0b2021200c4b0d040b200241f80b6a41086a22034200370300200242003703f80b419fcac5004113200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d200241b80d6a4110100c0c040b419cb1c5001058000b411a4101102a000b41344101102a000b200241f80b6a41086a22034200370300200242003703f80b419fcac5004113200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d410410272203450d032003200f36000020034104410810282203450d0420032021360004200241b80d6a4110200341081003200310290b201021010b200241f80b6a41086a22034200370300200242003703f80b41eac7c5004112200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d200241003602a0102002420137039810200220013602b00b200241b00b6a20024198106a10300240024020010d0020022802a0102103200228029c10210b20022802981021010c010b200520014103746a2113410020022802a010220f6b210d200228029c10210b410021030340200f20036a210e200520036a2210280200210c02400240200b200d6a4104490d0020022802981021010c010b200e41046a2201200e490d16200b4101742221200120012021491b22214100480d1602400240200b0d002021102721010c010b200228029810200b2021102821010b2001450d062002202136029c1020022001360298102021210b0b2002200e41046a22213602a0102001200f6a20036a200c360000201041046a280200210c0240200b200d6a417c6a41034b0d00202141046a22222021490d16200b4101742221202220222021491b22214100480d1602400240200b0d002021102721010c010b2001200b2021102821010b2001450d072002202136029c1020022001360298102021210b0b2002200e41086a3602a0102001200f6a20036a41046a200c360000200d41786a210d200341086a2103201041086a2013470d000b200f20036a21030b200241b80d6a41102001200310030240200b450d00200110290b2017450d00200510290b200241f0036a41bdc6c500411610b50120022802f403212f20022802f0032130200241e8036a41d3c6c500411d10b50120022802ec03213120022802e8032132200241c00a6a41186a22034200370300200241c00a6a41106a22014200370300200241c00a6a41086a220b4200370300200242003703c00a41b3a4c400411a200241c00a6a1000200241b80d6a41186a2003290300370300200241b80d6a41106a2001290300370300200241b80d6a41086a200b290300370300200220022903c00a3703b80d2002410036029810200241b80d6a412020024198106a1005210302400240200228029810220b417f470d00410021010c010b410021012003450d00200241c00a6a200b4120200b4120491b22016a41004100412020016b2001411f4b1b10cd041a200241c00a6a2003200110ce041a200b411f4d0d05200241e00a6a41186a2201200241c00a6a41186a290300370300200241e00a6a41106a220b200241c00a6a41106a290300370300200241e00a6a41086a220d200241c00a6a41086a290300370300200220022903c00a3703e00a2003102920024198106a41186a200129030037030020024198106a41106a200b29030037030020024198106a41086a200d290300370300200220022903e00a37039810410121010b412810272203450d05200320013a0004200341b8d6c5003602002003200229039810370005200320022f00b00b3b00252003410d6a20024198106a41086a290300370000200341156a20024198106a41106a2903003700002003411d6a20024198106a41186a290300370000200341276a200241b20b6a2d00003a0000200241c00a6a41186a22014200370300200241c00a6a41106a220b4200370300200241c00a6a41086a220d4200370300200242003703c00a41c6a3c400411a200241c00a6a1000200241b80d6a41186a2001290300370300200241b80d6a41106a200b290300370300200241b80d6a41086a200d290300370300200220022903c00a3703b80d4100210b2002410036029810200241b80d6a412020024198106a100521010240200228029810220d417f460d002001450d00200241c00a6a200d4120200d4120491b220b6a410041004120200b6b200b411f4b1b10cd041a200241c00a6a2001200b10ce041a200d411f4d0d07200241e00a6a41186a220b200241c00a6a41186a290300370300200241e00a6a41106a220d200241c00a6a41106a290300370300200241e00a6a41086a220e200241c00a6a41086a290300370300200220022903c00a3703e00a2001102920024198106a41186a200b29030037030020024198106a41106a200d29030037030020024198106a41086a200e290300370300200220022903e00a370398104101210b0b412810272233450d072033200b3a0004203341b8d6c5003602002033200229039810370005203320022f00b00b3b00252033410d6a20024198106a41086a2201290300370000203341156a20024198106a41106a220b2903003700002033411d6a20024198106a41186a220d290300370000203341276a200241b00b6a41026a2d00003a00002002420037028c0d2002418883c0003602880d200241003602a80d200242083703a00d200241b80c6a411c6a200241880d6a360200200241b80c6a41186a200241b00d6a360200200241003602c80c200241f4f9c4003602bc0c200220033602b80c2002200241a00d6a3602cc0c2002200241b00d6a3602c40c2002200241b00d6a3602c00c20024198106a200241b80c6a108b0202400240024020022d00d810220e4102470d00200241023a00f80d0c010b200241f80b6a41386a220f20024198106a41386a290300370300200241f80b6a41306a221020024198106a41306a290300370300200241f80b6a41286a220520024198106a41286a290300370300200241f80b6a41206a220c20024198106a41206a290300370300200241f80b6a41186a2221200d290300370300200241f80b6a41106a220d200b290300370300200241f80b6a41086a220b2001290300370300200241e00a6a41086a2201200241e1106a2222290000370300200241ef0a6a2213200241e8106a29000037000020022002290398103703f80b200220022900d9103703e00a200241d4106a200f290300370200200241cc106a2010290300370200200241c4106a2005290300370200200241bc106a200c29030037020020024198106a411c6a202129030037020020024198106a41146a200d290300370200200241a4106a200b290300370200200241013602c80c200220022903f80b37029c10200241b00b6a20024198106a41c40010ce041a200241003602981020024198106a410472200241b00b6a41c40010ce041a20024198106a41c8006a200e3a0000202220022903e00a370000200241e9106a2001290300370000200241f0106a2013290000370000200241b80d6a200241b80c6a41146a20024198106a10950320022d00f80d4102470d010b20031029410821344100213541082105410821174100210c0c0e0b20024198106a200310d70341c80010272234450d082034200241b80d6a41c80010ce041a200241d80c6a41186a200241b80c6a41186a290300370300200241d80c6a41106a200241b80c6a41106a290300370300200241d80c6a41086a200241b80c6a41086a290300370300200220022903b80c3703d80c20024198106a200241d80c6a108b02024020022d00d81022054102470d004101210c410121350c0c0b20024198106a41046a2103200241e1106a210d20024198106a410472212e200241ec0c6a2136200241d9106a210e20022802e80c21374102210f41c800210b410021014101213502400340200241f80b6a41386a221020024198106a41386a290300370300200241f80b6a41306a220c20024198106a41306a290300370300200241f80b6a41286a222120024198106a41286a290300370300200241f80b6a41206a222220024198106a41206a290300370300200241f80b6a41186a221320024198106a41186a290300370300200241f80b6a41106a220420024198106a41106a290300370300200241f80b6a41086a221620024198106a41086a290300370300200241e00a6a41086a2217200e41086a290000370300200241e00a6a410f6a222d200e410f6a29000037000020022002290398103703f80b2002200e2900003703e00a200341386a2010290300370200200341306a200c290300370200200341286a2021290300370200200341206a2022290300370200200341186a2013290300370200200341106a2004290300370200200341086a2016290300370200200320022903f80b3702002002203720016a221041016a3602e80c200241b00b6a20024198106a41c40010ce041a2002201036029810202e200241b00b6a41c40010ce041a200d20022903e00a370000200d41086a2017290300370000200d410f6a202d290000370000200220053a00e010200241b80d6a203620024198106a10950320022d00f80d4102460d0120024198106a200241b80d6a41c80010ce041a0240200141016a22102035470d00200241b00b6a20022802d80c20022802dc0c280210110000201041016a22052010490d15200f20052005200f491b2235ad42c8007e2206422088a70d152006a722054100480d15024002402001417f470d002005102721340c010b2034200b2005102821340b2034450d0c0b2034200b6a20024198106a41c80010ce041a200f41026a210f200b41c8006a210b20024198106a200241d80c6a108b022010210120022d00d81022054102460d0c0c000b0b200141016a210c203421050c0c0b41044101102a000b41084101102a000b20214101102a000b20214101102a000b418f89c3004133104e000b41284104102a000b418f89c3004133104e000b41284104102a000b41c8004108102a000b20054108102a000b201041016a210c0b20342105200241023a00f80d0b20022802d80c220120022802dc0c220328020011010002402003280204450d00200110290b200521170b200241b80d6a2033109303024002400240024020022802d80d222e450d00200241b00b6a41017221360240024002400240034020022802e00d211320022802dc0d2137200241d80c6a41186a2238200241b80d6a41186a290300370300200241d80c6a41106a2239200241b80d6a41106a290300370300200241d80c6a41086a223a200241b80d6a41086a290300370300200220022903b80d3703d80c200241b00b6a200241d80c6a108c02024002400240024020022d00b00b4101460d00200241003602b8100c010b200241f80b6a41186a203641186a290000370300200241f80b6a41106a203641106a290000370300200241f80b6a41086a203641086a290000370300200220362900003703f80b20024198106a200241f80b6a108d0220022802b81022030d010b420021194200211a0c010b20024198106a41086a290300211a200229039810211920022802bc10450d00200310290b2013ad42c8007e2206422088a70d062006a72203417f4c0d0602400240024020030d00410821160c010b200310272216450d010b02400240201341057422030d00410021220c010b202e20036a212d41002122202e210403402004220e41206a2104200241880d6a2103200228028c0d2110024003402003280200220f41086a2101200f2f0106222141057421034100210b0240024003402003450d01200e2001412010d004220d450d02200341606a2103200b41016a210b200141206a2101200d417f4a0d000b200b417f6a21210b2010450d022010417f6a2110200f20214102746a4194036a21030c010b0b200c200f200b4102746a41e8026a220328020022014d0d052005200141c8006c6a22012903102106200141186a290300210a200241d0036a41b18ac0004116108601200241c0036a20022903d803200241d0036a41106a290300427f420010d404200c200328020022014d0d06200241b0036a2019201a20022903c003420020022802d003220b1b221442012014420156200241c0036a41086a2903004200200b1b22144200522014501b220b1b20144200200b1b10d4042005200141c8006c6a220141186a427f200a200620022903b0037c2214200654220bad7c2218200b2018200a54201420065a1b220b1b3703002001427f2014200b1b370310200241e00a6a41186a2201200e41186a290000370300200241e00a6a41106a220b200e41106a290000370300200241e00a6a41086a220d200e41086a2900003703002002200e2900003703e00a2003280200210e024020132022470d00201341016a22032013490d122013410174220f20032003200f491b2203ad42c8007e2206422088a70d122006a7220f4100480d120240024020130d00200f102721160c010b2016201341c8006c200f102821160b2016450d08200321130b2016202241c8006c6a220342003703002003200e360220200341186a4200370300200341106a4200370300200341086a4200370300200320022903e00a3702242003412c6a200d290300370200200341346a200b2903003702002003413c6a2001290300370200202241016a21220b2004202d470d000b0b200241c00a6a41186a22032038290300370300200241c00a6a41106a22012039290300370300200241c00a6a41086a220b203a290300370300200220022903d80c3703c00a20024198036a41b18ac000411610860120024188036a20022903a00320024198036a41106a290300427f420010d404200241f8026a2019201a2002290388034200200228029803220d1b22064201200642015620024188036a41086a2903004200200d1b22064200522006501b220d1b20064200200d1b10d404200241b80c6a41086a220d200b290300370300200241b80c6a41106a220b2001290300370300200241b80c6a41186a22012003290300370300200220022903c00a3703b80c20022903f802210602402037450d00202e10290b2016450d0620024198106a41186a220e200129030037030020024198106a41106a220f200b29030037030020024198106a41086a220b200d290300370300200220022903b80c37039810024020022802a80d220120022802a40d470d00200241b80d6a203310d70320022802a40d220320022802a80d220d6b417f20022802b80d221041016a222120212010491b22104f0d00200d20106a2210200d490d0f2003410174220d20102010200d491b220dad42d0007e220a422088a70d0f200aa722104100480d0f0240024020030d002010102721030c010b20022802a00d200341d0006c2010102821030b2003450d062002200d3602a40d200220033602a00d0b20022802a00d200141d0006c6a22032016360220200320022903981037022c200341286a2022360200200341246a2013360200200342003703102003420037030820032006370300200341186a4200370300200341346a200b2903003702002003413c6a200f290300370200200341c4006a200e2903003702002002200141016a3602a80d200241b80d6a203310930320022802d80d222e0d010c060b0b20034108102a000b41e086c3002001200c1037000b41acf2c2002001200c1037000b200f4108102a000b20104108102a000b2033102902400240200c2031410420321b22034101200341014b1b4f0d0002402035450d00203410290b024020022802a80d2203450d00200341d0006c210120022802a00d41206a210303400240200341046a280200450d00200328020010290b200341d0006a2103200141b07f6a22010d000b0b024020022802a40d0d00410021130c020b20022802a00d1029410021130c010b200c202f410020301b2203200c2003491b223341ffffff3f712033470d0120334105742203417f4c0d01024002400240024020030d00410121130c010b200310272213450d010b2033ad422c7e2206422088a70d032006a72203417f4c0d0302400240024020030d00410421320c010b200310272232450d010b024020330d004100213a4100213b0c030b2005200c41c8006c22386a211620024198106a41186a212e20024198106a41106a213620024198106a41086a21374100212d2033213b03400240200c450d002038210303400240201741c0006a2d00000d00200241e8026a427f427f201741106a290300220642012006420156201741186a29030022064200522006501b22011b2006420020011b10d4042017200241e8026a41086a290300370308201720022903e8023703000b201741c8006a2117200341b87f6a22030d000b0b20022802a00d220d20022802a80d222141d0006c6a21040240024002400240024002402021450d00200d210e03400240200e2802282203450d00200341c8006c210b200e28022041206a21030340200c200328020022014d0d0402402005200141c8006c6a22012d00400d002001290310220a200141186a290300221484500d00200241d8026a200e29030022064200428080808010420010d304200241a8026a420042002006420010d304200241c8026a427f20022903d802200e41086a290300220642ffffffff0f8320065220022903b00242005272200241d8026a41086a2903002218200642208620022903a8027c7c220620185472220f1b427f2006200f1b200a201410d404200241b8026a200e41146a350200200e41186a290300220642208684200642208820022903c802200241c8026a41086a29030010d3042001427f2001290300220620022903b8027c220a200a200654220f200141086a22102903002206200241b8026a41086a2903007c200fad7c220a200654200a2006511b220f1b3703002010427f200a200f1b3703000b200341c8006a2103200b41b87f6a220b0d000b0b200e41d0006a220e2004470d000b0b202d41016a213a2005200c41c8006c6a210e203821012005210303402003210b02400240200e20036b41d8014d0d00200b41c0006a2d00000d01200b41c8006a21030c070b0340024020010d00202d213a0c0c0b200141b87f6a2101200b41c0006a210f200b41c8006a2203210b200f2d00000d000b200341b87f6a210b0c060b200b4188016a2d0000450d03200b41d0016a2d0000450d02200141e07d6a2101200b41a0026a2103200b4198026a2d00000d000b410321010c030b41acf2c2002001200c1037000b200b41d8016a2103410221010c010b200b4190016a2103410121010b200b200141c8006c6a210b0b02402003200e460d00200b41086a2903002106200b290300210a0340200341c8006a21010240200341c0006a2d00000d00200341086a2903002214200620032903002218200a54201420065420142006511b220e1b21062018200a200e1b210a2003200b200e1b210b0b2001210320162001470d000b0b200b41013a004002402021450d00200b417c6a2110200b41206a21210340200d41d0006a21220240200d2802282201450d00200d2802202103200141c8006c210103400240024020102003460d00200341246a2021412010d0040d010b200d41186a220e2903002106200b41086a220f290300210a2003200b2903002214200d29031022187d3703002003200a20067d2014201854ad7d370308200b2903002106200e200f290300370300200d20063703100b200341c8006a2103200141b87f6a22010d000b0b2022210d20222004470d000b0b202e200b41386a2900003703002036200b41306a2900003703002037200b41286a2900003703002002200b2900203703981002400240203b202d470d00202d4101742203203a203a2003491b223b41ffffff3f71203b470d0e203b41057422034100480d0e02400240202d0d002003102721130c010b2013202d4105742003102821130b2013450d010b2013202d4105746a2203200229039810370000200341186a202e290300370000200341106a2036290300370000200341086a203729030037000020052117203a212d203a20334f0d040c010b0b20034101102a000b20034104102a000b20034101102a000b0240024020022802a80d22030d00410021360c010b20022802a00d2222200341d0006c6a212e2013203a4105746a210e410021360340200220222f002c3b01b80d20022022412e6a2d00003a00ba0d20022022413f6a290000370398102002202241c4006a29000037009d10024020222802282203450d002022280220220f200341c8006c6a21042022413b6a2800002137202241376a2800002138202241336a28000021392022412f6a28000021312022412c6a21054100210c4108212141002110024002400340200f220d41246a2101200d41c8006a210f201321030240024003400240200e20036b41e0004b0d002003200e460d030340024020012003470d002003210b0c040b024020032001412010d0040d002003210b0c040b200e200341206a2203470d000c040b0b024020032001470d002003210b0c020b024020032001412010d0040d002003210b0c020b200341206a220b2001460d01200b2001412010d004450d01200341c0006a220b2001460d01200b2001412010d004450d01200341e0006a220b2001460d0120034180016a2103200b2001412010d0040d000b0b2005200b460d00200b2005412010d004450d000240024020222903102218200d290300220a85202241186a2903002214200d41086a2903002206858450450d0042002106428080808010210a0c010b20024198026a200a4200428080808010420010d30420024188026a42004200200a420010d3040240200642ffffffff0f832006522002290390024200527220024198026a41086a290300221920064220862002290388027c7c221a201954724101470d000240201842208820144220868422182014422088221484500d00200241e8016a200a20062018201410d404200241e8016a41086a290300210620022903e801210a0c020b41bcf2c2001058000b200241f8016a200229039802201a20184201201842015620144200522014501b22031b2014420020031b10d404200241f8016a41086a290300210620022903f801210a0b200d200a370310200d41186a20063703002002200d2f00243b01900b2002200d41266a2d00003a00920b2002200d41376a2900003703800b2002200d413c6a2900003700850b200d41336a2800002101200d412f6a280000210b200d412b6a2800002116200d41276a280000210d0240200c2010470d00200c41016a2203200c490d10200c4101742217200320032017491b2203ad42307e2214422088a70d102014a722174100480d1002400240200c0d002017102721210c010b2021200c41306c2017102821210b2021450d032003210c0b20022d00920b211720022f01900b212d2021201041306c6a2203200136000f2003200b36000b200320163600072003200d3600032003202d3b0100200341026a20173a00002003200a370320200341286a2006370300200320022903800b370013200341186a20022900850b370000201041016a21100b200f2004470d000b02402010450d0002400240201041306c22010d00420021064200210a0c010b202141206a2103420021064200210a0340200341086a290300200a7c2003290300220a20067c2206200a54ad7c210a200341306a2103200141506a22010d000b0b200241d8016a420042808080801020067d22142014428080808010564200200a200642808080801056ad7c7d22064200522006501b22031b22194200200620031b22062010ad221a420010d40420022903d801211402402019201a5441002006501b0d00200241d8016a41086a2903002118202141206a21032010210103402003427f2003290300220620147c220a200a200654220b200341086a220d290300220620187c200bad7c220a200654200a2006511b220b1b370300200d427f200a200b1b370300200341306a21032001417f6a22010d000b0b200241c8016a20142006201a200610d3040240201920022903c8017da7220d450d004100210303402021200320107041306c6a2201427f2001290320220642017c220a200a200654220b200141286a22012903002214200bad7c2218201454200a20065a1b220b1b3703202001427f2018200b1b370300200341016a2203200d490d000b0b200220022f01b80d3b01ac0b200220022d00ba0d3a00ae0b20022002290398103703980b2002200229009d1037009d0b024020332036470d00203341016a22032033490d0f20334101742201200320032001491b2203ad422c7e2206422088a70d0f2006a722014100480d0f0240024020330d002001102721320c010b20322033412c6c2001102821320b2032450d03200321330b20022d00ae0b210120022f01ac0b210b20322036412c6c6a2203203736000f2003203836000b20032039360007200320313600032003200b3b0100200341026a20013a0000200320022903980b370013200341186a200229009d0b370000200320103602282003200c36022420032021360220203641016a21360c030b200c450d02202110290c020b20174108102a000b20014104102a000b202241d0006a2222202e470d000b0b02402035450d00203410290b024020022802a80d2203450d00200341d0006c210120022802a00d41206a210303400240200341046a280200450d00200328020010290b200341d0006a2103200141b07f6a22010d000b0b20022802a40d450d0020022802a00d10290b20022802900d210f20022802880d21010240200228028c0d2203450d00034020012802940321012003417f6a22030d000b0b0240200f450d004100210b410021030340200f417f6a210f02400240200320012f01064f0d00200341016a21030c010b02400240200128020022030d00200bad21064100210d410021030c010b2001330104422086200bad8421064101210d0b200110292006a7210b024002402006422088a7220e20032f01064f0d00200321010c010b034002400240200328020022010d00200bad2106410021010c010b200d41016a210d2003330104422086200bad8421060b200310292006a7210b200121032006422088a7220e20012f01064f0d000b0b200e41027420016a4198036a28020021010240200d417f6a2203450d00034020012802940321012003417f6a22030d000b0b410021030b200f0d000b0b02402001418883c000460d0020012802002103200110292003450d0020032802002101200310292001450d00024020012802002203450d00034020011029200321012003280200220b2103200b0d000b0b200110290b024020130d00200241086a41c8f9c4004111108601410021130c030b2036412c6c2203412c6e213c41002117024002400240024020030d004108213d4100213c0c010b203c41ffffff1f71203c470d0a203c41067422014100480d0a20011027223d450d010b024002402032203220036a2237460d00200241b80d6a410172210e41002117203d210c203221050340200241c00a6a41186a2216200541186a290200370300200241c00a6a41106a222d200541106a290200370300200241c00a6a41086a222e200541086a290200370300200220052902003703c00a200241b80d6a2005108c02024002400240024020022d00b80d4101460d00200241003602b8100c010b200241b00b6a41186a200e41186a290000370300200241b00b6a41106a200e41106a290000370300200241b00b6a41086a200e41086a2900003703002002200e2900003703b00b20024198106a200241b00b6a108d0220022802b81022030d010b4200211a4200211b0c010b20024198106a41086a290300211b200229039810211a20022802bc10450d00200310290b2005280220210b4100210d024002402005280228222141306c220f0d0041082104410021210c010b202141ffffff1f712021470d0d202141067422034100480d0d200310272204450d030b2005412c6a21220240200b200b200f6a460d004100210d200421030340200b220141286a290300210a200141206a2903002106200241b80d6a2005108c02024002400240024020022d00b80d4101460d00200241003602b8100c010b200241b00b6a41186a200e41186a290000370300200241b00b6a41106a200e41106a290000370300200241b00b6a41086a200e41086a2900003703002002200e2900003703b00b20024198106a200241b00b6a108d0220022802b810220b0d010b42002118420021190c010b20024198106a41086a2903002119200229039810211820022802bc10450d00200b10290b200141306a210b200241b0016a41b18ac000411610860120024188016a20022903b801200241b0016a41106a290300427f420010d404200241e8006a20182019200229038801420020022802b00122101b22144201201442015620024188016a41086a290300420020101b22144200522014501b22101b2014420020101b10d40420024198016a41b18ac0004116108601200241f8006a20022903a00120024198016a41106a290300427f420010d404200241386a200a420020022903682214420010d304200241d8006a200642002014420010d304200241286a420042002006420010d304200241c8006a2002290378420020022802980122101b221442012014420156200241f8006a41086a290300420020101b22144200522014501b22101b2014420020101b427f200235025c200241d8006a41086a2903002218200229033820022903287c7c221442208684200229034020022903308442005220142018547222101b42ffffffff0f201442208820101b10d304200320063703002003200a370308200341286a200141186a290300370300200341206a200141106a290300370300200341186a200141086a290300370300200341106a2001290300370300200341386a200241c8006a41086a290300370300200341306a2002290348370300200341c0006a2103200d41016a210d200f41506a220f0d000b0b200c201a370300200c201b370308200c2004360230200c41386a200d360200200c41346a2021360200200c20022903c00a370310200c41186a202e290300370300200c41206a202d290300370300200c41286a2016290300370300201741016a2117200c41c0006a210c2022210520222037470d000b0b200242003702940a2002418883c0003602900a024002400240203a450d002013203a4105746a213120024198106a410272213e200241c00a6a41136a2134200241e00a6a41136a213f200241b80d6a4101722121201321050340200241b80d6a2005108c02024002400240024020022d00b80d4101460d00200241003602b8100c010b200241b00b6a41186a202141186a290000370300200241b00b6a41106a202141106a290000370300200241b00b6a41086a202141086a290000370300200220212900003703b00b20024198106a200241b00b6a108d0220022802b81022030d010b420021064200210a0c010b20024198106a41086a290300210a200229039810210620022802bc10450d00200310290b200241b00b6a41186a2222200541186a290000370300200241b00b6a41106a2204200541106a290000370300200241b00b6a41086a2216200541086a290000370300200220052900003703b00b0240024002400240024002400240024020022802900a220e418883c000460d0020022802940a210f0c010b200241b80d6a410041e00210cd041a20024198106a410041900410cd041a41f8061027220e450d014100210f200e41003b0106200e4100360200200e41086a200241b80d6a41e00210ce041a200e41e8026a20024198106a41900410ce041a200241003602940a2002200e3602900a0b200541206a210502400340200e41086a2101200e41066a210c200e2f0106221041057421034100210b024003402003450d01200241b00b6a2001412010d004220d450d03200341606a2103200b41016a210b200141206a2101200d417f4a0d000b200b417f6a21100b0240200f450d00200f417f6a210f200e20104102746a41f8066a280200210e0c010b0b200241b80c6a41186a22032022290300370300200241b80c6a41106a20042903002214370300200241b80c6a41086a20162903002218370300200220022903b00b22193703b80c200220022802980a41016a3602980a200241f80b6a41106a22302014370300200241f80b6a41086a22402018370300200241f80b6a41186a22412003290300370300200220193703f80b200c2f01002201410b490d04200241b80d6a410041e00210cd041a20024198106a410041900410cd041a41f80610272203450d02200341003b010620034100360200200341086a200241b80d6a41e00210ce04210b200341e8026a20024198106a41900410ce04210d200241e00a6a41086a2242200e41d0016a290000370300200241e00a6a41106a2243200e41d8016a290000370300200241e00a6a41186a2244200e41e0016a29000037030020024198106a41086a222d200e4190056a29030037030020024198106a41106a222e200e4198056a29030037030020024198106a41186a2237200e41a0056a29030037030020024198106a41206a2238200e41a8056a29030037030020024198106a41286a2239200e41b0056a2903003703002002200e2900c8013703e00a2002200e2903880537039810200b200e41e8016a200e2f010641796a220141057410ce04210b200d200e41b8056a200141306c10ce04210d200e41063b0106200320013b0106200220022f01e00a3b01ac0b200220022d00e20a3a00ae0b2002203f2900003703980b2002203f41056a224529000037009d0b20022800e30a214620022800e70a214720022800eb0a214820022800ef0a2149200241b80d6a41286a224a2039290300370300200241b80d6a41206a224b2038290300370300200241b80d6a41186a224c2037290300370300200241b80d6a41106a224d202e290300370300200241b80d6a41086a224e202d29030037030020022002290398103703b80d0240024020104107490d002010410574200b6a41c07e6a200b201041796a220f4105746a220b200141ffff0371200f6b41057410cf041a200b41186a2041290300370000200b41106a2030290300370000200b41086a2040290300370000200b20022903f80b370000201041306c200d6a220141e07d6a200141b07d6a2201200341066a220c2f0100200f6b41306c10cf041a200141186a200a370300200120063703102001200a37030820012006370300200141286a4100360200200142083703200c010b200e41086a20104105746a220141206a2001200c2f010020106b41057410cf041a200141186a2041290300370000200141106a2030290300370000200141086a2040290300370000200120022903f80b370000200e41e8026a201041306c6a220141306a2001200c2f010020106b41306c10cf041a200141186a200a370300200120063703102001200a37030820012006370300200141286a4100360200200142083703200b200c200c2f010041016a3b0100200241a00d6a41026a220120022d00ae0b3a00002016204e2903003703002004204d2903003703002022204c290300370300200241b00b6a41206a224f204b290300370300200241b00b6a41286a2250204a290300370300200220022f01ac0b3b01a00d200220022903980b3703c00a2002200229009d0b3700c50a200220022903b80d3703b00b200241d80c6a41286a22512050290300370300200241d80c6a41206a2252204f290300370300200241d80c6a41186a22532022290300370300200241d80c6a41106a22542004290300370300200241d80c6a41086a22552016290300370300200220022903b00b3703d80c200220022f01a00d3b01900b200220012d00003a00920b200220022903c00a3703800b200220022900c50a3700850b0240200e280200220f0d00200241900a6a21012003210b0c060b200e2f0104213541002156200321570340200241b00d6a41026a225820022d00920b3a0000200220022f01900b3b01b00d200220022903800b3703a00d200220022900850b3700a50d20502051290300370300204f2052290300370300202220532903003703002004205429030037030020162055290300370300200220022903d80c3703b00b203541ffff03712110024002400240200f2f01062203410b490d00203e410041a20710cd041a41a8071027220d450d07200d4100360200200d41046a20024198106a41a40710ce041a2044200f41e0016a2900003703002043200f41d8016a2900003703002042200f41d0016a2900003703002002200f2900c8013703e00a2039200f41b0056a2903003703002038200f41a8056a2903003703002037200f41a0056a290300370300202e200f4198056a290300370300202d200f4190056a2903003703002002200f2903880537039810200d41086a200f41e8016a200f2f0106220141796a220341057410ce042159200d41e8026a200f41b8056a200341306c10ce04215a200d41f8066a200f4194076a2001417a6a220c41027410ce04212f200f41063b0106200d20033b01060240200c450d0041002103202f210103402001280200220b20033b0104200b200d360200200141046a2101200c200341016a2203470d000b0b204a2039290300370300204b2038290300370300204c2037290300370300204d202e290300370300204e202d29030037030020022002290398103703b80d200220022f01e00a3b01ac0b200220022d00e20a3a00ae0b20022900e30a210620022900eb0a210a2002204529000037009d0b2002203f2900003703980b203420022903980b370000203441056a220c200229009d0b370000200220022d00ae0b3a00c20a200220022f01ac0b3b01c00a2002200a3700cb0a200220063700c30a2039204a2903003703002038204b2903003703002037204c290300370300202e204d290300370300202d204e290300370300200220022903b80d37039810203541ffff037122014107490d0120592010417a6a220b4105746a2059201041796a22034105746a2201200d2f010620036b41057410cf041a200141186a20022900a50d3700002001204936000f2001204836000b2001204736000720012046360003200141026a20582d00003a0000200120022f01b00d3b0000200120022903a00d370013201041306c205a6a220141e07d6a200141b07d6a2201200d2f0106223520036b41306c10cf041a200141286a2050290300370300200141206a204f290300370300200141186a2022290300370300200141106a2004290300370300200141086a2016290300370300200120022903b00b370300200d203541016a22013b010620104102742235202f6a416c6a202f200b4102746a2210200141ffff0371200b6b41027410cf041a20102057360200200b200d2f010622104b0d02200d20356a41e0066a210103402001280200220b200341016a22033b0104200b200d360200200141046a210120032010490d000c030b0b200f41086a2201201041016a220b4105746a200120104105746a2201200320106b220d41057410cf041a2001204936000f2001204836000b2001204736000720012046360003200141026a20582d00003a0000200120022f01b00d3b0000200120022903a00d370013200141186a20022900a50d370000200f201041306c6a22014198036a200141e8026a220c200d41306c10cf041a20014190036a205029030037030020014188036a204f29030037030020014180036a2022290300370300200141f8026a2004290300370300200141f0026a2016290300370300200c20022903b00b370300200f200341016a22033b01062010410274200f41f8066a22016a41086a2001200b4102746a2201200341ffff0371200b6b41027410cf041a2001205736020002402010200f2f010622034f0d002057200b3b01042057200f360200200b20034f0d002003417f6a210d200f200b417f6a22034102746a4180076a210103402001280200220b200341026a3b0104200b200f360200200141046a2101200d200341016a2203470d000b0b41001a200241900a6a1a200e1a0c090b200f41086a2203201041016a220b4105746a200320104105746a2203200f2f0106223520106b222f41057410cf041a2003204936000f2003204836000b2003204736000720032046360003200341026a20582d00003a0000200320022f01b00d3b0000200320022903a00d370013200341186a20022900a50d370000200f41e8026a201041306c6a220341306a2003202f41306c10cf041a200341286a2050290300370300200341206a204f290300370300200341186a2022290300370300200341106a2004290300370300200341086a2016290300370300200320022903b00b370300200f203541016a22033b01062010410274222f200f41f8066a22356a41086a2035200b4102746a2235200341ffff0371200b6b41027410cf041a203520573602002001200f2f0106220b4f0d00200f202f6a41fc066a2103034020032802002201201041016a22103b01042001200f360200200341046a2103200b2010470d000b0b205641016a21102002419c0d6a41026a220320022d00c20a3a00002040202d2903003703002030202e29030037030020412037290300370300200241f80b6a41206a22012038290300370300200241f80b6a41286a220b2039290300370300200220022f01c00a3b019c0d20022002290398103703f80b200220342900003703880d2002200c29000037008d0d20022800c30a214620022800c70a214720022800cb0a214820022800cf0a21492051200b29030037030020522001290300370300205320412903003703002054203029030037030020552040290300370300200220022903f80b3703d80c200220022f019c0d3b01900b200220032d00003a00920b200220022903880d3703800b2002200229008d0d3700850b0240200f28020022030d00200f1a200241900a6a22011a200d210b0c070b200f2f01042135200241900a6a1a200f1a2003210f200d2157201021560c000b0b200e200b41306c6a22034180036a200a370300200341f8026a2006370300200341f0026a200a370300200341e8026a200637030020034190036a410036020020034188036a220b28020021012003418c036a2802002103200b42083703002001450d052003450d05200110290c050b41f8064108102a000b41f8064108102a000b41a8074108102a000b200e20104105746a220341286a200341086a220b200120106b41057410cf041a200341206a2041290300370000200341186a2030290300370000200341106a2040290300370000200b20022903f80b370000200e201041306c6a22034198036a200341e8026a2201200e2f010620106b41306c10cf041a20034190036a410036020020034188036a420837030020034180036a200a370300200341f8026a2006370300200341f0026a200a37030020012006370300200e200e2f010641016a3b01060c010b203e410041a20710cd041a41a80710272203450d0320034100360200200341046a20024198106a41a40710ce041a20032001280200220d3602f806200120033602002001200128020441016a360204200d41003b0104200d2003360200200320032f0106220d4105746a220141086a20022f01900b3b00002001410a6a20022d00920b3a0000200141176a2049360000200141136a20483600002001410f6a20473600002001410b6a20463600002001411b6a20022903800b370000200141206a20022900850b3700002003200d41306c6a220141e8026a20022903d80c370300200141f0026a2055290300370300200141f8026a205429030037030020014180036a205329030037030020014188036a205229030037030020014190036a2051290300370300200341f8066a200d41016a22014102746a200b360200200320013b0106200b20013b0104200b2003360200200e1a0b20052031470d000b0b20174106742203450d04203d20036a212d203d211603402016450d05024020162802382203450d002016280230222220034106746a2104201641106a212103402022220c41106a210e200c41c0006a2122200241900a6a210320022802940a2110024003402003280200220f41086a2101200f2f0106220541057421034100210b0240024003402003450d01200e2001412010d004220d450d02200341606a2103200b41016a210b200141206a2101200d417f4a0d000b200b417f6a21050b2010450d022010417f6a2110200f20054102746a41f8066a21030c010b0b200f200b41306c6a220341e8026a2201427f20012903002206200c2903307c220a200a2006542201200341f0026a220b2903002206200c41386a220d2903007c2001ad7c220a200654200a2006511b22011b370300200b427f200a20011b37030020024198106a41086a220e202141086a2900003703002021290000210620024198106a41106a220f202141106a29000037030020024198106a41186a2210202141186a2900003703002002200637039810200d2903002106200c290330210a20034188036a210d0240024020034190036a220b28020022012003418c036a280200460d00200d28020021030c010b200141016a22032001490d1120014101742205200320032005491b2205ad42307e2214422088a70d112014a7220c4100480d110240024020010d00200c102721030c010b200d280200200141306c200c102821030b2003450d06200d2003360200200d41046a2005360200200b28020021010b2003200141306c6a220320063703082003200a3703002003200229039810370310200341186a200e290300370300200341206a200f290300370300200341286a2010290300370300200b200b28020041016a3602000b20222004470d000b0b201641c0006a2216202d470d000c050b0b41a8074108102a000b200c4108102a000b20034108102a000b20014108102a000b200241f80b6a41086a22034200370300200242003703f80b41cdf8c4004116200241f80b6a1004200241b80d6a41086a2003290300370300200220022903f80b3703b80d2002410036029810200241b80d6a411020024198106a10052103024002400240200228029810220b417f460d002003450d002002200b3602b40b200220033602b00b20024198106a200241b00b6a102d2002280298102237450d02200241a0106a2802002101200228029c102138200b450d01200310290c010b4100213841012137410021010b024002400240024002400240024020014105742204450d00203721030340410f10272201450d07200141076a4100290091a3443700002001410029008aa3443700002001410f412f10282201450d062001200329000037000f200141276a200341186a220f2900003700002001411f6a200341106a2210290000370000200141176a200341086a2205290000370000200241c00a6a41186a220b4200370300200241c00a6a41106a220d4200370300200241c00a6a41086a220e4200370300200242003703c00a2001412f200241c00a6a1000200241b80d6a41186a220c200b290300370300200241b80d6a41106a2221200d290300370300200241b80d6a41086a2222200e290300370300200220022903c00a3703b80d200241b80d6a4120100c20011029411210272201450d05200141106a41002f00c4a344222e3b0000200141086a41002900bca3442206370000200141002900b4a344220a37000020014112413210282201450d04200120032900003700122001412a6a200f290000370000200141226a20102900003700002001411a6a2005290000370000200b4200370300200d4200370300200e4200370300200242003703c00a20014132200241c00a6a1000200c200b2903003703002021200d2903003703002022200e290300370300200220022903c00a3703b80d200241206a200241b80d6a412010c102200228022421162002280220212d20011029024020164100202d1b22164102490d00411210272201450d04200141106a202e3b0000200141086a20063700002001200a37000020014112413210282201450d03200120032900003700122001412a6a200f290000370000200141226a20102900003700002001411a6a2005290000370000200b4200370300200d4200370300200e4200370300200242003703c00a20014132200241c00a6a1000200c200b2903003703002021200d2903003703002022200e290300370300200220022903c00a3703b80d20022016417f6a36029810200241b80d6a412020024198106a41041003200110290b200341206a2103200441606a22040d000b0b02402038450d00203710290b20022802900a210f024020022802940a2203450d00200321010340200f2802f806210f2001417f6a22010d000b03402003417f6a22030d000b0b024020022802980a22210d00427f2114427f21060c090b02400240200f2f0106450d00200f41e8026a210d200f41086a210e4101210c0c010b02400240200f28020022030d004100210b41002101410021030c010b200f2f0104210b410121010b0240200b20032f0106490d000340200141016a210120032f0104220b200328020022032f01064f0d000b0b2003200b41306c6a41e8026a210d2003200b4105746a41086a210e200b41027420036a41fc066a280200210f4100210c2001417f6a2203450d000340200f2802f806210f2003417f6a22030d000b0b20024198106a41106a212d427f2114427f21060340200d41086a2203290300210a200d2903002118200241b00b6a41186a2222200e41186a290000370300200241b00b6a41106a2204200e41106a290000370300200241b00b6a41086a2216200e41086a2900003703002002200e2900003703b00b200d280228220ead42307e2219422088a70d082019a72201417f4c0d08200d41186a29030021192003290300211a200d290310211b200d290300211f200d2802202103024002400240024002400240024020010d00410821100c010b200110272210450d010b02400240200e0d004100210b0c010b2003200e41306c6a210d4100210b201021010340200120032903003703002001200341086a290300370308200141106a200341106a290300370300200141186a200341186a290300370300200141206a200341206a290300370300200141286a200341286a290300370300200141306a2101200b41016a210b200341306a2203200d470d000b0b20024198106a41186a20193703002002201b3703a8102002201f370398102002200b3602c0102002200e3602bc10200220103602b8102002201a3703a010410f10272203450d01200341076a4100290091a3443700002003410029008aa3443700002003410f412f10282205450d02200520022903b00b37000f200541276a20222903003700002005411f6a2004290300370000200541176a2016290300370000200241c00a6a41186a22034200370300200241c00a6a41106a22014200370300200241c00a6a41086a220b4200370300200242003703c00a2005412f200241c00a6a1000200241b80d6a41186a2003290300370300200241b80d6a41106a2001290300370300200241b80d6a41086a200b290300370300200220022903c00a3703b80d200241003602800c200242013703f80b200220024198106a3602d80c200241d80c6a200241f80b6a10592002202d3602d80c200241d80c6a200241f80b6a105920022802b8102103200220022802c01022013602d80c200241d80c6a200241f80b6a103002402001450d00200141306c210d03400240024020022802fc0b220b20022802800c22016b4120490d0020022802f80b210b0c010b200141206a220e2001490d17200b4101742210200e200e2010491b220e4100480d1702400240200b0d00200e1027210b0c010b20022802f80b200b200e1028210b0b200b450d062002200e3602fc0b2002200b3602f80b0b200b20016a220b41086a200341186a290000370000200b41106a200341206a290000370000200b41186a200341286a2900003700002002200141206a3602800c200b200341106a290000370000200220033602d80c200241d80c6a200241f80b6a1059200341306a2103200d41506a220d0d000b0b20182014542103200a2006512101200a200654210b20022802fc0b210d200241b80d6a412020022802f80b220e20022802800c10030240200d450d00200e10290b2003200b20011b21032021417f6a212120051029024020022802bc10450d0020022802b81010290b200a200620031b21062018201420031b21142021450d0e0240200c200f2f01064f0d00200f200c41306c6a41e8026a210d200f200c4105746a41086a210e200c41016a210c0c060b02400240200f28020022030d004100210b41002101410021030c010b200f2f0104210b410121010b200b20032f0106490d040340200141016a210120032f0104220b200328020022032f01064f0d000c050b0b20014108102a000b410f4101102a000b412f4101102a000b200e4101102a000b2003200b41306c6a41e8026a210d2003200b4105746a41086a210e200b41027420036a41fc066a280200210f4100210c2001417f6a2203450d000340200f2802f806210f2003417f6a22030d000c010b0b0b41324101102a000b41124101102a000b41324101102a000b41124101102a000b412f4101102a000b410f4101102a000b418f89c3004133104e000b1039000b200241f80b6a41086a22034200370300200242003703f80b41c8f9c4004111200241f80b6a1004200241b80d6a41086a22012003290300370300200220022903f80b3703b80d200220063703a0102002201437039810200241b80d6a411020024198106a4110100320034200370300200242003703f80b41cdf8c4004116200241f80b6a100420012003290300370300200220022903f80b3703b80d200241003602a01020024201370398102002203a3602b00b200241b00b6a20024198106a103002400240203a0d0020022802a0102101200228029c10210e200228029810210f0c010b203a4105742110410020022802a01022016b210d200228029810210f200228029c10210e2013210303400240200e200d6a411f4b0d00200141206a220b2001490d08200e4101742205200b200b2005491b220b4100480d0802400240200e0d00200b1027210f0c010b200f200e200b1028210f0b200f450d07200b210e0b200f20016a220b2003290000370000200b41186a200341186a290000370000200b41106a200341106a290000370000200b41086a200341086a290000370000200d41606a210d200141206a2101200341206a2103201041606a22100d000b2002200e36029c10200220013602a0102002200f360298100b200241b80d6a4110200f200110030240200e450d00200f10290b20022802980a211020022802900a210b024020022802940a2203450d000340200b2802f806210b2003417f6a22030d000b0b02402010450d004100210d410021030340024002402003200b2f01064f0d00200b200341306c6a2201418c036a280200210f20014188036a2802002101200341016a21030c010b02400240200b28020022030d00200dad21064100210e410021030c010b200b330104422086200dad8421064101210e0b200b10292006a7210d024002402006422088a7220f20032f01064f0d00200321010c010b034002400240200328020022010d00200dad2106410021010c010b200e41016a210e2003330104422086200dad8421060b200310292006a7210d200121032006422088a7220f20012f01064f0d000b0b200f41027420016a41fc066a280200210b2001200f41306c6a2203418c036a280200210f20034188036a28020021010240200e417f6a2203450d000340200b2802f806210b2003417f6a22030d000b0b410021030b2001450d012010417f6a21100240200f450d00200110290b20100d000b0b0240200b418883c000460d00200b2802002103200b10292003450d0020032802002101200310292001450d00024020012802002203450d00034020011029200321012003280200220b2103200b0d000b0b200110290b02402017450d0020174106742101203d41306a210303400240200341046a280200450d00200328020010290b200341c0006a2103200141406a22010d000b0b203aad21060240203c450d00203d10290b20064220862106203bad210a02402036450d002036412c6c2101203241206a210303400240200341046a280200450d00200328020010290b2003412c6a2103200141546a22010d000b0b2006200a8421062033450d00203210290b02402012452015720d00201110290b20130d0102402007450d00200741d0006c2101200841c0006a210303400240200341046a280200450d00200328020010290b200341d0006a2103200141b07f6a22010d000b0b2009450d00200810290b200041003602000c010b200020063702042000201336020002402007450d00200741d0006c2101200841c0006a210303400240200341046a280200450d00200328020010290b200341d0006a2103200141b07f6a22010d000b0b2009450d00200810290b200241c0176a24000f0b200b4101102a000b102b000b418f89c3004133104e000b9f0501067f230041c0046b22012400200141b8036a41086a22024200370300200142003703b8034188d4c3004116200141b8036a100420014190016a41086a2002290300370300200120012903b80337039001200141003602b80320014190016a4110200141b8036a10052103024002400240024020012802b8032204417f470d00411221020c010b200120043602ac02200120033602a802200141b8036a200141a8026a103c20012802b8034112460d02200141b0026a200141b8036a41880110ce041a200141003a00a001200141a0016a20012802a802220520012802ac022202410047220610ce041a20022006490d012001200220066b3602ac022001200520066a3602a802024002402002450d0020012d00a00122054103490d010b200141b0026a103d0c030b20012802b0022102200141a0016a200141b0026a41047241840110ce041a20024112460d02200141b8036a200141a0016a41840110ce041a02402004450d00200310290b20014190016a4110100c0b2001410c6a200141b8036a41840110ce041a0240024020024112470d00419ed4c30021060c010b200141b0026a2001410c6a41840110ce041a200141013a00a001200141b8036a41086a22064200370300200142003703b80341f586c500411f200141b8036a100420014190016a41086a2006290300370300200120012903b8033703900120014190016a4110200141a0016a41011003200641023a0000200141053a00b8034100210641b8d6c5004100200141b8036a108801200120023602b803200141b8036a410472200141b0026a41840110ce041a200141a0016a20004280ce187c200141b8036a20054280af1a10b50320012802a0014101470d0020012802a40121060b200141c0046a240020060f0b20062002103e000b418f89c3004133104e000bb81304077f137e017f047e23004180036b22012400200141c0016a41086a22024200370300200142003703c00141b7d2c3004115200141c0016a1004200141d8026a41086a2002290300370300200120012903c0013703d802200141003602c001200141d8026a4110200141c0016a100521020240024002400240024002400240024002400240024020012802c0012203417f460d002002450d002001200336022c20012002360228200141c0016a200141286a103f20012802c0012204450d02200141c8016a280200210520012802c40121062003450d01200210290c010b4108210441002105410021060b0240200541b0016c22020d00200141003602302001200436022c200120043602282001200141f8026a3602340c080b200420026a2103200141c0016a20042802880110b603200441b0016a21020240024020012802d00122070d0042002108420021090c010b200141186a20012903c001200141c0016a41086a290300200141d8016a350200420010d304200141186a41086a29030021092001290318210820012802d401450d00200710290b200141013602302001200336022c200120023602282001200141f8026a3602342004450d072004ad422086210a024020022003460d00200541b0016c41d07e6a21034201210b0340200141c0016a20024188016a28020010b6030240024020012802d00122070d004200210c4200210d0c010b200141086a20012903c001200141c0016a41086a29030020013502d801420010d304200141086a41086a290300210d2001290308210c20012802d401450d00200710290b02402008200c562009200d562009200d511b0d002002ad422086200b84210a200c2108200d21090b200241b0016a2102200b42017c210b200341d07e6a22030d000b0b200a428080808010540d072005200aa722024d0d0120042005417f6a220741b0016c6a22034180016a290300210d20034188016a290300210920034190016a290300210b20034198016a290300210c200341e0006a2903002108200341e8006a290300210a200341f0006a290300210e200341f8006a290300210f200341c0006a2903002110200341c8006a2903002111200341d0006a2903002112200341d8006a2903002113200341206a2903002114200341286a2903002115200341306a2903002116200341386a290300211720032903002118200329030821192003290310211a2004200241b0016c6a220241186a221b290300211c200341a8016a290300211d200341a0016a290300211e201b200341186a2903003703002002290310211f2002201a3703102002290308211a200220193703082002290300211920022018370300200241386a2203290200211820032017370200200241306a2203290200211720032016370200200241286a2203290200211620032015370200200241206a2203290200211520032014370200200241d8006a2203290200211420032013370200200241d0006a2203290200211320032012370200200241c8006a2203290200211220032011370200200241c0006a2203290200211120032010370200200241f8006a220329020021102003200f370200200241f0006a2203290200210f2003200e370200200241e8006a2203290200210e2003200a370200200241e0006a2203290200210a2003200837020020024198016a200c37020020024190016a200b37020020024188016a2203280200211b2003200937020020024180016a220329020021092003200d370200200241a0016a201e370200200241a8016a201d370200200141286a41f8006a2010370300200141286a41f0006a200f370300200141286a41e8006a200e370300200141286a41e0006a200a370300200141286a41d8006a2014370300200141286a41d0006a2013370300200141286a41c8006a2012370300200141286a41c0006a2011370300200141286a41386a2018370300200141286a41306a2017370300200141286a41286a2016370300200141286a41206a2015370300200141286a41186a201c370300200141286a4180016a20093703002001201f3703382001201a37033020012019370328200120073602b801200120063602b401200120043602b001200141c0016a41086a22024200370300200142003703c00141b7d2c3004115200141c0016a1004200141d8026a41086a2002290300370300200120012903c0013703d802200141103602c4012001200141d8026a3602c001200141b0016a200141c0016a103302402007450d00200541b0016c41d07e6a21032004210203402002103d200241b0016a2102200341d07e6a22030d000b0b02402006450d00200410290b411310272202450d022002410f6a41002800ecd143360000200241086a41002900e5d143370000200241002900ddd14337000020024113412610282202450d032002201b360013200141c0016a41186a22034200370300200141c0016a41106a22074200370300200141c0016a41086a22044200370300200142003703c00120024117200141c0016a1000200141d8026a41186a2003290300370300200141d8026a41106a2007290300370300200141d8026a41086a2004290300370300200120012903c0013703d802200141003602c001200141d8026a4120200141c0016a1005210320012802c0012207417f460d052003450d05200120033602b001200120073602b401200142003703c801200142003703c001200141c0016a20032007411020074110491b220410ce041a2001200720046b3602b4012001200320046a3602b0012007410f4d0d04200141c8016a290300210920012903c001210d200141c0016a200141b0016a102d20012802c0012207450d0420012902c401210b20031029200141d8026a4120100c200b422088a72104200ba721050c060b418f89c3004133104e000b41ccd2c300200220051037000b41134101102a000b41264101102a000b418f89c3004133104e000b410021070b200210290240024020070d00200141286a103d0c010b024020044105742203450d002007210203402002200d200910ad01200241206a2102200341606a22030d000b0b200141e8016a2009370300200141e0016a200d370300200141d8016a2004360200200141d4016a2005360200200141d0016a2007360200200141cc016a201b360200200141c8016a41013a0000200141053a00c00141b8d6c5004100200141c0016a108801200141c0016a200141286a41880110ce041a200141d8026a20004280ce187c200141c0016a41004280af1a10b50320012802d8024101470d0020012802dc0221020c020b410021020c010b02402005450d00200541b0016c21032004210203402002103d200241b0016a2102200341d07e6a22030d000b0b41dcd2c30021022006450d00200410290b20014180036a240020020bda0604047f017e047f017e230041d0046b22022400024002400240411a10272203450d00200341186a41002f00dbd1433b0000200341106a41002900d3d143370000200341086a41002900cbd143370000200341002900c3d1433700002003411a413410282203450d012003200136001a200241c0026a41186a22014200370300200241c0026a41106a22044200370300200241c0026a41086a22054200370300200242003703c0022003411e200241c0026a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903c002370300200241003602c00220024120200241c0026a1005210102400240024020022802c0022204417f460d002001450d002002200136022020022004360224200242003703c002200241c0026a20012004410820044108491b220510ce041a2002200420056b3602242002200120056a3602200240200441074d0d0020022903c0022106200241c0026a200241206a103c20022802c0022105200241cc036a200241c0026a41047241840110ce041a20054112460d00200241bc016a200241cc036a41840110ce041a20022005360230200241306a410472200241bc016a41840110ce042107200241003a00c002200241c0026a2002280220220820022802242209410047220a10ce041a2009200a490d0620022009200a6b220436022420022008200a6a220a360220024002402009450d0020022d00c00222084103490d010b200241306a103d0c010b200242003703c002200241c0026a200a2004410820044108491b220910ce041a2002200420096b3602242002200a20096a360220200441074b0d02200241306a103d0b418f89c3004133104e000b200041123602080c010b20022903c002210b200241c0026a200741840110ce041a200220022800293602cc0320022002412c6a2800003600cf03200241306a200241c0026a41840110ce041a200220022800cf033600bf01200220022802cc033602bc012001102920002005360208200020063703002000410c6a200241306a41840110ce041a20004198016a20083a000020004190016a200b370200200020022802bc01360099012000419c016a20022800bf013600000b20031029200241d0046a24000f0b411a4101102a000b41344101102a000b200a2009103e000bfc0202047f017e230041d0006b22022400024002400240411310272203450d002003410f6a4100280096d243360000200341086a410029008fd24337000020034100290087d24337000020034113412610282203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1000200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033037030820024100360230200241086a4120200241306a100521040240024020022802302201417f460d002002200136022c20022004360228200241306a200241286a102d20022802302205450d042002290234210602402001450d00200410290b20002006370204200020053602000c010b20004100360208200042013702000b20031029200241d0006a24000f0b41134101102a000b41264101102a000b418f89c3004133104e000bc80301047f230041c0006b2202240002400240024002400240411010272203450d00200341086a41002900a6d1433700002003410029009ed1433700002001280200210420034110412010282203450d01200320043600102003412041c00010282203450d02200320012900043700142003412c6a2001411c6a290000370000200341246a200141146a2900003700002003411c6a2001410c6a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034134200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290320370300410021042002410036022020024120200241206a100521050240024020022802202201417f460d00200241003a0020200241206a20052001410047220410ce041a20012004490d052001450d0620022d0020220141ff0071220441064f0d0620051029200141077621010c010b410021010b20031029200020043a0001200020013a0000200241c0006a24000f0b41104101102a000b41204101102a000b41c0004101102a000b20042001103e000b418f89c3004133104e000b8f0e04017f047e117f087e230041a0036b22052400024002400240024002400240024020040d00420021064200210742002108420021090c010b20054180036a41186a220a420037030020054180036a41106a220b420037030020054180036a41086a220c42003703002005420037038003419ad2c300411d20054180036a1000200541c0026a41186a200a290300370300200541c0026a41106a200b290300370300200541c0026a41086a200c29030037030020052005290380033703c0024100210c200541003602d801200541c0026a4120200541d8016a1005210d024020052802d801220a417f460d0020054180036a200a4120200a4120491b220b6a410041004120200b6b200b411f4b1b10cd041a20054180036a200d200b10ce041a200a411f4d0d02200541d8016a41186a220a20054180036a41186a290300370300200541d8016a41106a220b20054180036a41106a290300370300200541d8016a41086a220c20054180036a41086a29030037030020052005290380033703d801200d102920054190016a41186a200a29030037030020054190016a41106a200b29030037030020054190016a41086a200c290300370300200520052903d801370390014101210c0b41281027220b450d02200b200c3a0004200b41b8d6c500360200200b200529039001370005200b20052f00d8013b0025200b410d6a20054190016a41086a290300370000200b41156a20054190016a41106a290300370000200b411d6a20054190016a41186a290300370000200b41276a200541da016a2d00003a000020054190016a200b10ad0342002108420021094200210642002107024020052d00d0014106460d002004417f6a210e200541d8016a41c0006a210f200541d8016a41206a2110200541d8016a41186a2111200341ff0171211242002106420021074200210842002109034020112007370300200520063703e801200520083703d801200520093703e001201020054190016a41c10010ce04210a02400240200f2002460d00200f2002412010d0040d010b200541e0026a41186a220c200a41186a2213290200370300200541e0026a41106a220d200a41106a2214290200370300200541e0026a41086a2215200a41086a22162902003703002005200a2902003703e002411010272204450d06200441086a41002900a6d1433700002004410029009ed14337000020044110412010282204450d07200420013600102004412041c00010282204450d08200420052903e0023700142004412c6a200c290300370000200441246a200d2903003700002004411c6a201529030037000020054180036a41186a2217420037030020054180036a41106a2218420037030020054180036a41086a2219420037030020054200370380032004413420054180036a1000200541c0026a41186a2017290300370300200541c0026a41106a2018290300370300200541c0026a41086a201929030037030020052005290380033703c002200541c0026a412041b8d6c50041004100100b211a20041029201a417f470d0020052d00b8022104200c2013290000370300200d2014290000370300201520162900003703002005200a2900003703e00202404100417f4101200420124b1b20042012461b41016a41014b0d00200321040b20054180016a200541e0026a10950120054180016a41086a290300211b200529038001211c02400240200441ff01710d002005201c201b420a420010d4042017200c2903003703002018200d29030037030020192015290300370300200520052903e00237038003200541106a200120054180036a4100200e10aa03200541106a41186a290300211d200541106a41086a290300211e2005290320211f2005290310212020052903002221211c200541086a2903002222211b0c010b200541c0006a201b42002004ad42ff01832221420010d304200541d0006a201c42002021420010d3042017200c2903003703002018200d29030037030020192015290300370300200520052903e00237038003200541e0006a200120054180036a2004200e10aa03200541306a42004200201c420010d304427f200541d0006a41086a2903002221200529034020052903307c7c221d2005290348200529033884420052201d2021547222041b2122427f200529035020041b2121200541e0006a41186a290300211d200541e0006a41086a290300211e2005290370211f200529036021200b201b20077c201c20067c2207201c54ad7c201d7c2007201f7c2206200754ad7c2107202220097c202120087c2209202154ad7c201e7c200920207c2208200954ad7c21090b20054190016a200b10ad0320052d00d0014106470d000b0b200b10290b2000200637031020002008370300200041186a200737030020002009370308200541a0036a24000f0b418f89c3004133104e000b41284104102a000b41104101102a000b41204101102a000b41c0004101102a000b8607010d7f230041e0006b220124000240024002400240024002400240411a10272202450d00200241186a41002f00dbd1433b0000200241106a41002900d3d143370000200241086a41002900cbd143370000200241002900c3d1433700002002411a413410282202450d012002200036001a200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002411e200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100c20021029411310272202450d022002410f6a4100280096d243360000200241086a410029008fd24337000020024100290087d24337000020024113412610282202450d0320022000360013200141c0006a41186a22044200370300200141c0006a41106a22054200370300200141c0006a41086a220342003703002001420037034020024117200141c0006a1000200141206a41186a22062004290300370300200141206a41106a22072005290300370300200141206a41086a200329030037030020012001290340370320200141206a4120100c20021029200141c0006a200010a8032001280244210820012802402109024020012802482202450d002002410574210a200921030340200141186a220b200341186a290000370300200141106a220c200341106a290000370300200141086a220d200341086a29000037030020012003290000370300411010272202450d06200241086a41002900a6d1433700002002410029009ed14337000020024110412010282202450d07200220003600102002412041c00010282202450d08200341206a2103200220012903003700142002412c6a200b290300370000200241246a200c2903003700002002411c6a200d2903003700002004420037030020054200370300200141c0006a41086a220b42003703002001420037034020024134200141c0006a10002006200429030037030020072005290300370300200141206a41086a200b29030037030020012001290340370320200141206a4120100c20021029200a41606a220a0d000b0b02402008450d00200910290b200141e0006a24000f0b411a4101102a000b41344101102a000b41134101102a000b41264101102a000b41104101102a000b41204101102a000b41c0004101102a000bfa0201057f230041d0006b22022400024002400240411710272203450d002003410f6a41002900ffd143370000200341086a41002900f8d143370000200341002900f0d14337000020034117412e10282203450d0120032001370017200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a22064200370300200242003703302003411f200241306a1000200241086a41186a2004290300370300200241086a41106a2005290300370300200241086a41086a20062903003703002002200229033037030820024100360230200241086a4120200241306a100521050240024020022802302204417f460d002002200436022c20022005360228200241306a200241286a103b20022802302206450d042002290234210102402004450d00200510290b20002001370204200020063602000c010b20004100360208200042083702000b20031029200241d0006a24000f0b41174101102a000b412e4101102a000b418f89c3004133104e000bec0903037f047e097f23002202210320024180036b416071220224002001411c6a220429020021052004200229039802370200200141146a2204290200210620042002290390023702002001410c6a220429020021072004200229038802370200200241003a00800220012902042108200120022903800237020420022005370378200220063703702002200737036820022008370360200141246a2d0000210920024180026a41176a2204200537000020024180026a41106a220a200229007137030020024180026a41086a220b2002290069370300200220022900613703800202402008a741ff01714101460d00200041063a0040200324000f0b200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b29030037030020022002290380023703180240024002400240411510272204450d002004410d6a41002900bbd143370000200441086a41002900b6d143370000200441002900aed14337000020044115413510282204450d0120042002290318370015200420093a00342004412c6a2002412f6a290000370000200441256a200241186a41106a2903003700002004411d6a200241186a41086a29030037000020024180026a41186a220a420037030020024180026a41106a220b420037030020024180026a41086a220c420037030020024200370380022004413520024180026a1000200241e0016a41186a200a290300370300200241e0016a41106a200b290300370300200241e0016a41086a200c29030037030020022002290380023703e0012002410036028002200241e0016a412020024180026a1005210d200228028002220e417f460d032002200e36023c2002200d36023820024180026a200241386a10fc0220022d00a1024102460d02200241b8016a41206a220a20024180026a41206a2d00003a0000200241b8016a41186a220b20024180026a41186a290300370300200241b8016a41106a220c20024180026a41106a290300370300200241b8016a41086a220f20024180026a41086a29030037030020022002290380023703b801200241e0006a200241a2026a41c10010ce041a0240200e450d00200d10290b200241386a41086a220e200f290300370300200241386a41106a220d200c290300370300200241386a41186a2210200b290300370300200241386a41206a2211200a2d00003a0000200220022903b80137033820024180026a200241e0006a41c10010ce041a200a20112d00003a0000200b2010290300370300200c200d290300370300200f200e290300370300200220022903383703b801200241e0006a20024180026a41c10010ce041a200141246a200241e0006a41c0006a2d00003a00002001411c6a200241e0006a41386a290000370000200141146a200241e0006a41306a2900003700002001410c6a200241e0006a41286a290000370000200120022900800137000420002002290318370000200041086a200241186a41086a290300370000200041106a200241186a41106a290300370000200041176a200241186a41176a290000370000200020093a001f200020022903b801370020200041286a200f290300370000200041306a200c290300370000200041386a200b290300370000200041c0006a200a2d00003a000020041029200324000f0b41154101102a000b41354101102a000b418f89c3004133104e000b41b6b7c30041d700104e000bd50703037f047e047f230022022103200241a0026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042005370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a00102402008a741ff01714101460d0020004200370300200324000f0b200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a0013703000240024002400240411210272204450d00200441106a41002f0088a3443b0000200441086a4100290080a344370000200441002900f8a24437000020044112413210282204450d0120042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41186a220a4200370300200241a0016a41106a220b4200370300200241a0016a41086a220c4200370300200242003703a00120044132200241a0016a100020024180016a41186a200a29030037030020024180016a41106a200b29030037030020024180016a41086a200c290300370300200220022903a00137038001200241003602a00120024180016a4120200241a0016a1005210b20022802a001220a417f460d032002200a36029c022002200b36029802200241a0016a20024198026a10af0320022d00b8014102460d02200241a0016a41086a290300210520022903a001210820022802b001210c200241206a200241b9016a41c70010ce041a0240200a450d00200b10290b200241a0016a200241206a41c10010ce041a200241206a200241a0016a41c10010ce041a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2005370300200041286a2008370300200041386a200c360200200020093a00272000420137030020041029200324000f0b41124101102a000b41324101102a000b418f89c3004133104e000b41b6b7c30041d700104e000b860905027f027e057f017e027f23004190026b22022400200241206a2001102e0240024002402002280220450d0020022802242103200241086a200110532002290308a70d010b200041023a00180c010b200241186a290300210420022903102105200241003a00f001200241f0016a2001280200220620012802042207410047220810ce041a02400240024020072008490d002001200720086b22093602042001200620086a22083602002007450d0220022d00f001220741014b0d02410021060240024020070e020100010b200241f0016a2009412020094120491b22076a41004100412020076b2007411f4b1b10cd041a200241f0016a2008200710ce041a2001200920076b220a3602042001200820076a22083602002009411f4d0d03200241b0016a41086a200241f0016a41086a290000220b37030020024190016a41186a200241f0016a41186a29000037030020024190016a41106a200241f0016a41106a29000037030020024190016a41086a200b370300200220022900f001220b3703b0012002200b3703900141012106200a21090b200241f0006a41186a20024190016a41186a290300370300200241f0006a41106a20024190016a41106a290300370300200241f0006a41086a20024190016a41086a2903003703002002200229039001370370200241003a00f001200241f0016a20082009410047220710ce041a20092007490d012001200920076b220a3602042001200820076a22073602002009450d0220022d00f001220841014b0d02410021090240024020080e020100010b200241f0016a200a4120200a4120491b22086a41004100412020086b2008411f4b1b10cd041a200241f0016a2007200810ce041a2001200a20086b3602042001200720086a360200200a411f4d0d03200241b0016a41086a200241f0016a41086a290000220b37030020024190016a41186a200241f0016a41186a29000037030020024190016a41106a200241f0016a41106a29000037030020024190016a41086a200b370300200220022900f001220b3703b0012002200b37039001410121090b200241306a41186a220120024190016a41186a290300370300200241306a41106a220720024190016a41106a290300370300200241306a41086a220820024190016a41086a290300370300200241d0006a41086a220a200241f0006a41086a290300370300200241d0006a41106a220c200241f0006a41106a290300370300200241d0006a41186a220d200241f0006a41186a2903003703002002200229039001370330200220022903703703502000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290350370019200041216a200a290300370000200041296a200c290300370000200041316a200d2903003700002000413a6a2002290330370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a2002412e6a2f01003b0100200041da006a200228012a3601000c030b20082007103e000b20072009103e000b200041023a00180b20024190026a24000b3400200041ceb8c30036020420004100360200200041146a4107360200200041106a41d4b8c300360200200041086a42043702000b950101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120102722060d0041204101102a000b20062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000b130020004102360204200041e4c5c3003602000b3101017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242f02e3700000b3101017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242eb023700000bef0803037f017e047f230041f0026b22052400200541c986c500411910b5010240024002402005280204410020052802001b2206417f6a220720064d0d00200541123602100c010b200541086a200710a70320052802104112460d00200541a8016a200541086a41a00110ce041a20052903a8012108200541a8016a41086a103d20082001580d00200041f7d2c30036020420004101360200200041086a41c7003602002002103d0c010b200541a8016a41086a22074200370300200542003703a80141c986c5004119200541a8016a1004200541086a41086a2007290300370300200520052903a8013703082005200641016a3602a801200541086a4110200541a8016a41041003200520013703a8012007200241880110ce042109200520033a00c002200520043703b802024002400240024002400240411a10272207450d00200741186a41002f00dbd1433b0000200741106a41002900d3d143370000200741086a41002900cbd143370000200741002900c3d1433700002007411a413410282202450d012002200636001a200541086a41186a22074200370300200541086a41106a220a4200370300200541086a41086a220b4200370300200542003703082002411e200541086a1000200541c8026a41186a2007290300370300200541c8026a41106a200a290300370300200541c8026a41086a200b290300370300200520052903083703c802200541003602102005420137030820052903a8012101410810272207450d022005410836020c20052005280210220a41086a360210200520073602082007200a6a20013700002009200541086a1032024020052d00c002220741024b0d00024002400240024020070e03000102000b4100210a0c020b4101210a0c010b4102210a0b2005200a3a00ef0202400240200528020c20052802102207460d002005280208210b0c010b200741016a220b2007490d072007410174220c200b200b200c491b220c4100480d070240024020070d00200c1027210b0c010b20052802082007200c1028210b0b200b450d052005200c36020c2005200b360208200528021021070b2005200741016a360210200b20076a200a3a00000b20052903b802210102400240200528020c220a200528021022076b4108490d002005280208210a0c010b200741086a220b2007490d06200a4101742207200b200b2007491b22074100480d0602400240200a0d0020071027210a0c010b2005280208200a20071028210a0b200a450d052005200736020c2005200a360208200528021021070b2005200741086a360210200a20076a2001370000200528020c2107200541c8026a41202005280208220a2005280210100302402007450d00200a10290b200210292009103d200541b4016a2006360200200541b1016a20033a0000200541a8016a41086a41033a0000200541053a00a80141b8d6c5004100200541a8016a10880120004100360200200020063602040c060b411a4101102a000b41344101102a000b41084101102a000b200c4101102a000b20074101102a000b102b000b200541f0026a24000bd10302047f037e230041d0006b2202240002400240411310272203450d002003410f6a41002800ecd143360000200341086a41002900e5d143370000200341002900ddd14337000020034113412610282203450d0120032001360013200241286a41186a22014200370300200241286a41106a22044200370300200241286a41086a220542003703002002420037032820034117200241286a1000200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229032837030820024100360228200241086a4120200241286a1005210102400240024020022802282204417f460d002001450d00200220013602482002200436024c2002420037033020024200370328200241286a20012004411020044110491b220510ce041a2002200420056b36024c2002200120056a36024802402004410f4d0d00200241306a290300210620022903282107200241286a200241c8006a102d200228022822040d020b418f89c3004133104e000b410021040c010b200229022c2108200110292000200637030820002007370300200020083702140b2000200436021020031029200241d0006a24000f0b41134101102a000b41264101102a000b130020004111360204200041bcd4c3003602000b3400200041f3f3c30036020420004100360200200041146a410f360200200041106a41fcf3c300360200200041086a42093702000ba00101037f230041a0016b220224002002411236020020024100360298012002420137039001200241003a009f010240410110272203450d002002200336029001200320022802980122046a20022d009f013a000020024101360294012002200441016a2203360298012000200229039001370200200041086a2003360200024020022802004112460d002002103d0b200241a0016a24000f0b41014101102a000bb70101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002400240412010272206450d0020062002290300370000200641186a2003290300370000200641106a2004290300370000200641086a20052903003700002006412041c00010282206450d01200042c0808080900437020420002006360200200641003a0020200241206a24000f0b41204101102a000b41c0004101102a000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a20021030200041086a200228020836020020002002290300370200200241106a24000b1300200041063602042000419490c4003602000b3201017f02404108102722020d0041084101102a000b2000428880808080013702042000200236020020024280af1a3700000b3201017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242c0d1023700000b3e01017f02404110102722020d0041104101102a000b20024200370008200242808084fea6dee111370000200042908080808002370204200020023602000b3201017f02404108102722020d0041084101102a000b2000428880808080013702042000200236020020024280ce183700000be51a03037f027e067f230041f0016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e12000102030405060708090a0b0c0d0e0f1011000b200241e8006a200141086a10960220004100360200200041106a200241e8006a41086a290300370300200041086a20022903683703000c110b109702000b20004102360200200041086a200141086a2903003703000c0f0b200241e8006a200141046a1038200041033602002000410c6a200241f0006a280200360200200020022903683702040c0e0b109802000b0240024002400240200141086a280200417f6a220341014b0d0020030e020102010b41e4bdc0001058000b41012103024002402001410c6a22042d00004101460d00200241026a200441036a2d00003a0000200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a0000200220042f00013b01002002200141146a290200370368200141106a2802002104410021030c010b200141106a28020021040b200241246a41026a200241026a2d00003a0000200241286a41086a200241e8006a41086a290300370300200241286a41106a200241e8006a41106a290300370300200241286a41186a200241e8006a41186a280200360200200220022f01003b012420022002290368370328200141386a29030021052001290330210641012107200241106a21010c010b41012103024002402001410c6a22042d00004101460d00200241ee016a200441036a2d00003a0000200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a0000200220042f00013b01ec012002200141146a290200370368200141106a2802002104410021030c010b200141106a28020021040b41022107200241246a41026a200241ec016a41026a2d00003a0000200241286a41086a200241e8006a41086a290300370300200241286a41106a200241e8006a41106a290300370300200241286a41186a200241e8006a41186a280200360200200220022f01ec013b012420022002290368370328200220012903303703102002200141386a290300370318200141c8006a290300210520012903402106200221010b20012006370300200120053703082000410c6a20033a0000200041086a2007360200200020022f01243b000d2000410f6a200241266a2d00003a0000200041106a2004360200200041146a20022903283702002000411c6a200241286a41086a290300370200200041246a200241286a41106a2903003702002000412c6a200241c0006a280200360200200041386a200241106a41086a290300370300200041306a2002290310370300200041c0006a2002290300370300200041c8006a200241086a290300370300200041053602000c0c0b200241e8006a200141086a10990220004106360200200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c0b0b200241e8006a41186a200141286a290000370300200241e8006a41106a200141206a290000370300200241f0006a200141186a290000370300200241e8006a41286a200141386a290000370300200241e8006a41306a200141c0006a290000370300200241e8006a41386a200141c8006a2900003703002002200141106a2900003703682002200141306a290000370388012001410c6a2802002203417f4c0d0b0240024020030d00410121010c010b20012802042104200310272201450d0d20012004200310ce041a0b200241286a41386a2204200241e8006a41386a290300370300200241286a41306a2207200241e8006a41306a290300370300200241286a41286a2208200241e8006a41286a290300370300200241286a41206a2209200241e8006a41206a290300370300200241286a41186a220a200241e8006a41186a290300370300200241286a41106a220b200241e8006a41106a290300370300200241286a41086a220c200241e8006a41086a290300370300200220022903683703282000410c6a2003360200200041086a200336020020002001360204200041106a2002290328370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a2004290300370200200041073602000c0a0b200241e8006a200141086a109a0220004108360200200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c090b200241e8006a200141046a109b0220004109360200200041246a20024188016a2903003702002000411c6a20024180016a290300370200200041146a200241f8006a2903003702002000410c6a200241f0006a290300370200200020022903683702040c080b200241e8006a200141046a109b022000410a360200200041246a20024188016a2903003702002000411c6a20024180016a290300370200200041146a200241f8006a2903003702002000410c6a200241f0006a290300370200200020022903683702040c070b200241e8006a200141086a10c8012000410b360200200041c0006a200241e8006a41386a290300370300200041386a200241e8006a41306a290300370300200041306a200241e8006a41286a290300370300200041286a200241e8006a41206a290300370300200041206a200241e8006a41186a290300370300200041186a200241e8006a41106a290300370300200041106a200241e8006a41086a290300370300200041086a20022903683703000c060b2000410c360200200041086a200141086a2903003703000c050b2001410c6a2802002203417f4c0d050240024020030d00410121010c010b20012802042104200310272201450d0820012004200310ce041a0b200020013602042000410d3602002000410c6a2003360200200041086a20033602000c040b024002400240024002400240200141086a280200417f6a220341024b0d0020030e03010203010b4190a9c1001058000b200141386a2903002105200141306a290300210641012103024002402001410c6a2d00004101460d00200241f0006a2001411c6a290200370300200241e8006a41106a200141246a29020037030020024180016a2001412c6a2d00003a00002002200141146a29020037036820012f000d2001410f6a2d0000411074722104200141106a2802002101410021030c010b200141106a28020021010b200241286a41186a200241e8006a41186a280200360200200241286a41106a200241e8006a41106a290300370300200241286a41086a200241e8006a41086a29030037030020022002290368370328410121070c030b2001410c6a28020022034108762104410221070c010b2001410c6a28020022034108762104410321070b0b2000410e360200200041386a2005370300200041306a2006370300200041106a2001360200200041086a2007360200200041146a20022903283702002000410c6a2004410874200341ff0171723602002000411c6a200241286a41086a290300370200200041246a200241286a41106a2903003702002000412c6a200241c0006a2802003602000c030b200241e8006a200141086a109c02200041086a200241e8006a41800110ce041a2000410f3602000c020b02400240024002402001280204417f6a220341014b0d0020030e020102010b41f8e2c1001058000b41880110272203450d072003200141086a280200109502410121010c010b4101210302400240200141086a2d00004101460d00200241e8006a41086a200141186a290200370300200241e8006a41106a200141206a290200370300200241e8006a41186a200141286a2d00003a00002002200141106a29020037036820012f00092001410b6a2d00004110747221072001410c6a2802002104410021030c010b2001410c6a28020021040b200241286a41186a200241e8006a41186a280200360200200241286a41106a200241e8006a41106a290300370300200241286a41086a200241e8006a41086a2903003703002002200229036837032820032007410874722103410221010b20002001360204200041103602002000410c6a2004360200200041086a2003360200200041106a2002290328370200200041186a200241286a41086a290300370200200041206a200241286a41106a290300370200200041286a200241286a41186a2802003602000c010b200241e8006a200141086a10b101200041086a200241e8006a41d80010ce041a200041113602000b200241f0016a24000f0b1039000b20034101102a000b20034101102a000b4188014108102a000bb20503047f027e057f230041d0006b220224000240411310272203450d002003410f6a41002800ecd143360000200341086a41002900e5d143370000200341002900ddd143370000024020034113412610282204450d0020042000360013200241286a41186a22034200370300200241286a41106a22004200370300200241286a41086a220542003703002002420037032820044117200241286a1000200241086a41186a2003290300370300200241086a41106a2000290300370300200241086a41086a2005290300370300200220022903283703082002410036023020024201370328200141086a2903002106200129030021070240411010272203450d00200320073700002003200637000820024290808080800237022c20022003360228200128021021082002200141186a280200220336024c200241cc006a200241286a10300240024020030d0020022802302105200228022c21092002280228210a0c010b2003410574210b2002280228210a200228022c21092002280230210020082103034002400240200920006b4120490d00200041206a21050c010b0240200041206a22052000490d002009410174220c20052005200c491b220c4100480d000240024020090d00200c1027210a0c010b200a2009200c1028210a0b0240200a450d00200c21090c020b200c4101102a000b102b000b200a20006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200b41606a220b0d000b2002200936022c200220053602302002200a3602280b200241086a4120200a2005100302402009450d00200a10290b200410290240200141146a280200450d00200810290b200241d0006a24000f0b41104101102a000b41264101102a000b41134101102a000bbd0402087f047e230041e0006b22022400024002400240410f10272203450d00200341076a41002900909d44370000200341002900899d443700002003410f412f10282203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a22054200370300200242003703202003412f200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002410036024020024120200241c0006a100521050240024020022802402201417f460d00200241206a2001412020014120491b22046a41004100412020046b2004411f4b1b10cd041a200241206a2005200410ce041a2001411f4d0d04200241c0006a41186a2201200241206a41186a2204290300370300200241c0006a41106a2206200241206a41106a2207290300370300200241c0006a41086a2208200241206a41086a2209290300370300200220022903203703402005102920042001290300220a37030020072006290300220b37030020092008290300220c37030020022002290340220d370320200041013a00002000200d370001200041096a200c370000200041116a200b370000200041196a200a3700000c010b200041003a00000b20031029200241e0006a24000f0b410f4101102a000b412f4101102a000b418f89c3004133104e000bba0f010f7f230041f0006b22042400024002400240024002400240024002400240024002400240411a10272205450d00200541186a41002f00dbd1433b0000200541106a41002900d3d143370000200541086a41002900cbd143370000200541002900c3d1433700002005411a413410282205450d012005200136001a200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a22084200370300200442003703482005411e200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041b8d6c50041004100100b21062005102902400240024002402006417f470d0041839ec40021070c010b200441086a41186a200041186a290000370300200441086a41106a200041106a290000370300200441086a41086a200041086a29000037030020042000290000370308411010272205450d05200541086a41002900a6d1433700002005410029009ed14337000020054110412010282205450d06200520013600102005412041c00010282205450d07200520042903083700142005412c6a200441086a41186a2209290300370000200541246a200441086a41106a220a2903003700002005411c6a200441086a41086a220b290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041b8d6c50041004100100b210c200510290240200c417f470d00200441086a200110a8032006200041186a2900003703002007200041106a2900003703002008200041086a2900003703002004200029000037034802400240200428020c220d20042802102206460d00200641016a21052004280208210e0c010b200641016a22052006490d0420064101742207200520052007491b220d41ffffff3f71200d470d04200d41057422074100480d040240024020060d0020071027210e0c010b2004280208200641057420071028210e0b200e450d0a2004200d36020c2004200e3602080b200e20064105746a22062004290348370000200641186a200441c8006a41186a290300370000200641106a200441c8006a41106a290300370000200641086a200441c8006a41086a29030037000020042005360210411310272206450d0a2006410f6a4100280096d243360000200641086a410029008fd24337000020064100290087d2433700002006411341261028220f450d0b200f2001360013200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a2208420037030020044200370348200f4117200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a20082903003703002004200429034837032820044100360250200442013703482004200536026c200441ec006a200441c8006a10300240024020050d0020042802502106200428024c210c200428024821100c010b200541057421114100200428025022066b210820042802482110200428024c210c200e210503400240200c20086a411f4b0d00200641206a22072006490d06200c4101742212200720072012491b22074100480d0602400240200c0d002007102721100c010b2010200c2007102821100b2010450d052007210c0b201020066a22072005290000370000200741186a200541186a290000370000200741106a200541106a290000370000200741086a200541086a290000370000200841606a2108200641206a2106200541206a2105201141606a22110d000b2004200c36024c20042006360250200420103602480b200441286a41202010200610030240200c450d00201010290b200f1029200d450d00200e10290b2009200041186a290000370300200a200041106a290000370300200b200041086a29000037030020042000290000370308411010272205450d0b200541086a41002900a6d1433700002005410029009ed14337000020054110412010282205450d0c200520013600102005412041c00010282205450d0d200520042903083700142005412c6a200441086a41186a290300370000200541246a200441086a41106a2903003700002005411c6a200441086a41086a290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328410110272206450d0e41002107200641807f410020021b2003723a0000200441286a412020064101100320061029200510290b200441f0006a240020070f0b20074101102a000b102b000b411a4101102a000b41344101102a000b41104101102a000b41204101102a000b41c0004101102a000b20074101102a000b41134101102a000b41264101102a000b41104101102a000b41204101102a000b41c0004101102a000b41014101102a000bec0302047f027e230041d0006b2202240002400240411310272203450d002003410f6a41002800bb9c44360000200341086a41002900b49c44370000200341002900ac9c4437000020034113413310282203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241286a41186a22014200370300200241286a41106a22044200370300200241286a41086a220542003703002002420037032820034133200241286a1000200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229032837030820024100360228200241086a4120200241286a1005210102400240024020022802282204417f460d002001450d00200220013602482002200436024c20024200370328200241286a20012004410820044108491b220510ce041a2002200420056b36024c2002200120056a3602480240200441074d0d0020022903282106200241286a200241c8006a102d200228022822040d020b418f89c3004133104e000b410021040c010b200229022c2107200110292000200737020c200020063703000b2000200436020820031029200241d0006a24000f0b41134101102a000b41334101102a000bf40801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024020002d00004101460d000240024020022003460d00200128020021020c010b200341016a22022003490d0920034101742204200220022004491b22044100480d090240024020030d002004102721020c010b200128020020032004102821020b2002450d0320012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c010b0240024020022003460d00200128020021020c010b200341016a22022003490d0820034101742204200220022004491b22044100480d080240024020030d002004102721020c010b200128020020032004102821020b2002450d0320012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240200141046a2802002202200428020022036b4120490d00200128020021020c010b200341206a22042003490d0820024101742203200420042003491b22034100480d080240024020020d002003102721020c010b200128020020022003102821020b2002450d0420012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a2802002103024020002d00214101460d000240024020022003460d00200128020021000c010b200341016a22002003490d0820034101742202200020002002491b22024100480d080240024020030d002002102721000c010b200128020020032002102821000b2000450d0520012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b0240024020022003460d00200128020021020c010b200341016a22022003490d0720034101742204200220022004491b22044100480d070240024020030d002004102721020c010b200128020020032004102821020b2002450d0520012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240200141046a2802002202200428020022036b4120490d00200128020021020c010b200341206a22042003490d0720024101742203200420042003491b22034100480d070240024020020d002003102721020c010b200128020020022003102821020b2002450d0620012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000f0b20044101102a000b20044101102a000b20034101102a000b20024101102a000b20044101102a000b20034101102a000b102b000bab0201027f230041106b2202240020024100360208200242013703000240412010272203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a200210592002200041106a36020c2002410c6a20021059200028022021032002200041286a280200220036020c2002410c6a2002103002402000450d002003200041186c6a210003402002200336020c2002410c6a20021059200341106a200210302000200341186a2203470d000b0b2002280204210320012802002001280204200228020022002002280208100302402003450d00200010290b200241106a24000f0b41204101102a000bcd0801067f230041106b220224002002410036020820024201370300200041106a200210302002200036020c2002410c6a20021059200228020421032002280208210402400240024002400240024002400240024020002d00184101460d000240024020032004460d00200228020021050c010b200441016a22032004490d0920044101742205200320032005491b22034100480d090240024020040d002003102721050c010b200228020020042003102821050b2005450d0320022003360204200220053602000b2002200441016a2206360208200520046a41003a00000c010b0240024020032004460d00200228020021050c010b200441016a22032004490d0820044101742205200320032005491b22034100480d080240024020040d002003102721050c010b200228020020042003102821050b2005450d0320022003360204200220053602000b2002200441016a360208200520046a41013a00000240024020022802042203200228020822046b4120490d00200441206a21060c010b200441206a22062004490d0820034101742207200620062007491b22074100480d080240024020030d002007102721050c010b200520032007102821050b2005450d042002200736020420022005360200200721030b200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a290000370000200220063602082004200041196a2900003700000b02400240200041396a2d00004101460d00024020032006470d00200341016a22002003490d0920034101742204200020002004491b22004100480d090240024020030d002000102721050c010b200520032000102821050b2005450d0620022000360204200220053602000b2002200641016a360208200520066a41003a00002002280208210420022802042105200228020021030c010b024020032006470d00200341016a22042003490d0820034101742207200420042007491b22044100480d080240024020030d002004102721050c010b200520032004102821050b2005450d0620022004360204200220053602000b2002200641016a360208200520066a41013a00000240024020022802042205200228020822046b4120490d00200228020021030c010b200441206a22032004490d0820054101742206200320032006491b22064100480d080240024020050d002006102721030c010b200228020020052006102821030b2003450d072002200636020420022003360200200621050b200320046a220641086a200041c2006a290000370000200641106a200041ca006a290000370000200641186a200041d2006a2900003700002002200441206a220436020820062000413a6a2900003700000b2001280200200128020420032004100302402005450d00200310290b200241106a24000f0b20034101102a000b20034101102a000b20074101102a000b20004101102a000b20044101102a000b20064101102a000b102b000b9316010c7f230041f0026b2201240002400240024002400240411210272202450d00200241106a41002f0088a3443b0000200241086a4100290080a344370000200241002900f8a24437000020024112413210282202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e8006a41186a22004200370300200141e8006a41106a22034200370300200141e8006a41086a220442003703002001420037036820024132200141e8006a1000200141c8016a41186a2000290300370300200141c8016a41106a2003290300370300200141c8016a41086a2004290300370300200120012903683703c8012001410036029002200141c8016a412020014190026a100521002001280290022205417f460d032000450d032001200536024c2001200036024820014190026a200141c8006a10af0320012d00a80222034102460d02200141e8006a41186a200141c1026a290000370300200141e8006a41106a200141b9026a290000370300200141e8006a41086a200141b1026a290000370300200141f0016a41086a200141d2026a290100370300200141f0016a41106a200141da026a290100370300200141f0016a41186a200141e2026a290100370300200120012900a9023703682001200141ca026a2901003703f001200141c9026a2d0000210402402005450d00200010290b200141c8016a4120100c0c040b41124101102a000b41324101102a000b418f89c3004133104e000b410221030b200141286a41186a2200200141e8006a41186a290300370300200141286a41106a2205200141e8006a41106a290300370300200141286a41086a2206200141e8006a41086a290300370300200141086a41086a2207200141f0016a41086a2208290300370300200141086a41106a2209200141f0016a41106a220a290300370300200141086a41186a220b200141f0016a41186a220c29030037030020012001290368370328200120012903f00137030820021029024020034102460d0020082006290300370300200a2005290300370300200c2000290300370300200141c8006a41086a2007290300370300200141c8006a41106a2009290300370300200141c8006a41186a200b290300370300200120012903283703f0012001200129030837034841002102024002400240024002400240024002400240200441ff01714101470d00411210272202450d01200241106a41002f0088a3443b0000200241086a4100290080a344370000200241002900f8a24437000020024112413210282202450d02200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d00411210272200450d04200041106a41002f0088a3443b0000200041086a4100290080a344370000200041002900f8a24437000020004112413210282200450d05200020012903f0013700122000412a6a200141f0016a41186a290300370000200041226a200141f0016a41106a2903003700002000411a6a200141f0016a41086a290300370000200141e8006a41186a22054200370300200141e8006a41106a22064200370300200141e8006a41086a220742003703002001420037036820004132200141e8006a1000200141c8016a41186a2005290300370300200141c8016a41106a2006290300370300200141c8016a41086a2007290300370300200120012903683703c8012001410036029002200141c8016a412020014190026a100521062001280290022205417f470d0141e0a3c40041d300104e000b200141e8006a41186a22004200370300200141e8006a41106a22054200370300200141e8006a41086a220642003703002001420037036841b3a4c400411a200141e8006a1000200141c8016a41186a2000290300370300200141c8016a41106a2005290300370300200141c8016a41086a2006290300370300200120012903683703c8010240200441ff01714101460d00200141c8016a4120100c0c080b412010272200450d0520002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141c8016a4120200041201003200010290c070b200120053602ec01200120063602e80120014190026a200141e8016a10af0320012d00a80222074102460d05200141b0016a41106a220820014190026a41106a2209290300370300200141b0016a41086a220a20014190026a41086a220b29030037030020012001290390023703b001200141e8006a200141a9026a220c41c70010ce041a02402005450d00200610290b200b200a29030037030020092008290300370300200120012903b00137039002200120073a00a802200c200141e8006a41c70010ce041a200141c9026a20043a0000200141ca026a2001290348370100200141d2026a200141c8006a41086a290300370100200141da026a200141c8006a41106a290300370100200141e2026a200141c8006a41186a290300370100200141e8006a41186a22044200370300200141e8006a41106a22054200370300200141e8006a41086a220642003703002001420037036820004132200141e8006a1000200141c8016a41186a2004290300370300200141c8016a41106a2005290300370300200141c8016a41086a2006290300370300200120012903683703c8012001412036026c2001200141c8016a36026820014190026a200141e8006a10c80320001029410121040c070b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41204101102a000b418f89c3004133104e000b41002100410021040b02400240024002400240024020020d00410021030c010b200141e8006a41186a22054200370300200141e8006a41106a22064200370300200141e8006a41086a220742003703002001420037036820024132200141e8006a1000200141c8016a41186a2005290300370300200141c8016a41106a2006290300370300200141c8016a41086a2007290300370300200120012903683703c8012001410036029002200141c8016a412020014190026a100521062001280290022205417f460d02200120053602ec01200120063602e80120014190026a200141e8016a10af0320012d00a8024102460d01200141b0016a41106a220720014190026a41106a2208290300370300200141b0016a41086a220920014190026a41086a220a29030037030020012001290390023703b001200141e8006a200141a9026a220b41c70010ce041a02402005450d00200610290b200a200929030037030020082007290300370300200120012903b00137039002200b200141e8006a41c70010ce0420012903f001370000200141b1026a200141f0016a41086a290300370000200141b9026a200141f0016a41106a290300370000200141c1026a200141f0016a41186a290300370000200120033a00a802200141e8006a41186a22034200370300200141e8006a41106a22054200370300200141e8006a41086a220642003703002001420037036820024132200141e8006a1000200141c8016a41186a2003290300370300200141c8016a41106a2005290300370300200141c8016a41086a2006290300370300200120012903683703c8012001412036026c2001200141c8016a36026820014190026a200141e8006a10c80320021029410121030b200420004572450d020c030b418f89c3004133104e000b41e0a3c40041d300104e000b200010290b2002452003720d00200210290b200141f0026a24000bf31b01107f230041d0026b220124000240024002400240411210272202450d00200241106a41002f00f6a2443b0000200241086a41002900eea244370000200241002900e6a24437000020024112413210282202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141b0016a41186a22004200370300200141b0016a41106a22034200370300200141b0016a41086a22044200370300200142003703b00120024132200141b0016a1000200141f8016a41186a2000290300370300200141f8016a41106a2003290300370300200141f8016a41086a2004290300370300200120012903b0013703f80120014100360260200141f8016a4120200141e0006a1005210020012802602204417f460d022000450d02200120043602c402200120003602c002200141c0006a200141c0026a102d0240024020012802402205450d0020012802442106200141e0006a200141c0026a10940320012d006022074102470d012006450d00200510290b418f89c3004133104e000b200141b0016a41186a200141f9006a290000370300200141b0016a41106a200141f1006a290000370300200141b0016a41086a200141e9006a290000370300200141a0026a41086a2001418a016a290100370300200141a0026a41106a20014192016a290100370300200141a0026a41186a2001419a016a290100370300200120012900613703b001200120014182016a2901003703a00220014181016a2d0000210302402004450d00200010290b200141f8016a4120100c0c030b41124101102a000b41324101102a000b410221070b200141206a41186a2200200141b0016a41186a290300370300200141206a41106a2204200141b0016a41106a290300370300200141206a41086a2208200141b0016a41086a290300370300200141086a2209200141a0026a41086a220a290300370300200141106a220b200141a0026a41106a220c290300370300200141186a220d200141a0026a41186a220e290300370300200120012903b001370320200120012903a00237030020021029024002400240024020074102460d00200a2008290300370300200c2004290300370300200e2000290300370300200141c0006a41086a2009290300370300200141c0006a41106a200b290300370300200141c0006a41186a200d290300370300200120012903203703a002200120012903003703404100210c024002400240024002400240024002400240200341ff01714101470d00411210272202450d01200241106a41002f00f6a2443b0000200241086a41002900eea244370000200241002900e6a2443700002002411241321028220c450d02200c2001290340370012200c412a6a200141d8006a290300370000200c41226a200141c0006a41106a290300370000200c411a6a200141c0006a41086a2903003700000b0240024020074101470d00411210272202450d04200241106a41002f00f6a2443b0000200241086a41002900eea244370000200241002900e6a2443700002002411241321028220d450d05200d20012903a002370012200d412a6a200141a0026a41186a290300370000200d41226a200141a0026a41106a290300370000200d411a6a200141a0026a41086a290300370000200141b0016a41186a22024200370300200141b0016a41106a22004200370300200141b0016a41086a22044200370300200142003703b001200d4132200141b0016a1000200141f8016a41186a2002290300370300200141f8016a41106a2000290300370300200141f8016a41086a2004290300370300200120012903b0013703f80120014100360260200141f8016a4120200141e0006a1005210020012802602204417f460d072000450d072001200436029c022001200036029802200141c0026a20014198026a102d024020012802c002220e450d00200141c8026a280200210220012802c402210f200141b0016a20014198026a10940320012d00b00122084102470d02200f450d00200e10290b418f89c3004133104e000b200141b0016a41186a22024200370300200141b0016a41106a22004200370300200141b0016a41086a22044200370300200142003703b00141c6a3c400411a200141b0016a1000200141f8016a41186a2002290300370300200141f8016a41106a2000290300370300200141f8016a41086a2004290300370300200120012903b0013703f8010240200341ff01714101460d00200141f8016a4120100c0c080b412010272202450d0520022001290340370000200241186a200141c0006a41186a290300370000200241106a200141c0006a41106a290300370000200241086a200141c0006a41086a290300370000200141f8016a4120200241201003200210290c070b200141e0006a200141b0016a41017241c10010ce041a200141b0016a200141e0006a41c30010ce041a02402004450d00200010290b200120083a006c200120023602682001200f3602642001200e360260200141ed006a200141b0016a41c30010ce041a2001418d016a20033a00002001418e016a200129034037010020014196016a200141c0006a41086a2903003701002001419e016a200141c0006a41106a290300370100200141a6016a200141c0006a41186a290300370100200141b0016a41186a22004200370300200141b0016a41106a22034200370300200141b0016a41086a22044200370300200142003703b001200d4132200141b0016a1000200141f8016a41186a2000290300370300200141f8016a41106a2003290300370300200141f8016a41086a2004290300370300200120012903b0013703f801200141003602b801200142013703b001200120023602c002200141c0026a200141b0016a1030024002402002450d002002410574210a410020012802b80122006b210420012802b001210920012802b4012108200e210203400240200820046a411f4b0d00200041206a22032000490d0e2008410174220b20032003200b491b22034100480d0e0240024020080d002003102721090c010b200920082003102821090b2009450d03200321080b200920006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200a41606a220a0d000b200120083602b401200120003602b801200120093602b0010b200141ec006a200141b0016a10c60320012802b4012102200141f8016a412020012802b001220020012802b801100302402002450d00200010290b0240200f450d00200e10290b200d10294101210f0c080b20034101102a000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41204101102a000b41e0a3c40041d300104e000b4100210d4100210f0b02400240200c0d00410021020c010b200141b0016a41186a22024200370300200141b0016a41106a22004200370300200141b0016a41086a22034200370300200142003703b001200c4132200141b0016a1000200141f8016a41186a2002290300370300200141f8016a41106a2000290300370300200141f8016a41086a2003290300370300200120012903b0013703f80120014100360260200141f8016a4120200141e0006a1005210320012802602200417f460d042001200036029c022001200336029802200141c0026a20014198026a102d0240024020012802c002220e450d00200141c8026a280200210220012802c4022110200141b0016a20014198026a10940320012d00b0014102470d012010450d00200e10290b418f89c3004133104e000b200141e0006a200141b0016a41017241c10010ce041a200141b0016a200141e0006a41c30010ce041a02402000450d00200310290b20012002360268200120103602642001200e360260200141ed006a200141b0016a41c30010ce0420012903a002370000200141f5006a200141a0026a41086a290300370000200141fd006a200141a0026a41106a29030037000020014185016a200141a0026a41186a290300370000200120073a006c200141b0016a41186a22004200370300200141b0016a41106a22034200370300200141b0016a41086a22044200370300200142003703b001200c4132200141b0016a1000200141f8016a41186a2000290300370300200141f8016a41106a2003290300370300200141f8016a41086a2004290300370300200120012903b0013703f801200141003602b801200142013703b001200120023602c002200141c0026a200141b0016a103002402002450d002002410574210a410020012802b80122006b210420012802b001210920012802b4012108200e210203400240200820046a411f4b0d00200041206a22032000490d062008410174220b20032003200b491b22034100480d060240024020080d002003102721090c010b200920082003102821090b2009450d05200321080b200920006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200a41606a220a0d000b200120083602b401200120003602b801200120093602b0010b200141ec006a200141b0016a10c60320012802b4012102200141f8016a412020012802b001220020012802b801100302402002450d00200010290b02402010450d00200e10290b200c1029410121020b0240200f200d45720d00200d10290b0240200c452002720d00200c10290b2006450d00200510290b200141d0026a24000f0b20034101102a000b102b000b41e0a3c40041d300104e000b13002000410d360204200041d0a4c4003602000b3400200041ced2c40036020420004100360200200041146a4115360200200041106a41d8d2c400360200200041086a42073702000b7501027f230041106b22022400200241003602082002420137030002404104102722030d0041044101102a000b2003410036000020024284808080c000370204200220033602002002410036020c2002410c6a20021030200041086a200228020836020020002002290300370200200241106a24000b3001017f02404108102722020d0041084101102a000b20004288808080800137020420002002360200200242003700000bdf0301077f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a10592002200336023c2002413c6a200241306a10592002280220210320022004280200220436023c2002413c6a200241306a10300240024002402004450d00200441306c210503400240024020022802342206200228023822046b4120490d00200441206a2107200228023021060c010b200441206a22072004490d0420064101742208200720072008491b22084100480d040240024020060d002008102721060c010b200228023020062008102821060b2006450d0320022008360234200220063602300b200620046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a290000370000200220073602382004200341106a2900003700002002200336023c2002413c6a200241306a1059200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a28020036020002402002280224450d00200228022010290b200241c0006a24000f0b20084101102a000b102b000b7001017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a10302002200241086a36022c2002412c6a200241206a1059200041086a200228022836020020002002290320370200200241306a24000b3201017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241c0843d3600000b3001017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241043600000bdf0606077f047e037f037e017f017e230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a22054200370300200242003703800120024180016a2001280200220620012802042207412020074120491b220810ce041a2001200720086b3602042001200620086a360200024002402007411f4b0d00200041003602200c010b200241e0006a41186a2003290300370300200241e0006a41106a2004290300370300200241e0006a41086a20052903003703002002200229038001370360200241c8006a2001105302402002290348a70d00200041003602200c010b200241c8006a41106a29030021092002290350210a200241306a2001105302402002290330a70d00200041003602200c010b200241c0006a290300210b2002290338210c200241286a2001102e024002400240024002402002280228450d0002400240200228022c220d41aa01200d41aa01491b220e0d00410821040c010b200e41186c220710272204450d030b0240200d450d00200241106a41106a210f4100210341002106410021080340200241106a20011053024002402002290310a7450d00200f290300211020022903182111200241086a2001102e20022802080d010b200e450d03200410290c030b200841016a2107200228020c210502402008200e470d002003200720072003491b220ead42187e2212422088a70d072012a722134100480d070240024020080d002013102721040c010b200420062013102821040b2004450d060b200420066a2208201037030820082011370300200841106a2005360200200341026a2103200641186a210620072108200d2007470d000b0b20040d010b200041003602200c040b20024180016a41186a200241e0006a41186a290300221037030020024180016a41106a200241e0006a41106a290300221137030020024180016a41086a200241e0006a41086a290300221237030020022002290360221437038001200041186a200b3703002000200c370310200020093703082000200a3703002000200dad422086200ead84370224200020043602202000412c6a2014370200200041346a20123702002000413c6a2011370200200041c4006a20103702000c030b20074108102a000b20134108102a000b102b000b200241a0016a24000b130020004102360204200041b8f6c4003602000b3101017f02404104102722020d0041044101102a000b20004284808080c00037020420002002360200200241a0053600000bb90d021e7f037e230041f0026b22042400024002400240024002400240410d10272205450d00200541056a41002900aca344370000200541002900a7a3443700002005410d412d10282205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41186a22064200370300200441a0026a41106a22074200370300200441a0026a41086a22084200370300200442003703a0022005412d200441a0026a1000200441e0016a41186a2006290300370300200441e0016a41106a2007290300370300200441e0016a41086a2008290300370300200420042903a0023703e001200441003602a002200441e0016a4120200441a0026a10052107024002400240024020042802a0022206417f460d00200441003a00a002200441a0026a20072006410047220810ce041a20062008490d062006450d0720042d00a002220641034f0d07200710292005102920060e03010302010b200510290b200441f8006a2001108c0220042d00784101470d06200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2207290000370300200420042900793703a001200441a0026a200441a0016a108d02200441c0016a41186a22082005290000370300200441c0016a41106a22092006290000370300200441c0016a41086a220a2007290000370300200420042900793703c00120042802c002220b450d06200441e0016a41186a220c2008290300370300200441e0016a41106a220d2009290300370300200441e0016a41086a220e200a290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2207200441a0026a41106a2208290300370300200441e0016a41386a220f200441a0026a41186a2210290300370300200441086a41286a2211200441ec026a2212280200360200200441086a41206a2213200441e4026a2214290200370300200441086a41186a2215200441dc026a2216290200370300200441086a41106a2217200441d4026a2218290200370300200441086a41086a2219200441cc026a221a290200370300200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221b200f290300370300200441386a41306a221c2007290300370300200441386a41286a221d2005290300370300200441386a41206a221e200429038002370300200441386a41186a221f200c290300370300200441386a41106a2220200d290300370300200441386a41086a2221200e290300370300200420042903e001370338200f201b2903003703002007201c2903003703002005201d290300370300200441e0016a41206a221b201e290300370300200c201f290300370300200d2020290300370300200e2021290300370300200420042903383703e001200441f8006a41186a201f290300370300200441f8006a41106a2020290300370300200441f8006a41086a2021290300370300200420042903383703782010200f29030037030020082007290300370300200620052903003703002004200b3602c0022004201b2903003703a002200441c4026a22052004290308370200201a2019290300370200201820172903003702002016201529030037020020142013290300370200201220112802003602002010290300212220082008290300222320027c22243703002010202220037c2024202354ad7c37030020062903002122200420042903a002222320027c22243703a0022006202220037c2024202354ad7c370300200441c0016a200120022003109f0120043502c001210220092903002122200a2903002103200441f8006a200441a0026a10d80302402005280200450d0020042802c00210290b200242018521020c070b200441a0026a2001108c0220042d00a0024101470d05200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a20022003109f0120043502384201852102200441386a41106a2903002122200441386a41086a29030021030c060b200441a0026a200120022003109f0120043502a0024201852102200441b0026a2903002122200441a8026a29030021030c050b410d4101102a000b412d4101102a000b20082006103e000b418f89c3004133104e000b420021020b2000200337030820002002370300200041106a2022370300200441f0026a24000b0900200042003702000bdb0201047f230041d0006b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410e10a80102400240410e10272203450d00200341066a410029009fa34437000020034100290099a3443700002003410e412e10282203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241306a41186a22004200370300200241306a41106a22044200370300200241306a41086a22054200370300200242003703302003412e200241306a1000200241106a41186a2000290300370300200241106a41106a2004290300370300200241106a41086a200529030037030020022002290330370310200241203602342002200241106a3602302001200241306a10c70320031029200241d0006a24000f0b410e4101102a000b412e4101102a000b02000bd70302027f077e23004180016b22032400200341c0006a200110ae0302400240024020032903404201520d00200241016a2104200341c0006a41086a21020340200341086a41306a200241306a2903002205370300200341086a41286a200241286a2903002206370300200341086a41206a200241206a2903002207370300200341086a41186a200241186a2903002208370300200341086a41106a200241106a2903002209370300200341086a41086a200241086a290300220a37030020032002290300220b370308200341c0006a41306a2005370300200341c0006a41286a2006370300200341c0006a41206a2007370300200341c0006a41186a2008370300200341c0006a41106a20093703002002200a3703002003200b3703402004417f6a2204450d02200341c0006a200110ae0320032903404201510d000b0b200042003703000c010b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a2903003703000b20034180016a24000beb050a067f017e017f017e017f017e017f017e017f017e230041206b2202240002400240024020014108490d00200141017641feffffff07712203417f6a220420014f0d022001410d74200173220541117620057322054105742005732206417f2001417f6a677622077122054100200120052001491b6b220520014f0d01200020044105746a22042900002108200020054105746a220541086a2209290000210a200541106a220b290000210c200541186a220d290000210e20042005290000370000200441186a220f2900002110200f200e370000200441106a220f290000210e200f200c370000200441086a2204290000210c2004200a370000200d2010370000200b200e3700002009200c37000020052008370000024020032001490d00200321040c030b2006410d7420067322054111762005732205410574200573220620077122054100200120052001491b6b220520014f0d01200020034105746a22042900002108200020054105746a220541086a2209290000210a200541106a220b290000210c200541186a220d290000210e20042005290000370000200441186a220f2900002110200f200e370000200441106a220f290000210e200f200c370000200441086a2204290000210c2004200a370000200d2010370000200b200e3700002009200c370000200520083700002003410172220420014f0d022006410d742006732205411176200573220541057420057320077122054100200120052001491b6b220520014f0d01200020044105746a22012900002108200020054105746a220041086a2205290000210a200041106a2204290000210c200041186a2203290000210e20012000290000370000200141186a220629000021102006200e370000200141106a2206290000210e2006200c370000200141086a2201290000210c2001200a370000200320103700002004200e3700002005200c370000200020083700000b200241206a24000f0b41c481c500200520011037000b41b481c500200420011037000be90609067f017e017f017e017f027e017f017e027f230041206b22022400024020014101762203450d0003402003417f6a2203210402400240024003402004410174220541017221060240200541026a220520014f0d00200620014f0d0220052006200020064105746a200020054105746a412010d0044100481b21060b200620014f0d03200420014f0d02200020044105746a2204200020064105746a2205412010d004417f4a0d03200541086a22072900002108200541106a2209290000210a200541186a220b290000210c2004290000210d20042005290000370000200441186a220e290000210f200e200c370000200441106a220e290000210c200e200a370000200441086a2204290000210a20042008370000200b200f3700002009200c3700002007200a3700002005200d370000200621040c000b0b41b883c500200620011037000b41c883c500200420011037000b20030d000b0b0240024020014102490d002001210703402007417f6a220720014f0d02200241186a2209200041186a2204290000370300200241106a220b200041106a2205290000370300200241086a220e200041086a2203290000370300200020074105746a220641086a2900002108200641106a290000210a200641186a290000210c2000290000210d200020062900003700002004200c3700002005200a370000200320083700002002200d37030041002105024002400240034020062002290300370000200641186a2009290300370000200641106a200b290300370000200641086a200e2903003700002005410174220641017221040240200641026a220620074f0d00200420074f0d0220062004200020044105746a200020064105746a412010d0044100481b21040b200420074f0d03200520074f0d02200020054105746a2205200020044105746a2206412010d004417f4a0d032009200541186a2203290000370300200b200541106a2210290000370300200e200541086a2211290000370300200641086a2900002108200641106a290000210a200641186a290000210c2005290000210d200520062900003700002003200c3700002010200a370000201120083700002002200d370300200421050c000b0b41b883c500200420071037000b41c883c500200520071037000b200741014b0d000b0b200241206a24000f0b41c481c500200720011037000bdb08030a7f017e0a7f230041c0006b22022400200041a07f6a21032001417f6a2104200141324921054101210641002107024003400240024020062001490d00410021080c010b41012108200020064105746a2209200941606a412010d0044100480d0003404101210a20042006460d03200641016a2106200941206a220a2009412010d0042108200a21092008417f4a0d000b200620014921080b2006200146210a20050d0120062001460d0102400240024002402006417f6a220920014f0d002008450d0120002006410574220b6a220a290000210c200a200020094105746a22092900003700002009200c370000200a41086a220d290000210c200d200941086a220e290000370000200e200c370000200a41106a220f290000210c200f200941106a22102900003700002010200c370000200a41186a2211290000210c2011200941186a22122900003700002012200c37000020064102490d03200920002006417e6a22084105746a2213412010d004417f4a0d032009290000210c20092013290000370000200241206a41186a22142012290000370300200241206a41106a22152010290000370300200241206a41086a2216200e290000370300200e201341086a2900003700002010201341106a2900003700002012201341186a2900003700002002200c3703204100210e2008450d022003200b6a210903400240200241206a2009412010d0044100480d002008210e0c040b200941206a2009290000370000200941386a200941186a290000370000200941306a200941106a290000370000200941286a200941086a290000370000200941606a21092008417f6a22080d000c030b0b41b481c500200920011037000b41c481c500200620011037000b2000200e4105746a22092002290320370000200941186a2014290300370000200941106a2015290300370000200941086a20162903003700000b200741016a21070240200120066b22104102490d00200a41206a2209200a412010d004417f4a0d00200a290000210c200a2009290000370000200241206a41186a22122011290000370300200241206a41106a2213200f290000370300200241206a41086a220b200d290000370300200d200941086a290000370000200f200941106a2900003700002011200941186a2900003700002002200c3703204101210d024020104103490d00200a41c0006a200241206a412010d004417f4a0d00410321084102210e0340200a200e4105746a220941606a220d2009290000370000200d41186a200941186a290000370000200d41106a200941106a290000370000200d41086a200941086a290000370000024020082010490d00200e210d0c020b20084105742109200e210d2008210e200841016a2108200a20096a200241206a412010d0044100480d000b0b200a200d4105746a22092002290320370000200941186a2012290300370000200941106a2013290300370000200941086a200b2903003700000b20074105470d000b4100210a0b200241c0006a2400200a0bb204030e7f017e017f230041c0006b22032400200128020022042001280208220541047422066a210720012802042108200421010240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d0340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b0130024020012d0000220e41ac01470d00200141106a21010c020b2003410c6a41026a200b2d0000220f3a0000200320032f013022103b010c200141046a29020021112001410c6a2802002112200920103b0000200941026a200f3a00002003200e3a00302003201236023c20032011370234200341206a200341306a200210df032003200c2900003703102003200d290000370017024020032d0020220e411a470d002006200a41106a220a470d010c030b0b2000200e3a000020002003290310370001200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d00200a41046a28020010290b200141106a2101200a41106a2007470d000b0b2008450d02200410290c020b20012007460d0003400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a22012007470d000b0b02402008450d00200410290b2000411a3a00000b200341c0006a24000bf6d60202097f017e230041106b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000eac01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000cab010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000caa010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df50120044101742208200520052008491b22084100480df5010240024020040d002008102721050c010b200628020020042008102821050b2005450dad0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41023a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df50120044101742208200520052008491b22084100480df5010240024020040d002008102721050c010b200628020020042008102821050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca9010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df40120044101742208200520052008491b22084100480df4010240024020040d002008102721050c010b200628020020042008102821050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41033a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df40120044101742208200520052008491b22084100480df4010240024020040d002008102721050c010b200628020020042008102821050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca8010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df30120044101742208200520052008491b22084100480df3010240024020040d002008102721050c010b200628020020042008102821050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41043a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df30120044101742208200520052008491b22084100480df3010240024020040d002008102721050c010b200628020020042008102821050b2005450db00120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca7010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000ca6010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000ca5010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490df00120044101742207200620062007491b22074100480df0010240024020040d002007102721060c010b200928020020042007102821060b2006450db00120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410c3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df1012004410174220a20062006200a491b220a4100480df1010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db201200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca5010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490def0120044101742207200620062007491b22074100480def010240024020040d002007102721060c010b200928020020042007102821060b2006450db10120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410d3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df0012004410174220a20062006200a491b220a4100480df0010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db301200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca4010b0b200241046a210a2001410c6a2802002104200141086a2802002109200141046a280200210b02400240200241086a2802002002410c6a2802002201460d00200a28020021050c010b200141016a22052001490dee0120014101742206200520052006491b22064100480dee010240024020010d002006102721050c010b200a28020020012006102821050b2005450db20120022005360204200241086a20063602002002410c6a28020021010b2002410c6a2206200141016a360200200520016a410e3a000020032009200b200b20094102746a200210e00320032d0000411a470d9303200241086a2107034002400240200728020020062802002201460d00200a28020021050c010b200141016a22052001490def0120014101742208200520052008491b22084100480def010240024020010d002008102721050c010b200a28020020012008102821050b2005450db4012002200536020420072008360200200628020021010b2006200141016a360200200520016a200441807f72200441ff0071200441077622011b3a00002001210420010d000b0240200941ffffffff0371450d00200b10290b2000411a3a00000c95030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490ded0120044101742206200520052006491b22064100480ded010240024020040d002006102721050c010b200228020420042006102821050b2005450db30120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000ca1010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490dec0120044101742207200620062007491b22074100480dec010240024020040d002007102721060c010b200928020020042007102821060b2006450db30120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41103a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490ded012004410174220a20062006200a491b220a4100480ded010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db501200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca1010b0b200241046a2109200141046a280200210520012d0001210b02400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490deb0120044101742207200620062007491b22074100480deb010240024020040d002007102721060c010b200928020020042007102821060b2006450db40120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41113a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490dec012004410174220a20062006200a491b220a4100480dec010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db601200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b02400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490deb0120044101742206200520052006491b22064100480deb010240024020040d002006102721050c010b200928020020042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a200b3a00000c9f010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dea0120044101742206200520052006491b22064100480dea010240024020040d002006102721050c010b200228020420042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000c9e010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490de90120044101742206200520052006491b22064100480de9010240024020040d002006102721050c010b200228020420042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c9d010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de80120044101742207200620062007491b22074100480de8010240024020040d002007102721060c010b200928020020042007102821060b2006450db60120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41203a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de9012004410174220a20062006200a491b220a4100480de9010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db801200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9d010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de70120044101742207200620062007491b22074100480de7010240024020040d002007102721060c010b200928020020042007102821060b2006450db70120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41213a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de8012004410174220a20062006200a491b220a4100480de8010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db901200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9c010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de60120044101742207200620062007491b22074100480de6010240024020040d002007102721060c010b200928020020042007102821060b2006450db80120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41223a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de7012004410174220a20062006200a491b220a4100480de7010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dba01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9b010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de50120044101742207200620062007491b22074100480de5010240024020040d002007102721060c010b200928020020042007102821060b2006450db90120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41233a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de6012004410174220a20062006200a491b220a4100480de6010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dbb01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9a010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de40120044101742207200620062007491b22074100480de4010240024020040d002007102721060c010b200928020020042007102821060b2006450dba0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41243a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de5012004410174220a20062006200a491b220a4100480de5010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dbc01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c99010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de30120044101742208200720072008491b22084100480de3010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41283a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de4012004410174220b20072007200b491b220b4100480de4010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dbd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de40120044101742209200620062009491b22094100480de4010240024020040d002009102721060c010b200a28020020042009102821060b2006450dbe012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c98010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de20120044101742208200720072008491b22084100480de2010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41293a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de3012004410174220b20072007200b491b220b4100480de3010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dbf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de30120044101742209200620062009491b22094100480de3010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c97010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de10120044101742208200720072008491b22084100480de1010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de2012004410174220b20072007200b491b220b4100480de2010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de20120044101742209200620062009491b22094100480de2010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c96010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de00120044101742208200720072008491b22084100480de0010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de1012004410174220b20072007200b491b220b4100480de1010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de10120044101742209200620062009491b22094100480de1010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c95010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddf0120044101742208200720072008491b22084100480ddf010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de0012004410174220b20072007200b491b220b4100480de0010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de00120044101742209200620062009491b22094100480de0010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c94010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dde0120044101742208200720072008491b22084100480dde010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddf012004410174220b20072007200b491b220b4100480ddf010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc701200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddf0120044101742209200620062009491b22094100480ddf010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc8012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c93010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddd0120044101742208200720072008491b22084100480ddd010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc70120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dde012004410174220b20072007200b491b220b4100480dde010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc901200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dde0120044101742209200620062009491b22094100480dde010240024020040d002009102721060c010b200a28020020042009102821060b2006450dca012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c92010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddc0120044101742208200720072008491b22084100480ddc010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc90120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412f3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddd012004410174220b20072007200b491b220b4100480ddd010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcb01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddd0120044101742209200620062009491b22094100480ddd010240024020040d002009102721060c010b200a28020020042009102821060b2006450dcc012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c91010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddb0120044101742208200720072008491b22084100480ddb010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41303a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddc012004410174220b20072007200b491b220b4100480ddc010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddc0120044101742209200620062009491b22094100480ddc010240024020040d002009102721060c010b200a28020020042009102821060b2006450dce012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c90010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dda0120044101742208200720072008491b22084100480dda010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41313a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddb012004410174220b20072007200b491b220b4100480ddb010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddb0120044101742209200620062009491b22094100480ddb010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8f010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd90120044101742208200720072008491b22084100480dd9010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41323a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dda012004410174220b20072007200b491b220b4100480dda010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dda0120044101742209200620062009491b22094100480dda010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8e010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd80120044101742208200720072008491b22084100480dd8010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41333a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd9012004410174220b20072007200b491b220b4100480dd9010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd90120044101742209200620062009491b22094100480dd9010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8d010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd70120044101742208200720072008491b22084100480dd7010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41343a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd8012004410174220b20072007200b491b220b4100480dd8010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd80120044101742209200620062009491b22094100480dd8010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8c010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd60120044101742208200720072008491b22084100480dd6010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41353a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da3022004410174220b20072007200b491b220b4100480da3020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da30220044101742209200620062009491b22094100480da3020240024020040d002009102721060c010b200a28020020042009102821060b2006450dd9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8b010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da10220044101742208200720072008491b22084100480da1020240024020040d002008102721070c010b200a28020020042008102821070b2007450dd80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41363a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da2022004410174220b20072007200b491b220b4100480da2020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dda01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da20220044101742209200620062009491b22094100480da2020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8a010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da00220044101742208200720072008491b22084100480da0020240024020040d002008102721070c010b200a28020020042008102821070b2007450dda0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41373a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da1022004410174220b20072007200b491b220b4100480da1020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450ddc01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da10220044101742209200620062009491b22094100480da1020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddd012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c89010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9f0220044101742208200720072008491b22084100480d9f020240024020040d002008102721070c010b200a28020020042008102821070b2007450ddc0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41383a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da0022004410174220b20072007200b491b220b4100480da0020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dde01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da00220044101742209200620062009491b22094100480da0020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddf012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c88010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9e0220044101742208200720072008491b22084100480d9e020240024020040d002008102721070c010b200a28020020042008102821070b2007450dde0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41393a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9f022004410174220b20072007200b491b220b4100480d9f020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de001200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9f0220044101742209200620062009491b22094100480d9f020240024020040d002009102721060c010b200a28020020042009102821060b2006450de1012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c87010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9d0220044101742208200720072008491b22084100480d9d020240024020040d002008102721070c010b200a28020020042008102821070b2007450de00120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9e022004410174220b20072007200b491b220b4100480d9e020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de201200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9e0220044101742209200620062009491b22094100480d9e020240024020040d002009102721060c010b200a28020020042009102821060b2006450de3012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c86010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9c0220044101742208200720072008491b22084100480d9c020240024020040d002008102721070c010b200a28020020042008102821070b2007450de20120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9d022004410174220b20072007200b491b220b4100480d9d020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de401200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9d0220044101742209200620062009491b22094100480d9d020240024020040d002009102721060c010b200a28020020042009102821060b2006450de5012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c85010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9b0220044101742208200720072008491b22084100480d9b020240024020040d002008102721070c010b200a28020020042008102821070b2007450de40120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9c022004410174220b20072007200b491b220b4100480d9c020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de601200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9c0220044101742209200520052009491b22094100480d9c020240024020040d002009102721050c010b200a28020020042009102821050b2005450de7012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c84010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9a0220044101742208200720072008491b22084100480d9a020240024020040d002008102721070c010b200a28020020042008102821070b2007450de60120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9b022004410174220b20072007200b491b220b4100480d9b020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9b0220044101742209200620062009491b22094100480d9b020240024020040d002009102721060c010b200a28020020042009102821060b2006450de9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c83010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d990220044101742208200720072008491b22084100480d99020240024020040d002008102721070c010b200a28020020042008102821070b2007450de80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9a022004410174220b20072007200b491b220b4100480d9a020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dea01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9a0220044101742209200620062009491b22094100480d9a020240024020040d002009102721060c010b200a28020020042009102821060b2006450deb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c82010b0b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d980220044101742208200520052008491b22084100480d98020240024020040d002008102721050c010b200628020020042008102821050b2005450dea0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a413f3a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d980220044101742208200520052008491b22084100480d98020240024020040d002008102721050c010b200628020020042008102821050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c80010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d970220044101742208200520052008491b22084100480d97020240024020040d002008102721050c010b200628020020042008102821050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c0003a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d970220044101742208200520052008491b22084100480d97020240024020040d002008102721050c010b200628020020042008102821050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c7f0b200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d960220044101742207200520052007491b22074100480d96020240024020040d002007102721050c010b200228020420042007102821050b2005450dec0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210e1032003210220032d0000411a470df0020c7e0b200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d950220044101742206200520052006491b22064100480d95020240024020040d002006102721050c010b200228020420042006102821050b2005450dec0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200c200210e2032003210220032d0000411a470def020c7d0b200241046a2106200141046a280200210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d940220044101742208200520052008491b22084100480d94020240024020040d002008102721050c010b200628020020042008102821050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c3003a000002400240200241086a2802002205200828020022046b4104490d00200628020021050c010b200441046a22082004490d940220054101742204200820082004491b22044100480d94020240024020050d002004102721050c010b200628020020052004102821050b2005450ded0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441046a360200200520046a20073600000c7c0b200241046a2106200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d930220044101742207200520052007491b22074100480d93020240024020040d002007102721050c010b200628020020042007102821050b2005450ded0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a41c4003a000002400240200241086a2802002205200728020022046b4108490d00200628020021050c010b200441086a22072004490d930220054101742204200720072004491b22044100480d93020240024020050d002004102721050c010b200628020020052004102821050b2005450dee0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441086a360200200520046a200c3700000c7b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d920220044101742206200520052006491b22064100480d92020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c7a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d910220044101742206200520052006491b22064100480d91020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c790b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d900220044101742206200520052006491b22064100480d90020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c780b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f0220044101742206200520052006491b22064100480d8f020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000c770b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e0220044101742206200520052006491b22064100480d8e020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000c760b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d0220044101742206200520052006491b22064100480d8d020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c750b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c0220044101742206200520052006491b22064100480d8c020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c740b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b0220044101742206200520052006491b22064100480d8b020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000c730b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a0220044101742206200520052006491b22064100480d8a020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c720b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d890220044101742206200520052006491b22064100480d89020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c710b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d880220044101742206200520052006491b22064100480d88020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000c700b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d870220044101742206200520052006491b22064100480d87020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c6f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d860220044101742206200520052006491b22064100480d86020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c6e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d850220044101742206200520052006491b22064100480d85020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c6d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d840220044101742206200520052006491b22064100480d84020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c6c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d830220044101742206200520052006491b22064100480d83020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c6b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d820220044101742206200520052006491b22064100480d82020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c6a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d810220044101742206200520052006491b22064100480d81020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c690b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d800220044101742206200520052006491b22064100480d80020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000c680b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff0120044101742206200520052006491b22064100480dff010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000c670b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe0120044101742206200520052006491b22064100480dfe010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c660b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd0120044101742206200520052006491b22064100480dfd010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000c650b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000c640b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000c630b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000c620b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000c610b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c600b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000c5f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000c5e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c5d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000c5c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c5b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000c5a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000c590b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df00120044101742206200520052006491b22064100480df0010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c580b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490def0120044101742206200520052006491b22064100480def010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000c570b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dba0220044101742206200520052006491b22064100480dba020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000c560b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db90220044101742206200520052006491b22064100480db9020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000c550b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db80220044101742206200520052006491b22064100480db8020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c540b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db70220044101742206200520052006491b22064100480db7020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c530b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db60220044101742206200520052006491b22064100480db6020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c520b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db50220044101742206200520052006491b22064100480db5020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c510b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db40220044101742206200520052006491b22064100480db4020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c500b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db30220044101742206200520052006491b22064100480db3020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c4f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db20220044101742206200520052006491b22064100480db2020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000c4e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db10220044101742206200520052006491b22064100480db1020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c4d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db00220044101742206200520052006491b22064100480db0020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000c4c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daf0220044101742206200520052006491b22064100480daf020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c4b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dae0220044101742206200520052006491b22064100480dae020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000c4a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dad0220044101742206200520052006491b22064100480dad020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000c490b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dac0220044101742206200520052006491b22064100480dac020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c480b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dab0220044101742206200520052006491b22064100480dab020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c470b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daa0220044101742206200520052006491b22064100480daa020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c460b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da90220044101742206200520052006491b22064100480da9020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c450b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da80220044101742206200520052006491b22064100480da8020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000c440b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da70220044101742206200520052006491b22064100480da7020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c430b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da60220044101742206200520052006491b22064100480da6020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c420b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da50220044101742206200520052006491b22064100480da5020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000c410b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da40220044101742206200520052006491b22064100480da4020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000c400b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da30220044101742206200520052006491b22064100480da3020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000c3f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da20220044101742206200520052006491b22064100480da2020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000c3e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da10220044101742206200520052006491b22064100480da1020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000c3d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da00220044101742206200520052006491b22064100480da0020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000c3c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9f0220044101742206200520052006491b22064100480d9f020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c3b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9e0220044101742206200520052006491b22064100480d9e020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c3a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9d0220044101742206200520052006491b22064100480d9d020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c390b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9c0220044101742206200520052006491b22064100480d9c020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c380b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9b0220044101742206200520052006491b22064100480d9b020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000c370b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9a0220044101742206200520052006491b22064100480d9a020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c360b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d990220044101742206200520052006491b22064100480d99020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c350b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d980220044101742206200520052006491b22064100480d98020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000c340b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d970220044101742206200520052006491b22064100480d97020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000c330b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d960220044101742206200520052006491b22064100480d96020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c320b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d950220044101742206200520052006491b22064100480d95020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c310b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d940220044101742206200520052006491b22064100480d94020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c300b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d930220044101742206200520052006491b22064100480d93020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c2f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d920220044101742206200520052006491b22064100480d92020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000c2e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d910220044101742206200520052006491b22064100480d91020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000c2d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d900220044101742206200520052006491b22064100480d90020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c2c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f0220044101742206200520052006491b22064100480d8f020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c2b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e0220044101742206200520052006491b22064100480d8e020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c2a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d0220044101742206200520052006491b22064100480d8d020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000c290b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c0220044101742206200520052006491b22064100480d8c020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c280b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b0220044101742206200520052006491b22064100480d8b020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c270b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a0220044101742206200520052006491b22064100480d8a020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c260b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d890220044101742206200520052006491b22064100480d89020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c250b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d880220044101742206200520052006491b22064100480d88020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c240b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d870220044101742206200520052006491b22064100480d87020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c230b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d860220044101742206200520052006491b22064100480d86020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c220b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d850220044101742206200520052006491b22064100480d85020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c210b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d840220044101742206200520052006491b22064100480d84020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000c200b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d830220044101742206200520052006491b22064100480d83020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000c1f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d820220044101742206200520052006491b22064100480d82020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000c1e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d810220044101742206200520052006491b22064100480d81020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c1d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d800220044101742206200520052006491b22064100480d80020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c1c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff0120044101742206200520052006491b22064100480dff010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c1b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe0120044101742206200520052006491b22064100480dfe010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c1a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd0120044101742206200520052006491b22064100480dfd010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000c190b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000c180b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c170b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000c160b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000c150b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000c140b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c130b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000c120b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000c110b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c100b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000c0f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c0e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000c0d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df00120044101742206200520052006491b22064100480df0010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000c0c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c0b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000c0a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000c090b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000c080b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000c070b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000c060b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000c050b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c040b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000c030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000c020b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000c010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000b2000411a3a000020012d00004109470df201200141086a28020041ffffffff0371450df201200141046a28020010290cf2010b20064101102a000b20064101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20064101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20064101102a000b20084101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20064101102a000b20064101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b102b000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20074101102a000b20064101102a000b20084101102a000b20044101102a000b20074101102a000b20044101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20002003290300370200200041086a200341086a290300370200200941ffffffff0371450d01200b10290c010b20002002290200370200200041086a200241086a29020037020020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200341106a24000bb60301057f2004410c6a2105200441086a2106024002400240034002400240200628020020052802002207460d00200428020421080c010b200741016a22082007490d0420074101742209200820082009491b22094100480d040240024020070d002009102721080c010b200428020420072009102821080b2008450d022004200836020420062009360200200528020021070b2005200741016a360200200820076a200141807f72200141ff0071200141077622071b3a00002007210120070d000b024020022003460d002004410c6a2105200441086a2106034020022802002101034002400240200628020020052802002207460d00200428020421080c010b200741016a22082007490d0620074101742209200820082009491b22094100480d060240024020070d002009102721080c010b200428020420072009102821080b2008450d052004200836020420062009360200200528020021070b2005200741016a360200200820076a200141807f72200141ff0071200141077622071b3a00002007210120070d000b200241046a22022003470d000b0b2000411a3a00000f0b20094101102a000b20094101102a000b102b000bc30301067f200141c000712103200141ff0071210402400240024002400240200141077522050d002003450d010b2002410c6a2106200241086a2107034002402005417f470d00200341ff01710d020b02400240200728020020062802002208460d00200228020421030c010b200841016a22032008490d0520084101742204200320032004491b22044100480d050240024020080d002004102721030c010b200228020420082004102821030b2003450d032002200336020420072004360200200628020021080b2006200841016a360200200320086a200141807f723a0000200541c000712103200541ff007121042005210120054107752208210520080d002008210520030d000b0b02400240200241086a2802002002410c6a2802002205460d00200228020421080c010b200541016a22082005490d0320054101742203200820082003491b22034100480d030240024020050d002003102721080c010b200228020420052003102821080b2008450d0220022008360204200241086a20033602002002410c6a28020021050b2002410c6a200541016a360200200820056a20043a00002000411a3a00000f0b20044101102a000b20034101102a000b102b000bc30301067f2001a7220341c000712104200341ff0071210502400240024002400240200142078722014200520d002004450d010b2002410c6a2106200241086a2107034002402001427f520d00200441ff01710d020b02400240200728020020062802002204460d00200228020421050c010b200441016a22052004490d0520044101742208200520052008491b22084100480d050240024020040d002008102721050c010b200228020420042008102821050b2005450d032002200536020420072008360200200628020021040b2006200441016a360200200520046a200341807f723a00002001a7220341c000712104200341ff00712105200142078722014200520d0020040d000b0b02400240200241086a2802002002410c6a2802002204460d00200228020421030c010b200441016a22032004490d0320044101742206200320032006491b22064100480d030240024020040d002006102721030c010b200228020420042006102821030b2003450d0220022003360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000f0b20084101102a000b20064101102a000b102b000bcf03010a7f230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a200110e403024020022802184101470d002000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a28020010290b200741106a2107200641706a22060d000b0b2008450d04200910290c040b200220032900003703082002200429000037000f20022d0020210a2002200229000f37001f200220022903083703180240024020072008470d00200741016a220b2007490d032005200b200b2005491b220841ffffffff00712008470d032008410474220b4100480d030240024020070d00200b102721090c010b20092006200b102821090b2009450d010b200920066a220b200a3a0000200b41016a2002290318370000200b41086a200229001f370000200541026a2105200641106a2106200741016a2107200a41ff01714106460d030c010b0b200b4108102a000b102b000b20002009360204200041003602002000410c6a2007360200200041086a20083602000b200241306a24000b99b601020a7f017e230041f0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204460d00200441016a22052004490d02200320054f0d0120052003107f000b200241013a0048200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a10e603200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c610b2001280200220620046a2d000021072001410c6a2208200536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d0020070ec001b702b702010203b70200000000000405060708090a00000000000000000b0c000000000d0e0f101100000012131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901b7020b2000410b3a000420004101360200200041056a20073a00000cb9020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da102200620056a2c00002101200820093602004100210a0240200141004e0d00411821090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410221070cbd020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a10e603200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cbc020b4102210a410221070cb8020b4103210a410221070cb7020b4101210a0b410221070cb5020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da102200620056a2c00002101200820093602004100210a0240200141004e0d00411821090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410321070cbc020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a10e603200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cbb020b4102210a410321070cb7020b4103210a410321070cb6020b4101210a0b410321070cb4020b024002400240024002400240024020032005460d00200441026a21092005417f460de00120032009490da102200620056a2c00002101200820093602004100210a0240200141004e0d00411821090c020b0240200141017441807f71200172220141ff0171220541847e6a220941034d0d0041062109200541c001470d034104210a410421070cbb020b20090e0404030506040b200241013a0047200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c7006a360238200241c8006a200241d8006a10e603200241326a200241d0006a2802003601002002200229034837012a2002200229012837031820022002412e6a29010037011e410521090b2002200229011e37010e200220022903183703080b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e3701000cba020b4102210a410421070cb6020b4103210a410421070cb5020b4101210a0b410421070cb3020b410621070cb2020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddd012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb5020b410721070cb1020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddd012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb4020b410821070cb0020b200241d8006a200110e70341042109200228025822064101460da201200241e0006a280200210b200228025c210302400240200241e4006a28020022040d00410021074100210a0c010b0240024020044102742205410275220741ffffffff03712007470d0020054100480d002005102722090d0120054104102a000b102b000b200441027421042005417c6a210a410021050340200920056a200320056a2802003602002004200541046a2205470d000b200a41027641016a210a0b0240200b450d00200310290b20022d005c4105470dae022006450dae0220022802640da3010cae020b410a21070cae020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddb012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb1020b410b21070cad020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460ddb012003200541016a22044f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b20014120490d01410d210120074110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cb0020b0240024020032004460d00200441016a22012004490dd901200320014f0d0120012003107f000b200241013a0048200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a10e603200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000cb0020b200620046a2d0000210520082001360200024020050d00410c21074100210a0cad020b200041163a000420004101360200200041056a20053a00000caf020b410d21070cab020b410e21070caa020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460dda012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cad020b410f21070ca9020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460dda012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cac020b411021070ca8020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460dda012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000cab020b411121070ca7020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460dda012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000caa020b411221070ca6020b410021014100210902400240034002402001411f4d0d00410f21010c020b0240024020032005460d002005417f460dda012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010c020b200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b20014120490d01410d210120044110490d010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000ca9020b411321070ca5020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddb01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca8020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9c010b20032001460d9a012001417f460dd7012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9b010b200aad210c411421070ca4020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddc01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca7020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9d010b20032001460d9b012001417f460dd8012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9c010b200aad210c411521070ca3020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddd01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca6020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9e010b20032001460d9c012001417f460dd9012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9d010b200aad210c411621070ca2020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dde01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca5020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010c9f010b20032001460d9d012001417f460dda012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9e010b200aad210c411721070ca1020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ddf01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca4020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca0010b20032001460d9e012001417f460ddb012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0d9f010b200aad210c411821070ca0020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de001200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca3020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca1010b20032001460d9f012001417f460ddc012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da0010b200aad210c411921070c9f020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de101200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca2020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca2010b20032001460da0012001417f460ddd012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da1010b200aad210c411a21070c9e020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de201200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca1020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca3010b20032001460da1012001417f460dde012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da2010b200aad210c411b21070c9d020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de301200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000ca0020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca4010b20032001460da2012001417f460ddf012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da3010b200aad210c411c21070c9c020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de401200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9f020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca5010b20032001460da3012001417f460de0012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da4010b200aad210c411d21070c9b020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de501200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9e020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca6010b20032001460da4012001417f460de1012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da5010b200aad210c411e21070c9a020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de601200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9d020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca7010b20032001460da5012001417f460de2012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da6010b200aad210c411f21070c99020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de701200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9c020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca8010b20032001460da6012001417f460de3012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b41202107024020054120490d00410d21012004410f4b0da7010b200aad210c0c98020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de801200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9b020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010ca9010b20032001460da7012001417f460de4012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da8010b200aad210c412121070c97020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450de901200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c9a020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010caa010b20032001460da8012001417f460de5012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0da9010b200aad210c412221070c96020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dea01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c99020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cab010b20032001460da9012001417f460de6012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0daa010b200aad210c412321070c95020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450deb01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c98020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cac010b20032001460daa012001417f460de7012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dab010b200aad210c412421070c94020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dec01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c97020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cad010b20032001460dab012001417f460de8012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dac010b200aad210c412521070c93020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450ded01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c96020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cae010b20032001460dac012001417f460de9012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dad010b200aad210c412621070c92020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450dee01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c95020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010caf010b20032001460dad012001417f460dea012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0dae010b200aad210c412721070c91020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450def01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c94020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb0010b20032001460dae012001417f460deb012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0daf010b200aad210c412821070c90020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df001200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c93020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb1010b20032001460daf012001417f460dec012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0db0010b200aad210c412921070c8f020b410120036b2107200441026a21014100210541002109024002400240034002402005411f4d0d00410f21010c020b02400240200720016a4102460d002001450df101200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320022802282109200228022c210520022802302103410521010c030b200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d0220044110490d02410d21010b0b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a20093602000c92020b2001417f6a2101410021054100210a034002402005411f4d0d00410f21010cb2010b20032001460db0012001417f460ded012003200141016a2207490d8d02200620016a2d0000210420082007360200200441ff00712005411f7174200a72210a200541076a2105200721012004418001710d000b024020054120490d00410d21012004410f4b0db1010b200aad210c412a21070c8e020b0240024020032005460d00200441026a21012005417f460dee01200320014f0d0120012003107f000b200241013a0048200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a10e603200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c91020b200620056a2d0000210920082001360200024020090d00412b21074100210a0c8e020b200041153a000420004101360200200041056a20093a00000c90020b0240024020032005460d00200441026a21012005417f460dee01200320014f0d0120012003107f000b200241013a0048200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241c8006a360238200241086a200241d8006a10e603200241336a200241106a2802003600002002200229030837002b2002200229002837031820022002412f6a29000037001f200041053a0004200020022903183700052000410c6a200229001f370000200041013602000c90020b200620056a2d0000210920082001360200024020090d00412c21074100210a0c8d020b200041153a000420004101360200200041056a20093a00000c8f020b41002101410021090240024002400340410d210a2001411f4b0d010240024020032005460d002005417f460df2012003200541016a22074f0d01200541016a2003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e6034105210a0c020b200620056a2c0000210420082007360200200441ff00712001411f71742009722109200141076a21012007210520044100480d000b200441c00071210502402001411f4b0d0020050d020b0240024020014120490d0020050d010b200441ff01714108490d0320014120490d032005450d010c030b20044180017241ff017141f7014b0d020b2000200a36020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c90020b2009417f2001411f71747221090b412d21070c8b020b4200210c4100210102400240024002400340410e21072001413f4b0d010240024020032005460d002005417f460df3012003200541016a22094f0d01200541016a2003107f000b200241013a0008200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241086a360238200241286a200241d8006a10e6032002290328210c20022802302101410521070c030b200620056a2d0000210420082009360200200441ff0071220aad2001413f71ad86200c84210c200141076a210120092105200441187441187522094100480d000b200941c00071210502402001413f4b0d0020050d030b02400240200141c000490d0020050d010b200141c000490d0420090d010c040b200a41ff00460d030b0b200020073a0004200020022f00183b000520004101360200200041106a2001360200200041086a200c370200200041076a2002411a6a2d00003a00000c8f020b200c427f2001413f71ad8684210c0b412e21070c8a020b02400240200320056b4104490d00200441056a21012005417b4b0dee01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e60320004281808080d000370300200041086a2002290228370200200041106a200241286a41086a2802003602000c8d020b200620056a280000210920082001360200412f21070c89020b02400240200320056b4108490d00200441096a2101200541774b0dee01200320014f0d0120012003107f000b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e6032002290328210c200041106a2002280230360200200041086a200c37020020004281808080d0003703000c8c020b200620056a290000210c20082001360200413021070c88020b413121070c87020b413221070c86020b413321070c85020b413421070c84020b413521070c83020b413621070c82020b413721070c81020b413821070c80020b413921070cff010b413a21070cfe010b413b21070cfd010b413c21070cfc010b413d21070cfb010b413e21070cfa010b413f21070cf9010b41c00021070cf8010b41c10021070cf7010b41c20021070cf6010b41c30021070cf5010b41c40021070cf4010b41c50021070cf3010b41c60021070cf2010b41c70021070cf1010b41c80021070cf0010b41c90021070cef010b41ca0021070cee010b41cb0021070ced010b41cc0021070cec010b41cd0021070ceb010b41ce0021070cea010b41cf0021070ce9010b41d00021070ce8010b41d10021070ce7010b41d20021070ce6010b41d30021070ce5010b41d40021070ce4010b41d50021070ce3010b41d60021070ce2010b41d70021070ce1010b41d80021070ce0010b41d90021070cdf010b41da0021070cde010b41db0021070cdd010b41dc0021070cdc010b41dd0021070cdb010b41de0021070cda010b41df0021070cd9010b41e00021070cd8010b41e10021070cd7010b41e20021070cd6010b41e30021070cd5010b41e40021070cd4010b41e50021070cd3010b41e60021070cd2010b41e70021070cd1010b41e80021070cd0010b41e90021070ccf010b41ea0021070cce010b41eb0021070ccd010b41ec0021070ccc010b41ed0021070ccb010b41ee0021070cca010b41ef0021070cc9010b41f00021070cc8010b41f10021070cc7010b41f20021070cc6010b41f30021070cc5010b41f40021070cc4010b41f50021070cc3010b41f60021070cc2010b41f70021070cc1010b41f80021070cc0010b41f90021070cbf010b41fa0021070cbe010b41fb0021070cbd010b41fc0021070cbc010b41fd0021070cbb010b41fe0021070cba010b41ff0021070cb9010b41800121070cb8010b41810121070cb7010b41820121070cb6010b41830121070cb5010b41840121070cb4010b41850121070cb3010b41860121070cb2010b41870121070cb1010b41880121070cb0010b41890121070caf010b418a0121070cae010b418b0121070cad010b418c0121070cac010b418d0121070cab010b418e0121070caa010b418f0121070ca9010b41900121070ca8010b41910121070ca7010b41920121070ca6010b41930121070ca5010b41940121070ca4010b41950121070ca3010b41960121070ca2010b41970121070ca1010b41980121070ca0010b41990121070c9f010b419a0121070c9e010b419b0121070c9d010b419c0121070c9c010b419d0121070c9b010b419e0121070c9a010b419f0121070c99010b41a00121070c98010b41a10121070c97010b41a20121070c96010b41a30121070c95010b41a40121070c94010b41a50121070c93010b41a60121070c92010b41a70121070c91010b41a80121070c90010b41a90121070c8f010b41aa0121070c8e010b41ab0121070c8d010b200041013602002000200241d8006a41047222012902003702042000410c6a200141086a2902003702000c8f010b200228026010290c8a010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c8c010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c8a010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c88010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c86010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c84010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c82010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c80010b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c7e0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c7c0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c7a0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c780b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c760b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c740b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c720b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c700b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c6e0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c6c0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c6a0b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c680b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c660b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c640b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c620b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a2802003602000c600b417f2005103e000b417f2009103e000b417f2009103e000b417f2009103e000b417f200541016a103e000b417f200541016a103e000b417f200541016a103e000b417f200541016a103e000b417f2001103e000b417f200541016a103e000b417f200541016a103e000b417f200541016a103e000b417f200541016a103e000b417f200541016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f200141016a103e000b417f2001103e000b417f2001103e000b417f200541016a103e000b417f200541016a103e000b20052001103e000b20052001103e000b20092003107f000b20092003107f000b20092003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b200141016a2003107f000b0240024002400240024002402007200a470d002007210a0c010b2007200a490d010240200a0d004100210a024020070d00410421090c020b20091029410421090c010b20092007410274200a410274220510282209450d020b4100210541002107034002402005411f4d0d00410f21010c080b20012802082206200128020c2203460d06200341016a22042003490d0320062004490d04200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d21012003410f4b0d070b2007ad422086200aad84210c410921070c040b41ac87c5001058000b20054104102a000b417f2004103e000b20042006107f000b20004100360200200041106a200c3703002000410c6a2009360200200041096a200a3a0000200041086a20073a00000c020b200241013a0018200241ec006a41013602002002420137025c20024180c0c5003602582002411f36023c2002200241386a3602682002200241186a360238200241286a200241d8006a10e603410521010b2000200136020420004101360200200041086a2002290228370200200041106a200241286a41086a280200360200200a41ffffffff0371450d00200910290b200241f0006a24000bd30101017f230041106b22022400024002400240024020002d00000e03010200010b2002200128021841dcbfc500410b2001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c020b2002200128021841e7bfc500410c2001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c010b2002200128021841f3bfc500410d2001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040b200241106a240020000b8a0301067f230041306b2202240020012802002103024002402001280204220441037422050d00410021060c010b200341046a2107410021060340200728020020066a2106200741086a2107200541786a22050d000b0b024002400240024002400240200141146a2802000d00200621070c010b02402004450d00024002402006410f4b0d002003280204450d010b200620066a220720064f0d020b4101210541002107200241086a21060c020b41f0d2c500410041001037000b2007417f4c0d01200241086a2106024020070d0041012105410021070c010b200710272205450d020b200241003602102002200736020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a29020037030020022001290200370318200241146a4180d3c500200241186a1091040d0220002006290200370200200041086a200641086a280200360200200241306a24000f0b1039000b20074101102a000b4198d3c5004133200241186a41ccd3c50010a201000bf30603067f017e067f230041c0006b2202240041002103410021040240024002400240024002400240034002402003411f4d0d00410f21030c020b0240024020012802082205200128020c2206460d00200641016a22072006490d05200520074f0d0120072005107f000b200241013a000f2002413c6a41013602002002420137022c20024180c0c5003602282002411f3602142002200241106a36023820022002410f6a360210200241186a200241286a10e603410521030c020b200128020020066a2d000021062001200736020c200641ff00712003411f71742004722104200341076a21032006418001710d000b20034120490d01410d210320064110490d010b200241086a200241186a41086a280200220136020020022002290218220837030020002003360204200041086a2008370200200041106a2001360200200041013602000c050b410421090240024020040d004100210a0c010b4100210a4100210b0340200b220c41016a210b4100210341002105024002400240034002402003411f4d0d00410f21010c020b024002402001280208220d200128020c2206460d00200641016a22072006490d09200d20074f0d012007200d107f000b200241013a00002002413c6a41013602002002420137022c20024180c0c5003602282002411f3602142002200241106a36023820022002360210200241186a200241286a10e60320022802182103200228021c2106200228022021074100210e410521010c030b200128020020066a2d000021062001200736020c200641ff00712003411f71742005722105200341076a21032006418001710d000b20034120490d0220064110490d02410d21010b0b20004101360200200041106a20073602002000410c6a2006360200200041086a20033602002000200e410874200172360204200a450d07200910290c070b0240200a200c470d00200a4101742203200a41016a220620062003491b220341ffffffff03712003470d06200341027422064100480d0602400240200a0d002006102721090c010b2009200a4102742006102821090b2009450d052003210a0b2005410876210e2009200c4102746a2005360200200b2004470d000b0b20002009360204200041003602002000410c6a2004360200200041086a200a3602000c040b417f2007103e000b417f2007103e000b20064104102a000b102b000b200241c0006a24000bf6d60202097f017e230041106b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000eac01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000cab010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450dad0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000caa010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df50120044101742208200520052008491b22084100480df5010240024020040d002008102721050c010b200628020020042008102821050b2005450dad0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41023a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df50120044101742208200520052008491b22084100480df5010240024020040d002008102721050c010b200628020020042008102821050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca9010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df40120044101742208200520052008491b22084100480df4010240024020040d002008102721050c010b200628020020042008102821050b2005450dae0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41033a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df40120044101742208200520052008491b22084100480df4010240024020040d002008102721050c010b200628020020042008102821050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca8010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490df30120044101742208200520052008491b22084100480df3010240024020040d002008102721050c010b200628020020042008102821050b2005450daf0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41043a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490df30120044101742208200520052008491b22084100480df3010240024020040d002008102721050c010b200628020020042008102821050b2005450db00120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2007410473ad42078342038688a7413f7141c000723a00000ca7010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000ca6010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450db00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000ca5010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490df00120044101742207200620062007491b22074100480df0010240024020040d002007102721060c010b200928020020042007102821060b2006450db00120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410c3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df1012004410174220a20062006200a491b220a4100480df1010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db201200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca5010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490def0120044101742207200620062007491b22074100480def010240024020040d002007102721060c010b200928020020042007102821060b2006450db10120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a410d3a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490df0012004410174220a20062006200a491b220a4100480df0010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db301200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca4010b0b200241046a210a2001410c6a2802002104200141086a2802002109200141046a280200210b02400240200241086a2802002002410c6a2802002201460d00200a28020021050c010b200141016a22052001490dee0120014101742206200520052006491b22064100480dee010240024020010d002006102721050c010b200a28020020012006102821050b2005450db20120022005360204200241086a20063602002002410c6a28020021010b2002410c6a2206200141016a360200200520016a410e3a000020032009200b200b20094102746a200210e00320032d0000411a470d9303200241086a2107034002400240200728020020062802002201460d00200a28020021050c010b200141016a22052001490def0120014101742208200520052008491b22084100480def010240024020010d002008102721050c010b200a28020020012008102821050b2005450db4012002200536020420072008360200200628020021010b2006200141016a360200200520016a200441807f72200441ff0071200441077622011b3a00002001210420010d000b0240200941ffffffff0371450d00200b10290b2000411a3a00000c95030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490ded0120044101742206200520052006491b22064100480ded010240024020040d002006102721050c010b200228020420042006102821050b2005450db30120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000ca1010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490dec0120044101742207200620062007491b22074100480dec010240024020040d002007102721060c010b200928020020042007102821060b2006450db30120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41103a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490ded012004410174220a20062006200a491b220a4100480ded010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db501200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000ca1010b0b200241046a2109200141046a280200210520012d0001210b02400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490deb0120044101742207200620062007491b22074100480deb010240024020040d002007102721060c010b200928020020042007102821060b2006450db40120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41113a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490dec012004410174220a20062006200a491b220a4100480dec010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db601200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b02400240200241086a2802002002410c6a2802002204460d00200928020021050c010b200441016a22052004490deb0120044101742206200520052006491b22064100480deb010240024020040d002006102721050c010b200928020020042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a200b3a00000c9f010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dea0120044101742206200520052006491b22064100480dea010240024020040d002006102721050c010b200228020420042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000c9e010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490de90120044101742206200520052006491b22064100480de9010240024020040d002006102721050c010b200228020420042006102821050b2005450db60120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c9d010b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de80120044101742207200620062007491b22074100480de8010240024020040d002007102721060c010b200928020020042007102821060b2006450db60120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41203a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de9012004410174220a20062006200a491b220a4100480de9010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db801200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9d010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de70120044101742207200620062007491b22074100480de7010240024020040d002007102721060c010b200928020020042007102821060b2006450db70120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41213a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de8012004410174220a20062006200a491b220a4100480de8010240024020040d00200a102721060c010b20092802002004200a102821060b2006450db901200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9c010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de60120044101742207200620062007491b22074100480de6010240024020040d002007102721060c010b200928020020042007102821060b2006450db80120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41223a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de7012004410174220a20062006200a491b220a4100480de7010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dba01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9b010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de50120044101742207200620062007491b22074100480de5010240024020040d002007102721060c010b200928020020042007102821060b2006450db90120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41233a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de6012004410174220a20062006200a491b220a4100480de6010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dbb01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c9a010b0b200241046a2109200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200928020021060c010b200441016a22062004490de40120044101742207200620062007491b22074100480de4010240024020040d002007102721060c010b200928020020042007102821060b2006450dba0120022006360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200620046a41243a0000200241086a2108034002400240200828020020072802002204460d00200928020021060c010b200441016a22062004490de5012004410174220a20062006200a491b220a4100480de5010240024020040d00200a102721060c010b20092802002004200a102821060b2006450dbc01200220063602042008200a360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c99010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de30120044101742208200720072008491b22084100480de3010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41283a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de4012004410174220b20072007200b491b220b4100480de4010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dbd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de40120044101742209200620062009491b22094100480de4010240024020040d002009102721060c010b200a28020020042009102821060b2006450dbe012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c98010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de20120044101742208200720072008491b22084100480de2010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41293a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de3012004410174220b20072007200b491b220b4100480de3010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dbf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de30120044101742209200620062009491b22094100480de3010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c97010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de10120044101742208200720072008491b22084100480de1010240024020040d002008102721070c010b200a28020020042008102821070b2007450dbf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de2012004410174220b20072007200b491b220b4100480de2010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de20120044101742209200620062009491b22094100480de2010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c96010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490de00120044101742208200720072008491b22084100480de0010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de1012004410174220b20072007200b491b220b4100480de1010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de10120044101742209200620062009491b22094100480de1010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c95010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddf0120044101742208200720072008491b22084100480ddf010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490de0012004410174220b20072007200b491b220b4100480de0010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490de00120044101742209200620062009491b22094100480de0010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c94010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dde0120044101742208200720072008491b22084100480dde010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddf012004410174220b20072007200b491b220b4100480ddf010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc701200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddf0120044101742209200620062009491b22094100480ddf010240024020040d002009102721060c010b200a28020020042009102821060b2006450dc8012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c93010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddd0120044101742208200720072008491b22084100480ddd010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc70120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dde012004410174220b20072007200b491b220b4100480dde010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dc901200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dde0120044101742209200620062009491b22094100480dde010240024020040d002009102721060c010b200a28020020042009102821060b2006450dca012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c92010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddc0120044101742208200720072008491b22084100480ddc010240024020040d002008102721070c010b200a28020020042008102821070b2007450dc90120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a412f3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddd012004410174220b20072007200b491b220b4100480ddd010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcb01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddd0120044101742209200620062009491b22094100480ddd010240024020040d002009102721060c010b200a28020020042009102821060b2006450dcc012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c91010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490ddb0120044101742208200720072008491b22084100480ddb010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcb0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41303a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddc012004410174220b20072007200b491b220b4100480ddc010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcd01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddc0120044101742209200620062009491b22094100480ddc010240024020040d002009102721060c010b200a28020020042009102821060b2006450dce012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c90010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dda0120044101742208200720072008491b22084100480dda010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcd0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41313a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490ddb012004410174220b20072007200b491b220b4100480ddb010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dcf01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490ddb0120044101742209200620062009491b22094100480ddb010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd0012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8f010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd90120044101742208200720072008491b22084100480dd9010240024020040d002008102721070c010b200a28020020042008102821070b2007450dcf0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41323a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dda012004410174220b20072007200b491b220b4100480dda010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd101200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dda0120044101742209200620062009491b22094100480dda010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd2012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8e010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd80120044101742208200720072008491b22084100480dd8010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd10120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41333a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd9012004410174220b20072007200b491b220b4100480dd9010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd301200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd90120044101742209200620062009491b22094100480dd9010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd4012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8d010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd70120044101742208200720072008491b22084100480dd7010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd30120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41343a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490dd8012004410174220b20072007200b491b220b4100480dd8010240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd501200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490dd80120044101742209200620062009491b22094100480dd8010240024020040d002009102721060c010b200a28020020042009102821060b2006450dd6012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8c010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490dd60120044101742208200720072008491b22084100480dd6010240024020040d002008102721070c010b200a28020020042008102821070b2007450dd50120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41353a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da3022004410174220b20072007200b491b220b4100480da3020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dd801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da30220044101742209200620062009491b22094100480da3020240024020040d002009102721060c010b200a28020020042009102821060b2006450dd9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8b010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da10220044101742208200720072008491b22084100480da1020240024020040d002008102721070c010b200a28020020042008102821070b2007450dd80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41363a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da2022004410174220b20072007200b491b220b4100480da2020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dda01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da20220044101742209200620062009491b22094100480da2020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c8a010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490da00220044101742208200720072008491b22084100480da0020240024020040d002008102721070c010b200a28020020042008102821070b2007450dda0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41373a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da1022004410174220b20072007200b491b220b4100480da1020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450ddc01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da10220044101742209200620062009491b22094100480da1020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddd012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c89010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9f0220044101742208200720072008491b22084100480d9f020240024020040d002008102721070c010b200a28020020042008102821070b2007450ddc0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41383a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490da0022004410174220b20072007200b491b220b4100480da0020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dde01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490da00220044101742209200620062009491b22094100480da0020240024020040d002009102721060c010b200a28020020042009102821060b2006450ddf012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c88010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9e0220044101742208200720072008491b22084100480d9e020240024020040d002008102721070c010b200a28020020042008102821070b2007450dde0120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a41393a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9f022004410174220b20072007200b491b220b4100480d9f020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de001200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9f0220044101742209200620062009491b22094100480d9f020240024020040d002009102721060c010b200a28020020042009102821060b2006450de1012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c87010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9d0220044101742208200720072008491b22084100480d9d020240024020040d002008102721070c010b200a28020020042008102821070b2007450de00120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413a3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9e022004410174220b20072007200b491b220b4100480d9e020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de201200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9e0220044101742209200620062009491b22094100480d9e020240024020040d002009102721060c010b200a28020020042009102821060b2006450de3012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c86010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9c0220044101742208200720072008491b22084100480d9c020240024020040d002008102721070c010b200a28020020042008102821070b2007450de20120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413b3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9d022004410174220b20072007200b491b220b4100480d9d020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de401200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9d0220044101742209200620062009491b22094100480d9d020240024020040d002009102721060c010b200a28020020042009102821060b2006450de5012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c85010b0b200241046a210a200141086a2802002106200141046a280200210502400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9b0220044101742208200720072008491b22084100480d9b020240024020040d002008102721070c010b200a28020020042008102821070b2007450de40120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413c3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9c022004410174220b20072007200b491b220b4100480d9c020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de601200220073602042009200b360200200828020021040b2008200441016a360200200720046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021050c010b200441016a22052004490d9c0220044101742209200520052009491b22094100480d9c020240024020040d002009102721050c010b200a28020020042009102821050b2005450de7012002200536020420082009360200200728020021040b2007200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000c84010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d9a0220044101742208200720072008491b22084100480d9a020240024020040d002008102721070c010b200a28020020042008102821070b2007450de60120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413d3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9b022004410174220b20072007200b491b220b4100480d9b020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450de801200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9b0220044101742209200620062009491b22094100480d9b020240024020040d002009102721060c010b200a28020020042009102821060b2006450de9012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c83010b0b200241046a210a200141086a2802002105200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200a28020021070c010b200441016a22072004490d990220044101742208200720072008491b22084100480d99020240024020040d002008102721070c010b200a28020020042008102821070b2007450de80120022007360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200720046a413e3a0000200241086a2109034002400240200928020020082802002204460d00200a28020021070c010b200441016a22072004490d9a022004410174220b20072007200b491b220b4100480d9a020240024020040d00200b102721070c010b200a2802002004200b102821070b2007450dea01200220073602042009200b360200200828020021040b2008200441016a360200200720046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2107200241086a2108034002400240200828020020072802002204460d00200a28020021060c010b200441016a22062004490d9a0220044101742209200620062009491b22094100480d9a020240024020040d002009102721060c010b200a28020020042009102821060b2006450deb012002200636020420082009360200200728020021040b2007200441016a360200200620046a200541807f72200541ff0071200541077622041b3a00002004210520040d000c82010b0b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d980220044101742208200520052008491b22084100480d98020240024020040d002008102721050c010b200628020020042008102821050b2005450dea0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a413f3a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d980220044101742208200520052008491b22084100480d98020240024020040d002008102721050c010b200628020020042008102821050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c80010b200241046a210620012d0001210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d970220044101742208200520052008491b22084100480d97020240024020040d002008102721050c010b200628020020042008102821050b2005450deb0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c0003a000002400240200241086a28020020082802002204460d00200628020021050c010b200441016a22052004490d970220044101742208200520052008491b22084100480d97020240024020040d002008102721050c010b200628020020042008102821050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a200441016a360200200520046a20073a00000c7f0b200141046a280200210602400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d960220044101742207200520052007491b22074100480d96020240024020040d002007102721050c010b200228020420042007102821050b2005450dec0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210e1032003210220032d0000411a470df0020c7e0b200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d950220044101742206200520052006491b22064100480d95020240024020040d002006102721050c010b200228020420042006102821050b2005450dec0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200c200210e2032003210220032d0000411a470def020c7d0b200241046a2106200141046a280200210702400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d940220044101742208200520052008491b22084100480d94020240024020040d002008102721050c010b200628020020042008102821050b2005450dec0120022005360204200241086a20083602002002410c6a28020021040b2002410c6a2208200441016a360200200520046a41c3003a000002400240200241086a2802002205200828020022046b4104490d00200628020021050c010b200441046a22082004490d940220054101742204200820082004491b22044100480d94020240024020050d002004102721050c010b200628020020052004102821050b2005450ded0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441046a360200200520046a20073600000c7c0b200241046a2106200141086a290300210c02400240200241086a2802002002410c6a2802002204460d00200628020021050c010b200441016a22052004490d930220044101742207200520052007491b22074100480d93020240024020040d002007102721050c010b200628020020042007102821050b2005450ded0120022005360204200241086a20073602002002410c6a28020021040b2002410c6a2207200441016a360200200520046a41c4003a000002400240200241086a2802002205200728020022046b4108490d00200628020021050c010b200441086a22072004490d930220054101742204200720072004491b22044100480d93020240024020050d002004102721050c010b200628020020052004102821050b2005450dee0120022005360204200241086a20043602002002410c6a28020021040b2002410c6a200441086a360200200520046a200c3700000c7b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d920220044101742206200520052006491b22064100480d92020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c7a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d910220044101742206200520052006491b22064100480d91020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c790b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d900220044101742206200520052006491b22064100480d90020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c780b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f0220044101742206200520052006491b22064100480d8f020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000c770b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e0220044101742206200520052006491b22064100480d8e020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000c760b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d0220044101742206200520052006491b22064100480d8d020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c750b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c0220044101742206200520052006491b22064100480d8c020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c740b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b0220044101742206200520052006491b22064100480d8b020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000c730b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a0220044101742206200520052006491b22064100480d8a020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c720b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d890220044101742206200520052006491b22064100480d89020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c710b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d880220044101742206200520052006491b22064100480d88020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000c700b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d870220044101742206200520052006491b22064100480d87020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c6f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d860220044101742206200520052006491b22064100480d86020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c6e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d850220044101742206200520052006491b22064100480d85020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c6d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d840220044101742206200520052006491b22064100480d84020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c6c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d830220044101742206200520052006491b22064100480d83020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c6b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d820220044101742206200520052006491b22064100480d82020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c6a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d810220044101742206200520052006491b22064100480d81020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c690b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d800220044101742206200520052006491b22064100480d80020240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000c680b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff0120044101742206200520052006491b22064100480dff010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000c670b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe0120044101742206200520052006491b22064100480dfe010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c660b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd0120044101742206200520052006491b22064100480dfd010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000c650b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000c640b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000c630b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000c620b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000c610b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c600b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000c5f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000c5e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c5d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000c5c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c5b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000c5a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000c590b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df00120044101742206200520052006491b22064100480df0010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c580b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490def0120044101742206200520052006491b22064100480def010240024020040d002006102721050c010b200228020420042006102821050b2005450dee0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000c570b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dba0220044101742206200520052006491b22064100480dba020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000c560b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db90220044101742206200520052006491b22064100480db9020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000c550b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db80220044101742206200520052006491b22064100480db8020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c540b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db70220044101742206200520052006491b22064100480db7020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c530b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db60220044101742206200520052006491b22064100480db6020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c520b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db50220044101742206200520052006491b22064100480db5020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c510b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db40220044101742206200520052006491b22064100480db4020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c500b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db30220044101742206200520052006491b22064100480db3020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c4f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db20220044101742206200520052006491b22064100480db2020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000c4e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db10220044101742206200520052006491b22064100480db1020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c4d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490db00220044101742206200520052006491b22064100480db0020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000c4c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daf0220044101742206200520052006491b22064100480daf020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c4b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dae0220044101742206200520052006491b22064100480dae020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000c4a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dad0220044101742206200520052006491b22064100480dad020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000c490b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dac0220044101742206200520052006491b22064100480dac020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c480b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dab0220044101742206200520052006491b22064100480dab020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c470b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490daa0220044101742206200520052006491b22064100480daa020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c460b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da90220044101742206200520052006491b22064100480da9020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c450b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da80220044101742206200520052006491b22064100480da8020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000c440b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da70220044101742206200520052006491b22064100480da7020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c430b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da60220044101742206200520052006491b22064100480da6020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c420b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da50220044101742206200520052006491b22064100480da5020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000c410b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da40220044101742206200520052006491b22064100480da4020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000c400b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da30220044101742206200520052006491b22064100480da3020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000c3f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da20220044101742206200520052006491b22064100480da2020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000c3e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da10220044101742206200520052006491b22064100480da1020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000c3d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490da00220044101742206200520052006491b22064100480da0020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000c3c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9f0220044101742206200520052006491b22064100480d9f020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c3b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9e0220044101742206200520052006491b22064100480d9e020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c3a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9d0220044101742206200520052006491b22064100480d9d020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c390b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9c0220044101742206200520052006491b22064100480d9c020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c380b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9b0220044101742206200520052006491b22064100480d9b020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000c370b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d9a0220044101742206200520052006491b22064100480d9a020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c360b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d990220044101742206200520052006491b22064100480d99020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c350b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d980220044101742206200520052006491b22064100480d98020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000c340b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d970220044101742206200520052006491b22064100480d97020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000c330b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d960220044101742206200520052006491b22064100480d96020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c320b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d950220044101742206200520052006491b22064100480d95020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c310b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d940220044101742206200520052006491b22064100480d94020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c300b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d930220044101742206200520052006491b22064100480d93020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c2f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d920220044101742206200520052006491b22064100480d92020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000c2e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d910220044101742206200520052006491b22064100480d91020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000c2d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d900220044101742206200520052006491b22064100480d90020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c2c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8f0220044101742206200520052006491b22064100480d8f020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c2b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8e0220044101742206200520052006491b22064100480d8e020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c2a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8d0220044101742206200520052006491b22064100480d8d020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000c290b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8c0220044101742206200520052006491b22064100480d8c020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c280b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8b0220044101742206200520052006491b22064100480d8b020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c270b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d8a0220044101742206200520052006491b22064100480d8a020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c260b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d890220044101742206200520052006491b22064100480d89020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c250b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d880220044101742206200520052006491b22064100480d88020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c240b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d870220044101742206200520052006491b22064100480d87020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c230b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d860220044101742206200520052006491b22064100480d86020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c220b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d850220044101742206200520052006491b22064100480d85020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c210b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d840220044101742206200520052006491b22064100480d84020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000c200b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d830220044101742206200520052006491b22064100480d83020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000c1f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d820220044101742206200520052006491b22064100480d82020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000c1e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d810220044101742206200520052006491b22064100480d81020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c1d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490d800220044101742206200520052006491b22064100480d80020240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c1c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dff0120044101742206200520052006491b22064100480dff010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c1b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfe0120044101742206200520052006491b22064100480dfe010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c1a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfd0120044101742206200520052006491b22064100480dfd010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000c190b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000c180b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c170b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000c160b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000c150b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000c140b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c130b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000c120b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000c110b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c100b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000c0f0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c0e0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000c0d0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df00120044101742206200520052006491b22064100480df0010240024020040d002006102721050c010b200228020420042006102821050b2005450def0120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000c0c0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfc0120044101742206200520052006491b22064100480dfc010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c0b0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfb0120044101742206200520052006491b22064100480dfb010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000c0a0b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490dfa0120044101742206200520052006491b22064100480dfa010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000c090b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df90120044101742206200520052006491b22064100480df9010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000c080b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df80120044101742206200520052006491b22064100480df8010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000c070b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df70120044101742206200520052006491b22064100480df7010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000c060b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df60120044101742206200520052006491b22064100480df6010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000c050b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df50120044101742206200520052006491b22064100480df5010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c040b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df40120044101742206200520052006491b22064100480df4010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000c030b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df30120044101742206200520052006491b22064100480df3010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000c020b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df20120044101742206200520052006491b22064100480df2010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000c010b02400240200241086a2802002002410c6a2802002204460d00200228020421050c010b200441016a22052004490df10120044101742206200520052006491b22064100480df1010240024020040d002006102721050c010b200228020420042006102821050b2005450df00120022005360204200241086a20063602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000b2000411a3a000020012d00004109470df201200141086a28020041ffffffff0371450df201200141046a28020010290cf2010b20064101102a000b20064101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20064101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20064101102a000b20084101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20064101102a000b20064101102a000b20064101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20074101102a000b200a4101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b102b000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b200b4101102a000b20094101102a000b20084101102a000b20084101102a000b20084101102a000b20084101102a000b20074101102a000b20064101102a000b20084101102a000b20044101102a000b20074101102a000b20044101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b102b000b20002003290300370200200041086a200341086a290300370200200941ffffffff0371450d01200b10290c010b20002002290200370200200041086a200241086a29020037020020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200341106a24000b8307010c7f200028021021030240024002400240200028020822044101460d0020030d012000280218200120022000411c6a28020028020c11050021030c030b2003450d010b0240024020020d00410021020c010b200120026a2105200041146a28020041016a21064100210720012103200121080340200341016a210902400240024020032c0000220a417f4a0d000240024020092005470d004100210b200521030c010b20032d0001413f71210b200341026a220921030b200a411f71210c0240200a41ff0171220a41df014b0d00200b200c41067472210a0c020b0240024020032005470d004100210d2005210e0c010b20032d0000413f71210d200341016a2209210e0b200d200b41067472210b0240200a41f0014f0d00200b200c410c7472210a0c020b02400240200e2005470d004100210a200921030c010b200e41016a2103200e2d0000413f71210a0b200b410674200c411274418080f0007172200a72220a418080c400470d020c040b200a41ff0171210a0b200921030b02402006417f6a2206450d00200720086b20036a21072003210820052003470d010c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b20040d002000280218200120022000411c6a28020028020c1105000f0b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b0240200220096b200028020c2206490d002000280218200120022000411c6a28020028020c1105000f0b410021074100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a210a024002400240410020002d0030220320034103461b0e0402000100020b200a21074100210a0c010b200a4101762107200a41016a410176210a0b200741016a2103024003402003417f6a2203450d0120002802182000280204200028021c280210110400450d000b41010f0b2000280204210941012103200028021820012002200028021c28020c1105000d00200a41016a2103200028021c210a20002802182100034002402003417f6a22030d0041000f0b20002009200a280210110400450d000b41010f0b20030bfb07030e7f017e017f200241086a2103200241046a210420012802002205210602400240024002400240034002400240200428020020032802002207460d00200228020021080c010b200741016a22082007490d0220074101742209200820082009491b22094100480d020240024020070d002009102721080c010b200228020020072009102821080b2008450d032002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b2001280204220a2001410c6a2802002206410c6c6a210b200141086a280200210c200a21072006450d03200a21072005450d03200b41746a210d200241086a210841002107200a210e02400340200e2103024003402003280200220f0d01200741016a2107200b2003410c6a2203470d000c080b0b2003410c6a210e200741016a21102005417f6a2105200341046a290200211102400240034002400240200241046a220428020020082802002206460d00200228020021090c010b200641016a22092006490d0620064101742201200920092001491b22014100480d060240024020060d002001102721090c010b200228020020062001102821090b2009450d022002200936020020042001360200200828020021060b2008200641016a360200200920066a200741807f72200741ff0071200741077622061b3a0000200621072006450d020c000b0b20014101102a000b2011422088a7221221060240034002400240200428020020082802002207460d00200228020021090c010b200741016a22092007490d0520074101742201200920092001491b22014100480d050240024020070d002001102721090c010b200228020020072001102821090b2009450d022002200936020020042001360200200828020021070b2008200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b0240024020042802002206200828020022076b2012490d00200228020021060c010b200720126a22092007490d0420064101742207200920092007491b22074100480d040240024020060d002007102721060c010b200228020020062007102821060b2006450d032002200636020020042007360200200828020021070b2008200720126a360200200620076a200f201210ce041a02402011a7450d00200f10290b200d2003460d052010210720050d010c050b0b20014101102a000b20074101102a000b102b000b20094101102a000b2003410c6a21070b2007200b460d000340024020072802002206450d00200741046a280200450d00200610290b2007410c6a2207200b470d000b0b0240200c450d00200a10290b2000411a3a00000bcb0401067f200441046a2105024002400240024002400240200441086a2802002004410c6a2802002206460d00200528020021070c010b200641016a22072006490d0420064101742208200720072008491b22084100480d040240024020060d002008102721070c010b200528020020062008102821070b2007450d0120042007360204200441086a20083602002004410c6a28020021060b2004410c6a2208200641016a360200200720066a20024101463a0000200441086a2109034002400240200928020020082802002206460d00200528020021070c010b200641016a22072006490d052006410174220a20072007200a491b220a4100480d050240024020060d00200a102721070c010b20052802002006200a102821070b2007450d03200420073602042009200a360200200828020021060b2008200641016a360200200720066a200141807f72200141ff0071200141077622061b3a00002006210120060d000b024020024101470d002004410c6a2107200441086a2108034002400240200828020020072802002206460d00200528020021010c010b200641016a22012006490d0620064101742209200120012009491b22094100480d060240024020060d002009102721010c010b200528020020062009102821010b2001450d052004200136020420082009360200200728020021060b2007200641016a360200200120066a200341807f72200341ff0071200341077622061b3a00002006210320060d000b0b2000411a3a00000f0b20084101102a000b200a4101102a000b20094101102a000b102b000bc30701097f230041d0006b2202240002400240024002400240024002400240024020012802082203200128020c2204460d00200441016a22052004490d0420032005490d072001280200220620046a2d000021072001200536020c0240200741014d0d00410c21040c020b4100210820070e020302030b200241013a001f200241cc006a41013602002002420137023c20024180c0c5003602382002411f3602342002200241306a36024820022002411f6a360230200241206a200241386a10e6032002411a6a200241286a28020036010020022002290320370112200220022901103703002002200241166a290100370106410521040b200020073a0005200020043a000420002002290300370106200041013602002000410c6a20022901063701000c060b410121080b410120036b2109200441026a2104410021074100210a02400240034002402007411f4d0d00410f21070c020b02400240200920046a4102460d002004450d06200320044f0d0120042003107f000b200241013a0000200241cc006a41013602002002420137023c20024180c0c5003602382002411f3602342002200241306a36024820022002360230200241106a200241386a10e603410521070c020b200620046a417f6a2d000021052001200436020c200541ff00712007411f7174200a72210a200441016a2104200741076a21072005418001710d000b20074120490d01410d210720054110490d010b2000200736020420004101360200200041086a2002290210370200200041106a200241106a41086a2802003602000c050b0240024020080d00410021040c010b2004417f6a2104410021074100210802400240034002402007411f4d0d00410f21040c020b0240024020032004460d002004417f460d082003200441016a22094f0d01200441016a2003107f000b200241013a0000200241cc006a41013602002002420137023c20024180c0c5003602382002411f3602342002200241306a36024820022002360230200241106a200241386a10e603410521040c020b200620046a2d000021052001200936020c200541ff00712007411f71742008722108200741076a2107200921042005418001710d000b20074120490d01410d210420054110490d010b2000200436020420004101360200200041086a2002290210370200200041106a200241106a41086a2802003602000c060b410121040b2000200a360204200041003602002000410c6a2008360200200041086a20043602000c040b417f2005103e000b417f2004103e000b417f200441016a103e000b20052003107f000b200241d0006a24000ba60301077f2002410c6a2103200141086a28020022042105024002400240034002400240200241086a220628020020032802002207460d00200228020421080c010b200741016a22082007490d0420074101742209200820082009491b22094100480d040240024020070d002009102721080c010b200228020420072009102821080b2008450d022002200836020420062009360200200328020021070b2003200741016a360200200820076a200541807f72200541ff0071200541077622071b3a00002007210520070d000b200128020421032001280200210802400240200241086a28020022052002410c6a28020022076b2004490d00200228020421050c010b200720046a22062007490d0320054101742207200620062007491b22074100480d030240024020050d002007102721050c010b200228020420052007102821050b2005450d0220022005360204200241086a20073602002002410c6a28020021070b2002410c6a200720046a360200200520076a2008200410ce041a02402003450d00200810290b2000411a3a00000f0b20094101102a000b20074101102a000b102b000b8b07010b7f230041d0086b22022400410021034100210402400240024002400240034002402003411f4d0d00410f21030c020b0240024020012802082205200128020c2206460d00200641016a22072006490d05200520074f0d0120072005107f000b200241013a0089082002411c6a41013602002002420137020c20024180c0c5003602082002411f36029c08200220024198086a360218200220024189086a36029808200241b8086a200241086a10e603410521030c020b2001280200220820066a2d000021062001200736020c200641ff00712003411f71742004722104200341076a21032006418001710d000b20034120490d01410d210320064110490d010b2000200336020420004101360200200041086a20022902b808370200200041106a200241b8086a41086a2802003602000c030b024020040d002000428080808010370200200041086a42003702000c030b200241086a410041800810cd041a410121094100210a410021064100210b03400240024002400240200520076b2004200b6b22034180082003418008491b2203490d00200720036a220c2007490d022005200c4f0d01200c2005107f000b200241013a00a708200241cc086a4101360200200242013702bc0820024180c0c5003602b8082002411f36029c08200220024198086a3602c8082002200241a7086a36029808200241a8086a200241b8086a10e60320024194086a200241b0086a280200360000200220022903a80837008c08200041053a000420002002290089083700052000410c6a20024190086a29000037000020004101360200200a450d06200910290c060b200241086a200820076a200310ce041a2001200c36020c0240200a20066b2003490d00200320066a210c0c020b0240200620036a220c2006490d00200a4101742207200c200c2007491b22074100480d0002400240200a0d002007102721090c010b2009200a2007102821090b02402009450d002007210a0c030b20074101102a000b102b000b2007200c103e000b200920066a200241086a200310ce041a20042003200b6a220b4d0d02200128020c21072001280208210520012802002108200c21060c000b0b417f2007103e000b200241086a2009200c10dc01024020022802084101470d000240200a450d00200910290b200041083a0004200041013602000c010b200020093602042000410c6a200c360200200041086a200a360200200041003602000b200241d0086a24000b1600200120002802002200280200200028020810e9030bef0201067f230041c0006b2202240041002103410021040240024003400240024002402003411f4b0d002001280204220520012802082206460d01200641016a22072006490d04200520074f0d0220072005107f000b200041013602002000410f3a00040c040b200241013a000f200241346a41013602002002420137022420024180c0c5003602202002411f36023c2002200241386a36023020022002410f6a360238200241106a200241206a10e6032002410b6a200241186a28020036000020022002290310370003200041053a0004200020022900003700052000410c6a200241076a290000370000200041013602000c030b200128020020066a2d0000210620012007360208200641ff00712003411f71742004722104200341076a21032006418001710d000b0240024020034120490d002006410f4b0d010b20004100360200200020043602040c020b200041013602002000410d3a00040c010b417f2007103e000b200241c0006a24000bdb06010a7f20012802042103200128020021044100210541012106410021072001280208220821090240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d070240024020050d00200a102721060c010b20062005200a102821060b2006450d02200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d052005410174220a20092009200a491b220941004e0d010c050b200a4101102a000b0240024020050d002009102721060c010b200620052009102821060b2006450d01200921050b200620076a2004200810ce041a02402003450d00200410290b200128020c210c0240200520086b20076b200141146a2802002209490d00200820096a20076a21030c020b200820076a220a20096a2203200a490d022005410174220a20032003200a491b220a4100480d020240024020050d00200a102721060c010b20062005200a102821060b02402006450d00200a21050c020b200a4101102a000b20094101102a000b200620086a20076a200c200910ce041a200241086a210b200241046a210820032109024002400340024002402008280200200b2802002207460d002002280200210a0c010b200741016a220a2007490d0420074101742204200a200a2004491b22044100480d040240024020070d0020041027210a0c010b2002280200200720041028210a0b200a450d022002200a36020020082004360200200b28020021070b200b200741016a360200200a20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b02400240200241046a2802002209200241086a28020022076b2003490d00200228020021090c010b200720036a220a2007490d0320094101742207200a200a2007491b22074100480d030240024020090d002007102721090c010b200228020020092007102821090b2009450d0220022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a2006200310ce041a02402005450d00200610290b2000411a3a00000240200141106a280200450d00200c10290b0f0b20044101102a000b20074101102a000b102b000be5bc0106077f017e047f017e197f027e230041f080046b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280204220320012802082204460d00200441016a22052004490d02200320054f0d0120052003107f000b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210420022802dc8004210120004101360200200041003a00042001450d1d200410290c1d0b200128020020046a2d00002104200120053602082004410b4b0d02024020040e0c00100f0e0d0c0b0a02060504000b200241c0006a200110f0034101210620022802442107024020022802404101470d0020074108762108200241d0006a2802002101200241c0006a41086a29030021090c1c0b4100210a200241c0006a41004180800110cd041a4100210b410021032007450d10410121064100210b410021054100210c034002400240024002402001280204220d200128020822036b2007200c6b220441808001200441808001491b2204490d00200320046a22082003490d02200d20084f0d012008200d107f000b200241013a00c88004200241ec80046a4101360200200242013702dc800420024180c0c5003602d880042002411f3602242002200241206a3602e880042002200241c880046a360220200241286a200241d880046a10e6032002290328210920022802302101410521070240200b450d00200610290b0c1f0b200241c0006a200128020020036a200410ce041a200120083602080240200b20056b2004490d00200420056a21030c020b200520046a22032005490d14200b4101742208200320032008491b22084100480d1402400240200b0d002008102721060c010b2006200b2008102821060b02402006450d002008210b0c020b20084101102a000b20032008103e000b200620056a200241c0006a200410ce041a2003210520072004200c6a220c4b0d000c110b0b417f2005103e000b200241c0006a200110f303024020022802404101470d00200041013602002000200241c0006a41047222012902003702042000410c6a200141086a2902003702000c1b0b200241d4006a2802002108200241d0006a2802002101200241cc006a2802002105200241c8006a280200210b2002280244210c410021044100210302400240034002402004411f4d0d00410f21010c0a0b20052001460d082001417f460d012005200141016a2206490d02200c20016a2d0000220a41ff00712004411f71742003722103200441076a210420062101200a418001710d000b20044120490d06410d2101200a410f4b0d080c060b417f200141016a103e000b200141016a2005107f000b200041123a000420004101360200200041056a20043a00000c190b200241c0006a200110f3030240024020022802404101470d00200228024422014108762106200241c0006a41086a2903002209422088210e200241d0006a280200210a0c010b200241386a200241d4006a280200360200200241306a200241cc006a29020037030020022002290244370328410021064100210141002105024002400240024002400240024002400240034002402001411f4d0d00410f21070c070b2002280230220a20022802342204460d08200441016a22032004490d02200a2003490d01200228022820046a2d0000210420022003360234200441ff00712001411f71742005722105200141076a21012004418001710d000b024020014120490d002004410f4d0d0041002106410d21070c060b02400240024020050d004100210d410421030c010b410421034100210d4100210703402007220f41016a2107410021014100210c02400240024002400240024003404100210602402001411f4d0d00410f21070c0f0b2002280230220b20022802342204460d01200441016a220a2004490d02200b200a490d04200228022820046a2d000021042002200a360234200441ff00712001411f7174200c72210c200141076a21012004418001710d000b024020014120490d002004410f4d0d00410d21070c0e0b200241c0006a200241286a10e303024020022802404101470d002002280244220741087621062002280250210a200228024c210b200228024821080c0e0b200228024c21102002280248211120022802442112410021044100210b034002402004411f4d0d00410f21070c0e0b200228023022062002280234220a460d0c200a41016a2201200a490d0320062001490d0520022802282208200a6a2d0000210a20022001360234200a41ff00712004411f7174200b72210b200441076a2104200a418001710d000b20044120490d05200a410f4d0d05410d21070c0c0b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210b20022802e08004210a2009a72108410521070c0c0b417f200a103e000b417f2001103e000b200a200b107f000b20012006107f000b41002113200241c0006a41004180800410cd041a02400240200b0d0041012114410021150c010b41002113410121144100210a4100211603400240024002400240200620016b200b20166b220441808004200441808004491b2204490d00200120046a22152001490d02200620154f0d0120152006107f000b200241013a00c78004200241013602ec8004200242013702dc800420024180c0c5003602d880042002411f3602242002200241206a3602e880042002200241c780046a360220200241c880046a200241d880046a10e60320022802c88004210820022802cc8004210b20022802d08004210a410521072013450d0b201410290c0b0b200241c0006a200820016a200410ce041a2002201536023402402013200a6b2004490d002004200a6a21150c020b200a20046a2215200a490d1e20134101742201201520152001491b22014100480d1e0240024020130d002001102721140c010b201420132001102821140b02402014450d00200121130c020b20014101102a000b20012015103e000b2014200a6a200241c0006a200410ce041a200b200420166a22164d0d012002280234210120022802302106200228022821082015210a0c000b0b0240200d200f470d00200d4101742201200d41016a220420042001491b2201ad421c7e2209422088a70d1b2009a722044100480d1b02400240200d0d002004102721030c010b2003200d411c6c2004102821030b2003450d032001210d0b2003200f411c6c6a2201200c41087622043b000120012014360210200120123602042001200c3a0000200141036a20044110763a0000200141186a2015360200200141146a20133602002001410c6a2010360200200141086a201136020020072005470d000b0b200228023420022802384621010240200228022c450d00200228022810290b2001450d072005ad422086200dad842109410c21040c1c0b20044104102a000b2003200a107f000b417f2003103e000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210b20022802e08004210a2009a72108410521070b02402010450d0020104104742104201221010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b410021062011450d00201210290b0240200f450d002003200f411c6c6a210c20032105034002402005410c6a2802002204450d0020052802042101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b200121052001200c470d000b0b200d450d03200310290c030b4100210b410021080c020b20024103410220011b3a00c88004200241c0006a41146a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d88004210920022802e08004210a02402005450d0020032005411c6c6a210620032105034002402005410c6a2802002204450d0020052802042101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b2001210520012006470d000b0b2009422088210e4105210141002106200d450d02200310290c020b200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210b20022802e08004210a2009a7210841052107410021060b2006410874200741ff0171722101200bad220e4220862008ad842109200228022c450d00200228022810290b20004101360200200041106a200a360200200041086a200e422086200942ffffffff0f838437020020002006410874200141ff0171723602040c180b200241c0006a200110f3030240024020022802404101470d002002280244220b4108762101200241c0006a41086a2903002209422088210e200241d0006a28020021080c010b200241d4006a2802002114200241d0006a2802002101200241cc006a280200210a200241c8006a28020021132002280244210c410021044100210602400240024002400240024002400240024002400240024002400240034002402004411f4d0d00410f210b0c020b02400240200a2001460d002001417f460d06200a200141016a22054f0d01200141016a200a107f000b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d88004210920022802e0800421084105210b0c030b200c20016a2d0000220341ff00712004411f71742006722106200441076a2104200521012003418001710d000b20044120490d0220034110490d02410d210b0b0b2009422088a7210d2009a721160c0b0b024002400240024002400240024002400240024002400240024020060d0041002117410421030c010b200241c9006a211841042103410021174100211903402019221a41016a2119410021014100210b034002402001411f4d0d00410f210b0c170b200a2005460d142005417f460d0d200a200541016a2204490d06200c20056a2d0000220741ff00712001411f7174200b72210b200141076a2101200421052007418001710d000b024020014120490d002007410f4d0d00410d210b0c160b4100210f200241c0006a41004180800110cd041a02400240200b0d00410121102004210541002111410021070c010b41002111410121104100211541002112034002400240200a20046b200b20126b220141808001200141808001491b2201490d00200420016a22052004490d0f200a20054f0d012005200a107f000b200241013a00c78004200241013602ec8004200242013702dc800420024180c0c5003602d880042002411f3602242002200241206a3602e880042002200241c780046a360220200241c880046a200241d880046a10e60320022903c880042209422088a7210d20022802d0800421082009a721164105210b2011450d18201010290c180b200241c0006a200c20046a200110ce041a02400240201120156b2001490d00200120156a21070c010b201520016a22072015490d2820114101742204200720072004491b22044100480d280240024020110d002004102721100c010b201020112004102821100b2010450d0d200421110b201020156a200241c0006a200110ce041a2005210420072115200b200120126a22124b0d000b0b20024100360234200220103602282002200736023820022007ad4220862011ad8437022c4100210141002112034002402001411f4d0d00410f210b0c140b2007200f460d12200f417f460d0a2007200f41016a220b490d052010200f6a2d000021042002200b360234200441ff00712001411f71742012722112200141076a2101200b210f2004418001710d000b024020014120490d002004410f4d0d00410d210b0c130b4100211b0240024020120d004104211c410021110c010b410021114104211c4100211d0340201d221e41016a211d4100210141002115024002400240034002402001411f4d0d00410f211520162101200d211f0c020b024002402002280230220f20022802342204460d00200441016a220b2004490d10200f200b4f0d01200b200f107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7211f20022802e0800421082009a72101410521150c020b2002280228221020046a2d000021072002200b360234200741ff00712001411f71742015722115200141076a21012007418001710d000b20014120490d0120074110490d0120162101200d211f410d21150b200141087621204101210741002104200821214100210b20012116201f210d0c010b0240024002400240200f200b460d00200441026a2101200b417f460d0e200f20014f0d012001200f107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022802d88004212220022802dc8004212320022802e080042124410521150c010b2010200b6a2c00002104200220013602340240200441004e0d00411821150c010b0240200441c000710d00410621150c010b200441807f72220141ff017141fb014b0d0141062115200121040b20224108762120410121074100210b2023211f20242121202221010c010b20154180807c71210b201541087621042001417f732101410021070b200b200441ff017141087472201541ff017172210b02402007450d002020410874200141ff01717221162011450d15201c10290c150b02402011201e470d0020114101742204201141016a220720072004491b220441ffffffff01712004470d28200441037422074100480d280240024020110d0020071027211c0c010b201c201141037420071028211c0b201c450d09200421110b201c201e4103746a220420013a00042004200b360200201d2012470d000b0b4101210b41082110410021014100210741002115034020012104200241c0006a200241286a10e403024020022802404101470d0020022802502121200228024c211f200228024821162002280244210b0c120b200241d880046a41026a2201201841026a2d00003a0000200220182f00003b01d88004200228024c211e2002280250211d200228025421250240024020022d0048220f4106470d00200b417f6a210b0c010b200f417e6a41034f0d00200b41016a2226200b4f21272026210b20270d004115211f419487c50021164104210b200f4109470d11201d41ffffffff03710d100c110b200241c0006a41026a222620012d00003a0000200220022f01d880043b0140024020072015470d00200741016a22012007490d27201b20012001201b491b221541ffffffff00712015470d27201541047422014100480d270240024020070d002001102721100c010b201020042001102821100b2010450d040b201020046a2201200f3a00002001410c6a2025360200200141086a201d360200200141046a201e360200200141016a20022f01403b0000200141036a20262d00003a0000201b41026a211b200441106a2101200741016a2107200b0d000b200228023420022802384621010240200228022c450d00200228022810290b2001450d1402402017201a470d0020174101742201201741016a220420042001491b2201ad42187e2209422088a70d262009a722044100480d260240024020170d002004102721030c010b2003201741186c2004102821030b2003450d04200121170b2003201a41186c6a2201201036020c20012012360208200120113602042001201c360200200141146a2007360200200141106a201536020020192006470d000b0b2005201446210102402013450d00200c10290b2001450d142006ad4220862017ad842109410b21040c270b20014108102a000b20044104102a000b200f41016a2007107f000b200541016a200a107f000b20074104102a000b417f2001103e000b417f200b103e000b417f200f41016a103e000b20044101102a000b20042005103e000b417f200541016a103e000b417f200141016a103e000b201e10290b0b02402007450d00201021010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b02402015450d00201010290b2011450d01201c10290c010b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7211f20022802e0800421212009a721164105210b0b0240200228022c450d00200228022810290b201f210d202121080c020b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210d20022802e0800421082009a721164105210b0c010b20024103410220011b3a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022802d88004211620022802dc8004210d20022802e08004210802402007450d00200441106a21054100210103400240201020016a22042d00004109470d00200441086a28020041ffffffff0371450d00200441046a28020010290b2005200141106a2201470d000b0b02402015450d00201010290b4105210b2011450d00201c10290b0240201a450d002003201a41186c6a210a2003210503400240200541046a280200450d00200528020010290b0240200541146a2802002204450d00200528020c2101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b200541186a21010240200541106a280200450d00200528020c10290b200121052001200a470d000b0b2017450d01200310290c010b20024103410220011b3a0028200241c0006a41146a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d88004210920022802e08004210802402006450d002003200641186c6a210a2003210503400240200541046a280200450d00200528020010290b0240200541146a2802002204450d00200528020c2101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b200541186a21010240200541106a280200450d00200528020c10290b200121052001200a470d000b0b2009422088210e4105210b410021012017450d01200310290c010b200b4108762101200dad220e4220862016ad8421092013450d00200c10290b20004101360200200041106a2008360200200041086a200e422086200942ffffffff0f838437020020002001410874200b41ff0171723602040c170b200241c0006a200110f3030240024020022802404101470d00200228024422014108762106200241c0006a41086a2903002209422088210e200241d0006a280200210a0c010b200241e880046a200241d4006a280200360200200241e080046a200241cc006a290200370300200220022902443703d880044100210641002101410021050240024002400240024002400240024002400240034002402001411f4d0d00410f210b0c080b20022802e08004220a20022802e480042204460d09200441016a22032004490d01200a2003490d0420022802d8800420046a2d00002104200220033602e48004200441ff00712001411f71742005722105200141076a21012004418001710d000b024020014120490d002004410f4d0d0041002106410d210b0c070b0240024020050d004100210d410421030c010b410421034100210d4100210803402008221641016a2108410021014100210c0240024002400240024003404100210602402001411f4d0d00410f210b0c030b20022802e08004220b20022802e480042204460d01200441016a220a2004490d09200b200a490d0c20022802d8800420046a2d000021042002200a3602e48004200441ff00712001411f7174200c72210c200141076a21012004418001710d000b024020014120490d002004410f4d0d00410d210b0c020b200241c0006a200241d880046a10e303024020022802404101470d002002280244220b41087621062002280250210a200228024c2108200228024821070c020b200228024c21132002280248210f20022802442115200241c0006a200241d880046a10e703024020022802404101470d002002280244210b2002280250210a200228024c21082002280248210702402013450d0020134104742104201521010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b200b4108762106200f450d02201510290c020b200228024821142002280244210702400240200228024c22010d00410021064104210b4100210a0c010b2001410274220a410275220641ffffffff03712006470d1e200a4100480d1e200a1027220b450d0d200a417c6a2110200b210120072104034020012004280200360200200141046a2101200441046a2104200a417c6a220a0d000b201041027641016a210a0b02402014450d00200710290b200d2016470d04200d4101742201200d41016a220420042001491b2201ad421c7e2209422088a70d1d2009a722044100480d1d200d0d022004102721030c030b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a721082002280230210a2009a721074105210b0b02402016450d0020032016411c6c6a210c20032105034002402005410c6a2802002204450d0020052802042101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b200121052001200c470d000b0b200d450d0e200310290c0e0b2003200d411c6c2004102821030b2003450d052001210d0b20032016411c6c6a2201200c41087622043b00012001200b360210200120153602042001200c3a0000200141036a20044110763a0000200141186a200a360200200141146a20063602002001410c6a2013360200200141086a200f36020020082005470d000b0b20022802e4800420022802e88004462101024020022802dc8004450d0020022802d8800410290b2001450d072005ad422086200dad842109410a21040c1a0b417f2003103e000b417f200a103e000b20044104102a000b2003200a107f000b200a200b107f000b200a4104102a000b41002108410021070c020b20024103410220011b3a00c88004200241c0006a41146a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e603200229032821092002280230210a02402005450d0020032005411c6c6a210620032105034002402005410c6a2802002204450d0020052802042101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b0240200541086a280200450d00200528020410290b2005411c6a21010240200541146a280200450d00200528021010290b2001210520012006470d000b0b2009422088210e4105210141002106200d450d02200310290c020b200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a721082002280230210a2009a721074105210b410021060b2006410874200b41ff01717221012008ad220e4220862007ad84210920022802dc8004450d0020022802d8800410290b20004101360200200041106a200a360200200041086a200e422086200942ffffffff0f838437020020002006410874200141ff0171723602040c160b200820064621010240200b450d00200c10290b02402001450d00410921040c0f0b20024103410220011b3a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e603200241e380046a200241306a280200360000200220022903283700db8004200041053a0004200020022900d880043700052000410c6a200241df80046a290000370000200041013602000c150b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e603410521010b2000200136020420004101360200200041086a20022902d88004370200200041106a200241d880046a41086a280200360200200b450d13200c10290c130b200241c0006a200110f3030240024020022802404101470d00200228024422044108762101200241c0006a41086a2903002209422088210e200241d0006a28020021060c010b200241e880046a200241d4006a280200360200200241e080046a200241cc006a290200370300200220022902443703d880044100210c4100210141002105024002400240024002400240024002400240024002400240024002400240024002400240034002402001411f4d0d00410f2104410021050c130b20022802e08004220a20022802e480042204460d11200441016a22032004490d01200a2003490d0820022802d8800420046a2d00002104200220033602e48004200441ff00712001411f71742005722105200141076a21012004418001710d000b024020014120490d002004410f4d0d00410d2104410021050c120b0240024020050d0041002116410421030c010b410421034100210a41002116410021130340200241c0006a200241d880046a10ee03024020022802404101470d002002200229024c22093703c8800420022802482105200228024421042009a7210c0c110b200228024821152002280244210f0240024020022802e08004220420022802e480042206460d00200641016a22012006490d05200420014f0d0120012004107f000b200241013a00c78004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241286a200241c0006a10e6030c0e0b200228024c211420022802d88004220c20066a2d0000210d200220013602e480040240200d41034d0d00410a21010c100b02400240024002400240200d0e0400010203000b4100210d4100210b4100210603400240200b411f4d0d00410f21010c150b20042001460d132001417f460d092004200141016a2207490d0f200c20016a2d00002108200220073602e48004200841ff0071200b411f71742006722106200b41076a210b200721012008418001710d000b4100210d200b4120490d032008410f4d0d03410d21010c130b4100210b410021060340200b411f4b0d100240024020042001460d002001417f460d0b2004200141016a22074f0d01200141016a2004107f000b200241013a00c78004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241286a200241c0006a10e6030c120b200c20016a2d00002108200220073602e48004200841ff0071200b411f71742006722106200b41076a210b200721012008418001710d000b4101210d200b4120490d022008410f4d0d020c0e0b4100210b410021060340200b411f4b0d0f0240024020042001460d002001417f460d0b2004200141016a22074f0d01200141016a2004107f000b200241013a00c78004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241286a200241c0006a10e6030c110b200c20016a2d00002108200220073602e48004200841ff0071200b411f71742006722106200b41076a210b200721012008418001710d000b4102210d200b4120490d012008410f4b0d0d0c010b4100210b410021060340200b411f4b0d0e0240024020042001460d002001417f460d0b2004200141016a22074f0d01200141016a2004107f000b200241013a00c78004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241286a200241c0006a10e6030c100b200c20016a2d00002108200220073602e48004200841ff0071200b411f71742006722106200b41076a210b200721012008418001710d000b4103210d200b4120490d002008410f4b0d0c0b200220063602d080042002200d3602cc800420022902cc80042109024020162013470d0020164101742201201641016a220420042001491b2201ad42147e220e422088a70d1d200ea722044100480d1d0240024020160d002004102721030c010b2003201641146c2004102821030b2003450d09200121160b2003201341146c6a2201200937020c20012014360208200120153602042001200f360200200a41146a210a201341016a2201211320012005470d000b0b20022802e4800420022802e88004462101024020022802dc8004450d0020022802d8800410290b2001450d0f2005ad4220862016ad842109410821040c1e0b417f2003103e000b417f2001103e000b417f200141016a103e000b417f200141016a103e000b417f200141016a103e000b417f200141016a103e000b20044104102a000b2003200a107f000b200141016a2004107f000b410d21014100210d0c030b410f21014100210d0c020b20022802282105200229022c2109410521014100210d0c010b200241013a00c78004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241286a200241c0006a10e60320022802282105200229022c2109410521010b200d4108742001722104200220093703c880042009a7210c2015450d00200f10290b20022802cc8004210602402013450d002003210103400240200141046a280200450d00200128020010290b200141146a2101200a416c6a220a0d000b0b2016450d02200310290c020b20024103410220011b3a00c88004200241c0006a41146a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e603200229032821092002280230210602402005450d00200541146c21042003210103400240200141046a280200450d00200128020010290b200141146a21012004416c6a22040d000b0b2009422088210e41052104410021012016450d02200310290c020b200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a7210c200228023021062009a72105410521040b20044108762101200cad220e4220862005ad84210920022802dc8004450d0020022802d8800410290b20004101360200200041106a2006360200200041086a200e422086200942ffffffff0f838437020020002001410874200441ff0171723602040c120b200241c0006a200110f3030240024020022802404101470d00200228024422054108762101200241c0006a41086a2903002209422088210e200241d0006a280200210a0c010b200241386a200241d4006a280200360200200241306a200241cc006a290200370300200220022902443703284100210b410021014100210602400240024002400240024002400240034002402001411f4d0d00410f21054100210c0c090b2002280230220a20022802342204460d07200441016a22052004490d01200a2005490d052002280228220c20046a2d0000210420022005360234200441ff00712001411f71742006722106200141076a21012004418001710d000b024020014120490d002004410f4d0d00410d21054100210c0c080b024020060d00410421034100210d0c060b2006417f6a21144100211641002107410021084100210d4104210f410421030340024002400240024002400240024002400240200a2005460d00200541016a22042005490d0b200a20044f0d012004200a107f000b200241013a00c78004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241c880046a200241c0006a10e60320022802c88004210c20022802cc8004210b20022802d08004210a410521130c010b200c20056a2c000021012002200436023402400240200141004e0d00411821130c010b41062113200141c00071450d00200141807f72220141ff017141fb014b0d020b0b200241e880046a200a360200200241e480046a200b360200200241e080046a200c360200200220013a00dd8004200220133a00dc80040c010b024002400240200a2004460d00200541026a21052004417f460d0b200a20054f0d012005200a107f000b200241013a00c78004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c780046a360220200241c880046a200241c0006a10e60320022802c88004210c20022802cc8004210b20022802d08004210a410521010c010b200c20046a2d00002104200220053602340240200441014b0d004100210a20040e020403040b410c21010b200241e880046a200a360200200241e480046a200b360200200241e080046a200c360200200220043a00dd8004200220013a00dc80040b200241013a00d8800420022802dc800421050c020b418002210a0b200241c0006a200241286a10e303200228024c210b2002280248210c2002280244210520022802404101470d01200241d0006a280200210a0b02402008450d00200320076a21060340024020032802082204450d0020032802002101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b200341106a21010240200341046a280200450d00200328020010290b2001210320062001470d000b0b200d450d09200f10290c090b200841016a211302402008200d470d002016201320132016491b220d41ffffffff0071200d470d11200d41047422044100480d110240024020080d0020041027210f0c010b200f200720041028210f0b200f450d05200f21030b200320076a220420053602002004410c6a20154180807c712001417f7341ff017172200a722215360200200441086a200b360200200441046a200c36020020142008460d06201641026a2116200741106a2107200228023421052002280230210a2002280228210c201321080c000b0b417f2005103e000b417f2004103e000b417f2005103e000b20044104102a000b2005200a107f000b200228023420022802384621010240200228022c450d00200228022810290b02402001450d002006ad422086200dad842109410721040c0e0b20024103410220011b3a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d88004210920022802e08004210a02402006450d00200320064104746a2106200321050340024020052802082204450d0020052802002101200441047421040340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010290b200141106a2101200441706a22040d000b0b200541106a21010240200541046a280200450d00200528020010290b2001210520012006470d000b0b2009422088210e4105210541002101200d450d02200310290c020b200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210b20022802e08004210a2009a7210c410521050b20054108762101200bad220e422086200cad842109200228022c450d00200228022810290b20004101360200200041106a200a360200200041086a200e422086200942ffffffff0f838437020020002001410874200541ff0171723602040c110b200241c0006a200110f3030240024020022802404101470d00200228024422044108762105200241c0006a41086a2903002209422088210e200241d0006a28020021010c010b200241e880046a200241d4006a280200360200200241e080046a200241cc006a290200220937030020022002290244220e3703d88004200ea7210c2009a721034100210420022802e4800421014100210502400240024002400240024002400240024003402004411f4b0d0120032001460d032001417f460d042003200141016a220a490d06200c20016a2d0000220641ff00712004411f71742005722105200441076a2104200a21012006418001710d000b2002200a3602e4800420044120490d012006410f4d0d0141002104410d210c0c060b200220013602e4800441002104410f210c0c050b0240024020050d00410421034100210d0c010b4100210741002106410021014100210d410421030340200241c0006a200241d880046a10ec0320022f004520022d0047411074722104200228024c210b2002280248210820022d0044210c024020022802404101470d00200241d0006a2802002101200d450d08200310290c080b200141016a210a02402001200d470d002007200a200a2007491b220dad420c7e2209422088a70d102009a722164100480d100240024020010d002016102721030c010b200320062016102821030b2003450d050b200320066a2201200c3a0000200141036a20044110763a0000200141016a20043b0000200141086a200b360200200141046a2008360200200741026a21072006410c6a2106200a21012005200a470d000b0b20022802e4800420022802e88004462101024020022802dc8004450d0020022802d8800410290b2001450d062005ad422086200dad842109410621040c110b200220033602e48004200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a7210b200228023021012009a721084105210c410021040c040b417f200141016a103e000b20164104102a000b200141016a2003107f000b4100210b410021080b200441ffffff07712205410874200c41ff0171722104200bad220e4220862008ad84210920022802dc8004450d0120022802d8800410290c010b20024103410220011b3a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088210e200228023021014105210441002105200d450d00200310290b20004101360200200041106a2001360200200041086a200e422086200942ffffffff0f838437020020002005410874200441ff0171723602040c100b200241c0006a200110f3030240024020022802404101470d00200228024422044108762105200241c0006a41086a2903002209422088210e200241d0006a28020021010c010b200241e880046a200241d4006a280200360200200241e080046a200241cc006a290200220937030020022002290244220e3703d88004200ea7210c2009a721054100210420022802e480042101410021060240024002400240024002400240024002400240024003402004411f4b0d0120052001460d032001417f460d042005200141016a220a490d07200c20016a2d0000220341ff00712004411f71742006722106200441076a2104200a21012003418001710d000b2002200a3602e4800420044120490d012003410f4d0d0141002104410d210a0c080b200220013602e4800441002104410f210a0c070b024020060d004100210b410421030c060b2006417f6a2116410421034108210d4100210841002107034002400240024002402005200a460d00200a41016a2201200a490d07200520014f0d0120012005107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e6032002280228210b200228022c210c200228023021014105210a0c010b200c200a6a2c00002104200220013602e480040240200441004e0d004118210a0c010b4107210a0240200441c000710d000c010b200441807f7222044170470d00200241c0006a200241d880046a10ec0320022f004520022d004741107472210420022d0044210a20022802404101470d0120044180feff0771410876210520022802502101200228024c210c2002280248210b0b2005410874200441ff01717221042008450d09200310290c090b200228024c21052002280248210c0240024020072008460d002008210b0c010b20084101742201200841016a220b200b2001491b220bad420c7e2209422088a70d102009a722014100480d100240024020080d002001102721030c010b20032008410c6c2001102821030b2003450d050b2003200d6a22012005360200200141796a220520043b00002001417c6a200c360200200141786a200a3a0000200541026a20044110763a000020162007460d06200741016a2107200d410c6a210d20022802e48004210a20022802e08004210520022802d88004210c200b21080c000b0b200220053602e48004200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a7210c200228023021012009a7210b4105210a410021040c060b417f200141016a103e000b417f2001103e000b20014104102a000b200141016a2005107f000b20022802e4800420022802e88004462101024020022802dc8004450d0020022802d8800410290b2001450d022006ad422086200bad842109410521040c0c0b4100210c4100210b0b200441ffffff07712205410874200a41ff0171722104200cad220e422086200bad84210920022802dc8004450d0120022802d8800410290c010b20024103410220011b3a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088210e200228023021014105210441002105200b450d00200310290b20004101360200200041106a2001360200200041086a200e422086200942ffffffff0f838437020020002005410874200441ff0171723602040c0f0b200241c0006a200110f3030240024020022802404101470d00200228024422044108762105200241c0006a41086a2903002209422088210e200241d0006a28020021010c010b200241d4006a280200210d200241d0006a2802002101200241cc006a2802002105200241c8006a28020021072002280244210c4100210b41002104410021060240024002400240024002400240034002402004411f4d0d00410f2104410021050c030b20052001460d012001417f460d032005200141016a220a490d06200c20016a2d0000220341ff00712004411f71742006722106200441076a2104200a21012003418001710d000b024020044120490d002003410f4d0d00410d2104410021050c020b410421030240024020060d00410021130c010b410021164100211303402016221541016a2116200a2101410021044100210b024002400240034002402004411f4d0d00410f21040c020b0240024020052001460d002001417f460d0b2005200141016a220a4f0d01200141016a2005107f000b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210520022802dc8004210b20022802e080042101410521040c030b200c20016a2d0000220841ff00712004411f7174200b72210b200441076a2104200a21012008418001710d000b20044120490d0220084110490d02410d21040b0b2013450d04200310290c040b024020132015470d0020154101742201201620162001491b221341ffffffff03712013470d0e201341027422014100480d0e0240024020150d002001102721030c010b200320154102742001102821030b2003450d070b200320154102746a200b36020020162006470d000b0b200a200d46210102402007450d00200c10290b2001450d062006ad4220862013ad842109410421040c0f0b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210b20022802e0800421012009a72105410521040b200bad220e4220862005ad842109410021052007450d05200c10290c050b417f200141016a103e000b417f200141016a103e000b20014104102a000b200141016a2005107f000b20024103410220011b3a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d880042209422088210e20022802e08004210141052104410021052013450d00200310290b20004101360200200041106a2001360200200041086a200e422086200942ffffffff0f838437020020002005410874200441ff0171723602040c0e0b200241c0006a200110f3030240024020022802404101470d00200228024422044108762101200241c0006a41086a2903002209422088210e200241d0006a28020021060c010b200241e880046a200241d4006a280200360200200241e080046a200241cc006a290200370300200220022902443703d880044100210c41002101410021050240024002400240024002400240024002400240034002402001411f4d0d00410f2104410021050c0b0b20022802e08004220a20022802e480042204460d09200441016a22032004490d02200a2003490d0120022802d8800420046a2d00002104200220033602e48004200441ff00712001411f71742005722105200141076a21012004418001710d000b024020014120490d002004410f4d0d00410d2104410021050c0a0b02400240024020050d0041002116410421030c010b410421034100210a41002116410021130340200241c0006a200241d880046a10ee03200228024c210c2002280248210f20022802442110024020022802404101470d0020022802502106200f2105201021040c0a0b200241c0006a200241d880046a10ee03200228024c21112002280248211420022802442112024020022802404101470d0020022802502106201421052011210c201221040c090b024002400240024002400240024002400240024002400240024002400240024020022802e08004220620022802e48004220b460d00200b41016a2201200b490d02200620014f0d0120012006107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022802282105200229022c210e4105210741002115410021060c160b20022802d88004220d200b6a2d00002104200220013602e48004410021150240200441034d0d0041092107410021060c160b024002400240024020040e0400010203000b410021154100210441002107034002402004411f4d0d00410f21070c180b0240024020062001460d002001417f460d072006200141016a22084f0d01200141016a2006107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022802282105200229022c210e41052107410021150c190b200d20016a2d0000210b200220083602e48004200b41ff00712004411f71742007722107200441076a210420082101200b418001710d000b4100211520044120490d0f200b410f4d0d0f410d21070c160b0240024020062001460d00200b41026a21042001417f460d0620062004490d07200d20016a2c00002101200220043602e4800402402001417f4a0d00411821050c0e0b200141c000710d010c0c0b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e6032002290328210920022802302104410521050c0c0b200141807f7222014170470d0a200241c0006a200241d880046a10ec032002290348210920022802442107024020022802404101470d00200228025021040c0d0b410121150c0f0b200241c0006a200241d880046a10ec032002290348210920022802442107024020022802404101460d00410221150c0f0b200220022802503602482007418080807871211520074180807c712106200741087621040c0c0b0240024020062001460d00200b41026a21082001417f460d0620062008490d08200d20016a2c00002104200220083602e480040240200441004e0d0041182107410021060c180b200441c000710d010c090b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60341052107200229022c210e20022802282105410021060c160b200441807f72220441ff017141fc01490d070240024020062008460d00200b41036a21012008417f460d07200620014f0d0120012006107f000b200241013a00c88004200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022802282105200229022c210e41052107410021060c160b200d20086a2d0000210b200220013602e48004410021060240200b41014d0d00410c210741002115200b21040c160b2004417f732104410321150240200b0e020e000e0b410121060c0d0b417f2001103e000b417f200141016a103e000b417f2004103e000b20042006107f000b417f2008103e000b417f2001103e000b20082006107f000b41062107410021060c0d0b410721050b200141ff017141087420057221070b200220043602482007418080807871211520074180807c712106200741087621040b200220093703402002290244210e2009a721050c090b0b024020162013470d0020164101742201201641016a220b200b2001491b2201ad42287e220e422088a70d11200ea7220b4100480d110240024020160d00200b102721030c010b2003201641286c200b102821030b2003450d03200121160b2003201341286c6a2201201236020c2001200c3602082001200f36020420012010360200200141206a20093702002001411c6a20073602002001411a6a20063a0000200141196a20043a0000200141186a20153a0000200141146a2011360200200141106a2014360200200a41286a210a201341016a2201211320012005470d000b0b20022802e4800420022802e88004462101024020022802dc8004450d0020022802d8800410290b2001450d082005ad4220862016ad842109410321040c120b200b4104102a000b2003200a107f000b417f2003103e000b0b41002106410021040b200741ff0171200441ff0171410874722006418080fc0771722015722104200e422088a72106200ea7210c2014450d00201210290b200f450d00201010290b02402013450d002003210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200a41586a220a0d000b0b2016450d02200310290c020b20024103410220011b3a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e603200229032821092002280230210602402005450d00200541286c21042003210103400240200141046a280200450d00200128020010290b0240200141106a280200450d002001410c6a28020010290b200141286a2101200441586a22040d000b0b2009422088210e41052104410021012016450d02200310290c020b200241013a00c88004200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241c880046a360220200241286a200241c0006a10e60320022903282209422088a7210c200228023021062009a72105410521040b20044108762101200cad220e4220862005ad84210920022802dc8004450d0020022802d8800410290b20004101360200200041106a2006360200200041086a200e422086200942ffffffff0f838437020020002001410874200441ff0171723602040c0d0b200241c0006a200110f3030240024020022802404101470d00200228024422014108762105200241c0006a41086a2903002209422088210e200241d0006a28020021040c010b200241d4006a2802002113200241d0006a2802002101200241cc006a2802002105200241c8006a28020021072002280244210c41002108410021044100210a024002400240024002400240024002400240034002402004411f4d0d00410f21014100210a0c0a0b20052001460d082001417f460d022005200141016a2206490d01200c20016a2d0000220341ff00712004411f7174200a72210a200441076a2104200621012003418001710d000b024020044120490d002003410f4d0d00410d21014100210a0c090b024002400240200a0d0041002112410421030c010b410120056b210d4100210b4104210341002112410021110340024002400240024002400240024002400240024020052006460d00200641016a22012006490d0120052001490d050240200c20066a2d0000221641e000460d004117210f0c130b201141016a211a200641026a2101410021164100210441002108034002402004411f4d0d00410f210f0c0a0b200d20016a4102460d082001450d0320052001490d07200c20016a417f6a2d0000220641ff00712004411f71742008722108200141016a2101200441076a21042006418001710d000b024020044120490d002006410f4d0d00410d210f0c090b2001417f6a210441002115410121100240024020080d00410021170c010b4100211441002106410021170340024002400240024020052004460d00200120066a2216450d09200520164f0d0120162005107f000b200241013a0028200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210a20022802dc8004210820022802e0800421014105210f0c010b02400240200c20046a2c0000221641004e0d004118210f0c010b4106210f201641c00071450d00201641807f72221641ff017141fb014b0d020b0b2017450d0b201010290c0b0b200641016a210f024020062017470d002014200f200f2014491b22174100480d1b0240024020060d002017102721100c010b201020062017102821100b20100d0020174101102a000b200441016a2104201020066a2016417f733a0000201441026a2114200f21062008200f470d000b0b2010411076411074221f201041087641ff0171410874221872201041ff017122107221144100210103404100211602402015411f4d0d00410f210f0c130b0240024020052004460d002004417f460d072005200441016a22064f0d01200441016a2005107f000b200241013a0028200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210a20022802dc8004210820022d00e08004210120022d00e18004210520022f01e2800421044105210f0c130b200c20046a2d0000220f41ff00712015411f71742001722101201541076a211520062104200f418001710d000b20154120490d09200f410f4d0d09410d210f0c110b200241013a0028200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210a20022802dc8004210820022d00e08004210120022d00e18004210520022f01e2800421044105210f0c110b417f2001103e000b417f2001103e000b417f2016103e000b417f200441016a103e000b20012005107f000b20012005107f000b200241013a0028200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210820022802e0800421012009a7210a4105210f0b20014110762104200141087621050c090b0240200141014d0d004104210f41ba8cc500210a412421080c070b02400240024020010e020001000b410421040c010b20052006460d06024002400240200641016a22012006490d0020052001490d010240200c20066a2c0000221641004e0d004118210f0c0c0b4106210f201641c00071450d02201641807f72221641ff017141fb014d0d022016417f732104200121060c030b417f200641016a103e000b200641016a2005107f000b0c080b024020122011470d0020124101742201201241016a221620162001491b220141ffffffff00712001470d0f200141047422164100480d0f0240024020120d002016102721030c010b200320124104742016102821030b2003450d03200121120b200320114104746a220120194180807c71200441ff01714108747241e00072221936020c200120083602082001201736020420012018201072201f72360200200b41106a210b201a2111201a200a470d000b0b2006201346210102402007450d00200c10290b2001450d07200aad4220862012ad842109410221040c100b20164104102a000b200141016a2005107f000b417f200141016a103e000b200241013a0028200241013602542002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022802d88004210a20022802dc8004210820022d00e08004210120022d00e18004210520022f01e2800421044105210f0b0b2017450d00201410290b200541ff0171410874200141ff017172210520044110742104201641ff0171410874210602402011450d002003210103400240200141046a280200450d00200128020010290b200141106a2101200b41706a220b0d000b0b200520047221042006200f7221012012450d02200310290c020b20024103410220011b3a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d88004210920022802e0800421040240200a450d00200a41047421052003210103400240200141046a280200450d00200128020010290b200141106a2101200541706a22050d000b0b2009422088210e41052101410021052012450d02200310290c020b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210820022802e0800421042009a7210a410521010b200141087621052008ad220e422086200aad8421092007450d00200c10290b20004101360200200041106a2004360200200041086a200e422086200942ffffffff0f838437020020002005410874200141ff0171723602040c0c0b410021014100210402400340410021080240200a4105470d00410f21070c0b0b2003200a460d032003200a4d0d012006200a6a2d0000220541ff00712001411f71742004722104200141076a2101200a41016a220c210a2005418001710d000b024020014120490d002005410f4d0d00410d21070c0a0b024020040d0041002105410121134100210a4100210d0c050b200241c0006a410041800810cd041a410121134100210d4100210541002107034002400240024002402003200c6b200420076b22014180082001418008491b2201490d00200c20016a2216200c490d02200320164f0d0120162003107f000b200241013a00c88004200241ec80046a4101360200200242013702dc800420024180c0c5003602d880042002411f3602242002200241206a3602e880042002200241c880046a360220200241286a200241d880046a10e60320022903282209422088a7210a200228023021012009a72104410521070240200d0d002004210d0c0f0b201310292004210d0c0e0b200241c0006a2006200c6a200110ce041a0240200d20056b2001490d00200120056a210a0c020b200520016a220a2005490d04200d410174220c200a200a200c491b220c4100480d0402400240200d0d00200c102721130c010b2013200d200c102821130b02402013450d00200c210d0c020b200c4101102a000b200c2016103e000b201320056a200241c0006a200110ce041a2016210c200a21052004200120076a22074d0d040c000b0b200a41016a2003107f000b102b000b200241013a0028200241d4006a41013602002002420137024420024180c0c5003602402002411f3602242002200241206a3602502002200241286a360220200241d880046a200241c0006a10e60320022903d880042209422088a7210a20022802e0800421012009a7210d410521070c070b200241c0006a2013200a10dc01024020022802404101470d00410821070240200d0d000c080b201310290c070b201341087621052016210c0b2003200c490d012003200c6b2204417f4c0d020240024020040d00410121010c010b200410272201450d0420012006200c6a200410ce041a0b200aad4220862109200dad210e2004ad222842208621290240200b450d00200610290b2009200e8421092029202884210e2005410874201341ff0171722103410121040b200020043a000420004100360200200041056a20022f001d3b0000200041186a200e370200200041146a20013602002000410c6a2009370200200041086a2003360200200041206a200229020c370200200041076a2002411f6a2d00003a0000200041286a2002410c6a41086a2902003702000c060b200c2003103e000b1039000b20044101102a000b4100210a4100210d0b200aad422086200dad842109200b450d00200610290b20004101360200200041106a2001360200200041086a200937020020002008410874200741ff0171723602040b200241f080046a24000bf404010b7f230041c080016b220224002002200110f003410121030240024020022802004101470d0020002002290204370204200041013602002000410c6a2002410c6a2902003702000c010b20022802042104200241004180800110cd042105410021064100210702400240024002402004450d00410021084100210641012103410021090340024002402001280204220a200128020822076b200420096b220b41808001200b41808001491b220b490d002007200b6a220c2007490d04200a200c4f0d01200c200a107f000b200541013a008f8001200541b480016a4101360200200542013702a4800120054180c0c5003602a080012005411f3602bc80012005200541b880016a3602b0800120052005418f80016a3602b880012005419080016a200541a080016a10e6032005418b80016a2005419880016a2802003600002005200529039080013700838001200041053a00042000200529008080013700052000410c6a2005418780016a290000370000200041013602002006450d06200310290c060b2005200128020020076a200b10ce04210a2001200c36020802400240200620086b200b490d00200b20086a21070c010b2008200b6a22072008490d052006410174220c20072007200c491b220c4100480d050240024020060d00200c102721030c010b20032006200c102821030b2003450d04200c21060b200320086a200a200b10ce041a200721082004200b20096a22094b0d000b0b2000200336020420004100360200200041146a2007360200200041106a41003602002000410c6a2007360200200041086a20063602000c030b2007200c103e000b200c4101102a000b102b000b200241c080016a24000b0e0020003502004101200110aa010bf60201037f230041c0006b22022400200141086a2802002103200128020421042002200128020022013602100240024002402001418080044b0d0002402004450d0020022003360214200120034b0d022003418080044d0d002002413c6a41013602002002420237022c200241ec9cc5003602282002410136021c200241c89cc5003602182002200241186a3602382002200241286a10e6030c030b200241003602000c020b2002413c6a41013602002002420237022c200241cc9cc5003602282002410136021c200241c89cc5003602182002200241186a3602382002200241286a10e6030c010b200241246a41013602002002413c6a41023602002002420237022c200241dc9cc5003602282002410136021c2002200241186a3602382002200241106a3602202002200241146a3602182002200241286a10e6030b024002402002280200450d0020002002290300370200200041086a200241086a2802003602000c010b200041003602000b200241c0006a24000bf90501037f230041f0006b2204240002400240024002400240024020012802084102460d00412e10272201450d01200041013a0000200141266a41002900e09e45370000200141206a41002900da9e45370000200141186a41002900d29e45370000200141106a41002900ca9e45370000200141086a41002900c29e45370000200141002900ba9e45370000200041086a42ae808080e005370200200041046a20013602000c050b02400240024002400240200128020022052d0000416e6a2201411e4b0d004100210620010e1f03000000000000000000000000000000000000000000000000000008040102030b412010272201450d05200041013a0000200141186a41002900809f45370000200141106a41002900f89e45370000200141086a41002900f09e45370000200141002900e89e45370000200041086a42a08080808004370200200041046a20013602000c080b410221060c060b410321060c050b20042005280204220136020c0240024020012003490d0041889fc5002105200441e8006a2103200441d0006a2101200441c0006a21020c010b200220014101746a22012d0001450d0441989fc5002105200441386a2103200441206a2101200441106a21020b20034101360204200141146a410136020020012003360210200142023702042001200536020020032004410c6a3602002002200110e603200041013a00002000410c6a200241086a280200360200200041046a20022902003702000c050b410121060c030b412e4101102a000b41204101102a000b20012d000021060b0240200541106a2d00004106470d00200041003a0000200020063a00010c010b0240412910272201450d00200041013a0000200141286a41002d00d09f453a0000200141206a41002900c89f45370000200141186a41002900c09f45370000200141106a41002900b89f45370000200141086a41002900b09f45370000200141002900a89f45370000200041086a42a98080809005370200200041046a20013602000c010b41294101102a000b200441f0006a24000b8f0201017f230041106b220224000240024002400240024020002d00000e0401020300010b2002200128021841d0bfc50041032001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c030b2002200128021841d3bfc50041032001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c020b2002200128021841d6bfc50041032001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c010b2002200128021841d9bfc50041032001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040b200241106a240020000bf7c30103077f027e027f230041f0006b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d00000eac0100df010102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01000b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810272200450dab012003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c20032001360258418697c500413b200341d8006a41c497c50010a201000b02400240200128022820044103746a22052802002206200141206a28020022024b0d002006200220062002491b21040c010b024002402001411c6a280200220420026b200620026b2207490d0020012802182108200221040c010b200220076a22082002490dde0120044101742209200820082009491b22094100480dde010240024020040d002009102721080c010b200128021820042009102821080b2008450dad01200120083602182001411c6a2009360200200141206a28020021040b200820046a21090240024020074102490d002009410420062002417f736a220210cd041a2008200220046a22046a21090c010b2007450d010b200941043a0000200441016a21040b200141206a2004360200200541013a00060cde010b0240200141306a2802002204200141346a22062802004f0d002002310001210a200141206a350200210b024020042001412c6a280200470d00200441016a22022004490ddd0120044101742206200220022006491b220241ffffffff01712002470ddd01200241037422064100480ddd010240024020040d002006102721040c010b200128022820044103742006102821040b2004450dad01200120043602282001412c6a2002360200200141306a28020021040b200128022820044103746a200a422886200b84370200200141306a2201200128020041016a3602000cde010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450ddd012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450ddd012000200329023c370204200020013602000cde010b0240200141306a2802002204200141346a22062802004f0d002002310001210a200141206a350200210b024020042001412c6a280200470d00200441016a22022004490ddc0120044101742206200220022006491b220241ffffffff01712002470ddc01200241037422064100480ddc010240024020040d002006102721040c010b200128022820044103742006102821040b2004450dad01200120043602282001412c6a2002360200200141306a28020021040b200128022820044103746a200a422886200b8442808080803084370200200141306a2201200128020041016a3602000cdd010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450ddc012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450ddc012000200329023c370204200020013602000cdd010b2002310001210a200341d8006a200141186a200141286a22044100108004024020032d00584101470d002000200329025c370200200041086a200341e4006a2802003602000cdd010b0240200141306a2802002202200141346a22062802004f0d00200141206a350200210b024020022001412c6a280200470d00200241016a22062002490ddb0120024101742205200620062005491b220641ffffffff01712006470ddb01200641037422054100480ddb010240024020020d002005102721020c010b200428020020024103742005102821020b2002450dad01200120023602282001412c6a2006360200200141306a28020021020b200128022820024103746a200a422886200b8442808080801084370200200141306a2201200128020041016a3602000cdc010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450ddb012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450ddb012000200329023c370204200020013602000cdc010b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810272200450dac012003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c2003200136025841d497c5004134200341d8006a41c497c50010a201000b02400240200141286a220228020020044103746a22042d00044101470d002004310005210a200341d8006a200141186a20021081042003280258450d0120002003290358370200200041086a200341d8006a41086a2802003602000cdd010b411a10272201450dad01200141186a41002f00a098453b0000200141106a41002900989845370000200141086a410029009098453700002001410029008898453700002000429a808080a003370204200020013602000cdc010b0240200141306a2802002204200141346a22062802004f0d00200141206a350200210b024020042001412c6a280200470d00200441016a22062004490dda0120044101742205200620062005491b220641ffffffff01712006470dda01200641037422054100480dda010240024020040d002005102721020c010b200228020020044103742005102821020b2002450daf01200120023602282001412c6a2006360200200141306a28020021040b200128022820044103746a200a422886200b8442808080802084370200200141306a2201200128020041016a3602000cdb010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450dda012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dda012000200329023c370204200020013602000cdb010b02400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810272200450dae012003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c2003200136025841d497c5004134200341d8006a41c497c50010a201000b200141286a220528020020044103746a22042d00052106024020042d00044101470d00200641ff01714104470daf010b0240024020024101460d00200341d8006a200141186a220220051081042003280258450d0120002003290358370200200041086a200341d8006a41086a2802003602000cdc010b20012d003822024104460dd901200341d8006a200141186a2206200520021080040240024020032d00584101460d000240200141206a2802002204200141246a22082802004f0d00024020042001411c6a280200470d00200441016a22082004490ddc0120044101742207200820082007491b22084100480ddc010240024020040d002008102721040c010b200628020020042008102821040b2004450db401200120043602182001411c6a2008360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cdc010b200341ec006a220241013602002003420137025c200341f0a2c500360258200341013602042003200836020020032003360268200341106a200341d8006a10e60320032802102204450ddb012003200329021437021420032004360210200241013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382202450ddb01200329023c210a0c010b200328025c2202450dda01200341e0006a290300210a0b2000200a370204200020023602000cdb010b200641ff01714104460dd9010240200141206a2802002204200141246a22052802004f0d00024020042001411c6a280200470d00200441016a22052004490dd90120044101742208200520052008491b22054100480dd9010240024020040d002005102721020c010b200228020020042005102821020b2002450db201200120023602182001411c6a2005360200200141206a28020021040b200128021820046a20063a0000200141206a2201200128020041016a3602000cda010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200536020020032003360268200341106a200341d8006a10e60320032802102202450dd9012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd9012000200329023c370204200020013602000cda010b2003200241046a280200220236024802400240200141306a280200220420024d0d0020042002417f736a22022004490d0141d2a2c500411d104e000b200341ec006a220241023602002003411c6a41013602002003420237025c20034190a2c50036025820034101360214200320043602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a10e603200328023821042003200329023c37021420032004360210200241013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e6032003280214450dd101200328021010290cd1010b200141286a220428020020024103746a22022d00044103460dd10120022d0005220241ff01714104460dd101200341d8006a200141186a220620042002108004024020032d00584101460d000240200141206a2802002204200141246a22052802004f0d00024020042001411c6a280200470d00200441016a22052004490dd90120044101742208200520052008491b22054100480dd9010240024020040d002005102721040c010b200628020020042005102821040b2004450db301200120043602182001411c6a2005360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cd3010b200341ec006a220241013602002003420137025c200341f0a2c500360258200341013602042003200536020020032003360268200341106a200341d8006a10e60320032802102204450dd2012003200329021437021420032004360210200241013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e6032003280214450dd101200328021010290cd1010b200328025c2202450dd101200341e0006a290300210a0cd2010b200241046a2802002102200341d8006a200141186a2205200141286a220641001080040240024020032d00584101470d00200341e0006a290300210a200328025c22010d010cd9010b200141306a28020021042003200236024802400240200420024d0d0020042002417f736a22022004490d0141d2a2c500411d104e000b200341ec006a220141023602002003411c6a41013602002003420237025c20034190a2c50036025820034101360214200320043602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a10e603200328023821022003200329023c37021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b200329023c210a200328023822010d010cd9010b200628020020024103746a22022d00044103460dd80120022d0005220241ff01714104460dd801200341d8006a200520062002108004024020032d00584101460d000240200141206a2802002204200141246a22062802004f0d00024020042001411c6a280200470d00200441016a22062004490dd90120044101742208200620062008491b22064100480dd9010240024020040d002006102721040c010b200528020020042006102821040b2004450db401200120043602182001411c6a2006360200200141206a28020021040b200128021820046a20023a0000200141206a2201200128020041016a3602000cda010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450dd9012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd901200329023c210a0c010b200328025c2201450dd801200341e0006a290300210a0b2000200a370204200020013602000cd8010b200241086a2802002105200241046a280200210420032002410c6a280200220636024802400240200141306a280200220220064d0d0020022006417f736a22062002490d0141d2a2c500411d104e000b200341ec006a22044102360200200341106a410c6a41013602002003420237025c20034190a2c50036025820034101360214200320023602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a10e603200328023821022003200329023c37021420032002360210200441013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b2003200329023c370204200320032802383602000ccd010b410421090240200141286a220c280200220820064103746a22062d00044103460d0020062d000521090b200320093a00302005450dc801200941ff0171220d4104460dc701200541027421050340200320042802002206360248200220064d0dca0120022006417f736a220620024f0dce01200820064103746a22062d00044103460dcb0120062d000522074104460dcb01200d2007470dcb01200441046a21042005417c6a22050d000cc9010b0b20012d003822024104460dc501200341d8006a200141186a2206200141286a20021080040240024020032d00584101460d000240200141206a2802002204200141246a22052802004f0d00024020042001411c6a280200470d00200441016a22052004490dd70120044101742208200520052008491b22054100480dd7010240024020040d002005102721040c010b200628020020042005102821040b2004450db301200120043602182001411c6a2005360200200141206a28020021040b200128021820046a20023a0000200141206a2202200228020041016a3602000cc8010b200341ec006a220241013602002003420137025c200341f0a2c500360258200341013602042003200536020020032003360268200341106a200341d8006a10e60320032802102204450dc7012003200329021437021420032004360210200241013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382202450dc701200329023c210a0c010b200328025c2202450dc601200341e0006a290300210a0b2000200a370204200020023602000cd6010b200128020021042003200241046a2802002202360254024002400240200441386a28020020024b0d00200341ec006a41013602002003420237025c200341d8a0c500360258200341013602342003200341306a3602682003200341d4006a360230200341386a200341d8006a10e603200341186a200329023c370300200341013602102003200328023822043602140c010b2003200428023020024102746a2802002202360200024002402004412c6a28020020024b0d0041012106200341ec006a41013602002003420237025c200341e8a0c5003602582003410136024c2003200341c8006a36026820032003360248200341386a200341d8006a10e603200341186a200329023c220a370300200a422088a7210820032802382104200aa721020c010b2003411c6a200428022420024104746a22042d000d22083a0000200341186a2004280208220236020020042802002104410021060b20032006360210200320043602142006450d010b200341186a21010cc3010b02402002450d002004417f6a2104200141286a2106200141186a21050340200341d8006a20052006200420026a2d0000108004024020032d00584101470d00200341e0006a2101200328025c21040cc5010b2002417f6a22020d000b0b200841ff01714104460dd4010240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490dd40120024101742206200420042006491b22044100480dd4010240024020020d002004102721020c010b200128021820022004102821020b2002450db101200120023602182001411c6a2004360200200141206a28020021020b200128021820026a20083a0000200141206a2201200128020041016a3602000cd5010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450dd4012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382204450dd401200329023c210a0cc3010b200241046a28020021052001280200210220034100360238024002400240200241146a2802000d00200341d8006a41146a41013602002003420237025c200341b8a0c50036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10e6030c010b200341d8006a200141186a2204200141286a22064100108004024020032d00584101470d00200341e0006a290300210a0cc2010b20012802002208412c6a280200210220032005360238200220054b0d01200341ec006a41013602002003420237025c200341e8a0c50036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10e6030b2003290214210a200328021022010dc1010cd4010b200828022420054104746a22052d000d2108024020052802082202450d002005280200417f6a21050340200341d8006a20042006200520026a2d0000108004024020032d00584101470d00200341e0006a290300210a0cc2010b2002417f6a22020d000b0b200841ff01714104460dd3010240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490dd30120024101742205200620062005491b22064100480dd3010240024020020d002006102721020c010b200428020020022006102821020b2002450db101200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20083a0000200141206a2201200128020041016a3602000cd4010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450dd3012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd301200329023c210a0cc0010b200341d8006a200141186a200141286a410410800420032d00584101470dd201200328025c2201450dd2012000200341e0006a290300370204200020013602000cd3010b200341d8006a200141186a2204200141286a22064100108004200341d8006a21020240024020032d00584101460d00200341d8006a200420064104108004200341d8006a210220032d00584101460d00200341d8006a2004200620032d00592205108004200341d8006a210220032d00584101460d000240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490dd30120024101742208200620062008491b22064100480dd3010240024020020d002006102721020c010b200428020020022006102821020b2002450db201200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20053a0000200141206a2201200128020041016a3602000cd4010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450dd3012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd301200329023c210a0c010b200241046a2802002201450dd201200241086a290200210a0b2000200a370204200020013602000cd2010b200341d8006a200141046a200241046a2802001082040240024020032d00584101460d000240200141206a2802002202200141246a22042802004f0d0020032d00592104024020022001411c6a280200470d00200241016a22062002490dd20120024101742205200620062005491b22064100480dd2010240024020020d002006102721020c010b200128021820022006102821020b2002450db201200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20043a0000200141206a2201200128020041016a3602000cd3010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450dd2012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd201200329023c210a0c010b200328025c2201450dd101200341e0006a290300210a0b2000200a370204200020013602000cd1010b2003200241046a2802002202360200200341d8006a200141046a2002108204024020032d00584101470d002003200328025c22013602382003200341e0006a290300220a37023c0cbb010b200320032d005922023a0030200341d8006a200141186a200141286a4104108004024020032d00584101470d00200341c0006a200341e4006a2802003602002003200329025c3703380cba010b200320032d005922013a004820014104460dcf01200241ff01712001460dcf01200341106a41146a41253602002003411c6a4120360200200341d8006a41146a41033602002003420337025c200341c498c500360258200341013602142003200341106a3602682003200341c8006a3602202003200341306a36021820032003360210200341386a200341d8006a10e6030cb9010b200341d8006a200141046a200241046a2802001082040240024020032d00584101460d00200341d8006a200141186a2206200141286a20032d00592204108004024020032d00584101460d000240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490dd10120024101742208200520052008491b22054100480dd1010240024020020d002005102721020c010b200628020020022005102821020b2002450db201200120023602182001411c6a2005360200200141206a28020021020b200128021820026a20043a0000200141206a2201200128020041016a3602000cd2010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200536020020032003360268200341106a200341d8006a10e60320032802102202450dd1012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dd101200329023c210a0c020b200328025c2201450dd001200341e0006a290300210a0c010b200328025c2201450dcf01200341e0006a290300210a0b2000200a370204200020013602000ccf010b200128020021042003200241046a280200220236023802400240200441206a28020020024d0d000240200141206a2802002206200141246a22052802004f0d00200428021820024101746a2d00002102024020062001411c6a280200470d00200641016a22042006490dcf0120064101742205200420042005491b22044100480dcf010240024020060d002004102721060c010b200128021820062004102821060b2006450db101200120063602182001411c6a2004360200200141206a28020021060b200128021820066a20023a0000200141206a2201200128020041016a3602000cd0010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200536020020032003360268200341106a200341d8006a10e60320032802102202450dcf012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450dcf01200329023c210a0c010b200341ec006a41013602002003420237025c20034188a1c5003602582003410136024c2003200341c8006a3602682003200341386a360248200341106a200341d8006a10e60320032802102201450dce012003290214210a0b2000200a370204200020013602000cce010b2003200241046a28020022023602282001280200210420032002360254024002400240200441206a28020020024b0d00200341ec006a41013602002003420237025c20034188a1c5003602582003410136024c2003200341c8006a3602682003200341d4006a360248200341106a200341d8006a10e6030c010b200428021820024101746a22022d00010d01200341ec006a41013602002003420237025c20034198a1c50036025820034101360204200320033602682003200341d4006a360200200341106a200341d8006a10e6030b2003280210210120032003290214220a37023c200320013602380cb6010b200320022d000022023a002f200341d8006a200141186a200141286a4104108004024020032d00584101470d00200341c0006a200341e4006a2802003602002003200329025c3703380cb5010b200320032d005922013a00002001200241ff0171460dcc0120014104460dcc01200341106a41146a41253602002003411c6a4125360200200341d8006a41146a41033602002003420337025c200341dc98c500360258200341013602142003200341106a3602682003200336022020032003412f6a3602182003200341286a360210200341386a200341d8006a10e6030cb4010b200341d8006a2001200241046a280200410441001084042003280258450dcb0120002003290358370200200041086a200341d8006a41086a2802003602000ccc010b200341d8006a2001200241046a280200410841011084042003280258450dca0120002003290358370200200041086a200341d8006a41086a2802003602000ccb010b200341d8006a2001200241046a280200410441021084042003280258450dc90120002003290358370200200041086a200341d8006a41086a2802003602000cca010b200341d8006a2001200241046a280200410841031084042003280258450dc80120002003290358370200200041086a200341d8006a41086a2802003602000cc9010b200341d8006a2001200241046a280200410141001084042003280258450dc70120002003290358370200200041086a200341d8006a41086a2802003602000cc8010b200341d8006a2001200241046a280200410141001084042003280258450dc60120002003290358370200200041086a200341d8006a41086a2802003602000cc7010b200341d8006a2001200241046a280200410241001084042003280258450dc50120002003290358370200200041086a200341d8006a41086a2802003602000cc6010b200341d8006a2001200241046a280200410241001084042003280258450dc40120002003290358370200200041086a200341d8006a41086a2802003602000cc5010b200341d8006a2001200241046a280200410141011084042003280258450dc30120002003290358370200200041086a200341d8006a41086a2802003602000cc4010b200341d8006a2001200241046a280200410141011084042003280258450dc20120002003290358370200200041086a200341d8006a41086a2802003602000cc3010b200341d8006a2001200241046a280200410241011084042003280258450dc10120002003290358370200200041086a200341d8006a41086a2802003602000cc2010b200341d8006a2001200241046a280200410241011084042003280258450dc00120002003290358370200200041086a200341d8006a41086a2802003602000cc1010b200341d8006a2001200241046a280200410441011084042003280258450dbf0120002003290358370200200041086a200341d8006a41086a2802003602000cc0010b200341d8006a2001200241046a280200410441011084042003280258450dbe0120002003290358370200200041086a200341d8006a41086a2802003602000cbf010b200341d8006a2001200241046a280200410441001085042003280258450dbd0120002003290358370200200041086a200341d8006a41086a2802003602000cbe010b200341d8006a2001200241046a280200410841011085042003280258450dbc0120002003290358370200200041086a200341d8006a41086a2802003602000cbd010b200341d8006a2001200241046a280200410441021085042003280258450dbb0120002003290358370200200041086a200341d8006a41086a2802003602000cbc010b200341d8006a2001200241046a280200410841031085042003280258450dba0120002003290358370200200041086a200341d8006a41086a2802003602000cbb010b200341d8006a2001200241046a280200410141001085042003280258450db90120002003290358370200200041086a200341d8006a41086a2802003602000cba010b200341d8006a2001200241046a280200410241001085042003280258450db80120002003290358370200200041086a200341d8006a41086a2802003602000cb9010b200341d8006a2001200241046a280200410141011085042003280258450db70120002003290358370200200041086a200341d8006a41086a2802003602000cb8010b200341d8006a2001200241046a280200410241011085042003280258450db60120002003290358370200200041086a200341d8006a41086a2802003602000cb7010b200341d8006a2001200241046a280200410441011085042003280258450db50120002003290358370200200041086a200341d8006a41086a2802003602000cb6010b20012802002102200341003602380240024020022802080d00200341ec006a41013602002003420237025c20034188a0c50036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10e60320032802102202450d002003290214210a0c010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db50120024101742206200420042006491b22044100480db5010240024020020d002004102721020c010b200128021820022004102821020b2002450d9801200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000cb6010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450db5012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382202450db501200329023c210a0b2000200a370204200020023602000cb5010b20012802002102200341003602380240024020022802080d00200341ec006a41013602002003420237025c20034188a0c50036025820034101360204200320033602682003200341386a360200200341106a200341d8006a10e60320032802102202450d002003290214210a0c010b200341d8006a200141186a2204200141286a4100108004024020032d00584101460d000240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490db50120024101742205200620062005491b22064100480db5010240024020020d002006102721020c010b200428020020022006102821020b2002450d9901200120023602182001411c6a2006360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000cb6010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102202450db5012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382202450db501200329023c210a0c010b200328025c2202450db401200341e0006a290300210a0b2000200a370204200020023602000cb4010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db20120024101742206200420042006491b22044100480db2010240024020020d002004102721020c010b200128021820022004102821020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000cb3010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450db2012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450db2012000200329023c370204200020013602000cb3010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db10120024101742206200420042006491b22044100480db1010240024020020d002004102721020c010b200128021820022004102821020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41013a0000200141206a2201200128020041016a3602000cb2010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450db1012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450db1012000200329023c370204200020013602000cb2010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490db00120024101742206200420042006491b22044100480db0010240024020020d002004102721020c010b200128021820022004102821020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41023a0000200141206a2201200128020041016a3602000cb1010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450db0012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450db0012000200329023c370204200020013602000cb1010b0240200141206a2802002202200141246a22042802004f0d00024020022001411c6a280200470d00200241016a22042002490daf0120024101742206200420042006491b22044100480daf010240024020020d002004102721020c010b200128021820022004102821020b2002450d9701200120023602182001411c6a2004360200200141206a28020021020b200128021820026a41033a0000200141206a2201200128020041016a3602000cb0010b200341ec006a220141013602002003420137025c200341f0a2c500360258200341013602042003200436020020032003360268200341106a200341d8006a10e60320032802102202450daf012003200329021437021420032002360210200141013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382201450daf012000200329023c370204200020013602000cb0010b200341d8006a200141001086042003280258450dae0120002003290358370200200041086a200341d8006a41086a2802003602000caf010b200341d8006a200141001087042003280258450dad0120002003290358370200200041086a200341d8006a41086a2802003602000cae010b200341d8006a200141001087042003280258450dac0120002003290358370200200041086a200341d8006a41086a2802003602000cad010b200341d8006a200141001087042003280258450dab0120002003290358370200200041086a200341d8006a41086a2802003602000cac010b200341d8006a200141001087042003280258450daa0120002003290358370200200041086a200341d8006a41086a2802003602000cab010b200341d8006a200141001087042003280258450da90120002003290358370200200041086a200341d8006a41086a2802003602000caa010b200341d8006a200141001087042003280258450da80120002003290358370200200041086a200341d8006a41086a2802003602000ca9010b200341d8006a200141001087042003280258450da70120002003290358370200200041086a200341d8006a41086a2802003602000ca8010b200341d8006a200141001087042003280258450da60120002003290358370200200041086a200341d8006a41086a2802003602000ca7010b200341d8006a200141001087042003280258450da50120002003290358370200200041086a200341d8006a41086a2802003602000ca6010b200341d8006a200141001087042003280258450da40120002003290358370200200041086a200341d8006a41086a2802003602000ca5010b200341d8006a200141011086042003280258450da30120002003290358370200200041086a200341d8006a41086a2802003602000ca4010b200341d8006a200141011087042003280258450da20120002003290358370200200041086a200341d8006a41086a2802003602000ca3010b200341d8006a200141011087042003280258450da10120002003290358370200200041086a200341d8006a41086a2802003602000ca2010b200341d8006a200141011087042003280258450da00120002003290358370200200041086a200341d8006a41086a2802003602000ca1010b200341d8006a200141011087042003280258450d9f0120002003290358370200200041086a200341d8006a41086a2802003602000ca0010b200341d8006a200141011087042003280258450d9e0120002003290358370200200041086a200341d8006a41086a2802003602000c9f010b200341d8006a200141011087042003280258450d9d0120002003290358370200200041086a200341d8006a41086a2802003602000c9e010b200341d8006a200141011087042003280258450d9c0120002003290358370200200041086a200341d8006a41086a2802003602000c9d010b200341d8006a200141011087042003280258450d9b0120002003290358370200200041086a200341d8006a41086a2802003602000c9c010b200341d8006a200141011087042003280258450d9a0120002003290358370200200041086a200341d8006a41086a2802003602000c9b010b200341d8006a200141011087042003280258450d990120002003290358370200200041086a200341d8006a41086a2802003602000c9a010b200341d8006a200141021087042003280258450d980120002003290358370200200041086a200341d8006a41086a2802003602000c99010b200341d8006a200141021087042003280258450d970120002003290358370200200041086a200341d8006a41086a2802003602000c98010b200341d8006a200141021087042003280258450d960120002003290358370200200041086a200341d8006a41086a2802003602000c97010b200341d8006a200141021087042003280258450d950120002003290358370200200041086a200341d8006a41086a2802003602000c96010b200341d8006a200141021087042003280258450d940120002003290358370200200041086a200341d8006a41086a2802003602000c95010b200341d8006a200141021087042003280258450d930120002003290358370200200041086a200341d8006a41086a2802003602000c94010b200341d8006a200141031087042003280258450d920120002003290358370200200041086a200341d8006a41086a2802003602000c93010b200341d8006a200141031087042003280258450d910120002003290358370200200041086a200341d8006a41086a2802003602000c92010b200341d8006a200141031087042003280258450d900120002003290358370200200041086a200341d8006a41086a2802003602000c91010b200341d8006a200141031087042003280258450d8f0120002003290358370200200041086a200341d8006a41086a2802003602000c90010b200341d8006a200141031087042003280258450d8e0120002003290358370200200041086a200341d8006a41086a2802003602000c8f010b200341d8006a200141031087042003280258450d8d0120002003290358370200200041086a200341d8006a41086a2802003602000c8e010b200341d8006a200141001088042003280258450d8c0120002003290358370200200041086a200341d8006a41086a2802003602000c8d010b200341d8006a200141001088042003280258450d8b0120002003290358370200200041086a200341d8006a41086a2802003602000c8c010b200341d8006a200141001088042003280258450d8a0120002003290358370200200041086a200341d8006a41086a2802003602000c8b010b200341d8006a200141001089042003280258450d890120002003290358370200200041086a200341d8006a41086a2802003602000c8a010b200341d8006a200141001089042003280258450d880120002003290358370200200041086a200341d8006a41086a2802003602000c89010b200341d8006a200141001089042003280258450d870120002003290358370200200041086a200341d8006a41086a2802003602000c88010b200341d8006a200141001089042003280258450d860120002003290358370200200041086a200341d8006a41086a2802003602000c87010b200341d8006a200141001089042003280258450d850120002003290358370200200041086a200341d8006a41086a2802003602000c86010b200341d8006a200141001089042003280258450d840120002003290358370200200041086a200341d8006a41086a2802003602000c85010b200341d8006a200141001089042003280258450d830120002003290358370200200041086a200341d8006a41086a2802003602000c84010b200341d8006a200141001089042003280258450d820120002003290358370200200041086a200341d8006a41086a2802003602000c83010b200341d8006a200141001089042003280258450d810120002003290358370200200041086a200341d8006a41086a2802003602000c82010b200341d8006a200141001089042003280258450d800120002003290358370200200041086a200341d8006a41086a2802003602000c81010b200341d8006a200141001089042003280258450d7f20002003290358370200200041086a200341d8006a41086a2802003602000c80010b200341d8006a200141001089042003280258450d7e20002003290358370200200041086a200341d8006a41086a2802003602000c7f0b200341d8006a200141001089042003280258450d7d20002003290358370200200041086a200341d8006a41086a2802003602000c7e0b200341d8006a200141001089042003280258450d7c20002003290358370200200041086a200341d8006a41086a2802003602000c7d0b200341d8006a200141001089042003280258450d7b20002003290358370200200041086a200341d8006a41086a2802003602000c7c0b200341d8006a200141011088042003280258450d7a20002003290358370200200041086a200341d8006a41086a2802003602000c7b0b200341d8006a200141011088042003280258450d7920002003290358370200200041086a200341d8006a41086a2802003602000c7a0b200341d8006a200141011088042003280258450d7820002003290358370200200041086a200341d8006a41086a2802003602000c790b200341d8006a200141011089042003280258450d7720002003290358370200200041086a200341d8006a41086a2802003602000c780b200341d8006a200141011089042003280258450d7620002003290358370200200041086a200341d8006a41086a2802003602000c770b200341d8006a200141011089042003280258450d7520002003290358370200200041086a200341d8006a41086a2802003602000c760b200341d8006a200141011089042003280258450d7420002003290358370200200041086a200341d8006a41086a2802003602000c750b200341d8006a200141011089042003280258450d7320002003290358370200200041086a200341d8006a41086a2802003602000c740b200341d8006a200141011089042003280258450d7220002003290358370200200041086a200341d8006a41086a2802003602000c730b200341d8006a200141011089042003280258450d7120002003290358370200200041086a200341d8006a41086a2802003602000c720b200341d8006a200141011089042003280258450d7020002003290358370200200041086a200341d8006a41086a2802003602000c710b200341d8006a200141011089042003280258450d6f20002003290358370200200041086a200341d8006a41086a2802003602000c700b200341d8006a200141011089042003280258450d6e20002003290358370200200041086a200341d8006a41086a2802003602000c6f0b200341d8006a200141011089042003280258450d6d20002003290358370200200041086a200341d8006a41086a2802003602000c6e0b200341d8006a200141011089042003280258450d6c20002003290358370200200041086a200341d8006a41086a2802003602000c6d0b200341d8006a200141011089042003280258450d6b20002003290358370200200041086a200341d8006a41086a2802003602000c6c0b200341d8006a200141011089042003280258450d6a20002003290358370200200041086a200341d8006a41086a2802003602000c6b0b200341d8006a200141011089042003280258450d6920002003290358370200200041086a200341d8006a41086a2802003602000c6a0b200341d8006a200141021088042003280258450d6820002003290358370200200041086a200341d8006a41086a2802003602000c690b200341d8006a200141021088042003280258450d6720002003290358370200200041086a200341d8006a41086a2802003602000c680b200341d8006a200141021088042003280258450d6620002003290358370200200041086a200341d8006a41086a2802003602000c670b200341d8006a200141021088042003280258450d6520002003290358370200200041086a200341d8006a41086a2802003602000c660b200341d8006a200141021088042003280258450d6420002003290358370200200041086a200341d8006a41086a2802003602000c650b200341d8006a200141021088042003280258450d6320002003290358370200200041086a200341d8006a41086a2802003602000c640b200341d8006a200141021088042003280258450d6220002003290358370200200041086a200341d8006a41086a2802003602000c630b200341d8006a200141021089042003280258450d6120002003290358370200200041086a200341d8006a41086a2802003602000c620b200341d8006a200141021089042003280258450d6020002003290358370200200041086a200341d8006a41086a2802003602000c610b200341d8006a200141021089042003280258450d5f20002003290358370200200041086a200341d8006a41086a2802003602000c600b200341d8006a200141021089042003280258450d5e20002003290358370200200041086a200341d8006a41086a2802003602000c5f0b200341d8006a200141021089042003280258450d5d20002003290358370200200041086a200341d8006a41086a2802003602000c5e0b200341d8006a200141021089042003280258450d5c20002003290358370200200041086a200341d8006a41086a2802003602000c5d0b200341d8006a200141021089042003280258450d5b20002003290358370200200041086a200341d8006a41086a2802003602000c5c0b200341d8006a200141031088042003280258450d5a20002003290358370200200041086a200341d8006a41086a2802003602000c5b0b200341d8006a200141031088042003280258450d5920002003290358370200200041086a200341d8006a41086a2802003602000c5a0b200341d8006a200141031088042003280258450d5820002003290358370200200041086a200341d8006a41086a2802003602000c590b200341d8006a200141031088042003280258450d5720002003290358370200200041086a200341d8006a41086a2802003602000c580b200341d8006a200141031088042003280258450d5620002003290358370200200041086a200341d8006a41086a2802003602000c570b200341d8006a200141031088042003280258450d5520002003290358370200200041086a200341d8006a41086a2802003602000c560b200341d8006a200141031088042003280258450d5420002003290358370200200041086a200341d8006a41086a2802003602000c550b200341d8006a200141031089042003280258450d5320002003290358370200200041086a200341d8006a41086a2802003602000c540b200341d8006a200141031089042003280258450d5220002003290358370200200041086a200341d8006a41086a2802003602000c530b200341d8006a200141031089042003280258450d5120002003290358370200200041086a200341d8006a41086a2802003602000c520b200341d8006a200141031089042003280258450d5020002003290358370200200041086a200341d8006a41086a2802003602000c510b200341d8006a200141031089042003280258450d4f20002003290358370200200041086a200341d8006a41086a2802003602000c500b200341d8006a200141031089042003280258450d4e20002003290358370200200041086a200341d8006a41086a2802003602000c4f0b200341d8006a200141031089042003280258450d4d20002003290358370200200041086a200341d8006a41086a2802003602000c4e0b200341d8006a200141014100108a042003280258450d4c20002003290358370200200041086a200341d8006a41086a2802003602000c4d0b200341d8006a200141024100108a042003280258450d4b20002003290358370200200041086a200341d8006a41086a2802003602000c4c0b200341d8006a200141024100108a042003280258450d4a20002003290358370200200041086a200341d8006a41086a2802003602000c4b0b200341d8006a200141034100108a042003280258450d4920002003290358370200200041086a200341d8006a41086a2802003602000c4a0b200341d8006a200141034100108a042003280258450d4820002003290358370200200041086a200341d8006a41086a2802003602000c490b200341d8006a200141004101108a042003280258450d4720002003290358370200200041086a200341d8006a41086a2802003602000c480b200341d8006a200141004101108a042003280258450d4620002003290358370200200041086a200341d8006a41086a2802003602000c470b200341d8006a200141024101108a042003280258450d4520002003290358370200200041086a200341d8006a41086a2802003602000c460b200341d8006a200141024101108a042003280258450d4420002003290358370200200041086a200341d8006a41086a2802003602000c450b200341d8006a200141034101108a042003280258450d4320002003290358370200200041086a200341d8006a41086a2802003602000c440b200341d8006a200141034101108a042003280258450d4220002003290358370200200041086a200341d8006a41086a2802003602000c430b200341d8006a200141004102108a042003280258450d4120002003290358370200200041086a200341d8006a41086a2802003602000c420b200341d8006a200141004102108a042003280258450d4020002003290358370200200041086a200341d8006a41086a2802003602000c410b200341d8006a200141014102108a042003280258450d3f20002003290358370200200041086a200341d8006a41086a2802003602000c400b200341d8006a200141014102108a042003280258450d3e20002003290358370200200041086a200341d8006a41086a2802003602000c3f0b200341d8006a200141034102108a042003280258450d3d20002003290358370200200041086a200341d8006a41086a2802003602000c3e0b200341d8006a200141004103108a042003280258450d3c20002003290358370200200041086a200341d8006a41086a2802003602000c3d0b200341d8006a200141004103108a042003280258450d3b20002003290358370200200041086a200341d8006a41086a2802003602000c3c0b200341d8006a200141014103108a042003280258450d3a20002003290358370200200041086a200341d8006a41086a2802003602000c3b0b200341d8006a200141014103108a042003280258450d3920002003290358370200200041086a200341d8006a41086a2802003602000c3a0b200341d8006a200141024103108a042003280258450d3820002003290358370200200041086a200341d8006a41086a2802003602000c390b200341d8006a200141024100108a042003280258450d3720002003290358370200200041086a200341d8006a41086a2802003602000c380b200341d8006a200141034101108a042003280258450d3620002003290358370200200041086a200341d8006a41086a2802003602000c370b200341d8006a200141004102108a042003280258450d3520002003290358370200200041086a200341d8006a41086a2802003602000c360b200341d8006a200141014103108a0420032802580d1b0c340b41184101102a000b20094101102a000b20064104102a000b20064104102a000b20054104102a000b41184101102a000b411a4101102a000b20054104102a000b41184101102a000b200341ec006a41013602002003420237025c200341a498c5003602582003412636023c2003200441056a3602382003200341386a360268200341106a200341d8006a10e603200041086a200341106a41086a280200360200200020032903103702000c2b0b20084101102a000b20054101102a000b20054101102a000b20064101102a000b20054101102a000b20044101102a000b20064101102a000b20064101102a000b20064101102a000b20054101102a000b20044101102a000b20044101102a000b20064101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20002003290358370200200041086a200341d8006a41086a2802003602000c190b200329023c210a200328023821010b2001450d162000200a370204200020013602000c170b200329023c210a200328023821010b2001450d142000200a370204200020013602000c150b200328025c2201450d130b2000200a370204200020013602000c130b2004450d112001290200210a0b2000200a370204200020043602000c110b0240024002400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810272200450d012003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c20032001360258418697c500413b200341d8006a41c497c50010a201000b02400240200128022820044103746a22052802002206200141206a28020022024b0d002006200220062002491b21040c010b024002402001411c6a280200220420026b200620026b2207490d0020012802182108200221040c010b200220076a22082002490d1120044101742209200820082009491b22094100480d110240024020040d002009102721080c010b200128021820042009102821080b2008450d03200120083602182001411c6a2009360200200141206a28020021040b200820046a21090240024020074102490d002009410420062002417f736a220210cd041a2008200220046a22046a21090c010b2007450d010b200941043a0000200441016a21040b200141206a2004360200200541013a00060c110b41184101102a000b20094101102a000b200541027421050340200320042802002206360248200220064d0d0220022006417f736a220620024f0d060240200820064103746a22062d00044103460d0020062d00054104470d040b200441046a21042005417c6a22050d000b410421090b200341d8006a200141186a2202200c410010800420032d00584101470d02200341086a200341e4006a2802003602002003200329025c3703000c030b200341ec006a220441023602002003411c6a41013602002003420237025c20034190a2c50036025820034101360214200320023602002003200341106a360268200320033602182003200341c8006a360210200341386a200341d8006a10e603200328023821022003200329023c37021420032002360210200441013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b2003200329023c370204200320032802383602000c020b2003411c6a4126360200200341ec006a41023602002003420237025c200341b498c5003602582003200641056a360218200341263602142003200341106a3602682003200341306a3602102003200341d8006a10e6030c010b0240200941ff01714104460d00200341d8006a2002200c200910800402400240024020032d00584101460d000240200141206a2802002204200141246a22062802004f0d00024020042001411c6a280200470d00200441016a22062004490d0e20044101742205200620062005491b22064100480d0e0240024020040d002006102721020c010b200228020020042006102821020b2002450d04200120023602182001411c6a2006360200200141206a28020021040b200128021820046a20093a0000200141206a2202200228020041016a3602000c040b200341ec006a220241013602002003420137025c200341f0a2c500360258200341013602042003200636020020032003360268200341106a200341d8006a10e60320032802102204450d032003200329021437021420032004360210200241013602002003420137025c200341b89cc50036025820034121360204200320033602682003200341106a360200200341386a200341d8006a10e60302402003280214450d00200328021010290b20032802382202450d03200329023c210a0c010b200328025c2202450d02200341e0006a290300210a0b2003200a370204200320023602000c020b20064101102a000b200341003602000b024020032802002202450d0020002003290204370204200020023602000c0b0b0240024002400240200141306a2802002202417f6a220420024f0d00200420024d0d010b411810272200450d012003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c20032001360258418697c500413b200341d8006a41c497c50010a201000b02400240200128022820044103746a22052802002206200141206a28020022024b0d002006200220062002491b21040c010b024002402001411c6a280200220420026b200620026b2207490d0020012802182108200221040c010b200220076a22082002490d0b20044101742209200820082009491b22094100480d0b0240024020040d002009102721080c010b200128021820042009102821080b2008450d03200120083602182001411c6a2009360200200141206a28020021040b200820046a21090240024020074102490d002009410420062002417f736a220210cd041a2008200220046a22046a21090c010b2007450d010b200941043a0000200441016a21040b200141206a2004360200200541013a00060c0b0b41184101102a000b20094101102a000b41d2a2c500411d104e000b20032802382202450d00200329023c210a0c010b0240200141306a2802002202417f6a220420024f0d00200420024d0d020b411810272200450d022003421837025c20032000360258200341d8006a4100411810fe0320032003280260220041186a3602602000200328025822016a411841f6a1c500411810ff032003200329025c37025c20032001360258418697c500413b200341d8006a41c497c50010a201000b2000200a370204200020023602000c060b02400240200128022820044103746a22052802002206200141206a28020022024b0d002006200220062002491b21040c010b024002402001411c6a280200220420026b200620026b2207490d0020012802182108200221040c010b200220076a22082002490d0420044101742209200820082009491b22094100480d040240024020040d002009102721080c010b200128021820042009102821080b2008450d03200120083602182001411c6a2009360200200141206a28020021040b200820046a21090240024020074102490d002009410420062002417f736a220210cd041a2008200220046a22046a21090c010b2007450d010b200941043a0000200441016a21040b200141206a2004360200200541013a00060c040b41184101102a000b20094101102a000b102b000b200341d8006a200141186a20051081042003280258450d0020002003290358370200200041086a200341d8006a41086a2802003602000c010b200041003602000b200341f0006a24000b6501017f230041206b2202240020024127360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c2002419c81c6003602082002200236021820012000200241086a1091042101200241206a240020010b0c00200028020020011093040bcd0201067f02400240024002402001450d0020014108490d010240200141ffffffff01712001470d00200141037441076e21010c030b41f495c5001058000b200041106a4200370200200041086a4280808080c000370200200041046a418c96c5003602000c020b200141016a21010b02400240417f2001417f6a6776220141016a220241ffffffff01712002470d00200141086a417c712203200141056a2204490d00200320024103746a22052003490d002005417d4f0d00200510272206450d012001200241037641076c20014108491b2107200641ff01200410cd04220520036a21030240200241034b0d00200520026a418001410320016b10cd041a0b200041146a2007360200200041106a41003602002000410c6a2003360200200041086a2001360200200041046a20053602000c020b41f495c5001058000b20054104102a000b200041003a00000b970d02117f017e230041206b220124000240024002400240200028020c220241016a22032002490d00200041046a28020022022104024020024108490d00200241016a41037641076c21040b024020032004410176490d00200141086a200310fb0320012d00084101460d042001411c6a2802002105200141146a2802002106200141106a2802002107200128020c210820002802002209280200417f7341808182847871210a200041046a28020020096a41016a210b2000280208210c200028020c210d03400240024002400240200a0d00200941046a210203402002200b4f0d02200c41206a210c20022802002103200241046a220421022003418081828478712203418081828478460d000b200341808182847873210a2004417c6a21090b200c200a684138716a220e280200210f410021030240200e28020422104104490d0041002103200f2102201021040340200228000020034105777341b9f3ddf1796c2103200241046a21022004417c6a220441034b0d000b2010417c6a22022002417c7122026b21102002200f6a41046a210f0b201041014b0d01200f21020c020b2000200d36020c2000200636020820002005200d6b3602102000280200210420002008360200200041046a22032802002102200320073602002002450d070240200241016a220341ffffffff01712003470d00200241086a417c712208200241056a490d00200820034103746a2008491a0b200410290c070b200f41026a21022010417e6a21102003410577200f2f00007341b9f3ddf1796c21030b02402010450d00200341057720022d00007341b9f3ddf1796c21030b200a417f6a210f41002102200341057741ff017341b9f3ddf1796c221121030340200241046a2202200320077122046a2103200820046a280000418081828478712210450d000b0240200820106841037620046a20077122026a2c00004100480d002008280200418081828478716841037621020b200f200a71210a200820026a201141197622033a00002002417c6a20077120086a41046a20033a0000200620024103746a200e2902003702000c000b0b200241016a21044100210341002102024003400240024020034101710d00200220044f0d0320022103200241016a21020c010b200241036a220320024922080d0220032004492207450d022004200241046a20081b200420071b21020b200028020020036a220320032802002203410776417f73418182840871200341fffefdfb07726a360200410121030c000b0b20002802002102200041046a220428020041016a220341044f0d01200241046a2002200310cf041a2004280200220220002802006a41016a418001410320026b10cd041a0c020b41f495c5001058000b200220036a20022800003600000b417f210202400240200041046a2211280200220341016a220f2003490d00200041086a21064100210b0340200b220c41016a210b0240200c20002802006a2d0000418001470d00024003402006280200200c4103746a220e2802002107410021030240200e28020422084104490d004100210320072102200821040340200228000020034105777341b9f3ddf1796c2103200241046a21022004417c6a220441034b0d000b2008417c6a22022002417c7122026b2108200220076a41046a21070b02400240200841014b0d00200721020c010b200741026a21022008417e6a2108200341057720072f00007341b9f3ddf1796c21030b02402008450d00200341057720022d00007341b9f3ddf1796c21030b201128020021082000280200210741002102200341057741ff017341b9f3ddf1796c220a21030340200241046a2202200320087122046a2103200720046a280000418081828478712210450d000b0240200720106841037620046a20087122026a2c00004100480d002007280200418081828478716841037621020b2002200a20087122036b200c20036b732008714104490d01200720026a22032d000021042003200a41197622103a00002002417c6a20087120076a41046a20103a00000240200441ff01460d00200628020020024103746a220229020021122002200e290200370200200e20123702000c010b0b20002802002203200c6a41ff013a000020032011280200200c417c6a716a41046a41ff013a0000200628020020024103746a200e2902003702000c010b2007200c6a200a41197622023a00002008200c417c6a7120076a41046a20023a00000b200b200f470d000b200041046a28020022024108490d010b200241016a41037641076c21020b20002002200028020c6b3602100b200141206a24000b19002000200141186a280200360204200020012802103602000b810101017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d0220034101742201200220022001491b22014100480d020240024020030d002001102721020c010b200028020020032001102821020b2002450d0120002002360200200041046a20013602000b0f0b20014101102a000b102b000bea0101017f230041e0006b22042400200420013602082004200336020c024020012003470d0020002002200110ce041a200441e0006a24000f0b200441286a41146a4103360200200441346a411d360200200441106a41146a41033602002004200441086a36024020042004410c6a360244200441c8006a41146a41003602002004420337021420044190d1c5003602102004411d36022c200441b8d6c5003602582004420137024c200441e4d1c5003602482004200441286a3602202004200441c8006a3602382004200441c4006a3602302004200441c0006a360228200441106a41a0d2c5001057000bbc0601037f230041d0006b22042400200420033a000f0240024002400240024020022802082205417f6a220620054f0d00200620054d0d010b411810272202450d012004421837023420042002360230200441306a4100411810fe0320042004280238220241186a3602382002200428023022056a411841f6a1c500411810ff03200420042902343702342004200536023041d497c5004134200441306a41c497c50010a201000b200141086a2802002105200228020020064103746a2206280200210202400240024020062d0006450d0020052002460d010b024002400240200520024d0d00200141086a2005417f6a2202360200200128020020026a2d00002205417c6a220241014b0d02024020020e020400040b4118102722020d0141184101102a000b412b10272202450d05200041013a0000200241276a41002800f29b45360000200241206a41002900eb9b45370000200241186a41002900e39b45370000200241106a41002900db9b45370000200241086a41002900d39b45370000200241002900cb9b45370000200041086a42ab808080b005370200200041046a20023602000c060b200241106a4100290086a245370000200241086a41002900fea145370000200241002900f6a14537000020044298808080800337022420042002360220200441c4006a410136020020044201370234200441b89cc5003602302004412136024c2004200441c8006a3602402004200441206a360248200441106a200441306a10e60302402004280224450d00200428022010290b200041013a0000200041046a20042903103702002000410c6a200441106a41086a2802003602000c050b0240200341ff017122024104460d0020052002470d020b200041003a0000200020053a00010c040b20004180083b01000c030b200420053a0048200441c4006a4102360200200441206a410c6a412536020020044202370234200441f89bc500360230200441253602242004200441206a3602402004200441c8006a36022820042004410f6a360220200441106a200441306a10e6032000410c6a200441186a280200360200200041046a2004290310370200200041013a00000c020b41184101102a000b412b4101102a000b200441d0006a24000bc00502047f017e230041d0006b22032400024002400240024002400240200241086a2802002204417f6a220520044f0d00200520044d0d010b411810272202450d01200241106a4100290086a245370000200241086a41002900fea145370000200241002900f6a14537000020034298808080800337022420032002360220200341cc006a41013602002003420137023c200341b89cc500360238200341213602142003200341106a3602482003200341206a3602102000200341386a10e6032003280224450d04200328022010290c040b0240024002402002280200220620054103746a2d000522054104460d00200341386a200120022005108004024020032d00384101470d002000200329023c370200200041086a200341c4006a2802003602000c070b200241086a2802002204450d01200228020021060b200241086a2004417f6a2202360200200620024103746a290200220742808080808080c0ff0083428080808080808001520d010b411810272202450d02200241106a4100290086a245370000200241086a41002900fea145370000200241002900f6a14537000020034298808080800337022420032002360220200341cc006a41013602002003420137023c200341b89cc500360238200341213602142003200341106a3602482003200341206a3602102000200341386a10e6032003280224450d04200328022010290c040b200141086a28020021022003200737030820022007a7470d02200041003602000c030b41184101102a000b41184101102a000b200341cc006a41023602002003412c6a41013602002003420237023c200341989bc50036023820034101360224200320023602342003200341206a3602482003200341086a3602282003200341346a360220200341106a200341386a10e603200041086a200341106a41086a280200360200200020032903103702000b200341d0006a24000bad0301057f230041c0006b2203240020032002360200024002402001280204220420024b0d002001280208417c6a21052001410c6a280200410374210102400340024020010d00200320043602042003412c6a4102360200200341306a410c6a41013602002003420337021c200341c0a3c500360218200341013602342003200341306a3602282003200341046a36023820032003360230200341086a200341186a10e6032000410c6a200341106a280200360200200041046a2003290308370200200041013a00000c040b02402004200541046a2802006a220620044f0d00412010272204450d02200041013a0000200441186a41002900b8a345370000200441106a41002900b0a345370000200441086a41002900a8a345370000200441002900a0a345370000200041086a42a08080808004370200200041046a20043602000c040b200141786a2101200541086a2105200420024b21072006210420070d0020062104200620024d0d000b20052d00002104200041003a0000200020043a00010c020b41204101102a000b200041003a00002000200128020020026a2d00003a00010b200341c0006a24000bbe0201037f230041106b220224000240024020002d00004104470d002002200128021841f499c50041032001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c010b2002200128021841f799c50041082001411c6a28020028020c1105003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41809ac500108c04210120022d0008210020022802042203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841b682c60041012004411c6a28020028020c1105000d010b2001280200220028021841b782c60041012000411c6a28020028020c11050021000b200120003a00080b200241106a2400200041ff01714100470b820601037f230041d0006b22052400200520023602082005200336020c024002400240417f41012002411f71742002411f4b1b20034b0d00200541386a200141186a2203200141286a410010800420052d00384101470d012000200529023c370200200041086a200541c4006a2802003602000c020b200541cc006a41023602002005411c6a41013602002005420337023c200541f498c500360238200541013602142005200541106a36024820052005410c6a3602182005200541086a360210200541206a200541386a10e603200041086a200541206a41086a280200360200200020052903203702000c010b2001280200210220054100360220024020022802080d00200541cc006a41013602002005420237023c20054188a0c500360238200541013602342005200541306a3602482005200541206a360230200541106a200541386a10e60320052802102202450d0020002005290214370204200020023602000c010b0240024002400240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490d0320024101742207200620062007491b22064100480d030240024020020d002006102721020c010b200328020020022006102821020b2002450d02200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20043a0000200141206a2202200228020041016a3602000c030b200541cc006a220241013602002005420137023c200541f0a2c50036023820054101360234200520063602302005200541306a360248200541106a200541386a10e60320052802102201450d022005200529021437021420052001360210200241013602002005420137023c200541b89cc500360238200541213602342005200541306a3602482005200541106a360230200541206a200541386a10e60302402005280214450d00200528021010290b20052802202202450d0220002005290224370204200020023602000c030b20064101102a000b102b000b200041003602000b200541d0006a24000bb00301017f230041d0006b22052400200520023602082005200336020c024002400240417f41012002411f71742002411f4b1b20034b0d00200128020021022005410036023420022802080d01200541cc006a41013602002005420237023c20054188a0c500360238200541013602142005200541106a3602482005200541346a360210200541206a200541386a10e60320052802202202450d0120002005290224370204200020023602000c020b200541cc006a41023602002005412c6a41013602002005420337023c200541f498c500360238200541013602242005200541206a36024820052005410c6a3602282005200541086a360220200541106a200541386a10e603200041086a200541106a41086a280200360200200020052903103702000c010b200541386a200141186a2202200141286a22032004108004024020052d00384101470d002000200529023c370200200041086a200541c4006a2802003602000c010b200541386a200220034100108004024020052d00384101470d002000200529023c370200200041086a200541c4006a2802003602000c010b200041003602000b200541d0006a24000be70301047f230041c0006b22032400200341286a200141186a2204200141286a20021080040240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490d0320024101742206200520052006491b22054100480d030240024020020d002005102721020c010b200428020020022005102821020b2002450d02200120023602182001411c6a2005360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341f0a2c50036022820034101360214200320053602102003200341106a360238200341186a200341286a10e60320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341b89cc500360228200341213602142003200341106a3602382003200341186a3602102003200341286a10e6030240200328021c450d00200328021810290b20032802002201450d0220002003290204370204200020013602000c030b20054101102a000b102b000b200041003602000b200341c0006a24000ba00401047f230041c0006b22032400200341286a200141186a2204200141286a220520021080040240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b200341286a200420052002108004024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002202200141246a22052802004f0d00024020022001411c6a280200470d00200241016a22052002490d0320024101742206200520052006491b22054100480d030240024020020d002005102721020c010b200428020020022005102821020b2002450d02200120023602182001411c6a2005360200200141206a28020021020b200128021820026a41003a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341f0a2c50036022820034101360214200320053602102003200341106a360238200341186a200341286a10e60320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341b89cc500360228200341213602142003200341106a3602382003200341186a3602102003200341286a10e6030240200328021c450d00200328021810290b20032802002201450d0220002003290204370204200020013602000c030b20054101102a000b102b000b200041003602000b200341c0006a24000be70301057f230041c0006b22032400200341286a200141186a2204200141286a20021080040240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002205200141246a22062802004f0d00024020052001411c6a280200470d00200541016a22062005490d0320054101742207200620062007491b22064100480d030240024020050d002006102721050c010b200428020020052006102821050b2005450d02200120053602182001411c6a2006360200200141206a28020021050b200128021820056a20023a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341f0a2c50036022820034101360214200320063602102003200341106a360238200341186a200341286a10e60320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341b89cc500360228200341213602142003200341106a3602382003200341186a3602102003200341286a10e6030240200328021c450d00200328021810290b20032802002201450d0220002003290204370204200020013602000c030b20064101102a000b102b000b200041003602000b200341c0006a24000ba00401057f230041c0006b22032400200341286a200141186a2204200141286a220520021080040240024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b200341286a200420052002108004024020032d00284101470d002000200329022c370200200041086a200341346a2802003602000c010b0240024002400240200141206a2802002205200141246a22062802004f0d00024020052001411c6a280200470d00200541016a22062005490d0320054101742207200620062007491b22064100480d030240024020050d002006102721040c010b200428020020052006102821040b2004450d02200120043602182001411c6a2006360200200141206a28020021050b200128021820056a20023a0000200141206a2201200128020041016a3602000c030b2003413c6a220141013602002003420137022c200341f0a2c50036022820034101360214200320063602102003200341106a360238200341186a200341286a10e60320032802182202450d022003200329021c37021c20032002360218200141013602002003420137022c200341b89cc500360228200341213602142003200341106a3602382003200341186a3602102003200341286a10e6030240200328021c450d00200328021810290b20032802002201450d0220002003290204370204200020013602000c030b20064101102a000b102b000b200041003602000b200341c0006a24000be70301047f230041c0006b22042400200441286a200141186a2205200141286a20021080040240024020042d00284101470d002000200429022c370200200041086a200441346a2802003602000c010b0240024002400240200141206a2802002202200141246a22062802004f0d00024020022001411c6a280200470d00200241016a22062002490d0320024101742207200620062007491b22064100480d030240024020020d002006102721020c010b200528020020022006102821020b2002450d02200120023602182001411c6a2006360200200141206a28020021020b200128021820026a20033a0000200141206a2201200128020041016a3602000c030b2004413c6a220141013602002004420137022c200441f0a2c50036022820044101360214200420063602102004200441106a360238200441186a200441286a10e60320042802182202450d022004200429021c37021c20042002360218200141013602002004420137022c200441b89cc500360228200441213602142004200441106a3602382004200441186a3602102004200441286a10e6030240200428021c450d00200428021810290b20042802002201450d0220002004290204370204200020013602000c030b20064101102a000b102b000b200041003602000b200441c0006a24000bc10201037f230041206b220224000240024020002d00004104470d002002200128021841b2bfc50041082001411c6a28020028020c11050022003a001820022001360210200241003a0019200241003602140c010b2002200128021841babfc50041052001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200036020c200241106a2002410c6a41c0bfc500108c04210120022d0018210020022802142203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841b682c60041012004411c6a28020028020c1105000d010b2001280200220028021841b782c60041012000411c6a28020028020c11050021000b200120003a00080b200241206a2400200041ff01714100470bf30202047f057e230041d0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d0041012104200628021841f481c60041b382c60020051b4102410120051b2006411c6a28020028020c1105000d0120012000280200200228020c11040021040c010b024020050d0041012104200628021841b482c60041022006411c6a28020028020c1105000d01200028020021060b41012104200341013a00172003200341176a3602102006290208210720062902102108200341346a41fc81c60036020020032006290218370308200629022021092006290228210a200320062d00303a00482006290200210b2003200a3703402003200937033820032008370328200320073703202003200b3703182003200341086a3602302001200341186a200228020c1104000d002003280230419482c6004102200328023428020c11050021040b200020043a00082000200028020441016a360204200341d0006a240020000b17000240200041046a280200450d00200028020010290b0b0c002000280200200110f7030b160020002802002200280200200028020820011082010b110020012000280200200028020810e9030bbd0801087f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a36020020034280808080800437030820032000360220410021062003410036021820034100360210200320053602302003200536022802400240024002400240200228020822070d0020022802002108200228020422092004200420094b1b220a450d0141012104200020082802002008280204200128020c1105000d04200841086a210241012106034002402005280200200341086a200541046a280200110400450d00410121040c060b2006200a4f0d02200241046a210020022802002101200541086a2105200241086a210241012104200641016a2106200328022020012000280200200328022428020c110500450d000c050b0b20022802002108200228020422092002410c6a2802002205200520094b1b220a450d0041012104200020082802002008280204200128020c1105000d03200741106a2105200841086a21024101210603402003200541786a28020036020c2003200541106a2d00003a003820032005417c6a28020036020841002101410021040240024002400240200541086a2802000e0400010203000b2005410c6a2802002100410121040c020b02402005410c6a2802002207200328023422044f0d0041002104200328023020074103746a22072802044128470d0220072802002802002100410121040c020b41f8dbc500200720041037000b4100210420032802282207200328022c460d002003200741086a3602284100210420072802044128470d0020072802002802002100410121040b2003200036021420032004360210024002400240024002400240024020052802000e0404010006040b20032802282200200328022c470d010c050b200541046a2802002200200328023422044f0d01200328023020004103746a22002802044128470d04200028020028020021040c030b2003200041086a36022820002802044128470d03200028020028020021040c020b41f8dbc500200020041037000b200541046a28020021040b410121010b2003200436021c2003200136021802400240200541706a2802004101460d0020032802282204200328022c460d042003200441086a3602280c010b200541746a2802002204200328023422004f0d04200328023020044103746a21040b02402004280200200341086a200441046a280200110400450d00410121040c050b2006200a4f0d01200241046a210020022802002101200541246a2105200241086a210241012104200641016a2106200328022020012000280200200328022428020c110500450d000c040b0b0240200920064d0d00410121042003280220200820064103746a22052802002005280204200328022428020c1105000d030b410021040c020b41c8dac5001058000b4188dcc500200420001037000b200341c0006a240020040bfc0101027f230041106b220224002002200128021841bb82c60041052001411c6a28020028020c1105003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a4190a3c500108c041a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841b682c60041012000411c6a28020028020c1105000d010b2002280200220128021841b782c60041012001411c6a28020028020c11050021010b200220013a00080b200241106a2400200141ff01714100470ba46601037f230041206b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00000eac010102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab0100010b200220012802184183b4c50041112001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000cab010b200220012802184194b4c500410b2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000caa010b20022001280218419fb4c50041032001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000ca9010b2002200128021841a2b4c50041052001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41a8b4c500108c0421000ca8010b2002200128021841b8b4c50041042001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41a8b4c500108c0421000ca7010b2002200128021841bcb4c50041022001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a41a8b4c500108c0421000ca6010b2002200128021841beb4c50041042001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000ca5010b2002200128021841c2b4c50041032001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000ca4010b2002200128021841c5b4c50041022001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000ca3010b2002200128021841d8b4c50041042001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000ca2010b2002200128021841dcb4c50041072001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41e4b4c500108c04210120022000410c6a36020c20012002410c6a41c8b4c500108c0421000ca1010b2002200128021841f4b4c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000ca0010b2002200128021841fab4c50041042001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c9f010b2002200128021841feb4c500410c2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041016a36020c20012002410c6a418cb5c500108c0421000c9e010b20022001280218419cb5c50041042001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c9d010b2002200128021841a0b5c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c9c010b2002200128021841a6b5c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c9b010b2002200128021841aeb5c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c9a010b2002200128021841b6b5c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c99010b2002200128021841beb5c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c98010b2002200128021841c7b5c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c97010b2002200128021841d0b5c50041072001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c96010b2002200128021841d7b5c50041072001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c95010b2002200128021841deb5c50041072001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c94010b2002200128021841e5b5c50041072001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c93010b2002200128021841ecb5c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c92010b2002200128021841f5b5c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c91010b2002200128021841feb5c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c90010b200220012802184188b6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8f010b200220012802184192b6c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8e010b20022001280218419bb6c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8d010b2002200128021841a4b6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8c010b2002200128021841aeb6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8b010b2002200128021841b8b6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c8a010b2002200128021841c2b6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c89010b2002200128021841ccb6c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c88010b2002200128021841d4b6c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c87010b2002200128021841dcb6c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c86010b2002200128021841e4b6c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c85010b2002200128021841ecb6c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c84010b2002200128021841f5b6c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c83010b2002200128021841ffb6c50041092001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c82010b200220012802184188b7c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c81010b200220012802184192b7c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421012002200041086a36020c20012002410c6a41c8b4c500108c0421000c80010b20022001280218419cb7c500410d2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a418cb5c500108c0421000c7f0b2002200128021841a9b7c500410a2001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041016a36020c200241106a2002410c6a418cb5c500108c0421000c7e0b2002200128021841b3b7c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41bcb7c500108c0421000c7d0b2002200128021841ccb7c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041086a36020c200241106a2002410c6a41d4b7c500108c0421000c7c0b2002200128021841e4b7c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041046a36020c200241106a2002410c6a41c8b4c500108c0421000c7b0b2002200128021841ecb7c50041082001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200041086a36020c200241106a2002410c6a41f4b7c500108c0421000c7a0b200220012802184184b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c790b20022001280218418ab8c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c780b20022001280218418fb8c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c770b200220012802184194b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c760b20022001280218419ab8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c750b2002200128021841a0b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c740b2002200128021841a6b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c730b2002200128021841acb8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c720b2002200128021841b2b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c710b2002200128021841b8b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c700b2002200128021841beb8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6f0b2002200128021841c4b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6e0b2002200128021841cab8c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6d0b2002200128021841cfb8c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6c0b2002200128021841d4b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6b0b2002200128021841dab8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c6a0b2002200128021841e0b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c690b2002200128021841e6b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c680b2002200128021841ecb8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c670b2002200128021841f2b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c660b2002200128021841f8b8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c650b2002200128021841feb8c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c640b200220012802184184b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c630b200220012802184189b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c620b20022001280218418eb9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c610b200220012802184193b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c600b200220012802184198b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5f0b20022001280218419db9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5e0b2002200128021841a2b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5d0b2002200128021841a7b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5c0b2002200128021841acb9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5b0b2002200128021841b1b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c5a0b2002200128021841b6b9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c590b2002200128021841bbb9c50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c580b2002200128021841c0b9c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c570b2002200128021841c6b9c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c560b2002200128021841ccb9c50041092001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c550b2002200128021841d5b9c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c540b2002200128021841dbb9c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c530b2002200128021841e1b9c50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c520b2002200128021841e7b9c50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c510b2002200128021841eeb9c50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c500b2002200128021841f5b9c50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4f0b2002200128021841fcb9c50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4e0b200220012802184183bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4d0b200220012802184189bac50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4c0b20022001280218418ebac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4b0b200220012802184194bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c4a0b20022001280218419abac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c490b2002200128021841a1bac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c480b2002200128021841a8bac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c470b2002200128021841afbac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c460b2002200128021841b6bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c450b2002200128021841bcbac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c440b2002200128021841c2bac50041092001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c430b2002200128021841cbbac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c420b2002200128021841d1bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c410b2002200128021841d7bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c400b2002200128021841ddbac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3f0b2002200128021841e4bac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3e0b2002200128021841ebbac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3d0b2002200128021841f2bac50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3c0b2002200128021841f9bac50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3b0b2002200128021841ffbac50041052001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c3a0b200220012802184184bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c390b20022001280218418abbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c380b200220012802184190bbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c370b200220012802184197bbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c360b20022001280218419ebbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c350b2002200128021841a5bbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c340b2002200128021841acbbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c330b2002200128021841b2bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c320b2002200128021841b8bbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c310b2002200128021841bfbbc50041082001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c300b2002200128021841c7bbc50041082001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2f0b2002200128021841cfbbc500410a2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2e0b2002200128021841d9bbc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2d0b2002200128021841e0bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2c0b2002200128021841e6bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2b0b2002200128021841ecbbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c2a0b2002200128021841f2bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c290b2002200128021841f8bbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c280b2002200128021841febbc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c270b200220012802184184bcc500410b2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c260b20022001280218418fbcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c250b200220012802184195bcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c240b20022001280218419bbcc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c230b2002200128021841a2bcc50041082001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c220b2002200128021841aabcc50041082001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c210b2002200128021841b2bcc500410a2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c200b2002200128021841bcbcc50041072001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1f0b2002200128021841c3bcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1e0b2002200128021841c9bcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1d0b2002200128021841cfbcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1c0b2002200128021841d5bcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1b0b2002200128021841dbbcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c1a0b2002200128021841e1bcc50041062001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c190b2002200128021841e7bcc500410b2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c180b2002200128021841f2bcc500410a2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c170b2002200128021841fcbcc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c160b200220012802184188bdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c150b200220012802184194bdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c140b2002200128021841a0bdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c130b2002200128021841acbdc500410d2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c120b2002200128021841b9bdc500410d2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c110b2002200128021841c6bdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c100b2002200128021841d2bdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0f0b2002200128021841debdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0e0b2002200128021841eabdc500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0d0b2002200128021841f6bdc500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0c0b200220012802184184bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0b0b200220012802184192bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c0a0b2002200128021841a0bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c090b2002200128021841aebec500410c2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c080b2002200128021841babec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c070b2002200128021841c8bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c060b2002200128021841d6bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c050b2002200128021841e4bec500410e2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c040b2002200128021841f2bec500410d2001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c030b2002200128021841ffbec50041112001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c020b200220012802184190bfc50041112001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000c010b2002200128021841a1bfc50041112001411c6a28020028020c1105003a001820022001360210200241003a001920024100360214200241106a21000b20002d00082101024020002802042203450d00200141ff0171210441012101024020040d00024020034101470d0020002d0009450d00200028020022042d00004104710d0041012101200428021841b682c60041012004411c6a28020028020c1105000d010b2000280200220128021841b782c60041012001411c6a28020028020c11050021010b200020013a00080b200241206a2400200141ff01714100470bd00201027f230041106b220224002000280200280200210020012802184196a4c50041052001411c6a28020028020c1105002103200241003a0005200220033a00042002200136020020022000410c6a36020c2002419ba4c500410e2002410c6a41aca4c50010950421012002200036020c200141bca4c50041092002410c6a41c8a4c50010950421012002200041046a36020c200141d8a4c500410c2002410c6a41c8a4c50010950421012002200041086a36020c200141e4a4c500410c2002410c6a41c8a4c5001095041a20022d00042100024020022d0005450d00200041ff0171210141012100024020010d0020022802002200411c6a28020028020c210120002802182103024020002d00004104710d00200341b082c6004102200111050021000c010b200341b282c6004101200111050021000b200220003a00040b200241106a2400200041ff01714100470bdd0302047f057e230041d0006b2205240041012106024020002d00040d0020002d000521070240200028020022082d00004104710d0041012106200828021841f481c60041f181c600200741ff017122071b4102410320071b2008411c6a28020028020c1105000d014101210620002802002208280218200120022008411c6a28020028020c1105000d01410121062000280200220828021841c481c60041022008411c6a28020028020c1105000d0120032000280200200428020c11040021060c010b0240200741ff01710d0041012106200828021841f681c60041032008411c6a28020028020c1105000d01200028020021080b41012106200541013a00172005200541176a360210200829020821092008290210210a200541346a41fc81c600360200200520082902183703082008290220210b2008290228210c200520082d00303a00482008290200210d2005200c3703402005200b3703382005200a370328200520093703202005200d3703182005200541086a360230200541086a2001200210c5040d00200541086a41c481c600410210c5040d002003200541186a200428020c1104000d002005280230419482c6004102200528023428020c11050021060b200041013a0005200020063a0004200541d0006a240020000b865f010b7f23004190016b220324002003200136021c2002280208220441586a2105200241106a2802002206412c6c2101024002400240024002400240024002400240024002400240024002400240024002400240024003402001450d01200141546a2101200541286a21072005412c6a2208210520072d00004104470d000b2006412c6c2101200441586a210503402001450d02200141546a2101200541286a21072005412c6a2209210520072d0000410b470d000b2006412c6c2101200441586a210503402001450d03200141546a2101200541286a21072005412c6a2204210520072d00004102470d000b024041002802c082464105490d002003410136023c20032003411c6a36023841002802c48246210120034188016a41980136020020034180016a42ec80808010370300200341f8006a4125360200200341f0006a4101360200200341e0006a4201370300200341d8006a410a360200200341aba8c50036027c20034186a8c500360274200341ec006a200341386a360200200341a4a5c50036025c200341fca7c5003602542003410536025041c882c60041b8d6c500200141024622011b200341d0006a41b4cac50041cccac50020011b2802101100000b200341106a20081080032003280214200328021c22014d0d03200328021020014102746a2201450d03200341086a20041080030240200328020c200128020022014d0d00200328020820014104746a22010d050b412510272201450d092001411d6a41002900c9a545370000200141186a41002900c4a545370000200141106a41002900bca545370000200141086a41002900b4a545370000200141002900aca545370000200041086a42a5808080d00437020020002001360204200041013602000c120b411310272201450d042001410f6a41002800ffa445360000200141086a41002900f8a445370000200141002900f0a445370000200041086a4293808080b00237020020002001360204200041013602000c110b410f10272201450d04200141076a410029008aa54537000020014100290083a545370000200041086a428f808080f00137020020002001360204200041013602000c100b410f10272201450d04200141076a4100290099a54537000020014100290092a545370000200041086a428f808080f00137020020002001360204200041013602000c0f0b412510272201450d042001411d6a41002900c9a545370000200141186a41002900c4a545370000200141106a41002900bca545370000200141086a41002900b4a545370000200141002900aca545370000200041086a42a5808080d00437020020002001360204200041013602000c0e0b0240200941086a280200200328021c22054b0d00412710272201450d062001411f6a41002900f0a545370000200141186a41002900e9a545370000200141106a41002900e1a545370000200141086a41002900d9a545370000200141002900d1a545370000200041086a42a7808080f00437020020002001360204200041013602000c0e0b20092802002109200341206a41086a420037030020034280808080c00037032020012d000d2107410021012003410036024020032007410447220a36023c2003200a360238200341003a0044024041002802c0824641044b0d00200341d0006a41086a200341386a41086a29030037030020032003290338370350200341d0006a21070c070b2003412936024c2003200341386a36024841002802c48246210120034188016a41cb0036020020034180016a42ec80808010370300200341f8006a4125360200200341f0006a4101360200200341e0006a4201370300200341d0006a41086a2207410a360200200341aba8c50036027c20034186a8c500360274200341ec006a200341c8006a360200200341f8a5c50036025c200341fca7c5003602542003410536025041c882c60041b8d6c500200141024622011b200341d0006a41b4cac50041cccac50020011b280210110000200328022c2108200328022821012007200341386a41086a29030037030020032003290338370350200341d0006a210720082001460d0620032802242101200341d0006a21070c070b41134101102a000b410f4101102a000b410f4101102a000b41254101102a000b41254101102a000b41274101102a000b200141016a22082001490d0520014101742206200820082006491b220841ffffffff00712008470d05200841047422064100480d050240024020010d002006102721010c010b200328022420014104742006102821010b2001450d012003200836022820032001360224200328022c21080b200120084104746a22012007290200370200200141086a200741086a2902003702002003200328022c41016a36022c410021072009200541186c6a2201280214450d022009200541186c6a410c6a2109200141146a2108200341d0006a410472210b410021074100210103400240200328022020074d0d00200341d0006a200341206a4100109804024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c060b2007200328022020032802542d000c1b21070b02400240024002400240024002402001200828020022054f0d002003200928020020014104746a2205360234024041002802c082464105490d002003412236023c2003200341346a36023841002802c482462105200341c90136028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c50036027420034101360270200342013703602003419c81c60036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328023421050b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052d000022060eac0102220000002201030405060708090a0b0c0d0e0f1010101010101010101010101010111111111111111111121314141414151616161616161616161615161616161616161616161616161616161616161616161717171818181818181818181818181818181717171818181818181818181818181818181717171717171718181818181818171717171717171818181818181819191919191919191919191919191919191919191919191919020b20052d00012105200320032802203602402003200541044722053602382003200641034720057136023c200341003a0044024041002802c082464105490d002003412936024c2003200341386a36024841002802c482462105200341cb0036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341f8a5c50036025c2003410a360258200341fca7c500360254200341053602502003200341c8006a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b200341d0006a41086a200341386a41086a2903003703002003200329033837035002400240200328022c22052003280228460d00200328022421060c010b200541016a22062005490d282005410174220c20062006200c491b220c41ffffffff0071200c470d28200c410474220d4100480d280240024020050d00200d102721060c010b20032802242005410474200d102821060b2006450d1d2003200c36022820032006360224200328022c21050b200620054104746a22052003290350370200200541086a200341d0006a41086a2903003702002003200328022c41016a36022c0c210b41002105024041002802c082464105490d000240200328022c2206417f6a220c20064b0d002003280224200c4104746a4100200c2006491b21050b2003412a36024c200320053602382003200341386a36024841002802c482462105200341d30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c500360274200341013602702003420137036020034180a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341c8006a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b0240200328022c2205450d0020032005417f6a220536022c200328022420054104746a22052d000c4102470d1a0b411710272201450d1c2001410f6a4100290097a645370000200141086a4100290090a64537000020014100290088a645370000200041086a4297808080f00237020020002001360204200041013602000c250b024041002802c082464105490d0041002802c482462105200341c10036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410036027020034201370360200341a0a6c50036025c2003410a360258200341fca7c50036025420034105360250200341b8d6c50036026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b0240200328022c2205417f6a220620054f0d00200620054d0d180b411710272201450d1e2001410f6a4100290097a645370000200141086a4100290090a64537000020014100290088a645370000200041086a4297808080f00237020020002001360204200041013602000c240b200341d0006a200341206a200541046a280200109804024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c240b200341d0006a200341206a2003280254280204109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c240b024041002802c082464105490d0041002802c482462105200341c10036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410036027020034201370360200341a0a6c50036025c2003410a360258200341fca7c50036025420034105360250200341b8d6c50036026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b024002400240200328022c2205417f6a220620054f0d00200620054d0d010b4117102722010d0141174101102a000b200328022420064104746a41013a000c0c1f0b2001410f6a4100290097a645370000200141086a4100290090a64537000020014100290088a645370000200041086a4297808080f00237020020002001360204200041013602000c230b200341d0006a200341206a200541046a280200109804024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c230b200341d0006a200341206a20032802542802042205109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c230b200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c230b20032005360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c1e0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c220b200341d0006a200341206a2005410c6a280200109804024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c220b2003280254280204210c200541086a2802004102742106200541046a280200210502400340024020060d00200341d0006a200341206a200c109a042003280250450d0220002003290350370204200041013602002000410c6a200341d8006a2802003602000c240b200341d0006a200341206a2005280200109804024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c240b2006417c6a2106200541046a21052003280254280204200c460d000b412710272201450d1a2001411f6a41002900dda645370000200141186a41002900d6a645370000200141106a41002900cea645370000200141086a41002900c6a645370000200141002900bea645370000200041086a42a7808080f00437020020002001360204200041013602000c220b024041002802c082464105490d0041002802c482462105200341c10036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410036027020034201370360200341a0a6c50036025c2003410a360258200341fca7c50036025420034105360250200341b8d6c50036026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b024002400240200328022c2205417f6a220620054f0d00200620054d0d010b4117102722010d0141174101102a000b200328022420064104746a41013a000c0c1d0b2001410f6a4100290097a645370000200141086a4100290090a64537000020014100290088a645370000200041086a4297808080f00237020020002001360204200041013602000c210b200341d0006a200341206a200a109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c210b024041002802c082464105490d0041002802c482462105200341c10036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410036027020034201370360200341a0a6c50036025c2003410a360258200341fca7c50036025420034105360250200341b8d6c50036026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b2802101100000b024002400240200328022c2205417f6a220620054f0d00200620054d0d010b4117102722010d0141174101102a000b200328022420064104746a41013a000c0c1c0b2001410f6a4100290097a645370000200141086a4100290090a64537000020014100290088a645370000200041086a4297808080f00237020020002001360204200041013602000c200b200341d0006a200541046a2802002002109b04024020032802504101470d00200041013602002000200b2902003702042000410c6a200b41086a2802003602000c200b200341d0006a200341206a20032802542205280208109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c200b200320052d000d4104472205360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c1b0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c1f0b20032004108003024002402003280204200541046a28020022054d0d002003280200220620054104746a220c0d010b410e10272201450d18200141066a41002900eba645370000200141002900e5a645370000200041086a428e808080e00137020020002001360204200041013602000c1f0b200341d0006a200341206a200620054104746a280208109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1f0b2003200c2d000d4104472205360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c1a0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c1e0b200341d0006a200341206a4101109a042003280250450d1820002003290350370204200041013602002000410c6a200341d8006a2802003602000c1d0b200341d0006a200341206a4102109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1d0b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1d0b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c180b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c1c0b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c170b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c1b0b200341d0006a200341206a4101109a042003280250450d1520002003290350370204200041013602002000410c6a200341d8006a2802003602000c1a0b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c1a0b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c150b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c190b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c140b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c180b200341d0006a200341206a4101109a042003280250450d1220002003290350370204200041013602002000410c6a200341d8006a2802003602000c170b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c170b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c120b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c160b200341d0006a200341206a4102109a042003280250450d1020002003290350370204200041013602002000410c6a200341d8006a2802003602000c150b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c100b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c140b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c140b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0f0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c130b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0e0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c120b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c120b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0d0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c110b200341d0006a200341206a4102109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c110b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0c0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c100b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c100b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0b0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c0f0b200341d0006a200341206a4102109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c0f0b4101210520034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c0a0b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c0e0b41012105200341d0006a200341206a4101109a0402402003280250450d0020002003290350370204200041013602002000410c6a200341d8006a2802003602000c0e0b20034101360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328024821050b024002402003280220220620056a220520064f0d00410e102722010d01410e4101102a000b200320053602200c090b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c0d0b200328022420064104746a41013a000c0c070b20052802002106200320052802082205360238024041002802c082464105490d002003410136024c2003200341386a36024841002802c482462105200341db0036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341f4a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341c8006a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b280210110000200328023821050b2003200536022020032006360248024041002802c082464105490d002003410136023c2003200341c8006a36023841002802c482462105200341e30036028801200342ec8080801037038001200341aba8c50036027c2003412536027820034186a8c5003602742003410136027020034201370360200341a8a6c50036025c2003410a360258200341fca7c500360254200341053602502003200341386a36026c41c882c60041b8d6c500200541024622051b200341d0006a41b4cac50041cccac50020051b28021011000020032802202105200328024821060b0240200520066a220620054f0d00410e102722010d0a410e4101102a000b200320063602200c060b41fca6c500200120051037000b200d4104102a000b41174101102a000b41274101102a000b410e4101102a000b41174101102a000b200141016a22012008280200490d000c030b0b20064104102a000b200141066a41002900b6a645370000200141002900b0a645370000200041086a428e808080e00137020020002001360204200041013602000c010b20004100360200200020073602042003280228450d02200328022410290c020b2003280228450d01200328022410290c010b102b000b20034190016a24000bc60201027f230041106b2202240020012802184196a4c50041052001411c6a28020028020c1105002103200241003a0005200220033a00042002200136020020022000410c6a36020c2002419ba4c500410e2002410c6a41aca4c50010950421012002200036020c200141bca4c50041092002410c6a41c8a4c50010950421012002200041046a36020c200141d8a4c500410c2002410c6a41c8a4c50010950421012002200041086a36020c200141e4a4c500410c2002410c6a41c8a4c5001095041a20022d00042100024020022d0005450d00200041ff0171210141012100024020010d0020022802002200411c6a28020028020c210120002802182103024020002d00004104710d00200341b082c6004102200111050021000c010b200341b282c6004101200111050021000b200220003a00040b200241106a2400200041ff01714100470b9b0201027f024002400240024002402001410c6a2802002203417f6a220420034d0d00411610272201450d01200020013602042001410e6a4100290089aa45370000200141086a4100290083aa45370000200141002900fba945370000200041086a4296808080e0023702000c040b0240200420026b220220044d0d00411b10272201450d0220002001360204200141176a41002800a8aa45360000200141106a41002900a1aa45370000200141086a4100290099aa4537000020014100290091aa45370000200041086a429b808080b0033702000c040b200320024d0d022000200128020420024104746a360204200041003602000f0b41164101102a000b411b4101102a000b41acaac500200220031037000b200041013602000bbb0201037f230041106b220224000240024020002802000d00200220012802184186b2c50041042001411c6a28020028020c11050022003a000820022001360200200241003a0009200241003602040c010b20022001280218418ab2c50041042001411c6a28020028020c1105003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a4190b2c500108c04210120022d0008210020022802042203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841b682c60041012004411c6a28020028020c1105000d010b2001280200220028021841b782c60041012000411c6a28020028020c11050021000b200120003a00080b200241106a2400200041ff01714100470bc50401027f230041d0006b2203240020032002360204024041002802c082464105490d002003410136020c2003200341046a36020841002802c482462102200341c8006a41ef00360200200341c0006a42ec80808010370300200341386a4125360200200341306a4101360200200341206a4201370300200341186a410a360200200341aba8c50036023c20034186a8c5003602342003412c6a200341086a360200200341a4a9c50036021c200341fca7c5003602142003410536021041c882c60041b8d6c500200241024622021b200341106a41b4cac50041cccac50020021b280210110000200328020421020b0240024002402002450d00200341106a2001410010980420032802104101470d012000200341106a4104722202290200370200200041086a200241086a2802003602000c020b200041003602000c010b02400240024002402001280200220220032802142204280208460d00200220032802046b220420024d0d02410f102722020d01410f4101102a000b024020042d000c0d00412510272202450d03200042a5808080d004370204200020023602002002411d6a41002900c9a945370000200241186a41002900c4a945370000200241106a41002900bca945370000200241086a41002900b4a945370000200241002900aca9453700000c040b200041003602000c030b2000428f808080f00137020420002002360200200241076a41002900d8a945370000200241002900d1a9453700000c020b20004100360200200120043602000c010b41254101102a000b200341d0006a24000bd809010b7f230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c210202400340024020020d00410021070c020b200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a200810800320032802182107200328021c21020b2002410020071b21092006412c6c2102200441586a2105200741b8d6c50020071b210a02400340024020020d004100210b0c020b200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a20081080032003280210210b2003280214210c0b2006412c6c2102200441586a2105200b41b8d6c500200b1b210d0240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210502400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a200810800320032802082207200328020c41286c6a2108024003400240024002402008200722026b41f8004b0d0020022008460d0f2002411c6a2105034020022d0018450d02200541286a2105200241286a22022008470d000c100b0b20022d00180d012002411c6a2105200241286a21070c060b2005410c6a21070c050b200241c0006a2d0000450d01200241e8006a2d0000450d03200241a0016a210720024190016a2d00000d000b20024194016a21050c030b200241c4006a2105200241d0006a21070c020b4185aec50041c200104e000b200241ec006a2105200241f8006a21070b2001450d0203402001417f6a21010240024003400240024002402008200722026b41f8004b0d0020022008460d0e2002411c6a2105034020022d0018450d02200541286a2105200241286a22022008460d0f0c000b0b20022d00180d01200241286a210720010d052002411c6a21050c080b2005410c6a21072001450d070c040b200241c0006a2d0000450d02200241e8006a2d0000450d01200241a0016a210720024190016a2d00000d000b20010d0220024194016a21050c050b200241f8006a210720010d01200241ec006a21050c040b200241d0006a210720010d000b200241c4006a21050c020b410021050b200c4100200b1b200120056b22024d0d01200d20024102746a2205450d010b200320052802002202360224200920024d0d01200a20024104746a2202450d0120002002360204410021020c030b200341cc006a41013602002003420237023c200341a4afc5003602382003410136022c2003200341286a3602482003200341206a360228200341d0006a200341386a10e603200341d0006a21020c010b200341cc006a4102360200200341dc006a41013602002003420337023c200341b4afc500360238200341013602542003200341d0006a3602482003200341206a3602582003200341246a360250200341286a200341386a10e603200341286a21020b20022802002105200041086a200229020437020020002005360204410121020b20002002360200200341e0006a24000f0b41c7aec50041dd00104e000bc60902057f017e024020010d00200041ac013a00000f0b02400240024002400240024020012d00002202414f6a41fb004f0d000c010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e312c2c0001022c2c0304052c06072c2c08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292c0b20012d00012103410221020c2b0b20012d00012103410321020c2a0b20012d00012103410421020c290b200141046a2802002104410721020c270b200141046a2802002104410821020c260b2001280208220541ffffffff03712005470d2720054102742202417f4c0d270240024020020d00410421040c010b200210272204450d290b02402005450d00200128020421022005410274210620042103034020032002280200360200200341046a2103200241046a21022006417c6a22060d000b0b200135020c4220862005ad842107410921020c250b200141046a2802002104410b21020c240b200141046a280200210420012d00012103410c21020c240b200141046a2802002104410f21020c220b200141046a2802002104411021020c210b200141046a2802002104411121020c200b200141046a2802002104411221020c1f0b200141046a2802002104411321020c1e0b200141046a280200210420013502082107411421020c1d0b200141046a280200210420013502082107411521020c1c0b200141046a280200210420013502082107411621020c1b0b200141046a280200210420013502082107411721020c1a0b200141046a280200210420013502082107411821020c190b200141046a280200210420013502082107411921020c180b200141046a280200210420013502082107411a21020c170b200141046a280200210420013502082107411b21020c160b200141046a280200210420013502082107411c21020c150b200141046a280200210420013502082107411d21020c140b200141046a280200210420013502082107411e21020c130b200141046a280200210420013502082107411f21020c120b200141046a280200210420013502082107412021020c110b200141046a280200210420013502082107412121020c100b200141046a280200210420013502082107412221020c0f0b200141046a280200210420013502082107412321020c0e0b200141046a280200210420013502082107412421020c0d0b200141046a280200210420013502082107412521020c0c0b200141046a280200210420013502082107412621020c0b0b200141046a280200210420013502082107412721020c0a0b200141046a280200210420013502082107412821020c090b200141046a280200210420013502082107412921020c080b200141046a280200210420013502082107412a21020c070b20012d00012103412b21020c070b20012d00012103412c21020c060b200141046a2802002104412d21020c040b20012903082107412e21020c020b200141046a2802002104412f21020c020b20012903082107413021020b0b0b200020033a0001200020023a0000200041086a2007370300200041046a20043602000f0b1039000b20024104102a000b8d0301067f230041106b220224000240024002400240200041046a2802002203200041086a28020022046b20012802042205200128020022066b4104762207490d00200028020021030c010b200420076a22062004490d0220034101742205200620062005491b220641ffffffff00712006470d02200641047422054100480d020240024020030d002005102721030c010b200028020020034104742005102821030b2003450d0120002003360200200041046a2006360200200041086a280200210420012802042105200128020021060b0240024020062005470d00410021060c010b2001200641106a3602000b20022006109c04024020022d000041ac01460d00200320044104746a2106034020062002290300370300200641086a200241086a29030037030002400240200128020022052001280204470d00410021050c010b2001200541106a3602000b200441016a2104200641106a210620022005109c0420022d000041ac01470d000b0b200041086a2004360200200241106a24000f0b20054108102a000b102b000b110020002802003502004101200110aa010bea0302057f017e02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441c4006a2802002105200441386a2802002106200441346a2802002107200141016a21010c010b02400240200028020022010d002003ad210841002104410021010c010b20003301044220862003ad842108410121040b200010292008a72103024002402008422088a7220620012f01064f0d00200121050c010b034002400240200128020022050d002003ad2108410021050c010b200441016a210420013301044220862003ad8421080b200110292008a72103200521012008422088a7220620052f01064f0d000b0b200641027420056a4198036a2802002100200520064105746a220141c4006a2802002105200141386a2802002106200141346a280200210702402004417f6a2201450d00034020002802940321002001417f6a22010d000b0b410021010b20054102460d012002417f6a210202402006450d00200710290b20020d000b0b02402000418883c000460d0020002802002101200010292001450d0020012802002105200110292005450d00024020052802002201450d000340200510292001210520012802002200210120000d000b0b200510290b0b2300200141fd80c60041f880c60020002802002d000022001b4104410520001b10e9030b02000bc60201037f230041206b2202240002400240200028020022002d00004104470d002002200128021841b2bfc50041082001411c6a28020028020c11050022003a001820022001360210200241003a0019200241003602140c010b2002200128021841babfc50041052001411c6a28020028020c1105003a001820022001360210200241003a0019200241003602142002200036020c200241106a2002410c6a41c0bfc500108c04210120022d0018210020022802142203450d00200041ff0171210441012100024020040d00024020034101470d0020012d0009450d00200128020022042d00004104710d0041012100200428021841b682c60041012004411c6a28020028020c1105000d010b2001280200220028021841b782c60041012000411c6a28020028020c11050021000b200120003a00080b200241206a2400200041ff01714100470b890501047f230041d0006b220224002000280200220041046a28020021032000280200210041012104200128021841ba82c60041012001411c6a28020028020c110500210502402003450d0020022000360204024020050d00024020012d0000410471450d0041012104200128021841b882c6004101200128021c28020c1105000d012001280200210541012104200241013a001720022005360218200241fc81c60036023420022001290218370308200220012d00303a00482002200128020436021c200220012902283703402002200129022037033820022001290210370328200220012902083703202002200241176a3602102002200241086a360230200241046a200241186a1080010d012002280230419482c6004102200228023428020c11050021040c010b200241046a200110800121040b024020034101470d00200421050c010b200041046a21002003410274417c6a210320042105034020022000360204200541ff0171210441012105024020040d00024020012802002204410471450d00200241013a001720022004360218200241fc81c60036023420022001290218370308200220012d00303a00482002200128020436021c200220012902283703402002200129022037033820022001290210370328200220012902083703202002200241176a3602102002200241086a360230200241046a200241186a1080010d012002280230419482c6004102200228023428020c11050021050c010b200128021841f481c6004102200128021c28020c1105000d00200241046a200110800121050b200041046a21002003417c6a22030d000b0b41012100024020050d00200128021841b982c6004101200128021c28020c11050021000b200241d0006a240020000b8c0e01087f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024020042d00002200410d4b0d00024002400240024002400240024002400240024002400240024020000e0e0001020304050607080e090a0b0c000b200441086a280200450d0d200441046a28020010290c0d0b0240200441086a280200450d00200441046a28020010290b200441146a280200450d0c200441106a28020010290c0c0b02402004410c6a2802002201450d00200441046a28020021002001410474210103400240200041046a280200450d00200028020010290b200041106a2100200141706a22010d000b0b200441086a280200450d0b200428020410290c0b0b02402004410c6a2802002201450d00200441046a2802002100200141286c210103400240200041046a280200450d00200028020010290b0240200041106a280200450d002000410c6a28020010290b200041286a2100200141586a22010d000b0b200441086a280200450d0a200428020410290c0a0b200441086a280200450d09200441046a28020010290c090b200441086a280200450d08200441046a28020010290c080b200441086a280200450d07200441046a28020010290c070b02402004410c6a2802002200450d00200441046a280200220520004104746a21060340024020052802082201450d0020052802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010290b200041106a2100200141706a22010d000b0b200541106a21000240200541046a280200450d00200528020010290b2000210520002006470d000b0b200441086a280200450d06200428020410290c060b02402004410c6a2802002201450d00200441046a2802002100200141146c210103400240200041046a280200450d00200028020010290b200041146a21002001416c6a22010d000b0b200441086a280200450d05200428020410290c050b02402004410c6a2802002200450d00200441046a28020022052000411c6c6a2106034002402005410c6a2802002201450d0020052802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010290b200041106a2100200141706a22010d000b0b0240200541086a280200450d00200528020410290b2005411c6a21000240200541146a280200450d00200528021010290b2000210520002006470d000b0b200441086a280200450d04200428020410290c040b02402004410c6a2802002200450d00200441046a2802002205200041186c6a210603400240200541046a280200450d00200528020010290b0240200541146a2802002201450d00200528020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010290b200041106a2100200141706a22010d000b0b200541186a21000240200541106a280200450d00200528020c10290b2000210520002006470d000b0b200441086a280200450d03200428020410290c030b02402004410c6a2802002200450d00200441046a28020022052000411c6c6a2106034002402005410c6a2802002201450d0020052802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010290b200041106a2100200141706a22010d000b0b0240200541086a280200450d00200528020410290b2005411c6a21000240200541146a280200450d00200528021010290b2000210520002006470d000b0b200441086a280200450d02200428020410290c020b0240200441046a2d0000220041024b0d0002400240024020000e03000102000b2004410c6a280200450d04200441086a28020010290c040b0240200441146a2802002201450d002004410c6a28020021002001410c6c21010340024020002802002205450d00200041046a280200450d00200510290b2000410c6a2100200141746a22010d000b0b200441106a280200450d03200428020c10290c030b0240200441146a2802002200450d002004410c6a280200220720004104746a210803402007220641106a2107024020062802042200450d0002402006410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d00200510290b2000410c6a2100200141746a22010d000b0b200641086a280200450d00200628020410290b20072008470d000b0b200441106a280200450d02200428020c10290c020b2004410c6a280200450d01200441086a28020010290c010b0240200441086a280200450d00200441046a28020010290b0240200441146a2802002200450d00200441186a280200450d00200010290b200441246a280200450d00200441206a28020010290b20022003470d000b0b0bc30201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff01834101200110aa0121000c020b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000b20024180016a240020000f0b2004418001103e000b2004418001103e000bd00203027f017e017f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210020034120710d012000ac22042004423f8722047c2004852000417f73411f76200110aa0121000c020b20002802002103410021000340200220006a41ff006a2003410f712205413072200541d7006a2005410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021030340200220036a41ff006a2000410f712205413072200541376a2005410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d022001410141e8d9c5004102200220036a4180016a410020036b10ab0121000b20024180016a240020000f0b2003418001103e000b2000418001103e000bd00202027f027e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d0120042004423f8722057c2005852004427f55200110aa0121000c020b20002903002104410021000340200220006a41ff006a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000c010b410021000340200220006a41ff006a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004180016a22034181014f0d022001410141e8d9c5004102200220006a4180016a410020006b10ab0121000b20024180016a240020000f0b2003418001103e000b2003418001103e000b040041000b02000b02000b2700200028020c200041106a2802001010200041146a3502001022200041186a350200102200000b08002000200110100bcd0701037f024002400240024002400240024002402001413f4b0d0002400240200241046a280200200241086a2802002203460d00200228020021040c010b200341016a22042003490d0820034101742205200420042005491b22054100480d080240024020030d002005102721040c010b200228020020032005102821040b2004450d0220022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000c050b200141808001490d032001418080808004490d020c010b20054101102a000b0240024002400240200241046a280200200241086a2802002203460d00200228020021040c010b200341016a22042003490d0720034101742205200420042005491b22054100480d070240024020030d002005102721040c010b200228020020032005102821040b2004450d0120022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a000002400240200241046a2802002204200528020022036b4104490d00200228020021040c010b200341046a22052003490d0720044101742203200520052003491b22034100480d070240024020040d002003102721040c010b200228020020042003102821040b2004450d0220022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c040b20054101102a000b20034101102a000b024002400240200241046a2802002204200241086a28020022036b4104490d00200228020021040c010b200341046a22052003490d0520044101742203200520052003491b22034100480d050240024020040d002003102721040c010b200228020020042003102821040b2004450d0120022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c020b20034101102a000b02400240200241046a2802002204200241086a28020022036b4102490d00200228020021040c010b200341026a22052003490d0320044101742203200520052003491b22034100480d030240024020040d002003102721040c010b200228020020042003102821040b2004450d0220022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000b024020014103742201450d00200020016a210103402000280200200041046a280200200210c702200041086a22002001470d000b0b0f0b20034101102a000b102b000b841001047f024002400240024002400240024002400240024002400240024020002d0000220241024b0d0002400240024020020e03000102000b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0f20024101742204200320032004491b22044100480d0f0240024020020d002004102721030c010b200128020020022004102821030b2003450d0420012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a280200200110c7020f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0e20024101742204200320032004491b22044100480d0e0240024020020d002004102721030c010b200128020020022004102821030b2003450d0420012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a000020002d0001210502400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d0e20024101742204200320032004491b22044100480d0e0240024020020d002004102721030c010b200128020020022004102821030b2003450d0520012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a20053a0000200041086a2802002000410c6a280200200110c702200041146a280200200041186a280200200110c70202400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d0e20024101742204200320032004491b22044100480d0e0240024020020d002004102721030c010b200128020020022004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20002d00023a00000f0b02400240200141046a280200200141086a2802002202460d00200128020021030c010b200241016a22032002490d0d20024101742204200320032004491b22044100480d0d0240024020020d002004102721030c010b200128020020022004102821030b2003450d0620012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a000020002d0001210502400240200141046a28020020042802002202460d00200128020021030c010b200241016a22032002490d0d20024101742204200320032004491b22044100480d0d0240024020020d002004102721030c010b200128020020022004102821030b2003450d0720012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20053a0000200041086a2802002000410c6a280200200110c702200041146a280200200041186a280200200110c702200041206a280200200041246a280200200110c70220002d0002220041044b0d000240024002400240024020000e050001020304000b02400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d1120004101742203200220022003491b22034100480d110240024020000d002003102721020c010b200128020020002003102821020b2002450d0c20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d1020004101742203200220022003491b22034100480d100240024020000d002003102721020c010b200128020020002003102821020b2002450d0c20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41013a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d0f20004101742203200220022003491b22034100480d0f0240024020000d002003102721020c010b200128020020002003102821020b2002450d0c20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41023a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d0e20004101742203200220022003491b22034100480d0e0240024020000d002003102721020c010b200128020020002003102821020b2002450d0c20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41033a00000f0b02400240200141046a280200200141086a2802002200460d00200128020021020c010b200041016a22022000490d0d20004101742203200220022003491b22034100480d0d0240024020000d002003102721020c010b200128020020002003102821020b2002450d0c20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41043a00000b0f0b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20044101102a000b20034101102a000b20034101102a000b20034101102a000b20034101102a000b20034101102a000b102b000bd50101027f200028020421020240024020002802004101460d00200041086a2802002200200110c6022000450d01200041186c2103200241146a21000340200041706a280200200041746a280200200110c7022000417c6a2802002000280200200110c702200041186a2100200341686a22030d000c020b0b2000410c6a2802002200200110c6022000450d00200041186c2103200241146a21000340200041706a280200200041746a280200200110c7022000417c6a2802002000280200200110c702200041186a2100200341686a22030d000b0b0bc806010a7f230041106b22022400200028020421030240024002400240024020002802004101460d00200041086a2802002200200110c6022000450d01200041d8006c2104410021050340200320056a220041046a280200200041086a280200200110c702200041d4006a2d0000210602400240200141046a2207280200200141086a22082802002209460d002001280200210a0c010b200941016a220a2009490d062009410174220b200a200a200b491b220b4100480d060240024020090d00200b1027210a0c010b20012802002009200b1028210a0b200a450d042001200a3602002007200b360200200828020021090b2008200941016a360200200a20096a20063a00002000410c6a200110ae0402400240200041346a2802004101460d002002200041386a2802002000413c6a28020028020c110000200228020022092002280208200110c7022002280204450d01200910290c010b200041386a280200200041c0006a280200200110c7020b200041c8006a2802002003200541d00041cc00200041c4006a2802004101461b6a6a280200200110ad042004200541d8006a2205470d000c020b0b2000410c6a2802002200200110c6022000450d00200041d8006c2104410021050340200320056a220041046a280200200041086a280200200110c702200041d4006a2d0000210602400240200141046a2207280200200141086a22082802002209460d002001280200210a0c010b200941016a220a2009490d052009410174220b200a200a200b491b220b4100480d050240024020090d00200b1027210a0c010b20012802002009200b1028210a0b200a450d042001200a3602002007200b360200200828020021090b2008200941016a360200200a20096a20063a00002000410c6a200110ae0402400240200041346a2802004101460d002002200041386a2802002000413c6a28020028020c110000200228020022092002280208200110c7022002280204450d01200910290c010b200041386a280200200041c0006a280200200110c7020b200041c8006a2802002003200541d00041cc00200041c4006a2802004101461b6a6a280200200110ad042004200541d8006a2205470d000b0b200241106a24000f0b200b4101102a000b200b4101102a000b102b000b0600200010230b0600200010240b2801017f0240200210232203450d002003200020022001200120024b1b10ce041a200010240b20030b1c01017f0240200010232201450d0020014100200010cd041a0b20010bb10101037f0240024002400240200028020022002802042203200028020822046b2002490d00200028020021030c010b200420026a22052004490d0220034101742204200520052004491b22044100480d020240024020030d002004102721030c010b200028020020032004102821030b2003450d012000200436020420002003360200200028020821040b2000200420026a360208200320046a2001200210ce041a41000f0b20044101102a000b102b000ba70401047f230041106b220224002000280200210002400240024002400240024002402001418001490d002002410036020c2001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c040b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c030b0240200028020822032000280204470d00200341016a22042003490d0620034101742205200420042005491b22044100480d060240024020030d002004102721030c010b200028020020032004102821030b2003450d022000200436020420002003360200200028020821030b200028020020036a20013a00002000200028020841016a3602080c030b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b20044101102a000b0240024020002802042204200028020822036b2001490d00200028020021040c010b200320016a22052003490d0320044101742203200520052003491b22034100480d030240024020040d002003102721040c010b200028020020042003102821040b2004450d022000200336020420002004360200200028020821030b2000200320016a360208200420036a2002410c6a200110ce041a0b200241106a240041000f0b20034101102a000b102b000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a4180d3c500200241086a1091042101200241206a240020010b0c0042ebbe8cdadd9294ae070b5401017f024002402001418080c400460d0041012104200028021820012000411c6a2802002802101104000d010b024020020d0041000f0b2000280218200220032000411c6a28020028020c11050021040b20040bcd0801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b2107418002210803400240200820014f0d00200020086a2c000041bf7f4c0d0041002105200821060c020b2008417f6a21064100210520084101460d01200720086a21092006210820094101470d000b0b200420063602142004200036021020044100410520051b36021c200441b8d6c50041ead9c50020051b3602180240024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b200420023602202002450d0220022001460d02200141016a210903400240200220014f0d00200020026a2c000041404e0d040b2002417f6a210820024101460d0420092002462106200821022006450d000c040b0b20042002200320081b360228200441306a41146a4103360200200441c8006a41146a4102360200200441d4006a410236020020044203370234200441f0d9c5003602302004410136024c2004200441c8006a3602402004200441186a3602582004200441106a3602502004200441286a360248200441306a4188dac5001057000b200441e4006a4102360200200441c8006a41146a4102360200200441d4006a4101360200200441306a41146a41043602002004420437023420044198dac5003602302004410136024c2004200441c8006a3602402004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a360248200441306a41b8dac5001057000b200221080b024020082001460d00410121060240024002400240200020086a22092c00002202417f4a0d0041002105200020016a220621010240200941016a2006460d00200941026a210120092d0001413f7121050b2002411f712109200241ff017141df014b0d01200520094106747221010c020b2004200241ff0171360224200441286a21020c020b4100210020062107024020012006460d00200141016a210720012d0000413f7121000b200020054106747221010240200241ff017141f0014f0d0020012009410c747221010c010b41002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d020b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441306a41146a4105360200200441ec006a4102360200200441e4006a4102360200200441c8006a41146a412b360200200441d4006a412c36020020044205370234200441e0dac500360230200420023602582004410136024c2004200441c8006a3602402004200441186a3602682004200441106a3602602004200441246a3602502004200441206a360248200441306a4188dbc5001057000b41c8dac5001058000b7f01037f230041206b2202240002402000280200200110be040d002001411c6a2802002103200128021821042002411c6a4100360200200241b8d6c5003602182002420137020c200241f0dbc50036020820042003200241086a1091040d002000280204200110be042101200241206a240020010f0b200241206a240041010bf00a03037f017e047f410121020240200128021841272001411c6a2802002802101104000d004102210302400240024002402000280200220241776a2200411e4d0d00200241dc00470d010c020b41f400210402400240024020000e1f05010303000303030303030303030303030303030303030303040303030304050b41f20021040c010b41ee0021040b0c020b02400240200210bd04450d00200241017267410276410773ad4280808080d0008421050c010b024002400240200241808004490d000240024002402002418080084f0d0020024180fe0371410876210641e1edc500210041002107200241ff017121040340200041026a2108200720002d000122036a2109024020002d000022002006460d00200020064b0d062009210720082100200841a7eec500470d010c060b20092007490d02200941a6014b0d03200741a7eec5006a2100024003402003450d012003417f6a210320002d00002107200041016a210020072004470d000c080b0b2009210720082100200841a7eec500470d000c050b0b200241ef83384b0d04200241e28b746a41e28d2c490d042002419fa8746a419f18490d04200241dee2746a410e490d04200241feffff0071419ef00a460d04200241a9b2756a4129490d04200241cb91756a410a4d0d0441012103200221040c070b20072009103e000b200941a601107f000b20024180fe0371410876210641b0e8c500210041002107200241ff01712104024002400340200041026a2108200720002d000122036a2109024020002d000022002006460d00200020064b0d03200921072008210020084182e9c500470d010c030b024020092007490d00200941a5024b0d0220074182e9c5006a2100024003402003450d012003417f6a210320002d00002107200041016a210020072004470d000c070b0b200921072008210020084182e9c500470d010c030b0b20072009103e000b200941a502107f000b200241ffff0371210741a7ebc50021034101210402400340200341016a21090240024020032d0000220041187441187522084100480d00200921030c010b200941e1edc500460d02200841ff007141087420032d0001722100200341026a21030b0240200720006b22074100480d0020044101732104200341e1edc500470d010b0b4101210320044101710d040c020b41c8dac5001058000b200241ffff0371210741cdefc50021034101210402400340200341016a21090240024020032d0000220041187441187522084100480d00200921030c010b200941e5f2c500460d02200841ff007141087420032d0001722100200341026a21030b0240200720006b22074100480d0020044101732104200341e5f2c500470d010b0b4101210320044101710d030c010b41c8dac5001058000b200241017267410276410773ad4280808080d0008421050b41032103200221040c010b200221040b03402003210741dc0021004101210241012103024002400240024020070e0401020300010b024002400240024002402005422088a741ff01710e06050403020100050b200542ffffffff8f60834280808080c000842105410321030c060b200542ffffffff8f608342808080803084210541f5002100410321030c050b200542ffffffff8f608342808080802084210541fb002100410321030c040b20042005a72207410274411c7176410f712203413072200341d7006a2003410a491b210002402007450d002005427f7c42ffffffff0f83200542808080807083842105410321030c040b200542ffffffff8f6083428080808010842105410321030c030b200542ffffffff8f6083210541fd002100410321030c020b20012802184127200128021c2802101104000f0b41002103200421000b20012802182000200128021c280210110400450d000b0b20020b950201017f024002402000418010490d00024002400240024002400240200041808004490d002000410c7641706a2201418002490d014188f3c50020014180021037000b200041067641606a220141df074b0d01200141d0dec5006a2d0000220141c9004b0d02200141037441e0f3c5006a21010c060b200141b0e6c5006a2d00004106742000410676413f7172220141ff034b0d02200141b0f8c5006a2d0000220141394b0d03200141037441b0fcc5006a21010c050b41e8f2c500200141e0071037000b41f8f2c500200141ca001037000b4198f3c50020014180041037000b41a8f3c5002001413a1037000b200041037641f8ffffff017141b8dcc5006a21010b200129030042012000413f71ad86834200520ba40201037f23004180016b2202240002400240024002400240200128020022034110710d0020034120710d012000ad4101200110aa0121000c020b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d022001410141e8d9c5004102200220036a4180016a410020036b10ab0121000c010b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d022001410141e8d9c5004102200220036a4180016a410020036b10ab0121000b20024180016a240020000f0b2000418001103e000b2000418001103e000b0e0020003502004101200110aa010b1c002001280218418181c600410b2001411c6a28020028020c1105000b1c002001280218418c81c600410e2001411c6a28020028020c1105000b140020002802002001200028020428020c1104000bc30501077f410021040240024020024103712205450d00410420056b2205450d00200220032005200520034b1b22046a210641002105200141ff017121072004210820022109024003400240200620096b41034b0d0041002107200141ff0171210603402008450d04200920076a210a2008417f6a2108200741016a2107200a2d0000220a2006470d000b2005200a200141ff01714641016a4101716a20076a417f6a21050c020b200520092d0000220a2007476a2105200a2007460d012005200941016a2d0000220a2007476a2105200a2007460d012005200941026a2d0000220a2007476a2105200a2007460d012005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000b0b410121090c010b200141ff017121070240024020034108490d002004200341786a220a4b0d00200741818284086c210502400340200220046a220941046a2802002005732208417f73200841fffdfb776a7120092802002005732209417f73200941fffdfb776a7172418081828478710d01200441086a2204200a4d0d000b0b200420034b0d010b200220046a2109200220036a2102200320046b2108410021050240024003400240200220096b41034b0d0041002107200141ff0171210203402008450d04200920076a210a2008417f6a2108200741016a2107200a2d0000220a2002470d000b200a200141ff01714641016a41017120056a20076a417f6a21050c020b200520092d0000220a2007476a2105200a2007460d012005200941016a2d0000220a2007476a2105200a2007460d012005200941026a2d0000220a2007476a2105200a2007460d012005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000b0b41012109200520046a21050c020b41002109200520076a20046a21050c010b20042003103e000b20002005360204200020093602000b2701017f2000280200220128020020012802042000280204280200200028020828020010ba04000ba60401077f230041306b220324000240024020020d00410021040c010b200341286a210502400240024002400340024020002802082d0000450d00200028020041ed81c6004104200028020428020c1105000d050b2003410a3602282003428a808080103703202003200236021c200341003602182003200236021420032001360210200341086a410a2001200210c304024002400240024020032802084101470d00200328020c210403402003200420032802186a41016a2204360218024002402004200328022422064f0d00200328021421070c010b200328021422072004490d00200641054f0d072003280210200420066b22086a22092005460d0420092005200610d004450d040b200328021c22092004490d0220072009490d0220032006200341106a6a41176a2d0000200328021020046a200920046b10c3042003280204210420032802004101460d000b0b2003200328021c3602180b200028020841003a0000200221040c010b200028020841013a0000200841016a21040b2000280204210920002802002106024020044520022004467222070d00200220044d0d03200120046a2c000041bf7f4c0d030b200620012004200928020c1105000d04024020070d00200220044d0d04200120046a2c000041bf7f4c0d040b200120046a2101200220046b22020d000b410021040c040b20064104107f000b200120024100200410ba04000b200120022004200210ba04000b410121040b200341306a240020040b02000bfa0101017f230041106b220224002002410036020c0240024002402001418001490d002001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b200220013a000c410121010c010b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010b20002002410c6a200110c5042101200241106a240020010b6101017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a419882c600200241086a1091042101200241206a240020010b0e0020002802002001200210c5040b810201017f230041106b22022400200028020021002002410036020c0240024002402001418001490d002001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b200220013a000c410121010c010b20022001413f71418001723a000d20022001410676411f7141c001723a000c410221010b20002002410c6a200110c5042101200241106a240020010b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a419882c600200241086a1091042101200241206a240020010b1c00200128021841bb82c60041052001411c6a28020028020c1105000b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f0240024020012000490d002002450d01200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000c020b0b2002450d002001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000b0b20000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205470d01200141016a2101200041016a21002002417f6a2202450d020c000b0b200420056b21030b20030b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b3e01017f230041106b2205240020052001200220032004410010d604200529030021012000200541086a29030037030820002001370300200541106a24000b4c01017f230041206b22052400200542003703182005420037031020052001200220032004200541106a10d604200529031021012000200529031837030820002001370300200541206a24000be20502037f067e230041306b2206240002400240024002400240024002400240024002402002500d002003500d012004500d02200479a7200279a76b2207413f4b0d0341ff0020076b2108200741016a21070c080b02402004500d0020050d040c060b024002402005450d0020034200510d0620054200370308200520012003823703000c010b20034200510d050b200120038021010c060b2004500d030240024002402001500d0020047b4201510d01200479a7200279a76b2207413e4b0d0241ff0020076b2108200741016a21070c090b02402005450d0020054200370300200520022004823703080b200220048021010c070b02402005450d002005200137030020052004427f7c2002833703080b200220047a423f838821010c060b2005450d040c020b024020037b4201510d0041bf7f200379a7200279a76b22076b2108200741c1006a21070c060b02402005450d002005420037030820052003427f7c2001833703000b20034201510d06200641206a2001200220037aa710d204200641286a2903002102200629032021010c060b2005450d020b2005200137030020052002370308420021010c020b00000b420021010b420021020c010b200620012002200841ff007110d104200641106a20012002200741ff007110d204200641086a2903002102200641106a41086a2903002109200629030021012006290310210a0240024020070d004200210b4200210c0c010b4200210c4200210d03402009420186200a423f8884220b200b427f8520047c200a4201862002423f8884220a427f85220b20037c200b54ad7c423f87220b2004837d200a200b200383220e54ad7d2109200a200e7d210a420020024201862001423f8884842102200d2001420186842101200b420183220b210d2007417f6a22070d000b0b02402005450d002005200a370300200520093703080b200c20024201862001423f8884842102200b20014201868421010b2000200137030020002002370308200641306a24000b0bdb82060200418080c0000bc08206180010001d0000008858110013000000db03000009000000617373657274696f6e206661696c65643a20696e646578203c206c656e0000005000100043000000fb0a00003000000000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962616c6c6f632f7665632e7273005000100043000000070b00002c0000004469676573744974656d206e6f7420657175616c3501100036000000326811005b000000fc0100000500000000000000000000000000000000000000f80010003d000000326811005b0000000302000005000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b20716564003501100036000000326811005b000000c801000005000000000000000000000000000000326811005b000000cf0100000500000076616c69646174696f6e206572726f72c80110007c00000044021000490000007a00000006000000657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f7761736d2f6d6f642e727300000000000000140310000a000000000000000010110002000000000000000000000020031000010000000000000000000000280310000d0000000000000034e81000010000000000000000000000380310000100000000000000000000003c8310000800000000000000400310000400000000000000000000006003100001000000000000004e65774163636f756e740000ab0310001b0000005265617065644163636f756e740000009403100017000000611011000900000061101100090000006a101100070000006a10110007000000680310002c000000205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e76657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e74000000000000a40410001100000000000000b8041000020000000000000000000000c80410000100000000000000486561727462656174526563656976656400000060e810000b000000160510000b000000d0041000460000002041206e6577206865617274626561742077617320726563656976656420617420746869732060426c6f636b4e756d626572602066726f6d2060417574686f72697479496460417574686f72697479496454696d657374616d702055706461746542616c616e63657320546f74616c49737375616e636554696d657374616d7020526563656e7448696e74737405100031000000a50510004b0000007e0000000400000046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e72730806100023000000a50510004b0000007f0000000400000046696e616c697a6564206865696768742061626f766520626c6f636b206e756d62657242616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e636542616c616e636573204c6f636b730000002d00000008000000040000002e0000004765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e74206461746142616c616e6365732056657374696e6700000000000c07100008000000000000001407100002000000000000000000000044071000170000000000000000000000fc0710000b0000000000000008081000030000000000000000000000500810000d000000000000007472616e7366657200000000b58f10000400000000000000b01d11002300000000000000ee25110005000000000000004d0a1000130000006c0a100036000000386b110000000000a20a100042000000e40a1000480000002c0b100045000000710b10002d000000386b1100000000009e0b100046000000386b1100000000007e1b11000b000000e40b10004c000000300c100033000000630c10005a000000386b110000000000bd0c100013000000386b110000000000d00c100054000000240d10004b0000006f0d100035000000a40d100037000000db0d100056000000386b1100000000001f1c11000c0000007365745f62616c616e63650000000000db2a10000300000000000000b01d11002300000000000000450a100008000000000000004d0a10001300000000000000600a10000c000000000000004d0a100013000000b808100025000000386b110000000000dd0810004800000025091000420000006709100046000000ad0910003a000000386b110000000000e70910002d000000386b1100000000007e1b11000b000000891b110020000000140a1000310000001f1c11000c00000020536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e6e65775f66726565436f6d706163743c543a3a42616c616e63653e6e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c2074726967676572202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e00000000000000ec0f10000d0000000000000000000000f90f10000a0000000000000000000000000000000000000000000000000000000000000040811100bc101000000000000000000004101000010000000000000001000000000000000c101000070000000101000000000000423111000c00000000000000131010002b0000000000000000000000000000000000000040811100001b100000000000000000004010100001000000000000000000000000000000481010000b0000000101000000000000423111000c00000000000000f90f10000a0000000000000000000000000000000000000040811100bc1010000000000000000000541010000b000000000000000100000000000000ac1010000f0000000101000000000000423111000c00000000000000f90f10000a0000000000000000000000000000000000000040811100bc1010000000000000000000cc1010000b00000000000000010000000000000024111000050000000101000000000000423111000c00000000000000291110002c000000000000000000000000000000000000004081110058111000000000000000000068111000010000000000000001000000546f74616c49737375616e6365543a3a42616c616e636500991610002600000056657374696e6756657374696e675363686564756c653c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e000063161000360000004672656542616c616e636500e913100027000000386b1100000000001014100050000000601410005d000000bd14100055000000121510004f0000006115100051000000b215100015000000386b110000000000c7151000570000001e16100045000000526573657276656442616c616e6365002f0000000000000001000000300000009e1110005d000000fb11100027000000386b110000000000221210005b0000007d12100049000000386b110000000000c61210005d000000231310002d000000386b1100000000005013100053000000a3131000460000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e0000002f000000000000000100000031000000701110002e00000020416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e0000000000d81710001200000000000000f90f10000a0000000000000040811100ec1710000000000000000000fc171000010000000000000000000000949f10000b00000000000000f90f10000a0000000000000040811100041810000000000000000000a09f1000010000000000000000000000a89f10000b00000000000000f90f10000a0000000000000040811100041810000000000000000000b49f1000010000000000000000000000bc9f10001200000000000000f90f10000a0000000000000040811100041810000000000000000000d09f1000010000000000000000000000d89f10001200000000000000f90f10000a0000000000000040811100141810000000000000000000fc9f100001000000000000004578697374656e7469616c4465706f73697400002f00000000000000010000003200000024181000350000002f0000000000000001000000330000002f00000000000000010000003400000020546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e496d4f6e6c696e6520476f737369704174496d4f6e6c696e652052656365697665644865617274626561747373726d6c2f696d2d6f6e6c696e652d776f726b65722d737461747573576974686472617720686173206265656e20636865636b65642061626f76653b0a090909647565735f6c696d69746564203c2072656e745f627564676574203c2062616c616e6365202d2073756273697374656e6365203c2062616c616e6365202d206578697374656e7469616c5f6465706f7369743b0a09090971656400000000004c191000090000000000000058191000020000000000000000000000386b11000000000000000000686561727462656174000000000000004c1910000900000000000000881910002900000000000000b11910000a00000000000000d5ca1000070000004865617274626561743c543a3a426c6f636b4e756d6265722c20543a3a417574686f7269747949643e5f7369676e61747572650000000000c41a10000800000000000000000000001bf610000e0000000000000000000000000000000000000000000000000000000000000040811100cc1a10000000000000000000386b110000000000000000000100000000000000dc1a10000f0000000000000000000000eb1a1000150000000000000000000000000000000000000000000000000000000000000040811100001b10000000000000000000386b110000000000000000000000000000000000101b1000120000000201010000000000eb1a10001500000000000000221b10000e00000000000000d5ca1000070000000000000040811100301b10000000000000000000386b1100000000000000000001000000476f7373697041742f0000000000000001000000350000004c6173744e6577457261537461727473657373696f6e3a3a53657373696f6e496e6465782f000000000000000100000036000000526563656976656448656172746265617473543a3a417574686f7269747949642f00000000000000010000003100000000000000a83b11000e00000000000000eb1a1000150000000000000040811100781b10000000000000000000c83b110001000000000000002f00000000000000010000003700000054696d657374616d70204f72646572656448696e747354696d657374616d70204d656469616e616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b20716564000038000000040000000400000039000000881c100043000000a50510004b000000b700000004000000401c100048000000820a00000a000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e72737072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b207165646e6f7420656e6f75676820667265652066756e6473000000000c1d10000a00000000000000181d1000010000000000000000000000301d1000020000000000000066696e616c5f68696e74000000000000c5351000040000000000000073f3100017000000401d10003d0000007d1d10001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e00000000081e10000a000000000000001bf610000e0000000000000040811100141e10000000000000000000241e10000100000000000000000000002c1e10000d000000000000001bf610000e00000000000000408111003c1e100000000000000000004c1e1000010000000000000057696e646f7753697a6500002f00000000000000010000003a0000009b1e1000460000005265706f72744c6174656e63790000002f00000000000000010000003b000000541e100047000000205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e20546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e0000000a68110028000000fc1e1000430000008c010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f62616c616e6365732f7372632f6c69622e727300fc1e1000430000008c01000001000000676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c756500000000282010000b0000000000000018e81000020000000000000000000000342010000100000000000000000000003c201000100000000000000034e810000100000000000000000000004c201000010000000000000000000000542010000c00000000000000a483100001000000000000000000000060201000010000000000000000000000682010000e0000000000000078201000020000000000000000000000882010000100000000000000566f746572526561706564002621100015000000426164526561706572536c6173686564172110000f00000054616c6c7953746172746564e22010003500000054616c6c7946696e616c697a6564000090e810000e00000090e810000e000000902010005200000020412074616c6c792028666f7220617070726f76616c20766f746573206f662073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e20412074616c6c792028666f7220617070726f76616c20766f746573206f662073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c20726561706572436f756e63696c205265676973746572496e666f4f66436f756e63696c204d656d62657273436f756e63696c204e65787446696e616c697a657022100048000000820a00000a000000436f756e63696c205465726d4475726174696f6e436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c204c6561646572626f617264007022100048000000880a00000e000000436f756e63696c2043616e64696461746573436f756e63696c20566f746572496e666f4f6647757275206d656469746174696f6e66696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e436f756e63696c20417070726f76616c734f66436f756e63696c20566f7465727300000000000000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000702410000d0000000000000080241000030000000000000000000000c8241000180000000000000000000000882510001300000000000000802410000300000000000000000000009c251000060000000000000000000000cc2510001300000000000000e0251000040000000000000000000000402610000c0000000000000000000000a02610000d00000000000000b0261000010000000000000000000000c82610000a000000000000000000000018271000100000000000000028271000010000000000000000000000402710000d0000000000000000000000a82710000e00000000000000b827100003000000000000000000000000281000080000000000000000000000402810001100000000000000542810000100000000000000000000006c281000030000000000000000000000842810000d0000000000000094281000010000000000000000000000ac281000040000000000000000000000cc2810001900000000000000e828100001000000000000000000000000291000020000000000000000000000102910001100000000000000e82810000100000000000000000000002429100002000000000000007365745f617070726f76616c7300000000000000b73510000500000000000000bc3510000900000000000000b0a910000500000000000000a02c10001200000000000000c53510000400000000000000c93510000800000085311000580000003931100010000000386b110000000000dd311000300000000d3210004a000000386b11000000000057321000350000008c32100051000000dd3210002c00000009331000530000005c33100062000000be331000600000001e3410001d0000003b341000570000009234100035000000386b110000000000c73410006b000000323510001d000000386b1100000000007e1b11000b0000002e271100080000004f3510002700000076351000410000001f1c11000c00000070726f78795f7365745f617070726f76616c7300d4301000650000003931100010000000386b1100000000007e1b11000b000000493110003c0000001f1c11000c000000726561705f696e6163746976655f766f7465720000000000ab3010000e000000000000004e1c11000c00000000000000db2a10000300000000000000b01d11002300000000000000b930100009000000000000004e1c11000c00000000000000c23010001200000000000000a02c1000120000004a2f100058000000a22f10005c000000fe2f100028000000386b1100000000002630100045000000386b1100000000006b30100040000000386b1100000000007e1b11000b0000002e27110008000000232f1000270000001f1c11000c000000726574726163745f766f74657200000000000000b0a9100005000000000000004e1c11000c000000472e10004b000000386b110000000000922e100042000000386b110000000000d42e10004f000000386b1100000000007e1b11000b0000002e27110008000000232f1000270000001f1c11000c0000007375626d69745f63616e64696461637900000000432e100004000000000000004e1c11000c000000b22c10001e000000386b110000000000d02c100044000000386b110000000000142d1000480000005c2d100051000000ad2d10004c000000f92d10001e000000386b1100000000007e1b11000b000000172e1000180000002f2e1000140000001f1c11000c00000070726573656e745f77696e6e6572000000000000922c10000900000000000000b01d110023000000000000009b2c10000500000000000000f32511001500000000000000b0a910000500000000000000a02c1000120000009e2b100059000000f72b1000680000005f2c10001e000000386b1100000000007e1b11000b0000007d2c1000150000000e7c1000110000001f1c11000c0000007365745f646573697265645f736561747300000000000000f629100005000000000000004e1c11000c000000de2a100059000000372b100052000000892b10001500000072656d6f76655f6d656d62657200000000000000db2a10000300000000000000b01d110023000000fb29100048000000386b110000000000432a1000480000008b2a1000500000007365745f70726573656e746174696f6e5f6475726174696f6e00000000000000f6291000050000000000000073f3100017000000a02910005600000088291000180000007365745f7465726d5f6475726174696f6e0000003429100054000000882910001800000020536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c792e204e6f74653a20412074616c6c792073686f756c642068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e28296020607369676e6564602073686f756c642068617665206174206c65617374202d204f28766f746572732920636f6d707574652e63616e646964617465746f74616c436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e204e4f54453a20696620606f726967696e602068617320616c72656164792061737369676e656420617070726f76616c7320766961205b607365745f617070726f76616c73605d2c2069742077696c6c204e4f54206861766520616e7920757361626c652066756e647320746f20706173732063616e64696461637920626f6e6420616e64206d75737420666972737420726574726163742e204e6f746520746861742073657474696e6720617070726f76616c732077696c6c206c6f636b2074686520656e746972652062616c616e6365206f662074686520766f74657220756e74696c2072657472616374696f6e206f72206265696e67207265706f727465642e202d20496e646570656e64656e74206f6620696e7075742e202d205468726565204442206368616e6765732e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2054686520696e646578206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e20416c736f2072656d6f76657320746865206c6f636b206f6e207468652062616c616e6365206f662074686520766f7465722e20536565205b60646f5f7365745f617070726f76616c732829605d2e202d2054776f20666577657220444220656e74726965732c206f6e65204442206368616e67652e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e20426f746820696e6469636573206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e202d2053616d6520617320607365745f617070726f76616c73602077697468206f6e65206164646974696f6e616c2073746f7261676520726561642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473204c6f636b732074686520746f74616c2062616c616e6365206f662063616c6c657220696e646566696e6974656c792e204f6e6c79205b60726574726163745f766f746572605d206f72205b60726561705f696e6163746976655f766f746572605d2063616e20756e6c6f636b207468652062616c616e63652e206068696e746020617267756d656e7420697320696e74657270726574656420646966666572656e746c79206261736564206f6e3a202d20696620606f726967696e602069732073657474696e6720617070726f76616c7320666f72207468652066697273742074696d653a2054686520696e6465782077696c6c20626520636865636b656420666f72206265696e6720612076616c6964205f686f6c655f20696e2074686520766f746572206c6973742e2020202d206966207468652068696e7420697320636f72726563746c7920706f696e74696e6720746f206120686f6c652c206e6f206665652069732064656475637465642066726f6d20606f726967696e602e2020202d204f74686572776973652c207468652063616c6c2077696c6c2073756363656564206275742074686520696e6465782069732069676e6f72656420616e642073696d706c792061207075736820746f20746865206c617374206368756e6b2020207769746820667265652073706163652068617070656e732e20496620746865206e65772070757368206361757365732061206e6577206368756e6b20746f20626520637265617465642c20612066656520696e646963617465642062792020205b60566f74696e67466565605d2069732064656475637465642e202d20696620606f726967696e6020697320616c7265616479206120766f7465723a2074686520696e646578205f5f6d7573745f5f2062652076616c696420616e6420706f696e7420746f2074686520636f727265637420706f736974696f6e206f662074686520606f726967696e6020696e207468652063757272656e7420766f74657273206c6973742e204e6f7465207468617420616e7920747261696c696e67206066616c73656020766f74657320696e2060766f746573602069732069676e6f7265643b20496e20617070726f76616c20766f74696e672c206e6f7420766f74696e6720666f7220612063616e64696461746520616e6420766f74696e672066616c73652c2061726520657175616c2e202d2054776f20657874726120444220656e74726965732c206f6e65204442206368616e67652e202d20417267756d656e742060766f74657360206973206c696d6974656420696e206c656e67746820746f206e756d626572206f662063616e646964617465732e766f7465735665633c626f6f6c3e68696e74536574496e64657800000000000000543b10001400000000000000000000001bf610000e00000000000000000000000000000000000000000000000000000000000000408111007c3b10000000000000000000683b100001000000000000000100000000000000703b10000c00000000000000000000001bf610000e00000000000000000000000000000000000000000000000000000000000000408111007c3b100000000000000000008c3b100001000000000000000100000000000000943b10000c0000000000000000000000061111000300000000000000000000000000000000000000000000000000000000000000408111001c4710000000000000000000a03b100001000000000000000100000000000000a0ad1000070000000000000000000000a83b10002300000000000000000000000000000000000000000000000000000000000000408111002c3d10000000000000000000cc3b100004000000000000000100000000000000ec3b1000090000000000000000000000f53b10000900000000000000000000000000000000000000000000000000000000000000408111001c4710000000000000000000003c100001000000000000000100000000000000083c10000b0000000101000000000000133c100018000000000000002b3c10001100000000000000000000000000000000000000408111002c3d100000000000000000003c3c100005000000000000000100000000000000643c10000e0000000101000000000000423111000c00000000000000723c1000100000000000000000000000000000000000000040811100f43d10000000000000000000843c100002000000000000000000000000000000943c10000b0000000101000000000000423111000c000000000000009f3c1000170000000000000000000000000000000000000040811100b83c10000000000000000000c83c100001000000000000000000000000000000d03c1000060000000101000000000000c93510000800000000000000d63c10001900000000000000000000000000000000000000408111002c3d10000000000000000000f03c100001000000000000000100000000000000f83c10000c0000000000000000000000c93510000800000000000000000000000000000000000000000000000000000000000000408111001c4710000000000000000000043d1000010000000000000001000000000000000c3d10000a0000000000000000000000c93510000800000000000000000000000000000000000000000000000000000000000000408111001c4710000000000000000000183d100001000000000000000100000000000000203d10000a0000000000000000000000b11a11001100000000000000000000000000000000000000000000000000000000000000408111002c3d100000000000000000003c3d100001000000000000000100000000000000443d10000e0000000000000000000000061111000300000000000000000000000000000000000000000000000000000000000000408111001c4710000000000000000000543d1000010000000000000001000000000000005c3d10000c0000000000000000000000683d1000280000000000000000000000000000000000000000000000000000000000000040811100903d10000000000000000000a03d100001000000000000000000000000000000a83d10000b0000000000000000000000b33d1000210000000000000000000000000000000000000000000000000000000000000040811100d43d10000000000000000000e43d10000200000000000000000000000000000010011100050000000101000000000000423111000c00000000000000423111000c0000000000000000000000000000000000000040811100f43d100000000000000000002801110002000000000000000000000050726573656e746174696f6e4475726174696f6e534310004f0000005465726d4475726174696f6e2f0000000000000001000000350000002d43100026000000446573697265645365617473f34210003a0000005665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e00cb4110005e000000294210005c0000008542100054000000d94210001a000000566f7465436f756e74566f7465496e64657800008441100047000000417070726f76616c734f6628543a3a4163636f756e7449642c20536574496e646578295665633c417070726f76616c466c61673e6f40100068000000386b110000000000d740100059000000386b11000000000030411000540000005265676973746572496e666f4f6628566f7465496e6465782c20753332290000fa3f10005f0000005940100016000000566f746572496e666f4f66566f746572496e666f3c42616c616e63654f663c543e3e00002f000000000000000100000036000000d93f100021000000566f746572735665633c4f7074696f6e3c543a3a4163636f756e7449643e3e00963f1000430000004e657874566f746572536574573f10003f000000566f746572436f756e7400003d3f10001a00000043616e6469646174657300002f000000000000000100000031000000213f10001c00000043616e646964617465436f756e740000fd3e1000240000004e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e292f00000000000000010000003c000000b53e1000480000004c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e2f00000000000000010000003c000000043e1000670000006b3e10004a0000002f0000000000000001000000360000002047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e2054686520666972737420656c656d656e742069732074686520776569676874206f66206561636820656e7472793b204974206d617920626520746865206469726563742073756d6d656420617070726f76616c207374616b65732c206f7220612077656967687465642076657273696f6e206f662069742e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e2043757272656e74206e756d626572206f66206163746976652063616e64696461746573205468652070726573656e742063616e646964617465206c6973742e2043757272656e74206e756d626572206f6620566f746572732e20746865206e65787420667265652073657420746f2073746f7265206120766f74657220696e2e20546869732077696c6c206b6565702067726f77696e672e205468652070726573656e7420766f746572206c69737420286368756e6b656420616e6420636170706564206174205b60564f5445525f5345545f53495a45605d292e20426173696320696e666f726d6174696f6e2061626f7574206120766f7465722e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722e2054686520766f746573206172652073746f726564206173206e756d657269632076616c75657320616e642070617273656420696e2061206269742d77697365206d616e6e65722e20496e206f7264657220746f2067657420612068756d616e2d7265616461626c6520726570726573656e746174696f6e2028605665633c626f6f6c3e60292c20757365205b60616c6c5f617070726f76616c735f6f66605d2e20467572746865726d6f72652c206561636820766563746f72206f66207363616c617273206973206368756e6b656420776974682074686520636170206f662060415050524f56414c5f5345545f53495a45602e2054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e74206d656d626572736869702e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e20746865206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e204e756d626572206f66206163636f756e747320746861742073686f756c6420636f6e737469747574652074686520636f6c6c6563746976652e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e000000000000d44510000d000000000000001d3311000c0000000000000040811100e44510000000000000000000f4451000020000000000000000000000044610000a000000000000001d3311000c0000000000000040811100104610000000000000000000204610000100000000000000000000002846100009000000000000001d3311000c0000000000000040811100344610000000000000000000444610000200000000000000000000005446100014000000000000001d3311000c000000000000004081110068461000000000000000000078461000020000000000000000000000884610000a0000000000000006111100030000000000000040811100944610000000000000000000a4461000020000000000000000000000b44610001300000000000000f53b1000090000000000000040811100c84610000000000000000000d8461000030000000000000000000000b00911000c000000000000001bf610000e0000000000000040811100f0461000000000000000000000471000020000000000000000000000104710000a00000000000000061111000300000000000000408111001c47100000000000000000002c471000050000000000000000000000544710000e0000000000000006111100030000000000000040811100644710000000000000000000744710000100000000000000000000007c471000110000000000000006111100030000000000000040811100904710000000000000000000a0471000010000000000000043616e646964616379426f6e640000002f00000000000000010000003d000000b04b10004e000000fe4b100014000000566f74696e67426f6e6400002f0000000000000001000000320000006e4b100042000000566f74696e674665650000002f00000000000000010000003e000000074b10004a000000514b10001d00000050726573656e74536c617368506572566f7465722f000000000000000100000033000000a34a100045000000e84a10001f0000004361727279436f756e7400002f000000000000000100000037000000354a1000470000007c4a100027000000496e6163746976654772616365506572696f64002f00000000000000010000003f000000984910004c000000e44910004b0000002f4a1000060000002f00000000000000010000004000000046491000490000008f491000090000004465636179526174696f00002f000000000000000100000041000000f34710004d00000040481000410000008148100047000000c84810004a0000001249100034000000564f5445525f5345545f53495a4500002f000000000000000100000042000000cf47100024000000415050524f56414c5f5345545f53495a450000002f000000000000000100000043000000a84710002700000020546865206368756e6b2073697a65206f662074686520617070726f76616c20766563746f722e20546865206368756e6b2073697a65206f662074686520766f74657220766563746f722e20446563617920666163746f72206f6620776569676874207768656e206265696e6720616363756d756c617465642e2049742073686f756c64207479706963616c6c792062652073657420746f205f5f6174206c656173745f5f20606d656d626572736869705f73697a65202d316020746f206b6565702074686520636f6c6c656374697665207365637572652e205768656e2073657420746f20604e602c20697420696e64696361746573206028312f4e295e7460206f66207374616b656420697320646563617965642061742077656967687420696e6372656d656e742073746570206074602e20302077696c6c20726573756c7420696e206e6f20776569676874206265696e6720616464656420617420616c6c20286e6f726d616c20617070726f76616c20766f74696e67292e204120726561736f6e61626c652064656661756c742076616c75652069732032342e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e204120726561736f6e61626c652064656661756c742076616c756520697320313030302e20486f77206d616e7920766f746520696e6469636573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e204120726561736f6e61626c652064656661756c742076616c756520697320312e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e204120726561736f6e61626c652064656661756c742076616c756520697320322e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e204120726561736f6e61626c652064656661756c742076616c756520697320312e2054686520616d6f756e74206f662066656520706169642075706f6e206561636820766f7465207375626d697373696f6e2c20756e6c6573732069662074686579207375626d69742061205f686f6c655f20696e64657820616e64207265706c6163652069742e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e204120726561736f6e61626c652064656661756c742076616c756520697320392e00000a681100280000002c4c1000440000000b010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f656c656374696f6e732f7372632f6c69622e72732c4c1000440000000b01000001000000436f756e63696c2050726f787963616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572696e76616c6964207265706f7274657220696e646578766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665626164207265706f7274657220696e6465786261642074617267657420696e646578696e76616c69642074617267657420696e64657872657472616374696f6e20696e646578206d69736d6174636872657472616374696f6e20696e64657820696e76616c696463616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f7465726475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e647363616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e747374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f6c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647370726573656e7465642063616e646964617465206d7573742062652063757272656e7463616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c65637465646475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c6e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e64696461746573696e76616c696420766f74657220696e64657877726f6e6720766f74657220696e6465786e657720766f746572206d75737420686176652073756666696369656e742066756e647320746f207061792074686520626f6e6446524e4b00000000000070e710000800000000000000b8511000010000000000000000000000c0511000010000000000000000000000c85110000800000000000000b40f1100010000000000000000000000d0511000010000000000000000000000d85110000700000000000000e0511000030000000000000000000000f8511000010000000000000000000000005210000500000000000000b40f110001000000000000000000000008521000010000000000000000000000105210000800000000000000b40f1100010000000000000000000000185210000100000000000000348910000d000000e95210000e0000005370656e64696e67af5210003a0000004177617264656400348910000d0000006a1011000700000061101100090000008f521000200000004275726e740000006c52100023000000526f6c6c6f766572205210004c000000205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e416c69766520636f6e7472616374206f7220746f6d6273746f6e6520616c726561647920657869737473647572696e6720657865637574696f6e0000000a681100280000004c5310004d0000005e000000080000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f7761736d2f72756e74696d652e72734772616e64706146696e616c697479205374616c6c656454726561737572792050726f706f73616c730000e0531000190000000054100048000000bb0100002d00000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f6f70732f61726974682e7273616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f7765642f0000000000000001000000440000002f0000000000000001000000450000000a68110028000000a85410004300000084000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74726561737572792f7372632f6c69622e7273000455100033000000375510004b000000b200000005000000636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f6163636f756e745f64622e7273707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a090909097165640000000000205810001200000000000000345810000100000000000000000000004c58100001000000000000007265706f72745f6d69736265686176696f720000000000006d5810000700000000000000d5ca1000070000005458100019000000205265706f727420736f6d65206d69736265686176696f722e5f7265706f72744772616e64706146696e616c6974790000000000d0de10000b00000000000000000000003c5a1000230000000000000000000000000000000000000000000000000000000000000040811100d06010000000000000000000605a100001000000000000000100000000000000685a10000500000000000000000000006d5a10001b0000000000000000000000000000000000000000000000000000000000000040811100885a10000000000000000000985a100001000000000000000100000000000000a05a10000d0000000000000000000000ad5a1000230000000000000000000000000000000000000000000000000000000000000040811100145b10000000000000000000d05a100001000000000000000000000000000000d85a10000a00000000000000000000001bf610000e0000000000000000000000000000000000000000000000000000000000000040811100145b10000000000000000000e45a100001000000000000000000000000000000ec5a1000070000000000000000000000f35a1000200000000000000000000000000000000000000000000000000000000000000040811100145b10000000000000000000245b10000100000000000000000000005665633c28417574686f7269747949642c20417574686f72697479576569676874293e00d45b10001b000000537461746553746f72656453746174653c543a3a426c6f636b4e756d6265723e2f000000000000000100000046000000b05b10002400000050656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e7f5b1000310000004e657874466f726365640000505b10002f0000005374616c6c656428543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d62657229002f0000000000000001000000360000002c5b10002400000020607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205374617465206f66207468652063757272656e7420617574686f72697479207365742e205468652063757272656e7420617574686f72697479207365742e0000000000745c10000d00000000000000845c1000020000000000000000000000b45c1000090000000000000000000000fc5c10000f000000000000000c5d1000010000000000000000000000245d10000700000000000000000000005c5d100010000000000000000c5d10000100000000000000000000006c5d1000080000000000000070726f706f73655f7370656e6400000000000000ee2511000500000000000000f325110015000000000000004a5f10000b00000000000000b01d110023000000785e10004b000000c35e10004d000000105f100015000000386b1100000000007e1b11000b0000002e27110008000000f57b100019000000255f1000250000001f1c11000c00000072656a6563745f70726f706f73616c00000000006d5e10000b00000000000000b5a91000160000002e5e10003f000000386b1100000000007e1b11000b0000002e27110008000000f57b100019000000e6f21000100000001f1c11000c000000617070726f76655f70726f706f73616cac5d100057000000035e10002b000000386b1100000000007e1b11000b0000002e27110008000000f57b1000190000000e7c1000110000001f1c11000c00000020417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e70726f706f73616c5f69642050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e62656e65666963696172790000000000000088ad10000d0000000000000000000000348910000d0000000000000000000000000000000000000000000000000000000000000040811100606010000000000000000000706010000100000000000000010000000000000018ad1000090000000101000000000000348910000d00000000000000786010002400000000000000000000000000000000000000408111009c6010000000000000000000ac60100001000000000000000000000000000000b4601000090000000000000000000000bd601000120000000000000000000000000000000000000000000000000000000000000040811100d06010000000000000000000e06010000100000000000000010000002f000000000000000100000041000000456110002900000050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e2f000000000000000100000036000000266110001f000000417070726f76616c735665633c50726f706f73616c496e6465783e002f000000000000000100000031000000e86010003e0000002050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e000000000000506210000c000000000000005c621000070000000000000040811100646210000000000000000000746210000200000000000000000000008462100013000000000000001d3311000c0000000000000040811100986210000000000000000000a8621000010000000000000000000000b06210000b000000000000001bf610000e0000000000000040811100bc6210000000000000000000cc621000010000000000000000000000d462100004000000000000005c621000070000000000000040811100d86210000000000000000000e8621000010000000000000050726f706f73616c426f6e645065726d696c6c002f000000000000000100000047000000a863100055000000fd6310004400000050726f706f73616c426f6e644d696e696d756d002f00000000000000010000003200000056631000520000005370656e64506572696f64002f00000000000000010000004800000034631000220000004275726e2f000000000000000100000049000000f0621000440000002050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c697479205374617465496e636f6e73697374656e74207374617465202d20636f756c646e277420736574746c6520696d62616c616e636520666f722066756e6473207370656e74206279207472656173757279000000a854100043000000840000000100000050726f706f73657227732062616c616e636520746f6f206c6f774e6f2070726f706f73616c206174207468617420696e646578002d00000008000000040000004a0000004b00000000000000000000004c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004772616e64706146696e616c697479204e657874466f726365643a73657373696f6e3a6b65797353657373696f6e2056616c696461746f727353657373696f6e204e6578744b65797373657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a0909097165640000000a681100280000002c601100500000003701000009000000000000000467100008000000000000000c6710000200000000000000000000003c6710000a000000000000007365745f6b657973000000008aca100004000000000000009568100007000000000000009c6810000500000000000000d5ca1000070000008c67100039000000c5671000480000000d68100031000000386b1100000000003e68100035000000386b1100000000007e1b11000b000000736810002200000094f21000160000001f1c11000c0000002053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e202d204f286c6f67206e2920696e206e756d626572206f66206163636f756e74732e543a3a4b65797370726f6f6600000000000000c03111000a00000000000000000000000c6b1000130000000000000000000000000000000000000000000000000000000000000040811100ac6b10000000000000000000206b100001000000000000000100000000000000286b10000c0000000000000000000000136511000c0000000000000000000000000000000000000000000000000000000000000040811100346b10000000000000000000446b1000010000000000000001000000000000004c6b1000070000000000000000000000d33311000400000000000000000000000000000000000000000000000000000000000000408111006c6b10000000000000000000546b1000010000000000000001000000000000005c6b10000d0000000000000000000000d33311000400000000000000000000000000000000000000000000000000000000000000408111006c6b100000000000000000007c6b100001000000000000000100000000000000846b10000a00000000000000000000008e6b10001e0000000000000000000000000000000000000000000000000000000000000040811100ac6b10000000000000000000bc6b100002000000000000000100000000000000cc6b1000080000000204010000000000d5ca10000700000000000000d46b10000e0000000000000095681000070000000000000040811100206c10000000000000000000e46b100004000000000000000000000000000000046c1000080000000204010000000000d5ca100007000000000000000c6c10001400000000000000d46b10000e0000000000000040811100206c10000000000000000000306c10000400000000000000000000005665633c543a3a56616c696461746f7249643e00566e10001f00000043757272656e74496e6465782f000000000000000100000041000000386e10001e0000004368616e676564000a6e10002e0000005175657565644368616e6765640000002f000000000000000100000036000000f56d1000150000005175657565644b6579735665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e2f0000000000000001000000310000006e6d10004f000000bd6d1000380000004e6578744b657973543a3a56616c696461746f7249640000476d100027000000386b110000000000996c100056000000ef6c1000580000004b65794f776e6572284b65795479706549642c205665633c75383e292f000000000000000100000036000000506c100049000000386b110000000000996c100056000000ef6c10005800000020546865206f776e6572206f662061206b65792e20546865207365636f6e64206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e20546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f662074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e2054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b6579732077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e20517565756564206b657973206368616e6765642e205472756520696620616e797468696e6720686173206368616e67656420696e20746869732073657373696f6e2e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e00000000000000b06e10001000000000000000c06e1000050000000000000040811100c86e10000000000000000000d86e1000020000000000000044454455505f4b45595f505245464958265b75385d0000002f00000000000000010000004d000000e86e100059000000416f10000d0000002055736564206173206669727374206b657920666f7220604e6578744b6579736020616e6420604b65794f776e65726020746f2070757420616c6c20746865206461746120696e746f207468652073616d65206272616e6368206f662074686520747269652e00000000000080d1f00840787d01000000000065cd1d23b4cc3a113b5c2301000000d31b421e4fdcba34836c472001000000c75bbd1e52a1fd2e01b4511d010000005feb3f1f1d03952998c57b1a01000000bdb6ca1fa50181245d60c61701000000abd95e20029dc11fec4f3215010000006fadfd2034d5561b086ec01201000000efdba82133aa4017c3a4711001000000eb7a6222fd1b7f132df1460e01000000c1332d23942a1210ad66410c01000000777f0c2408d6f90c5e33620a01000000a3040525591e360ab7a5aa080100000085311d268803c70760341c070100000097465e279f85ac054289b805010000007346d628a4a4e603ce9181040100000019e89b2abe607502ad987903010000009db7d72c54ba5801bb71a30201000000eb88dd2ff4b29000c5cf0202010000000b8c8d349e412700f8d7a5010100000053657373696f6e205175657565644b657973636f6465206973206e6f7420666f756e647072697374696e6520636f6465206973206e6f7420666f756e647468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f646553657373696f6e204b65794f776e65726e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e72656769737465726564206475706c6963617465206b657966696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e640a68110028000000907110003f0000006a000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7375646f2f7372632f6c69622e7273000a00000014000000f071100048000000820a00000a00000000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e72737375646f000000009472100005000000000000009c721000010000000000000000000000a4721000010000000000000000000000ac7210000a0000000000000034e81000010000000000000000000000b872100001000000000000005375646964000000d333110004000000fc721000180000004b65794368616e6765640000c07210003c00000020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e907110003f0000006a000000010000005375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b65796f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f00000000008dcb100006000000000000004e000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000050000000000000000000000000000000510000000000000000000000000000004edc100004000000000000005200000000000000000000000000000000000000000000000000000000000000510000000000000000000000020000000000000000000000000000000000000053000000000000000000000000000000f7bd10000900000000000000540000000000000000000000000000000000000000000000000000000000000055000000000000000000000002000000000000000000000000000000000000005600000000000000000000000000000061c110000a000000000000005700000000000000000000000000000000000000000000000000000000000000580000000000000000000000020000000000000000000000000000000000000051000000000000000000000000000000e6b7100007000000000000005900000000000000000000000000000000000000000000000000000000000000510000000000000000000000000000005a00000000000000000000000000000051000000000000000000000000000000f879100008000000000000005b000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000005d0000000000000000000000000000005e0000000000000000000000000000004e29110007000000000000005f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000006100000000000000000000000000000062000000000000000000000000000000007a100007000000000000006300000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000006500000000000000000000000000000066000000000000000000000000000000f3f910000900000000000000670000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000690000000000000000000000000000006a000000000000000000000000000000077a100007000000000000006b000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000006d000000000000000000000000000000510000000000000000000000000000000e7a100012000000000000006e000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000006d00000000000000000000000000000051000000000000000000000000000000207a100009000000000000006f00000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000007100000000000000000000000000000072000000000000000000000000000000297a10000f000000020000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000020000000000000000000000000000000000000074000000000000000000000000000000387a1000070000000000000075000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000077000000000000000000000000000000510000000000000000000000000000003f7a100008000000000000007800000000000000000000000000000000000000000000000000000000000000790000000000000000000000000000007a0000000000000000000000000000007b000000000000000000000000000000477a100009000000000000007c000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000007e0000000000000000000000000000007f000000000000000000000000000000507a100004000000000000008000000000000000000000000000000000000000000000000000000000000000810000000000000000000000000000008200000000000000000000000000000051000000000000000000000000000000547a100008000000000000008300000000000000000000000000000000000000000000000000000000000000840000000000000000000000000000008500000000000000000000000000000086000000000000000000000042616c616e63657353657373696f6e436f756e63696c546563686e6963616c436f6d6d6974746565456c656374696f6e7346696e616c697479547261636b65724772616e6470615472656173757279436f6e7472616374735375646f496d4f6e6c696e65000000003872100004000000000000007cef1000010000000000000000000000b47a1000090000000000000000000000fc7a10000700000000000000047b10000100000000000000000000001c7b100009000000000000001f7c10004e000000386b110000000000c17b100034000000386b1100000000007e1b11000b0000002e27110008000000f57b1000190000006d7c1000100000001f1c11000c0000007365745f6b657900000000004b1c11000300000000000000b01d110023000000647b10005d000000386b110000000000c17b100034000000386b1100000000007e1b11000b0000002e27110008000000f57b1000190000000e7c1000110000001f1c11000c0000002041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e202d204c696d697465642073746f726167652072656164732e202d204f6e65204442206368616e67652e2041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e202d204e6f204442207772697465732e00000000000000d87c1000030000000000000000000000423111000c0000000000000000000000000000000000000000000000000000000000000040811100dc7c10000000000000000000ec7c10000100000000000000010000004b6579002f000000000000000100000087000000f47c1000210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e4e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f7221496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473215468657265206973206f6e6c79206f6e6520666174616c206572726f723b207165640000002d00000008000000040000002e0000007375627374726174652d6e6f64650000df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000cbca25e39f1423870100000022f09549cb59f9ff010000008d8010001c000000187f100044000000bf000000030000006980100024000000187f100044000000c8000000030000003180100038000000187f100044000000060100002a0000000980100028000000187f1000440000000701000032000000e17f100028000000187f100044000000090100002c000000b57f10002c000000187f100044000000080100004c000000837f100032000000187f10004400000031010000030000005c7f100027000000187f1000440000003901000004000000f07e100028000000187f1000440000003f0100000300000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f2070617920746865697220666565735472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e626164207369676e617475726520696e2065787472696e73696300418110000d000000268110001b000000e480100042000000bf010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b00005881100010000000696e697469616c697a655f626c6f636b708110000f0000006170706c795f65787472696e736963008881100013000000696e686572656e745f65787472696e7369637300a48110000f000000636865636b5f696e686572656e747300bc8110001400000076616c69646174655f7472616e73616374696f6ed88110000f0000006f6666636861696e5f776f726b657200f0811000160000006772616e6470615f70656e64696e675f6368616e6765000010821000150000006772616e6470615f666f726365645f6368616e6765496e76616c6964206f726967696e00000000003c8310000800000000000000448310000300000000000000000000005c831000010000000000000000000000648310000c0000000000000018e8100002000000000000000000000070831000010000000000000000000000788310000a00000000000000848310000100000000000000000000008c831000010000000000000000000000948310000f00000000000000a4831000010000000000000000000000ac831000010000000000000000000000b48310000a00000000000000c0831000020000000000000000000000d0831000020000000000000000000000e08310000800000000000000e8831000020000000000000000000000f883100001000000000000005472616e73666572611011000900000061101100090000006a101100070000002385100055000000496e7374616e746961746564ec84100037000000436f646553746f72656400005ce8100004000000be8410002e0000005363686564756c65557064617465640006111100030000008e841000300000004469737061746368656400006110110009000000d333110004000000238410004e000000718410001d000000436f6e74726163746110110009000000d5ca100007000000008410002300000020416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e64656661756c743a0000000070e71000080000000000000088861000040000000000000000000000a8861000020000000000000000000000b88610000500000000000000c0861000050000000000000000000000e8861000020000000000000000000000f886100008000000000000008483100001000000000000000000000000871000010000000000000000000000088710000b000000000000008483100001000000000000000000000014871000010000000000000000000000f2e7100008000000000000001c8710000200000000000000000000002c871000010000000000000000000000348710000e000000000000001c8710000200000000000000000000004487100001000000000000006110110009000000348910000d0000005ce8100004000000c68810000b000000d1881000530000002489100010000000566f74656400000061101100090000005ce8100004000000d333110004000000c68810000b000000c68810000b0000003e881000420000008088100046000000417070726f7665640d88100031000000446973617070726f76656400d8871000350000005ce8100004000000d33311000400000097871000410000004d656d626572457865637574656400004c8710004b00000020412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d656d626572436f756e742041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292e50726f706f73616c496e646578436f6e7472616374205072697374696e65436f6465496e7374616e636531436f6c6c656374697665204d656d62657273496e7374616e636532436f6c6c656374697665204d656d62657273436f6e747261637420436f646553746f72616765436f6e747261637420436f6e7472616374496e666f4f66436f6e74726163742047617350726963650a68110028000000e0891000450000007d000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6c6c6563746976652f7372632f6c69622e727300000000000000308b10000f00000000000000408b1000010000000000000000000000588b1000030000000000000000000000708b10000800000000000000788b1000020000000000000000000000a88b1000020000000000000000000000b94711000400000000000000b88b1000040000000000000000000000188c1000070000000000000000000000508c10000600000000000000588c1000040000000000000000000000b88c10000a0000000000000000000000088d10000f00000000000000188d1000020000000000000000000000488d1000050000000000000000000000708d10000a000000000000007c8d1000040000000000000000000000dc8d100006000000000000007570646174655f7363686564756c650000000000fb951000080000000000000003961000080000008b9510002d000000386b110000000000b8951000430000007075745f636f6465000000004d9310000900000000000000569310000c00000000000000879510000400000000000000d5ca100007000000fb94100057000000529510003500000000000000b58f10000400000000000000b01d11002300000000000000ee2511000500000000000000f325110015000000000000004d9310000900000000000000569310000c00000000000000629310000400000000000000d5ca1000070000006693100042000000386b110000000000a89310004a000000f29310002c0000001e941000460000006494100052000000b694100045000000637265617465000000000000449310000900000000000000f325110015000000000000004d9310000900000000000000569310000c00000000000000b98f10000900000000000000c28f10000b00000000000000629310000400000000000000d5ca1000070000002d9110006a000000386b1100000000009791100021000000386b110000000000b8911000500000000892100041000000499210005b000000a492100057000000fb9210002a000000259310001f000000636c61696d5f7375726368617267650000000000b58f10000400000000000000423111000c000000000000000f9110000a000000000000001991100014000000f58f10005c0000005190100045000000386b110000000000969010004e000000e49010002b000000726573746f72655f746f000000000000b58f10000400000000000000423111000c00000000000000b98f10000900000000000000c28f10000b00000000000000cd8f10000e000000000000001d3311000c00000000000000db8f10000500000000000000e08f1000150000000c8e100040000000386b1100000000004c8e10006f000000bb8e10004e000000098f1000640000006d8f10004800000020416c6c6f7773206120636f6e747261637420746f20726573746f7265206120746f6d6273746f6e6520627920676976696e67206974732073746f726167652e2054686520636f6e747261637420746861742077616e747320746f20726573746f72652028692e652e206f726967696e206f66207468652063616c6c2c206f7220606d73672e73656e6465726020696e20536f6c6964697479207465726d73292077696c6c20636f6d70757465206120746f6d6273746f6e652077697468206974732073746f7261676520616e642074686520676976656e20636f64655f686173682e2049662074686520636f6d707574656420746f6d6273746f6e65206d61746368207468652064657374696e6174696f6e206f6e652c207468652064657374696e6174696f6e20636f6e747261637420697320726573746f7265642077697468207468652072656e745f616c6c6f77616e636560207370656369666965642c207768696c6520746865206f726967696e2073656e647320616c6c206974732066756e647320746f207468652064657374696e6174696f6e20616e642069732072656d6f7665642e64657374636f64655f68617368436f6465486173683c543e72656e745f616c6c6f77616e636564656c74615665633c657865633a3a53746f726167654b65793e20416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f6475636572206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e20496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e6175785f73656e6465724f7074696f6e3c543a3a4163636f756e7449643e20437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e746761735f6c696d6974436f6d706163743c4761733e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c650000000000749810000800000000000000000000007c9810000300000000000000000000000000000000000000000000000000000000000000408111000099100000000000000000008098100001000000000000000100000000000000889810000f000000000000000000000003961000080000000000000000000000000000000000000000000000000000000000000040811100989810000000000000000000a898100001000000000000000100000000000000b09810000c0000000101000000000000c28f10000b00000000000000d5ca100007000000000000000000000000000000000000004081110060b010000000000000000000bc98100001000000000000000000000000000000c49810000b0000000101000000000000c28f10000b00000000000000cf98100016000000000000000000000000000000000000004081110060b010000000000000000000e898100001000000000000000000000000000000f09810000e000000000000000000000020cb10000300000000000000000000000000000000000000000000000000000000000000408111000099100000000000000000001099100001000000000000000100000000000000189910000e0000000101000000000000423111000c00000000000000269910000f00000000000000000000000000000000000000408111003899100000000000000000004899100001000000000000000000000000000000509910000800000000000000000000001d3311000c0000000000000000000000000000000000000000000000000000000000000040811100589910000000000000000000689910000100000000000000010000004761735370656e7447617300a49a10002000000043757272656e745363686564756c65002f0000000000000001000000880000007f9a1000250000005072697374696e65436f6465269a100059000000436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c65000000cd991000590000004163636f756e74436f756e74657200002f000000000000000100000035000000b899100015000000436f6e7472616374496e666f4f66436f6e7472616374496e666f3c543e0000002f00000000000000010000003c0000008e9910002a00000047617350726963652f000000000000000100000089000000709910001e00000020546865207072696365206f66206f6e6520756e6974206f66206761732e2054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20546865207375627472696520636f756e7465722e2041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e00000000449e100013000000000000001bf610000e0000000000000040811100589e10000000000000000000689e1000040000000000000000000000889e100010000000000000001d3311000c0000000000000040811100989e10000000000000000000a89e1000010000000000000000000000b09e1000110000000000000006111100030000000000000040811100c49e10000000000000000000d49e1000020000000000000000000000e49e10000b000000000000001d3311000c0000000000000040811100f09e10000000000000000000009f1000010000000000000000000000089f100011000000000000001d3311000c00000000000000408111001c9f100000000000000000002c9f1000070000000000000000000000649f10000f000000000000001d3311000c0000000000000040811100749f10000000000000000000849f1000020000000000000000000000949f10000b000000000000001d3311000c000000000000004081110010a010000000000000000000a09f1000010000000000000000000000a89f10000b000000000000001d3311000c000000000000004081110010a010000000000000000000b49f1000010000000000000000000000bc9f100012000000000000001d3311000c000000000000004081110010a010000000000000000000d09f1000010000000000000000000000d89f100012000000000000001d3311000c0000000000000040811100ec9f10000000000000000000fc9f100001000000000000000000000004a010000b000000000000001d3311000c000000000000004081110010a01000000000000000000020a0100002000000000000000000000030a010000b000000000000007c9810000300000000000000408111005ca0100000000000000000003ca010000200000000000000000000004ca010000d000000000000007c9810000300000000000000408111005ca0100000000000000000006ca010000200000000000000000000007ca0100008000000000000000611110003000000000000004081110084a01000000000000000000094a01000020000000000000000000000a4a010000c0000000000000006111100030000000000000040811100b0a010000000000000000000c0a01000010000000000000000000000c8a010000d000000000000007c981000030000000000000040811100d8a010000000000000000000e8a0100002000000000000005369676e6564436c61696d48616e6469636170002f00000000000000010000008a00000085a6100038000000386b110000000000bda610004300000000a710001a000000546f6d6273746f6e654465706f7369742f00000000000000010000008b00000050a610003500000053746f7261676553697a654f66667365740000002f000000000000000100000043000000d7a510004b00000022a610002e00000052656e7442797465466565002f00000000000000010000008c0000008aa510004d00000052656e744465706f7369744f66667365740000002f00000000000000010000008d00000012a410004100000053a4100016000000386b11000000000069a410005a000000c3a410005600000019a51000530000006ca510001e000000537572636861726765526577617264002f00000000000000010000008e000000bfa3100039000000f8a310001a0000005472616e73666572466565009aa31000250000004372656174696f6e4665650073a31000270000005472616e73616374696f6e4261736546656500003ca31000370000005472616e73616374696f6e4279746546656500002f000000000000000100000034000000f9a2100043000000436f6e7472616374466565002f000000000000000100000033000000a7a210004b000000f2a210000700000043616c6c426173654665650052a210004700000099a210000e000000437265617465426173654665650000002f00000000000000010000003b00000001a21000490000004aa21000080000004d617844657074682f00000000000000010000008f000000aca1100047000000f3a110000e0000004d617856616c756553697a652f0000000000000001000000900000005ea110004e000000426c6f636b4761734c696d69740000002f000000000000000100000091000000f8a010004900000041a110001d00000020546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e204120726561736f6e61626c652064656661756c742076616c75652069732031305f3030305f3030302e20546865206d6178696d756d2073697a65206f6620612073746f726167652076616c756520696e2062797465732e204120726561736f6e61626c652064656661756c74206973203136204b69422e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e204120726561736f6e61626c652064656661756c742076616c7565206973203130302e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e204120726561736f6e61626c652064656661756c742076616c7565206973203137352e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e204120726561736f6e61626c652064656661756c742076616c7565206973203133352e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e204120726561736f6e61626c652064656661756c742076616c75652069732032312e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c656420746f2072656d6f76616c206f66206120636f6e74726163742e2054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f66667365742074686520636f7374206f66206f6e6520627974652e204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e20427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c207468656e20697420776f756c6420706179203530302042552f6461792e205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e2053697a65206f66206120636f6e7472616374206174207468652074696d65206f66206372656174696f6e2e205468697320697320612073696d706c652077617920746f20656e73757265207468617420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e20546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e205768656e20636c61696d207375726368617267652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b656420666f722063757272656e745f626c6f636b202d2064656c6179496e7374616e636531436f6c6c6563746976652050726f706f73616c73496e7374616e636531436f6c6c65637469766520566f74696e670000000000000004a810000b0000000000000010a8100001000000000000000000000028a8100004000000000000000000000048a81000070000000000000050a8100001000000000000000000000068a8100003000000000000000000000028ed1000070000000000000080a81000020000000000000000000000b0a81000040000000000000000000000e0ed10000400000000000000d0a8100003000000000000000000000018a9100004000000000000007365745f6d656d6265727300000000003fab10000b00000000000000b11a110011000000beaa10005400000012ab100017000000386b11000000000029ab100016000000657865637574650000000000f4f61000080000000000000038aa10001e00000056aa10003d000000386b11000000000093aa10002b000000000000005ff81000090000000000000024aa10001400000000000000f4f61000080000000000000038aa10001e0000007e1b11000b000000d2a9100024000000f6a910002e0000001f1c11000c00000000000000f4f61000080000000000000005f410000700000000000000b0a910000500000000000000b5a910001600000000000000cba910000700000000000000d3331100040000007e1b11000b00000038a91000230000005ba91000550000001f1c11000c000000202d20426f756e6465642073746f72616765207265616420616e64207772697465732e202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f7665202d20426f756e6465642073746f7261676520726561647320616e64207772697465732e202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e436f6d706163743c4d656d626572436f756e743e426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e20446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e642070726f76696465206974207072652d736f727465642e20526571756972657320726f6f74206f726967696e2e6e65775f6d656d62657273496e7374616e636531436f6c6c6563746976650000000000000018ad100009000000000000000000000021ad10000c000000000000000000000000000000000000000000000000000000000000004081110080b01000000000000000000030ad10000100000000000000010000000000000038ad10000a000000010100000000000005f41000070000000000000042ad100019000000000000000000000000000000000000004081110060b0100000000000000000005cad10000100000000000000000000000000000064ad100006000000010100000000000005f4100007000000000000006aad100013000000000000000000000000000000000000004081110060b01000000000000000000080ad10000100000000000000000000000000000088ad10000d00000000000000000000000611110003000000000000000000000000000000000000000000000000000000000000004081110070b01000000000000000000098ad100001000000000000000100000000000000a0ad1000070000000000000000000000b11a110011000000000000000000000000000000000000000000000000000000000000004081110080b010000000000000000000a8ad100001000000000000000100000050726f706f73616c735665633c543a3a486173683e00000070ae10002400000050726f706f73616c4f663c542061732054726169743c493e3e3a3a50726f706f73616c003dae100033000000566f74696e67566f7465733c543a3a4163636f756e7449643e00000010ae10002d00000050726f706f73616c436f756e74000000fead1000120000004d656d6265727300b0ad10004e000000205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e2050726f706f73616c7320736f206661722e20566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e2054686520686173686573206f6620746865206163746976652070726f706f73616c732e496e7374616e636532436f6c6c656374697665000000000018ad100009000000000000000000000021ad10000c000000000000000000000000000000000000000000000000000000000000004081110080b01000000000000000000030ad10000100000000000000010000000000000038ad10000a000000010100000000000005f41000070000000000000042ad100019000000000000000000000000000000000000004081110060b0100000000000000000005cad10000100000000000000000000000000000064ad100006000000010100000000000005f4100007000000000000006aad100013000000000000000000000000000000000000004081110060b01000000000000000000080ad10000100000000000000000000000000000088ad10000d00000000000000000000000611110003000000000000000000000000000000000000000000000000000000000000004081110070b01000000000000000000098ad100001000000000000000100000000000000a0ad1000070000000000000000000000b11a110011000000000000000000000000000000000000000000000000000000000000004081110080b010000000000000000000a8ad10000100000000000000010000002f0000000000000001000000360000002f0000000000000001000000410000002f0000000000000001000000310000000a68110028000000a8b0100044000000b7010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f6c69622e7273a8b0100044000000b7010000010000006e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e74496e76616c69642073757263686172676520636c61696d3a206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e7443616e6e6f7420726573746f72652066726f6d20696e6578697374696e67206f7220746f6d6273746f6e6520636f6e74726163744f726967696e20547269654964207772697474656e20696e207468652063757272656e7420626c6f636b546f6d6273746f6e657320646f6e2774206d6174636843616e6e6f7420726573746f726520746f20696e6578697374696e67206f7220616c69766520636f6e7472616374e0891000450000007d0000000100000070726f706f736572206e6f742061206d656d6265726475706c69636174652070726f706f73616c73206e6f7420616c6c6f776564496e7374616e636531436f6c6c6563746976652050726f706f73616c4f66496e7374616e636531436f6c6c6563746976652050726f706f73616c436f756e7470726f706f73616c206d757374206578697374766f746572206e6f742061206d656d6265726d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f726564000020b3100048000000880a00000e000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e7273496e7374616e636532436f6c6c6563746976652050726f706f73616c73496e7374616e636532436f6c6c65637469766520566f74696e67496e7374616e636532436f6c6c6563746976652050726f706f73616c4f66496e7374616e636532436f6c6c6563746976652050726f706f73616c436f756e740000000000000cb410000f000000000000001cb410000200000000000000000000002cb4100004000000000000004e65774163636f756e74496e646578006110110009000000c7b410000c0000004cb4100022000000386b1100000000006eb4100041000000afb41000180000002041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e64657800ecb410002b00000017b5100044000000ff0000000400000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74696d657374616d702f7372632f6c69622e7273626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d6974206279207072696365000000b8b510003000000017b5100044000000f30000000400000054696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b00b610004e00000017b5100044000000f40000000400000054696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f77417574686f727368697020417574686f72496e646963657320456e756d53657400a0b6100019000000c0b6100048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f6f70732f61726974682e72732d00000008000000040000002e0000000a6811002800000030b71000420000004a000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f696e64696365732f7372632f6c69622e7273000030b71000420000004a00000001000000696e76616c6964206163636f756e7420696e64657854696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e742064617461496e646963657300000000000000a0b810000b0000000000000000000000abb810000f0000000000000000000000000000000000000000000000000000000000000040811100bcb810000000000000000000ccb8100001000000000000000100000000000000d4b81000070000000101000000000000abb810000f00000000000000b11a1100110000000000000000000000000000000000000040811100dcb810000000000000000000ecb810000100000000000000010000004e657874456e756d536574543a3a4163636f756e74496e64657800002f0000000000000001000000410000000ab910001f000000456e756d536574002f000000000000000100000031000000f4b81000160000002054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e000000b0b9100048000000880a00000e000000a0b610001900000060b9100047000000e20000000a0000000000000000000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f70687261676d656e2e72730000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e7273496e6469636573204e657874456e756d536574417574686f727368697020556e636c65736d656d6f727976616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706543616e6e6f7420696d706f727420676c6f62616c736d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e6d6f64756c6520696d706f72747320606578745f7072696e746c6e60206275742064656275672066656174757265732064697361626c656443616e6e6f7420696d706f7274207461626c65736d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163654d656d6f727920696d706f7274206d757374206861766520746865206669656c64206e616d6520276d656d6f7279274d756c7469706c65206d656d6f727920696d706f72747320646566696e65644d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e52657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e00000000000044bc1000030000000000000048bc100001000000000000000000000060bc100009000000000000007365740000000000e2bd10000300000000000000e5bd100012000000a8bc100016000000386b110000000000bebc10005600000014bd100036000000386b1100000000004abd1000510000009bbd100011000000386b110000000000acbd10003600000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920604d696e696d756d506572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d7000000000b0be100003000000000000000000000095e31000090000000000000000000000000000000000000000000000000000000000000040811100b4be10000000000000000000c4be100001000000000000000100000000000000ccbe1000090000000000000000000000d3331100040000000000000000000000000000000000000000000000000000000000000040811100f8c210000000000000000000d8be10000100000000000000010000004e6f77002f0000000000000001000000350000000dbf100024000000446964557064617465000000e0be10002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e000000000000006cbf10000d0000000000000095e310000900000000000000408111007cbf100000000000000000008cbf100004000000000000004d696e696d756d506572696f640000002f000000000000000100000092000000acbf10005a00000006c010005a00000060c0100059000000b9c010001c00000020546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e0000000000000004c110000a0000000000000010c1100001000000000000000000000028c1100001000000000000007365745f756e636c657300000000000049c110000a0000000000000053c110000e00000030c11000190000002050726f76696465206120736574206f6620756e636c65732e6e65775f756e636c65735665633c543a3a4865616465723e417574686f7273686970000000000074c210000600000000000000000000007ac210003a0000000000000000000000000000000000000000000000000000000000000040811100b4c210000000000000000000c4c2100001000000000000000100000000000000ccc21000060000000000000000000000423111000c0000000000000000000000000000000000000000000000000000000000000040811100d4c210000000000000000000e4c2100001000000000000000000000000000000ecc210000c0000000000000000000000d3331100040000000000000000000000000000000000000000000000000000000000000040811100f8c21000000000000000000008c31000010000000000000001000000556e636c65735665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e2f00000000000000010000003100000058c3100007000000417574686f7200002f0000000000000001000000360000003fc3100019000000446964536574556e636c65732f00000000000000010000003600000010c310002f000000205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e20417574686f72206f662063757272656e7420626c6f636b2e20556e636c657300b0b9100048000000820a00000a000000556e636c657320616c72656164792073657420696e20626c6f636b2e756e636c652069732067656e65736973756e636c657320746f6f206869676820696e20636861696e756e636c6520706172656e74206e6f7420696e20636861696e756e636c65206e6f7420726563656e7420656e6f75676820746f20626520696e636c75646564756e636c6520616c726561647920696e636c75646564626164206f726967696e3a20657870656374656420746f206265206e6f206f726967696e626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e64657873746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c696420747970650000e0c410001900000000c5100048000000420100000e00000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e727360c510000e0000006ec5100048000000400100004a0000006578706c696369742070616e69632f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e7273000060c510000e0000006ec5100048000000410100004a000000e8c51000340000001cc6100045000000ac0000000300000074686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e7472616374732f7372632f657865632e72730000002f000000000000000100000093000000940000009500000096000000970000009800000053797374656d204e756d62657253797374656d2045787472696e73696373526f6f7453797374656d2044696765737453797374656d20426c6f636b4861736853797374656d204163636f756e744e6f6e636500000a68110028000000f4c610003f0000009d000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f626162652f7372632f6c69622e7273000a681100280000004cc7100041000000dd000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f73797374656d2f7372632f6c69622e7273000000f4c610003f0000009d0000000100000074696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c53797374656d20506172656e744861736853797374656d2052616e646f6d4d6174657269616c0030c8100048000000880a00000e00000053797374656d204576656e747353797374656d204576656e74546f706963730000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000080c910000a00000000000000386b11000000000000000000000000008cc9100001000000000000000000000094c9100006000000000000009cc91000010000000000000000000000b4c91000010000000000000000000000bcc910000e00000000000000ccc91000010000000000000000000000e4c91000010000000000000000000000ecc910000800000000000000f4c910000100000000000000000000000cca100001000000000000000000000014ca10000b0000000000000020ca100001000000000000000000000038ca100001000000000000000000000040ca10000c000000000000004cca100001000000000000000000000064ca1000010000000000000066696c6c5f626c6f636b000045cb10004800000072656d61726b0000000000003ecb10000700000000000000d5ca10000700000023cb10001b0000007365745f686561705f70616765730000000000001bcb1000050000000000000020cb100003000000dcca10003f0000007365745f636f6465000000004b1c11000300000000000000d5ca100007000000c3ca1000120000007365745f73746f726167650000000000b1ca10000500000000000000b6ca10000d00000096ca10001b0000006b696c6c5f73746f72616765000000008aca100004000000000000008eca1000080000006cca10001e000000204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e6b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e5665633c75383e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573753634204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b20412062696720646973706174636820746861742077696c6c20646973616c6c6f7720616e79206f74686572207472616e73616374696f6e20746f20626520696e636c756465642e53797374656d0000000000bcd010000c0000000101000000000000423111000c00000000000000c8d0100008000000000000000000000000000000000000004081110048df10000000000000000000d0d0100001000000000000000100000000000000d8d010000e00000000000000000000000611110003000000000000000000000000000000000000000000000000000000000000004081110024d110000000000000000000e8d0100001000000000000000000000000000000f0d0100013000000000000000000000003d1100006000000000000000000000000000000000000000000000000000000000000004081110024d1100000000000000000000cd110000100000000000000000000000000000014d110001000000000000000000000000611110003000000000000000000000000000000000000000000000000000000000000004081110024d11000000000000000000034d11000010000000000000000000000000000003cd1100014000000000000000000000050d1100010000000000000000000000000000000000000000000000000000000000000004081110048df1000000000000000000060d110000200000000000000010000000000000070d110000900000001010000000000001bf610000e0000000000000005f4100007000000000000000000000000000000000000004081110020d2100000000000000000007cd110000100000000000000010000000000000084d110000d0000000101000000000000061111000300000000000000d5ca100007000000000000000000000000000000000000004081110094d110000000000000000000a4d1100001000000000000000100000000000000acd110000e0000000000000000000000bad11000120000000000000000000000000000000000000000000000000000000000000040811100ccd110000000000000000000dcd1100002000000000000000100000000000000ecd110000600000000000000000000001bf610000e000000000000000000000000000000000000000000000000000000000000004081110048df10000000000000000000f4d1100001000000000000000100000000000000fcd110000a000000000000000000000005f4100007000000000000000000000000000000000000000000000000000000000000004081110020d21000000000000000000008d210000100000000000000010000000000000010d210000e000000000000000000000005f4100007000000000000000000000000000000000000000000000000000000000000004081110020d21000000000000000000030d210000100000000000000010000000000000038d210000600000000000000000000003ed210000b00000000000000000000000000000000000000000000000000000000000000408111004cd2100000000000000000005cd210000100000000000000010000000000000064d210000600000000000000000000006ad2100023000000000000000000000000000000000000000000000000000000000000004081110090d210000000000000000000a0d2100001000000000000000100000000000000a8d210000a0000000000000000000000b2d210000a0000000000000000000000000000000000000000000000000000000000000040811100bcd210000000000000000000ccd2100001000000000000000100000000000000d4d210000b0000000201010000000000dfd21000020000000000000005f410000700000000000000e1d21000210000000000000040811100fcde1000000000000000000004d310000d00000000000000010000004163636f756e744e6f6e6365543a3a496e646578b1d910001f00000045787472696e736963436f756e74000083d910002e000000416c6c45787472696e736963735765696768745765696768740000003ed9100045000000416c6c45787472696e736963734c656e2f000000000000000100000036000000eed81000500000004e6578745765696768744d756c7469706c6965725765696768744d756c7469706c6965727ad8100059000000d3d810001b000000426c6f636b4861736800000054d810002600000045787472696e736963446174610000002f00000000000000010000003100000005d810004f00000052616e646f6d4d6174657269616c2869382c205665633c543a3a486173683e292f00000000000000010000009900000048d7100069000000b1d71000540000004e756d626572000006d7100042000000506172656e74486173680000ead610001c00000045787472696e73696373526f6f7400002f00000000000000010000009a000000a5d61000450000004469676573744469676573744f663c543e0000002f00000000000000010000003100000069d610003c0000004576656e74735665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e0000002f00000000000000010000003100000041d61000280000004576656e74436f756e744576656e74496e6465782f00000000000000010000004100000013d610002e0000004576656e74546f7069637328295665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e00006cd3100049000000b5d3100025000000386b110000000000dad310004b00000025d410002a000000386b1100000000004fd4100054000000a3d4100051000000f4d4100039000000386b1100000000002dd510005300000080d5100053000000d3d5100040000000204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20546865206669727374206b657920736572766573206e6f20707572706f73652e2054686973206669656c64206973206465636c6172656420617320646f75626c655f6d6170206a75737420666f7220636f6e76656e69656e6365206f66207573696e67206072656d6f76655f707265666978602e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e20536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e6720627566666572207769746820746865206069386020707265666978206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546865206e65787420776569676874206d756c7469706c6965722e20546869732073686f756c6420626520757064617465642061742074686520656e64206f66206561636820626c6f636b206261736564206f6e207468652073617475726174696f6e206c6576656c2028776569676874292e20546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e53657373696f6e20486973746f726963616c53657373696f6e7365706f636820696e64696365732077696c6c206e6576657220726561636820325e3634206265666f726520746865206465617468206f662074686520756e6976657273653b20716564000000000000000000000000000000000000000000000000000000000000000072656163686564206d6178696d756d2064657074682c2063616e6e6f7420637265617465009b00000018000000040000009c0000009d0000009e0000009f000000a0000000a10000006e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e7469617465206665656e6f7420656e6f7567682067617320746f20706179207472616e736665722066656562616c616e636520746f6f206c6f7720746f2073656e642076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7464657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756572656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c20666565636f6e747261637420686173206265656e206576696374656470726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b207165640000004cc7100041000000dd000000010000003a6865617070616765733a636f64657472616e73616374696f6e20626972746820626c6f636b20616e6369656e7442616265000000000000bcde10000a000000000000000000000020cb100003000000000000000000000000000000000000000000000000000000000000004081110048df10000000000000000000c8de100001000000000000000100000000000000d0de10000b0000000000000000000000dbde10001e0000000000000000000000000000000000000000000000000000000000000040811100fcde100000000000000000000cdf10000100000000000000010000000000000014df10000e000000000000000000000020cb100003000000000000000000000000000000000000000000000000000000000000004081110048df1000000000000000000024df1000030000000000000001000000000000003cdf10000b000000000000000000000020cb100003000000000000000000000000000000000000000000000000000000000000004081110048df1000000000000000000058df10000100000000000000010000000000000060df10000a00000000000000000000006adf1000080000000000000000000000000000000000000000000000000000000000000040811100f0df1000000000000000000074df10000a000000000000000100000000000000c4df10000e00000000000000000000006adf1000080000000000000000000000000000000000000000000000000000000000000040811100f0df10000000000000000000d4df100001000000000000000100000000000000dcdf10001100000000000000000000006adf1000080000000000000000000000000000000000000000000000000000000000000040811100f0df1000000000000000000000e0100001000000000000000100000045706f6368496e6465780000cde2100015000000417574686f7269746965735665633c28417574686f7269747949642c2042616265576569676874293e0000002f000000000000000100000031000000b2e210001b00000045706f63685374617274536c6f74000019e210004000000059e210003e00000097e210001b00000043757272656e74536c6f74002f00000000000000010000003500000004e210001500000052616e646f6d6e6573735b75383b2033325d00003ee010002e000000386b1100000000006ce010000b000000386b11000000000077e0100041000000b8e010003e000000f6e01000450000003be110004500000080e1100041000000c1e11000430000004e65787452616e646f6d6e657373000027e0100017000000556e646572436f6e737472756374696f6e0000002f0000000000000001000000a200000008e010001f0000002052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e204e6578742065706f63682072616e646f6d6e6573732e205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e20232053656375726974792054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e792063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d626572732074686174207468697320286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e20626520757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e2043757272656e7420736c6f74206e756d6265722e20536c6f74206174207768696368207468652063757272656e742065706f636820737461727465642e20497420697320706f737369626c652074686174206e6f20626c6f636b2077617320617574686f7265642061742074686520676976656e20736c6f7420616e64207468652065706f6368206368616e676520776173207369676e616c6c6564206c61746572207468616e20746869732e2043757272656e742065706f636820617574686f7269746965732e2043757272656e742065706f636820696e6465782e00000000000054e310000d0000000000000020cb100003000000000000004081110064e31000000000000000000074e3100002000000000000000000000084e31000110000000000000095e31000090000000000000040811100a0e310000000000000000000b0e31000050000000000000045706f63684475726174696f6e0000002f0000000000000001000000a300000008e51000430000004be510003f0000004578706563746564426c6f636b54696d65543a3a4d6f6d656e7400002f0000000000000001000000a4000000d8e310004100000019e41000440000005de41000410000009ee4100042000000e0e410002800000020546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e6720626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f7574207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f74206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e20546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746f2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e00000000000070e71000080000000000000078e71000020000000000000000000000386b110000000000000000000000000088e71000060000000000000090e71000030000000000000000000000386b1100000000000000000000000000a8e710000e00000000000000386b1100000000000000000000000000386b1100000000000000000000000000b6e710000700000000000000c0e71000020000000000000000000000386b1100000000000000000000000000d0e710000600000000000000d8e71000010000000000000000000000386b1100000000000000000000000000e0e710000900000000000000d8e71000010000000000000000000000386b1100000000000000000000000000e9e710000900000000000000d8e71000010000000000000000000000386b1100000000000000000000000000f2e710000800000000000000fce71000020000000000000000000000386b11000000000000000000000000000ce81000090000000000000018e81000020000000000000000000000386b110000000000000000000000000028e810000b0000000000000034e81000010000000000000000000000386b11000000000000000000000000003ce81000060000000000000044e81000030000000000000000000000386b1100000000000000000050726f706f73656487e81000090000006a101100070000005461626c6564000087e81000090000006a1011000700000090e810000e00000045787465726e616c5461626c6564537461727465640000006be810000f0000007ae810000d00000050617373656400006be810000f0000004e6f7450617373656443616e63656c6c6564457865637574656400006be810000f000000d33311000400000044656c65676174656400000061101100090000006110110009000000556e64656c6567617465640061101100090000005665746f6564000061101100090000005ce810000400000060e810000b00000048617368426c6f636b4e756d6265725265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e6465785665633c4163636f756e7449643e44656d6f637261637920566f74654f6644656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6644656d6f6372616379204465706f7369744f6644656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7344656d6f6372616379205075626c696350726f7073c0e9100048000000880a00000e0000004e6f207075626c69632070726f706f73616c732077616974696e6743616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d00002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e727344656d6f6372616379204e65787445787465726e616c4e6f2065787465726e616c2070726f706f73616c2077616974696e6700000000000028ed1000070000000000000030ed100002000000000000000000000060ed100006000000000000000000000090ed1000060000000000000098ed1000010000000000000000000000b0ed1000060000000000000000000000e0ed10000400000000000000e4ed100002000000000000000000000014ee10000700000000000000000000004cee10000a00000000000000e4ed100002000000000000000000000058ee100007000000000000000000000090ee10001100000000000000a4ee100004000000000000000000000004ef100006000000000000000000000034ef1000100000000000000044ef10000100000000000000000000005cef10000200000000000000000000006cef100010000000000000007cef100001000000000000000000000094ef1000020000000000000000000000a4ef100019000000000000007cef1000010000000000000000000000c0ef1000020000000000000000000000d0ef10000d00000000000000e0ef100003000000000000000000000028f0100008000000000000000000000068f010000d0000000000000078f0100001000000000000000000000090f0100001000000000000000000000098f010001100000000000000acf01000010000000000000000000000c4f01000010000000000000000000000ccf010000d00000000000000dcf0100003000000000000000000000024f110000100000000000000000000002cf11000090000000000000038f1100001000000000000000000000050f1100005000000000000000000000078f110000c00000000000000386b110000000000000000000000000084f11000050000000000000000000000acf110000c0000000000000038f11000010000000000000000000000b8f11000050000000000000000000000e0f110000800000000000000e8f1100002000000000000000000000018f2100005000000000000000000000040f210000a00000000000000386b11000000000000000000000000004cf21000050000000000000070726f706f73650000000000f4f610000800000000000000fcf610001000000000000000ee2511000500000000000000f32511001500000099f9100028000000386b1100000000007e1b11000b0000002e27110008000000d3f91000200000001f1c11000c0000007365636f6e64000000000000f4f610000800000000000000c1f910001200000099f9100028000000386b1100000000007e1b11000b0000002e27110008000000d4251100100000001f1c11000c000000766f746500000000c0f31000090000000000000093f310001800000000000000e0ed1000040000000000000095f910000400000019f910004d00000066f910002f000000386b1100000000007e1b11000b0000002e27110008000000faf810001f0000001f1c11000c00000070726f78795f766f7465000068f8100054000000bcf810003e000000386b1100000000007e1b11000b0000002e27110008000000faf810001f0000001f1c11000c000000656d657267656e63795f70726f706f736500000000000000f4f610000800000000000000fcf6100010000000000000005ff8100009000000000000007ae810000d000000000000000ef610000d000000000000001bf610000e0000000000000029f6100005000000000000001bf610000e00000060f7100022000000386b11000000000082f7100058000000daf7100046000000386b11000000000020f810003f000000656d657267656e63795f63616e63656c00000000c0f3100009000000000000006be810000f0000000cf7100054000000e8f610000c00000065787465726e616c5f70726f706f736500000000f4f610000800000000000000fcf61000100000009cf610004c000000e8f610000c00000065787465726e616c5f70726f706f73655f6d616a6f726974790000002ef610005600000084f610001800000065787465726e616c5f7075736800000000000000f8f310000d0000000000000005f4100007000000000000000ef610000d000000000000001bf610000e0000000000000029f6100005000000000000001bf610000e0000000cf410005400000060f4100059000000b9f410003b000000386b110000000000f4f410003e00000032f510004b0000007df5100055000000d2f510003c0000007665746f5f65787465726e616c00000000000000f8f310000d0000000000000005f4100007000000c9f310002f00000063616e63656c5f7265666572656e64756d00000000000000c0f31000090000000000000093f3100018000000abf310001500000063616e63656c5f717565756564000000000000006ff31000040000000000000073f3100017000000000000008af3100005000000000000004e1c11000c000000000000008ff31000040000000000000093f310001800000047f31000280000007365745f70726f78790000000000000042f310000500000000000000423111000c0000001cf3100026000000386b1100000000007e1b11000b00000094f21000160000001f1c11000c00000072657369676e5f70726f7879f6f2100026000000386b1100000000007e1b11000b000000e6f21000100000001f1c11000c00000072656d6f76655f70726f7879c0f2100026000000386b1100000000007e1b11000b000000e6f21000100000001f1c11000c00000064656c656761746500000000aaf210000200000000000000423111000c00000000000000acf210000a00000000000000b6f210000a00000085f210000f000000386b1100000000007e1b11000b00000094f21000160000001f1c11000c000000756e64656c6567617465000074f2100011000000386b1100000000007e1b11000b0000002e271100080000001f1c11000c00000020556e64656c656761746520766f74652e2044656c656761746520766f74652e202d204f6e6520657874726120444220656e7472792e746f636f6e76696374696f6e436f6e76696374696f6e20436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e202d204f6e6520444220636c6561722e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e436f6d706163743c543a3a426c6f636b4e756d6265723e776869636877686174436f6d706163743c5265666572656e64756d496e6465783e2052656d6f76652061207265666572656e64756d2e7265665f696e646578205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e70726f706f73616c5f68617368543a3a48617368205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c656420696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e6520627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265202020656e61637465642e20496e6372656173656420746f2060456d657267656e6379566f74696e67506572696f646020696620746f6f206c6f772e766f74696e675f706572696f64543a3a426c6f636b4e756d62657264656c6179205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e70726f706f73616c426f783c543a3a50726f706f73616c3e205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d65205363686564756c6520616e20656d657267656e6379207265666572656e64756d2e20546869732077696c6c206372656174652061206e6577207265666572656e64756d20666f7220746865206070726f706f73616c602c20617070726f766564206173206c6f6e6720617320636f756e74656420766f7465732065786365656420607468726573686f6c646020616e642c20696620617070726f7665642c20656e61637465642061667465722074686520676976656e206064656c6179602e204974206d61792062652063616c6c65642066726f6d206569746865722074686520526f6f74206f722074686520456d657267656e6379206f726967696e2e7468726573686f6c6420566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e566f74652050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e436f6d706163743c50726f70496e6465783e202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e44656d6f63726163790000000024ff10000f000000000000000000000087e81000090000000000000000000000000000000000000000000000000000000000000040811100e4ff1000000000000000000034ff1000010000000000000001000000000000003cff10000b000000000000000000000047ff10002b0000000000000000000000000000000000000000000000000000000000000040811100a0001100000000000000000074ff1000010000000000000001000000000000007cff100009000000010100000000000087e81000090000000000000085ff1000210000000000000000000000000000000000000040811100a8ff10000000000000000000b8ff100001000000000000000000000000000000c0ff10000f00000000000000000000006be810000f0000000000000000000000000000000000000000000000000000000000000040811100e4ff10000000000000000000d0ff100001000000000000000100000000000000d8ff10000900000000000000000000006be810000f0000000000000000000000000000000000000000000000000000000000000040811100e4ff10000000000000000000f4ff100001000000000000000100000000000000fcff10001000000001010000000000006be810000f000000000000000c0011002d00000000000000000000000000000000000000408111001801110000000000000000003c00110001000000000000000000000000000000440011000d00000001010000000000001bf610000e00000000000000510011002b00000000000000000000000000000000000000408111007c00110000000000000000008c00110001000000000000000100000000000000940011000900000001010000000000006be810000f00000000000000b11a1100110000000000000000000000000000000000000040811100a00011000000000000000000b000110001000000000000000100000000000000b8001100060000000101000000000000be0011001f0000000000000095f91000040000000000000000000000000000000000000040811100e00011000000000000000000f00011000400000000000000010000000000000010011100050000000101000000000000423111000c00000000000000423111000c00000000000000000000000000000000000000408111001801110000000000000000002801110002000000000000000000000000000000380111000b0000000101010000000000423111000c00000000000000430111001a0000000000000000000000000000000000000040811100600111000000000000000000700111000100000000000000010000000000000078011100150000000000000000000000d33311000400000000000000000000000000000000000000000000000000000000000000408111005402110000000000000000009001110002000000000000000100000000000000a00111000c0000000000000000000000ac0111001c0000000000000000000000000000000000000000000000000000000000000040811100c80111000000000000000000d801110004000000000000000000000000000000f801110009000000010100000000000005f410000700000000000000010211002300000000000000000000000000000000000000408111002402110000000000000000003402110002000000000000000000000000000000440211000d000000010100000000000005f410000700000000000000d3331100040000000000000000000000000000000000000040811100540211000000000000000000640211000100000000000000010000005075626c696350726f70436f756e7400d40711003d0000005075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0000b4071100200000004465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e2900002f00000000000000010000003c00000093071100210000005265666572656e64756d436f756e7400470711004c0000004e65787454616c6c790000002f00000000000000010000004100000015071100320000005265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29000000e80611002d000000446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e2f000000000000000100000031000000b806110030000000566f74657273466f720000002f0000000000000001000000310000008f06110029000000566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e744964290000002f0000000000000001000000360000005005110058000000a805110053000000fb05110057000000520611003d00000050726f78790000002f000000000000000100000036000000e20411004c0000002e0511002200000044656c65676174696f6e7328543a3a4163636f756e7449642c20436f6e76696374696f6e290000002f0000000000000001000000a500000092041100500000004c6173745461626c656457617345787465726e616c0000003204110056000000880411000a0000004e65787445787465726e616c28543a3a50726f706f73616c2c20566f74655468726573686f6c64292f0000000000000001000000a600000044031100560000009a03110055000000ef03110029000000180411001a000000426c61636b6c69737428543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e292f00000000000000010000003c000000b6021100540000000a0311003a00000043616e63656c6c6174696f6e730000002f0000000000000001000000360000006c0211004a000000205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e2041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d6265722028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e20546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e20546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743a202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f72202d20605075626c696350726f70736020697320656d7074792e205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c69632070726f706f73616c2e2047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e00000000000000640911000f000000000000001bf610000e00000000000000408111003c0a11000000000000000000740911000500000000000000000000009c0911000c000000000000001bf610000e0000000000000040811100bc0911000000000000000000a8091100010000000000000000000000b00911000c000000000000001bf610000e0000000000000040811100bc0911000000000000000000cc091100010000000000000000000000d40911000e000000000000001d3311000c0000000000000040811100e40911000000000000000000f4091100010000000000000000000000fc09110015000000000000001bf610000e0000000000000040811100140a11000000000000000000240a11000100000000000000000000002c0a11000d000000000000001bf610000e00000000000000408111003c0a110000000000000000004c0a11000100000000000000456e6163746d656e74506572696f64009b0b11005c000000386b110000000000f70b11004c000000430c11005a0000009d0c1100270000004c61756e6368506572696f64620b110039000000566f74696e67506572696f642f0000000000000001000000a7000000340b11002e0000004d696e696d756d4465706f73697400002f0000000000000001000000a8000000e70a11004d000000456d657267656e6379566f74696e67506572696f640000002f0000000000000001000000a9000000ac0a11003b000000436f6f6c6f6666506572696f640000002f0000000000000001000000aa000000540a11005800000020506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e20546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e20546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e2049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e73757265207468617420766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e207468652063617365207768657265207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e0a68110028000000dc0c1100440000004b010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f64656d6f63726163792f7372632f6c69622e7273dc0c1100440000004b0100000100000076616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7763616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f776e6f7420612070726f787944656d6f63726163792043616e63656c6c6174696f6e7370726f706f73616c207374696c6c20626c61636b6c697374656470726f706f73616c20616c7265616479206d616465696e76616c696420686173686e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974796e6f2070726f706f73616c206d61646544656d6f637261637920426c61636b6c6973746e6f2065787465726e616c2070726f706f73616c756e6b6e6f776e2070726f706f73616c6964656e74697479206d6179206e6f74207665746f20612070726f706f73616c20747769636544656d6f63726163792050726f7879616c726561647920612070726f787977726f6e672070726f78796e6f742064656c656761746564756e6b6e6f776e20696e64657863616e6e6f742063616e63656c207468652073616d652070726f706f73616c20747769636570726f706f73616c206e6f7420666f756e64766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e00000000000000ac0f11000600000000000000b40f1100010000000000000000000000bc0f1100010000000000000000000000c40f11000e00000000000000d40f1100020000000000000000000000e40f1100020000000000000000000000f40f11000c000000000000000010110002000000000000000000000010101100010000000000000052657761726400006a1011000700000009111100380000004f66666c696e655761726e696e670000611011000900000006111100030000007110110052000000c3101100430000004f66666c696e65536c61736861101100090000006a101100070000001810110049000000204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e4163636f756e74496442616c616e6365204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20676976656e20616e206f66666c696e652d7761726e696e6720286974206973207374696c6c2077697468696e20697473206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e75333220416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e672043757272656e7445726153746172745374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67205374616b6572735374616b696e67204c65646765725374616b696e672050617965655374616b696e6720536c617368436f756e7468656164206f66205374616b696e67204e6f6d696e61746f72734c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656468656164206f66205374616b696e672056616c696461746f7273000000000000008c141100040000000000000090141100030000000000000000000000d81411000f0000000000000000000000501511000a000000000000005c151100010000000000000000000000741511000e0000000000000000000000e41511000600000000000000ec15110001000000000000000000000004161100170000000000000000000000bc1611001100000000000000386b1100000000000000000000000000d016110010000000000000000000000050171100080000000000000058171100010000000000000000000000701711000b0000000000000000000000c81711000800000000000000d0171100010000000000000000000000e81711000b0000000000000000000000401811000500000000000000386b1100000000000000000000000000481811000b0000000000000000000000a01811000900000000000000ac181100010000000000000000000000c41811000b00000000000000000000001c1911000e000000000000002c191100010000000000000000000000441911000b00000000000000000000009c1911001300000000000000b0191100010000000000000000000000c8191100010000000000000000000000d01911000d00000000000000386b1100000000000000000000000000e0191100080000000000000000000000201a11001700000000000000b0191100010000000000000000000000381a1100010000000000000000000000401a11001100000000000000541a11000100000000000000000000006c1a11000100000000000000626f6e6400000000a61d11000a00000000000000b01d11002300000000000000ee2511000500000000000000f32511001500000000000000281e110005000000000000002d1e11001100000044271100590000009d27110021000000386b110000000000be27110054000000386b1100000000001228110049000000386b1100000000007e1b11000b0000005b281100350000002e27110008000000902811001a000000386b110000000000aa2811005b00000005291100490000001f1c11000c000000626f6e645f6578747261000000000000362711000e00000000000000f3251100150000000826110059000000612611000d000000386b1100000000006e26110054000000c2261100590000001b27110013000000386b110000000000bf1c110055000000386b1100000000007e1b11000b000000141d11003a0000002e27110008000000d4251100100000001f1c11000c000000756e626f6e64000000000000ee2511000500000000000000f325110015000000ff211100550000005422110040000000942211004d000000386b110000000000e1221100520000003323110030000000386b110000000000632311004f000000b22311004f000000012411003f000000386b110000000000d31d110055000000386b1100000000004024110026000000386b1100000000007e1b11000b00000066241100500000004e1d110026000000b6241100590000000f2511005c0000006b25110069000000d425110010000000e42511000a00000077697468647261775f756e626f6e646564000000f81f11004b000000386b110000000000432011004d0000009020110013000000386b110000000000d31d110055000000386b110000000000a32011001b000000386b1100000000007e1b11000b000000be201100550000001321110051000000642111003d000000a12111005e000000741d1100320000001f1c11000c00000076616c696461746500000000d71f11000500000000000000dc1f11001c0000009d1f11003a000000386b110000000000881c110037000000386b110000000000d31d110055000000386b1100000000007e1b11000b000000141d11003a0000004e1d110026000000741d1100320000001f1c11000c0000006e6f6d696e617465000000006e1f11000700000000000000751f110028000000851e110044000000386b110000000000881c110037000000386b110000000000d31d110055000000386b1100000000007e1b11000b000000c91e110049000000121f110026000000381f1100360000001f1c11000c0000006368696c6c0000003e1e110032000000386b110000000000881c110037000000386b110000000000d31d110055000000386b1100000000007e1b11000b000000141d11003a000000701e110015000000741d1100320000001f1c11000c0000007365745f706179656500000000000000281e110005000000000000002d1e1100110000005a1c11002e000000386b110000000000881c110037000000386b110000000000d31d110055000000386b1100000000007e1b11000b000000141d11003a0000004e1d110026000000741d1100320000001f1c11000c0000007365745f636f6e74726f6c6c6572000000000000a61d11000a00000000000000b01d1100230000005a1c11002e000000386b110000000000881c110037000000386b110000000000bf1c110055000000386b1100000000007e1b11000b000000141d11003a0000004e1d110026000000741d1100320000001f1c11000c0000007365745f76616c696461746f725f636f756e7400000000004b1c110003000000000000004e1c11000c0000002b1c110020000000666f7263655f6e65775f657261000000e61a11004f000000351b110049000000386b1100000000007e1b11000b000000891b110020000000a91b110045000000ee1b1100310000001f1c11000c0000007365745f6f66666c696e655f736c6173685f677261636500c21a1100240000007365745f696e76756c6e657261626c657300000000000000a71a11000a00000000000000b11a110011000000741a11003300000020536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72735665633c543a3a4163636f756e7449643e2053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e2023203c7765696768743e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d205472696767657273207468652050687261676d656e20656c656374696f6e2e20457870656e7369766520627574206e6f7420757365722d636f6e74726f6c6c65642e202d20446570656e6473206f6e2073746174653a20604f287c65646765737c202a207c76616c696461746f72737c29602e2023203c2f7765696768743e2054686520696465616c206e756d626572206f662076616c696461746f72732e6e6577436f6d706163743c7533323e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e636f6e74726f6c6c65723c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636520546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e202d20436f6e7461696e73206f6e6520726561642e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c2077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602e202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e2020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c2077686963682069732020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360292063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e65656420746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e6365602920202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e202d204f6e6520444220656e7472792e203c2f7765696768743e76616c7565436f6d706163743c42616c616e63654f663c543e3e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f72207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e20556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e7420746861742063616e2062652061646465642e202d204f2831292e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c20626520746865206163636f756e74207468617420636f6e74726f6c732069742e206076616c756560206d757374206265206d6f7265207468616e2074686520606578697374656e7469616c5f6465706f7369746020646566696e656420696e207468652042616c616e636573206d6f64756c652e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e202d20546872656520657874726120444220656e74726965732e204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e5374616b696e6700000000000000903011000e000000000000000000000006111100030000000000000000000000000000000000000000000000000000000000000040811100603311000000000000000000a030110001000000000000000100000000000000a830110015000000000000000000000006111100030000000000000000000000000000000000000000000000000000000000000040811100c03011000000000000000000d030110001000000000000000100000000000000f40f11000c0000000000000000000000d8301100070000000000000000000000000000000000000000000000000000000000000040811100e03011000000000000000000f030110001000000000000000100000000000000f8301100110000000000000000000000061111000300000000000000000000000000000000000000000000000000000000000000408111006033110000000000000000000c31110001000000000000000100000000000000143111000d0000000000000000000000b11a110011000000000000000000000000000000000000000000000000000000000000004081110018341100000000000000000024311100030000000000000001000000000000003c311100060000000101000000000000423111000c00000000000000423111000c0000000000000000000000000000000000000040811100883111000000000000000000503111000100000000000000000000000000000058311100060000000101000000000000423111000c000000000000005e3111002900000000000000000000000000000000000000408111008831110000000000000000009831110001000000000000000000000000000000a0311100050000000101000000000000423111000c000000000000002d1e1100110000000000000000000000000000000000000040811100a83111000000000000000000b831110001000000000000000100000000000000c03111000a0000000101010000000000423111000c00000000000000dc1f11001c0000000000000000000000000000000000000040811100cc3111000000000000000000dc31110001000000000000000100000000000000e43111000a0000000101010000000000423111000c00000000000000b11a1100110000000000000000000000000000000000000040811100183411000000000000000000f031110001000000000000000100000000000000f8311100070000000101000000000000423111000c00000000000000ff3111002400000000000000000000000000000000000000408111002432110000000000000000003432110004000000000000000100000000000000543211000e0000000000000000000000b11a110011000000000000000000000000000000000000000000000000000000000000004081110018341100000000000000000064321100010000000000000001000000000000006c3211000a0000000000000000000000763211000800000000000000000000000000000000000000000000000000000000000000408111006033110000000000000000008032110001000000000000000100000000000000883211000f0000000000000000000000973211000b0000000000000000000000000000000000000000000000000000000000000040811100a43211000000000000000000b432110001000000000000000100000000000000bc3211001b0000000000000000000000136511000c0000000000000000000000000000000000000000000000000000000000000040811100603311000000000000000000d832110001000000000000000100000000000000e0321100110000000000000000000000f13211000a0000000000000000000000000000000000000000000000000000000000000040811100fc32110000000000000000000c33110001000000000000000100000000000000143311000900000000000000000000001d3311000c00000000000000000000000000000000000000000000000000000000000000408111002c33110000000000000000003c33110003000000000000000100000000000000543311000a0000000101000000000000423111000c00000000000000061111000300000000000000000000000000000000000000408111006033110000000000000000007033110002000000000000000100000000000000803311000f00000000000000000000008f331100280000000000000000000000000000000000000000000000000000000000000040811100183411000000000000000000b833110002000000000000000100000000000000c83311000b0000000000000000000000d3331100040000000000000000000000000000000000000000000000000000000000000040811100d83311000000000000000000e833110001000000000000000100000000000000f03311000a0000000000000000000000fa3311001d00000000000000000000000000000000000000000000000000000000000000408111001834110000000000000000002834110001000000000000000100000056616c696461746f72436f756e7400000e3b11002a0000004d696e696d756d56616c696461746f72436f756e740000002f0000000000000001000000ab000000be3a11005000000050657262696c6c002f0000000000000001000000ac0000006a3a1100540000004f66666c696e65536c61736847726163650000001c3a11004e000000496e76756c6e657261626c657300000048391100560000009e39110053000000f13911002b000000426f6e646564543a3a4163636f756e744964000008391100400000004c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e002f000000000000000100000036000000b73811005100000050617965650000002f0000000000000001000000360000007e3811003900000056616c696461746f727300002f0000000000000001000000ad0000002d381100510000004e6f6d696e61746f72730000d4371100590000005374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e002f0000000000000001000000ae00000017371100530000006a37110046000000386b110000000000b03711002400000043757272656e74456c65637465640000d83611003f00000043757272656e74457261457261496e6465780000c13611001700000043757272656e7445726153746172744d6f6d656e744f663c543e00002f000000000000000100000035000000a33611001e00000043757272656e74457261537461727453657373696f6e496e646578006f3611003400000043757272656e744572615265776172647345726152657761726473002f0000000000000001000000af0000002c36110043000000536c6f745374616b6542616c616e63654f663c543e0000002f000000000000000100000030000000b03511004c000000386b110000000000fc35110030000000536c617368436f756e7400002f0000000000000001000000410000003c35110057000000933511001d000000526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e00c0341100550000001535110027000000466f7263654e6577457261626f6f6c002f0000000000000001000000360000007934110047000000426f6e646564457261735665633c28457261496e6465782c2053657373696f6e496e646578293e002f00000000000000010000003100000030341100490000002041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202857686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e205265776172647320666f72207468652063757272656e74206572612e205573696e6720696e6469636573206f662063757272656e7420656c6563746564207365742e205468652073657373696f6e20696e646578206174207768696368207468652063757272656e742065726120737461727465642e20546865207374617274206f66207468652063757272656e74206572612e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e00000000a83b11000e00000000000000136511000c0000000000000040811100b83b11000000000000000000c83b1100010000000000000000000000d03b11000f0000000000000076321100080000000000000040811100e03b11000000000000000000f03b1100010000000000000053657373696f6e7350657245726100002f000000000000000100000037000000313c11001c000000426f6e64696e674475726174696f6e002f0000000000000001000000b0000000f83b110039000000204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e204e756d626572206f662073657373696f6e7320706572206572612e5374616b696e672043757272656e74456c656374656400803c110048000000880a00000e0000000000000000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e72735374616b696e6720536c6f745374616b65000000003e110019000000203e110048000000bb0100002d000000b10000002800000004000000b2000000b30000000000000000000000b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f6f70732f61726974682e72730a68110028000000803e1100420000009f020000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f6c69622e727300009040110023000000664011002a000000803e1100420000009f02000001000000636f6e74726f6c6c657220616c72656164792070616972656463616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e6365737461736820616c726561647920626f6e6465646e6f74206120636f6e74726f6c6c65726e6f74206120737461736863616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b73756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d7074795374616b696e6720496e76756c6e657261626c6573696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e007041110048000000ab010000230000007041110048000000ac01000023000000494111001c000000646c110018000000df0300000d0000000041110049000000870200001d000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f736f72742e7273617373657274696f6e206661696c65643a206d6964203c3d206c656e00000000000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e727300411100490000009d0000003a0000000041110049000000a4000000300000004f6666636861696e206572726f723a207375626d697474696e67207472616e73616374696f6e206661696c6564214f6666636861696e206572726f723a206465636f64696e6720417574686f726974794964206661696c6564214f6666636861696e206572726f723a206465636f64696e6720576f726b6572537461747573206661696c6564214f6666636861696e206572726f723a2065787472696e736963206372656174696f6e206661696c6564214f6666636861696e206572726f723a207369676e696e67206661696c6564214f6666636861696e206572726f723a206665746368696e67206e6574776f726b207374617465206661696c656421496d4f6e6c696e65204c6173744e6577457261537461727454726561737572792050726f706f73616c436f756e74547265617375727920417070726f76616c73000000000000010000000200000004000000080000001000000044656d6f6372616379205075626c696350726f70436f756e7444656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204e65787454616c6c7944656d6f6372616379204c6173745461626c656457617345787465726e616c746f6f206d616e7920696e737472756374696f6e73000000c44311002400000059691100170000004102000009000000547269656420746f20736872696e6b20746f2061206c6172676572206361706163697479436f6e7472616374204761735370656e74436f6e74726163742043757272656e745363686564756c65436f6e7472616374204163636f756e74436f756e7465726578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d6578745f6e6f776578745f64697370617463685f63616c6c6578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e746578745f7365745f72656e745f616c6c6f77616e63656578745f72656e745f616c6c6f77616e63656578745f7072696e746c6e6578745f626c6f636b5f6e756d6265724e6f6e2d656d7074792066756e6374696f6e20626f64792065787065637465640000264611000f000000354611000200000037461100030000009845110030000000c84511005e0000007d00000005000000617373657274696f6e206661696c65643a20636f6e746578742e6672616d655f737461636b2e69735f656d70747928292f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7761736d692d76616c69646174696f6e2d302e312e302f7372632f66756e632e7273417420696e737472756374696f6e202840293a2052657475726e207479706573206c656e6774682073686f756c642062652030206f72203143616e2774206465636f6465207761736d20636f64654d6f64756c65206973206e6f742076616c69646d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72796d756c7469706c65207461626c6573206465636c617265647461626c652065786365656473206d6178696d756d2073697a6520616c6c6f776564757365206f6620666c6f6174696e6720706f696e74207479706520696e2066756e6374696f6e20747970657320697320666f7262696464656e757365206f6620666c6f6174696e6720706f696e74207479706520696e206c6f63616c7320697320666f7262696464656e757365206f6620666c6f6174696e6720706f696e74207479706520696e20676c6f62616c7320697320666f7262696464656e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c656463616c6c6465706c6f796465706c6f792066756e6374696f6e2069736e2774206578706f72746564756e6b6e6f776e206578706f72743a20657870656374696e67206f6e6c79206465706c6f7920616e642063616c6c2066756e6374696f6e7366756e6374696f6e206861732061206e6f6e2d6578697374656e7420747970656578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e617475726563616c6c2066756e6374696f6e2069736e2774206578706f727465646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c65b44a11001e000000d24a11001f00000066756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2071656466756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2066756e6374696f6e5f73656374696f6e5f6c656e203d3d20636f64655f73656374696f6e5f6c656e3b2071656400009a4a11001a000000754a11000a0000007f4a11001b00000073746172742066756e6374696f6e20657870656374656420746f20686176652074797065205b5d202d3e205b5d000000644a110011000000444a110020000000244a110020000000fc491100280000007365676d656e74206f66667365742073686f756c642072657475726e20493332746f6f206d616e79206d656d6f727920726567696f6e7320696e20696e6465782073706163653a20746f6f206d616e79207461626c657320696e20696e6465782073706163653a20747279696e6720746f20696d706f7274206d757461626c6520676c6f62616c206475706c6963617465206578706f72742046756e6374696f6e20232072656164696e672f76616c69646174696f6e206572726f723a204d697373696e6720626f647920666f722066756e6374696f6e206c656e677468206f662066756e6374696f6e2073656374696f6e206973202c207768696c65206c656e206f6620636f64652073656374696f6e20697320000000104b11001c0000002c4b11005a0000004d00000028000000ffffffff48617368207461626c65206361706163697479206f766572666c6f772f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6861736862726f776e2d302e312e382f7372632f7261772f6d6f642e72736d616b655f746f705f6672616d655f706f6c796d6f72706869632069732063616c6c6564207769746820656d707479206672616d6520737461636b000000b50000000c00000004000000b6000000746869732066756e6374696f6e2063616e27742062652063616c6c6564207769746820656d707479206672616d6520737461636b4d6973706c6163656420656c736520696e737472756374696f6e00004c4d110047000000934d110005000000104d110037000000474d110005000000dd4c110017000000d44c110009000000264f110014000000bc4c110018000000d44c110009000000264f1100140000008c4c11001d000000a94c1100130000003781110001000000546f6f206c61726765206d656d6f727920616c69676e6d656e7420325e20286578706563746564206174206d6f737420547279696e6720746f2075706461746520676c6f62616c20206f66207479706520547279696e6720746f20757064617465206c6f63616c20416e79537065636966696300380000000400000004000000b70000004c6162656c7320696e2062725f7461626c6520706f696e747320746f20626c6f636b206f6620646966666572656e742074797065733a2020616e6420496620626c6f636b20776974686f757420656c736520726571756972656420746f2068617665204e6f526573756c7420626c6f636b20747970652e2042757420697420686173202074797065a84d110018000000c04d11000b000000556e657870656374656420737461636b20686569676874202c20657870656374656420547279696e6720746f2061636365737320706172656e74206672616d6520737461636b2076616c7565732e0000084e1100170000001f4e11001600000045787065637465642076616c7565206f66207479706520206f6e20746f70206f6620737461636b2e20476f7420000000404e110007000000537461636b3a200000000100ca4e110024000000a04e110006000000a64e11000e000000b44e1100160000007c4e110024000000a04e1100060000006d6178696d756d206d656d6f72792073697a65206d757374206265206174206d6f7374202070616765736d6178696d756d206c696d697420206973206c657373207468616e206d696e696d756d20696e697469616c206d656d6f72792073697a65206d757374206265206174206d6f7374200000004f110026000000264f110014000000547279696e6720746f20696e697469616c697a65207661726961626c65206f6620747970652020776974682076616c7565206f66207479706520496e69742065787072657373696f6e2073686f756c6420616c776179732062652077697468206c656e67746820324e6f6e20636f6e7374616e74206f70636f646520696e20696e69742065787072d14f110007000000e34f110022000000d14f110007000000d84f11000b00000045787072657373696f6e20646f65736e277420656e647320776974682060656e6460206f70636f6465476c6f62616c20206973206d757461626c6520646f65736e277420657869737473206f72206e6f742079657420646566696e65640000001850110010000000285011000f0000004d656d6f727920617420696e6465782020646f65736e27742065786973747300485011000f000000285011000f0000005461626c6520617420696e6465782000f957110012000000285011000f000000785011000e000000285011000f0000005479706520617420696e646578200000e650110010000000285011000f000000b850110010000000d85011000e000000b850110010000000c850110010000000457870656374656420676c6f62616c2020746f20626520696d6d757461626c6520746f206265206d757461626c65476c6f62616c20617420696e646578206e6f6e2d656d70747920737461636b206578706563746564000020511100200000004051110012000000747279696e6720746f206765742076616c756520617420706f736974696f6e20206f6e20737461636b206f662073697a6520636865636b656420636f75706c65206f66206c696e65732061626f7665007851110015000000657863656564656420737461636b206c696d697420000000380000000400000004000000b80000004c6f63616c732072616e6765206e6f7420696e2033322d6269742072616e6765d851110022000000fa511100150000000f52110007000000547279696e6720746f20616363657373206c6f63616c207769746820696e64657820207768656e20746865726520617265206f6e6c7920206c6f63616c734672616d6569735f706f6c796d6f7270686963000000380000000400000004000000b9000000656e645f61726974790000003800000004000000040000001d0000006272616e63685f617269747973746172745f6865696768744e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e000000945511000a00000046756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64885511000c000000f05411000b000000737461636b206d757374206265206e6f6e2d656d70747900e55411000b0000009e54110006000000737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e64009754110007000000905311006c000000c800000011000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e72736d61785f686569676874707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768742f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e72737472756e633a20707573683a20e054110005000000747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77706f703a20756e726561636861626c65706f705f6672616d653a20636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e64734055110048000000820a00000a000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f736c6963652f6d6f642e7273707573685f6672616d653a2066756e635f6964783a2066756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e6473a0561100650000002301000017000000785611002500000043616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a200000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a09090909716564f9571100120000000b5811000f000000cc5711000a000000d657110014000000ea5711000f0000005369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e76676173305811005800000088000000160000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e727300b45811001c0000008858110013000000c604000009000000617373657274696f6e206661696c65643a20656e64203c3d206c656ee85811001e0000008858110013000000b303000009000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e4e6f6e65536f6d650000380000000400000004000000ba000000e559110012000000f75911000c0000006066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e644636345265696e74657270726574493634556e726561636861626c654e6f70426c6f636b00380000000400000004000000bb0000004c6f6f704966456c7365456e644272003800000004000000040000001d0000004272496642725461626c6500380000000400000004000000bc00000052657475726e43616c6c43616c6c496e6469726563740000380000000400000004000000bd00000044726f7053656c6563744765744c6f63616c5365744c6f63616c5465654c6f63616c476574476c6f62616c536574476c6f62616c4933324c6f61644936344c6f61644633324c6f61644636344c6f61644933324c6f616438534933324c6f616438554933324c6f61643136534933324c6f61643136554936344c6f616438534936344c6f616438554936344c6f61643136534936344c6f61643136554936344c6f61643332534936344c6f616433325549333253746f726549363453746f726546333253746f726546363453746f726549333253746f72653849333253746f7265313649363453746f72653849363453746f7265313649363453746f7265333243757272656e744d656d6f727947726f774d656d6f7279493332436f6e737400380000000400000004000000be000000493634436f6e7374380000000400000004000000bf000000463332436f6e7374463634436f6e73743800000004000000040000000400000049333245717a49333245714933324e654933324c74534933324c74554933324774534933324774554933324c65534933324c655549333247655349333247655549363445717a49363445714936344e654936344c74534936344c74554936344774534936344774554936344c65534936344c655549363447655349363447655546333245714633324e654633324c7446333247744633324c65463332476546363445714636344e654636344c7446363447744636344c654636344765493332436c7a49333243747a493332506f70636e744933324164644933325375624933324d756c493332446976534933324469765549333252656d5349333252656d55493332416e644933324f72493332586f7249333253686c4933325368725349333253687255493332526f746c493332526f7472493634436c7a49363443747a493634506f70636e744936344164644936345375624936344d756c493634446976534936344469765549363452656d5349363452656d55493634416e644936344f72493634586f7249363453686c4936345368725349363453687255493634526f746c493634526f74724633324162734633324e65674633324365696c463332466c6f6f724633325472756e634633324e656172657374463332537172744633324164644633325375624633324d756c4633324469764633324d696e4633324d6178463332436f70797369676e4636344162734636344e65674636344365696c463634466c6f6f724636345472756e634636344e656172657374463634537172744636344164644636345375624636344d756c4636344469764636344d696e4636344d6178463634436f70797369676e493332577261704936344933325472756e63534633324933325472756e63554633324933325472756e63534636344933325472756e6355463634493634457874656e6453493332493634457874656e64554933324936345472756e63534633324936345472756e63554633324936345472756e63534636344936345472756e6355463634463332436f6e7665727453493332463332436f6e7665727455493332463332436f6e7665727453493634463332436f6e766572745549363446333244656d6f7465463634463634436f6e7665727453493332463634436f6e7665727455493332463634436f6e7665727453493634463634436f6e766572745549363446363450726f6d6f74654633324933325265696e746572707265744633324936345265696e746572707265744636344633325265696e746572707265744933324e6f526573756c7456616c756500380000000400000004000000b7000000463634493332493634463332496e76616c696444617461547261696c696e6744617461556e6578706563746564456f66086011000b000000492f4f204572726f723a20000a681100280000002c6011005000000087000000090000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e72730a681100280000002c601100500000009000000009000000436f756e63696c20446573697265645365617473436f756e63696c20566f7465436f756e74436f756e63696c204e657874566f746572536574436f756e63696c20566f746572436f756e74436f756e63696c2043616e646964617465436f756e74000000000000007c6111000e000000000000008c611100010000000000000000000000946111000100000000000000000000009c6111000600000000000000386b1100000000000000000000000000a4611100010000000000000000000000ac6111000700000000000000386b1100000000000000000000000000b461110001000000000000004e6577417574686f72697469657300002f621100170000000b621100240000005061757365640000e461110027000000526573756d656400bc611100280000002043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c28417574686f7269747949642c20753634293e4772616e64706146696e616c69747920417574686f72697469657354696d657374616d7020496e697469616c697a656462616265736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214241424520696e686572656e742064617461206e6f7420666f756e64426162652045706f6368496e6465784261626520417574686f726974696573426162652045706f63685374617274536c6f74426162652043757272656e74536c6f74426162652052616e646f6d6e65737342616265204e65787452616e646f6d6e6573734261626520556e646572436f6e737472756374696f6e5374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e672043757272656e744572615374616b696e672043757272656e74457261537461727453657373696f6e496e6465785374616b696e672043757272656e74457261526577617264735374616b696e6720466f7263654e65774572615374616b696e6720426f6e64656445726173417574686f727368697020446964536574556e636c657353657373696f6e2043757272656e74496e64657853657373696f6e204368616e67656453657373696f6e205175657565644368616e6765640000000000786411000a00000000000000846411000100000000000000000000008c64110002000000000000004e657753657373696f6e0000136511000c0000009c64110055000000f164110022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e53657373696f6e496e64657853657373696f6e2053746f72656452616e676500002f0000000000000001000000c0000000c1000000c20000002f0000000000000001000000c0000000c1000000c200000074696d737461703054696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d702044696455706461746500000000286611001000000000000000386b110000000000000000000000000038661100010000000000000000000000406611000f00000000000000386b110000000000000000000000000050661100010000000000000045787472696e736963537563636573736d6611002500000045787472696e7369634661696c656400586611001500000020416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e53797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e7369637357656967687453797374656d20416c6c45787472696e736963734c656e53797374656d204e6578745765696768744d756c7469706c69657253797374656d2045787472696e7369634461746153797374656d204576656e74436f756e7448617368206e6f7420657175616c0000406711001900000060671100500000005800000022000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e72736578745f6368696c645f73746f726167655f726f6f74206e657665722072657475726e73207533323a3a6d61785f76616c75653b2071656452756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e67696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d342e312e332f7372632f636f6465632e7273000000a86811002d000000d56811000c000000e168110003000000617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20ec6811003400000064657374696e6174696f6e20616e6420736f7572636520736c69636573206861766520646966666572656e74206c656e67746873646c110018000000470800000900000048691100110000005969110017000000ed020000050000006361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e7273e0691100460000006301000013000000380000000400000004000000c3000000c4000000c50000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f72002f0000000000000001000000c6000000000000002f72757374632f633739386466666163396463386338323337346462343866356234373436393063633665393638362f7372632f6c6962636f72652f666d742f6d6f642e7273010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202020202020202020202020202020202020202020203030303030303030303030303030303040404040400000000000000000000000000486b110020000000686b1100120000002f0000000000000001000000c7000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e64657820697320303030313032303330343035303630373038303931303131313231333134313531363137313831393230323132323233323432353236323732383239333033313332333333343335333633373338333934303431343234333434343534363437343834393530353135323533353435353536353735383539363036313632363336343635363636373638363937303731373237333734373537363737373837393830383138323833383438353836383738383839393039313932393339343935393639373938393900007c6c110006000000826c110022000000646c110018000000040a0000050000007372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820c46c110016000000da6c11000d000000646c1100180000000a0a000005000000736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d00ae6d11000b0000006280110016000000e76c110001000000986d110016000000e307000009000000408011000e0000004e801100040000005280110010000000e76c110001000000986d110016000000e707000005000000008011002b0000002b801100150000007a01000015000000ae6d11000b000000b96d110026000000df6d110008000000e76d110006000000e76c110001000000986d110016000000f4070000050000007372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f662060000000366e110002000000206e1100160000005404000011000000206e110016000000480400002800000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f20e07911004a000000307c110000020000307e11003a00000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b020001020202020302020202040205060202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200010305050606030706080809110a1c0b190c140d120e0d0f0410031212130916011705180219031a071c021d011f1620032b042c022d0b2e01300331023201a702a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f183858ba4a6bebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f747596972f5f262e2fa7afb7bfc7cfd7df9a409798308f1fc0c1ceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100757070207150d500443032d03010411060f0c3a041d255f206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082b0582ff1118082f112d032010210f808c048297190b158894052f053b07020e180980b030740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880c73035040a06380846080c06740b1e035a0459098083181c0a16094808808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b02100111041205131114021502170219041c051d0824016a036b02bc02d102d40cd509d602d702da01e005e102e802ee20f004f906fa020c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1ca8a9d8d909379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a22253e3fc5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d00c72a3a4cbcc6e6f5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a808617094e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b602048080a80a65e22450b0a060d1339070a362c041080c03c64530c0180a0451b4808531d398107460a1d03474937030e080a0639070a81361980c7320d839b66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b654b0439071140041c97f80882f3a50d811f3103110408818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b80d52d031a040281703a0501850080d7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a0d035d033d391d0d2c040907020e06809a83d60a0d030b05740c59070c140c0438080a0628081e527703310380a60c14040305030d06856a000000c0791100200000002700000019000000c0791100200000002800000020000000c0791100200000002a00000019000000c0791100200000002b00000018000000c0791100200000002c0000002000000000000000000000007372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21f003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000f0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c833000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d0000000000001e1f202100000000002200230024252600000000270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002829000000000000000000000000000000002a2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000002d2e00002f0000000000000000000000000000000000000000000000000000000000003031320000000000000000000000000000000000000000003300000029000000000000340000000000000000000000000000000000000000000000350036000000000000000000000000000000000000000000000000000037380000383838390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff060000f00c01000000fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f0000800000000000000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db0700000000000000f0000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f66206066616c736574727565426f72726f774572726f72426f72726f774d75744572726f720000386b1100000000002b801100150000008e04000005000000386b110000000000c4801100020000003a200000d8801100150000003c040000050000007372632f6c6962636f72652f726573756c742e727320202020207b202c20207b0a000000c80000000c00000004000000c9000000ca000000cb0000002c0a0000380000000400000004000000cc000000cd000000ce000000207d7d28280a2c290a5d5b4572726f720041c082c6000b08000000000000000000d79003046e616d6501ce9003d704000e6578745f626c616b65325f323536011f6578745f6765745f616c6c6f63617465645f6368696c645f73746f7261676502176578745f636c6561725f6368696c645f73746f72616765030f6578745f7365745f73746f72616765040c6578745f74776f785f31323805196578745f6765745f616c6c6f63617465645f73746f7261676506166578745f73616e64626f785f6d656d6f72795f6e6577071b6578745f73616e64626f785f6d656d6f72795f74656172646f776e08176578745f73616e64626f785f696e7374616e746961746509126578745f73616e64626f785f696e766f6b650a1d6578745f73616e64626f785f696e7374616e63655f74656172646f776e0b146578745f6765745f73746f726167655f696e746f0c116578745f636c6561725f73746f726167650d166578745f6b696c6c5f6368696c645f73746f726167650e106578745f636c6561725f7072656669780f166578745f6368696c645f73746f726167655f726f6f74100e6578745f7072696e745f7574663811156578745f7365745f6368696c645f73746f7261676512166578745f73616e64626f785f6d656d6f72795f67657413166578745f73616e64626f785f6d656d6f72795f73657414126578745f737232353531395f76657269667915126578745f656432353531395f766572696679160d6578745f7072696e745f68657817156578745f6c6f63616c5f73746f726167655f67657418216578745f6c6f63616c5f73746f726167655f636f6d706172655f616e645f736574190a6578745f7075626b65791a116578745f6e6574776f726b5f73746174651b086578745f7369676e1c166578745f7375626d69745f7472616e73616374696f6e1d156578745f6c6f63616c5f73746f726167655f7365741e106578745f73746f726167655f726f6f741f186578745f73746f726167655f6368616e6765735f726f6f74200b6578745f74776f785f363421236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74220d6578745f7072696e745f6e756d230a6578745f6d616c6c6f6324086578745f6672656525693c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a686135376361333065383863303365303426693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6833373139666330653134623738636436270c5f5f727573745f616c6c6f63280e5f5f727573745f7265616c6c6f63290e5f5f727573745f6465616c6c6f632a08727573745f6f6f6d2b34616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68336430333339633338393539363364642c693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a68666465363930626535643534353335662d4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68313930363035356636656634383237362e5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68323435356333626435643931376463372f3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683830383935343231326364636362353530633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6861653539633130346438353133613637313d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6861326361663333656666326237333732327c6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a6835633263313064386662343437643537333d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6861376564663762316162326163643437343d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6866613865343765633933663536666432353d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6866616630326139373163346561326261362d616c6c6f633a3a7665633a3a5665633c543e3a3a72657461696e3a3a68313264383737303031386466653032333736636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a683863356337376530636566356239316638443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68343262303431353366346265353836383948616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303161313636363462353235323061643a4b3c616c6c6f633a3a7665633a3a496e746f497465723c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68663764316263323333653933356434373b4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68326461353465626366663537666563623c796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a68393636393230613235616638643962363d30636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68343861333664316238316265333563653e36636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a68356364313639613635616238353965393f4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833363566626164393361653031316662404e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837316361626362323361376461623764414e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837366163313032323131663866333733424e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837366432313166353166623965376535434e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838356533343365643362656139623361444f3c616c6c6f633a3a7665633a3a5665633c75383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839653666323565383838303562306638454e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838653162663830323038623436323862464e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861656661353936643166623837656439474e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862616338653862656565356632616538484e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68663366396461396132336437353666354999013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383635343265656636313566636131354a513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68356130336335333262653737623464394b513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68383163363735636233376362643435384c513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68636637353230666433393733623732394d3373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a68613032373064313462303632633031664e2e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a68643935376630653162613762346162644f6c3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a683530626630633838373135643038613150723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683432346533633966643965353666383051753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6836303438386636313863323464616261525d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830363032666566393830393762343861535e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683366333530343539333033356663666354633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683038643361663639353837313639653555443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a686566323037386633376634356236613156303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838306262653634343531326431353032572d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68626563663738613764313663316663655829636f72653a3a70616e69636b696e673a3a70616e69633a3a683861643532323536383465376335666159643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68646262326435373236386334653436375a303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68306663393031333831336461313064325b3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68383831313733353133393938363536355c3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68663565393639663138373231616135665d367061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68633433653166343632633166303232365e4473726d6c5f737570706f72743a3a7472616974733a3a5369676e6564496d62616c616e63653c422c503e3a3a6d657267653a3a68393961636662653066623534346133385f4e73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573743c486173683e3a3a636f6e766572745f66697273743a3a6864663130346139623139623564343238607a3c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a7b7b636c6f737572657d7d3a3a686464386166653364373833613466363561bc017375627374726174655f7072696d6974697665733a3a6f6666636861696e3a3a5f494d504c5f454e434f44455f464f525f4f70617175654e6574776f726b53746174653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a6f6666636861696e3a3a4f70617175654e6574776f726b53746174653e3a3a656e636f64655f746f3a3a683864653337646339656532636163646662593c73726d6c5f636f6e7472616374733a3a7761736d3a3a5761736d566d2061732073726d6c5f636f6e7472616374733a3a657865633a3a566d3c543e3e3a3a657865637574653a3a683765333337393936323566663435303863663c73726d6c5f636f6e7472616374733a3a7761736d3a3a5761736d566d2061732073726d6c5f636f6e7472616374733a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a6864363435393936323564393661643362647d3c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a68613365643138333131633165303431656589013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a68643532333765626565386262646162346689013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a68373830316462666232383639633365396782013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a68613836663537336437383362323836346884013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a68326132393766353731373666386361326984013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a68356466383631343361653432386562366a84013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a68386132303764613038646361303032386b85013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a68393631313338353961323437343534396c87013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a68663338646437666630316265323433666d86013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a68653238626430613136333234663737636e85013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a68633235333030353435363561303231616f8f013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a68373239396531613762306235393139397084013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d3a3a68386230343966393830626561396630347181013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a6863356634376663366532666365326363728b013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a6839366164373461323632303534303837738a013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a6864363536323266343863303236666239748a013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a6866623732393936366436646236353066758b013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a68633864333539353230333061333532307690013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f72656e745f616c6c6f77616e63653a3a6865346536313364303366316231626364778c013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72656e745f616c6c6f77616e63653a3a68353239636230386335303534313937367885013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7072696e746c6e3a3a6836623535393535386661346339653736798a013c73726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e7472616374733a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f626c6f636b5f6e756d6265723a3a68316365326162663363373165346338657a3273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a68356134386464313632363132383634357b4573726d6c5f636f6e7472616374733a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a68366565343861623838353831666630307c135f5f727573745f616c6c6f635f7a65726f65647da7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a68343530373665613734316439633232317e643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a68303930356635623465623032383638317f34636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68666661376637663531656636613535368001303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68303333356131383037343065326233648101303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68613432353462303530376636356239388201313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834336239616334336136363337613934830189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a686433613133633364616236393537616384013573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a686261616264646563653365626462363885018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a683563616137313734316335333937353386013573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a683464373234623632323533336661633887017f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a686465373063346364396166633432623988014073726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a686433643562663333343338323266626289013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a68373837306238356533356562373234328a013873726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a68653364393136363537613365336232368b013673726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6b696c6c5f73746173683a3a68363338323138363461313337653137398c01453c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a6765743a3a68393061613361653732633833656639338d01d5013c73726d6c5f73657373696f6e3a3a4e6578744b6579733c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a67656e657261746f723a3a53746f72616765446f75626c654d61703c616c6c6f633a3a7665633a3a5665633c75383e2c3c542061732073726d6c5f73657373696f6e3a3a54726169743e3a3a56616c696461746f7249642c3c542061732073726d6c5f73657373696f6e3a3a54726169743e3a3a4b6579733e3e3a3a6b65795f666f723a3a68316239363465623039623463346132308e013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68633766633938653035376633333530628f01cf013c73726d6c5f73657373696f6e3a3a4b65794f776e65723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a67656e657261746f723a3a53746f72616765446f75626c654d61703c616c6c6f633a3a7665633a3a5665633c75383e2c287533322c20616c6c6f633a3a7665633a3a5665633c75383e292c3c542061732073726d6c5f73657373696f6e3a3a54726169743e3a3a56616c696461746f7249643e3e3a3a6b65795f666f723a3a6832353734656439663437656665366662900181013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a683765636562373662383465393430366691018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a683935333330336237353137646136643992013e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a683038396261373831343933393664343293013473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a683864613465376434306434633132323094013573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a6862343536656135666434613534336564950186013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a68376534653632323434633361613564659601653c73726d6c5f62616c616e6365733a3a54616b65466565733c542c493e2061732073725f7072696d6974697665733a3a7472616974733a3a5369676e6564457874656e73696f6e3e3a3a76616c69646174653a3a683137353630656536396263363164333797014b73725f7072696d6974697665733a3a7472616974733a3a4163636f756e744964436f6e76657273696f6e3a3a696e746f5f6163636f756e743a3a686437643561323437653936343338323398013573726d6c5f617574686f72736869703a3a4d6f64756c653c543e3a3a617574686f723a3a683339353630386434306535366633363899013d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a68386630396366306366633562363166329a013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a68366338316362376438353434333664639b016f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744672656542616c616e63653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68363634653735366135323539653534659c014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a68373633383762663065306136613933399d014873726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68363163646335643166613233316130619e01593c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f72616765446f75626c654d61703c4b312c4b322c563e3e3a3a72656d6f76655f7072656669783a3a68666332656331616339616533373238659f018e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a6836343734656565626631616462323833a0014273726d6c5f636f6e7472616374733a3a72656e743a3a7472795f65766963745f6f725f616e645f7061795f72656e743a3a6838393064333938626561646466353532a101483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6864373666326632313961373465366630a2012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6837613261353064316536613633333539a3013c73726d6c5f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835326137393065313637653833353630a4013e73726d6c5f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6837653761323665343030333039643361a5014773726d6c5f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6863393961633631393662646166633363a6018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a6836663666396631663235363035646265a701483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6839643635656336376635656131633538a80189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6831376262623835373466386234353634a90149636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a6863623838333863316264623130623561aa012f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a6839663433396331306235306661323566ab0135636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a6838303465663539383063333530396330ac018a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6832666663656134306236326365313862ad018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a6835303762386634643561356339336231ae014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835353135623762323533613661313033af014e73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6863353237363563363832333466303030b0019c013c73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a57696e646f7753697a6544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865326138353762393238303937326531b101493c73726d6c5f696d5f6f6e6c696e653a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830643964303130633531373464376137b201c6013c73726d6c5f696d5f6f6e6c696e653a3a5265636569766564486561727462656174733c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a67656e657261746f723a3a53746f72616765446f75626c654d61703c7533322c3c542061732073726d6c5f696d5f6f6e6c696e653a3a54726169743e3a3a417574686f7269747949642c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a6b65795f666f723a3a6839666162343066636163363438666538b3013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835636338646430373363316466383730b4018c013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e496e697469616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6862353162313535666137343830656531b5013573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a6835636365313535316465373165343638b6014073726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6832373433366465363333363863636664b7013873726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a616c6c5f766f746572733a3a6865376465623636613036333563346364b8013a73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a6862356366623966646431326362343134b901ab023c73726d6c5f656c656374696f6e733a3a566f746572496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f656c656374696f6e733a3a566f746572496e666f3c3c3c542061732073726d6c5f656c656374696f6e733a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a6831326661383262363539366434343230ba018e013c73726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4368616e67654d656d626572733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6368616e67655f6d656d626572733a3a6863656133623466363866353031346137bb013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837366535353966323933386565373462bc01bc013c73726d6c5f656c656374696f6e733a3a566f746572733c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3e3a3a6765743a3a6831656136663334656630636666373762bd013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832386162326161326664313362653432be013e73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838396534323930613036383532316361bf01713c73726d6c5f656c656374696f6e733a3a5f5f4765744279746553747275637443616e646964617465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834353035376464383562306231303133c0014773726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6836393765613834396437376665333936c10199013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a564f5445525f5345545f53495a4544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839666233326632353861666432393464c20197013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a566f74696e67506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864323236346132656331623566666433c3019e013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a496e6163746976654772616365506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834343861363466376433346165346563c40195013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4361727279436f756e7444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833323038376632623932366330353438c50194013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a566f74696e6746656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862666235346331666336643035383166c60195013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a566f74696e67426f6e6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835396333333633306664303535383639c70198013c73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a43616e646964616379426f6e6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835306436353364353736306636663333c801493c73726d6c5f656c656374696f6e733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6862313838373164656434333234353339c9015d3c73726d6c5f656c656374696f6e733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6865623237373936363537376332616332ca01323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6831666533363132333331313638633334cb013e73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a6831623765636666336534616135336566cc013473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a6866613936323364346331613731636561cd013a73726d6c5f656c656374696f6e733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a6839646330343430376563653138376565ce01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6834346562313437633932326265303632cf01793c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6832663762353865313534386536353861d001793c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6866343935363530383330653161313765d1017b3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6866643430616431306566633961633266d2017d3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6863303037346238366565616666666133d30180013c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6864393037393837623738363764356263d401743c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6865636138346635343737616165636630d501723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832666162346632393762633738393362d601613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833343835613264643835383431636332d701723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6839656363306337636437383038323737d801483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6837363131623933613539323766346231d901613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6863646339396163383037623662316336da014d73726d6c5f636f6e7472616374733a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a6832386263643136653763303735623063db013173726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a72616e646f6d3a3a6835626633356265346662393261616566dc0127636f72653a3a7374723a3a66726f6d5f757466383a3a6830386430613533636364333636383366dd017d3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6835303462306465336135333763313630de014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6838346466386135383335633337333363df0148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6830613564653661326333656633346165e0012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a6865616138303137356633383063613361e1014673726d6c5f636f6e7472616374733a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6861303336313832306535346562393361e2017d3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6832656534383537613666386661386334e3017f3c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6865616365323935303530343734363264e40181013c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6839626533333032656563316461643338e50184013c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6837666339623464643564653636666165e601783c73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6838356631373164656563363033336438e701367061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6865366538646366383963393164383733e8013a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835313661376532386333333139343162e9013c73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6835396665663231653832316339333063ea01663c73726d6c5f6772616e6470613a3a5f5f4765744279746553747275637453746174653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837636539336431333136393762366139eb014173726d6c5f737570706f72743a3a7472616974733a3a496d62616c616e63653a3a6d617962655f73756273756d653a3a6861393365353238393933316362383966ec013b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6864316463633936373665393831316535ed013d73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6862653963626362376434633964363963ee014673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6835333132373733363164353661346664ef018e013c73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4275726e44656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836306564613365323036363061346138f00195013c73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5370656e64506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863623665323938376635303361653937f10196013c73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a50726f706f73616c426f6e6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834633263343366353835343865633133f2013673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a6837353937346665653933353466353965f3013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837626461616565326462313031336137f4014f73726d6c5f636f6e7472616374733a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a6833383666633233353830333065353239f5015c3c73726d6c5f74726561737572793a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6835303363326164363635633065383333f6013b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6832633035326438376533663134326634f70130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6834353035636165666339373038373732f801633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830353463613161343333316134343562f901683c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a73697a655f68696e743a3a6835346530646462616330383561633239fa013e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a6831623935356631303935383134306330fb01693c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862303434633932643539306564396465fc01613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6839623462643566353137353466323766fd014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6838633162393638623437653339643037fe01aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6838663038613532313138663338346335ff013a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683834376431616439393133353538633780023c73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a683434313938383563633762383063623781024573726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6831653962326534666561326361353039820299013c73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a44454455505f4b45595f50524546495844656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686639643163336137393264633134353083028c013c73726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a54776f783634436f6e6361742061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654861736865723e3a3a686173683a3a683164626261313264323064653436316184023973726d6c5f636f6e7472616374733a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a683264643638373532626636626134376585024273726d6c5f636f6e7472616374733a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a68306335343562343937666534366438628602a5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c4c6f6f6b75703e3e3a3a636865636b3a3a68666538656361633632383338353936328702b3013c73726d6c5f73797374656d3a3a426c6f636b486173683c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173683e3e3a3a6765743a3a68343431663362346533343335343861358802cf017375627374726174655f636f6e73656e7375735f626162655f7072696d6974697665733a3a6469676573743a3a5f494d504c5f4445434f44455f464f525f526177426162655072654469676573743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f636f6e73656e7375735f626162655f7072696d6974697665733a3a6469676573743a3a526177426162655072654469676573743e3a3a6465636f64653a3a683037313535396534633038343031363689023573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a68393666656334636533303439306538668a023673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a68366231633530646430346231333463628b02673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a68323233383038663965353761356432338c023273726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a626f6e6465643a3a68386434613934326262666536326333618d02c9023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a68373038356335343662636132396435658e026f3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68393162623365343663353534323132398f02800173726d6c5f64656d6f63726163793a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f64656d6f63726163793a3a43616c6c3c543e3e3a3a6465636f64653a3a68653736633238363934363832396632309002840173726d6c5f636f6c6c6563746976653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e3e3a3a6465636f64653a3a68653231663834313361313066313634669102800173726d6c5f636f6e7472616374733a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e7472616374733a3a43616c6c3c543e3e3a3a6465636f64653a3a68366163336136623765636339306135359202870173726d6c5f636f6c6c6563746976653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e3e3a3a656e636f64655f746f3a3a68323335653561653030363565396561349302880173726d6c5f636f6e7472616374733a3a5f494d504c5f454e434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e7472616374733a3a5363686564756c653e3a3a656e636f64655f746f3a3a686562633839646631373665653164653894022b616c6c6f633a3a736c6963653a3a6d657267655f736f72743a3a68313463626638636433356132306266319502443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68363865366439316135393139346230319602463c73726d6c5f73797374656d3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68386266663463613331373663343263639702443c73726d6c5f626162653a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68663664393738646663633837376133659802473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68313663623861346338646234313334349902473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68373666633963373334666261336461359a02493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68303431353366306437383936366461329b024c3c73726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68326666376631336164376163353738649c02493c73726d6c5f636f6e7472616374733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68333135656332616632303137313131659d027e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a68643763656231616366303439653433329e029c0173726d6c5f636f6c6c6563746976653a3a5f494d504c5f454e434f44455f464f525f5261774576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6c6c6563746976653a3a5261774576656e743c486173682c4163636f756e7449642c493e3e3a3a656e636f64655f746f3a3a68386634353235316432393239363762389f023e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a6830386133316462373566343330376236a002406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a6864613235613331643933323561306635a102416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a6830646162326362666463313439353061a202426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a6838323134323562646137346134663963a302416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a6839613264663133306238666132323335a402416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a6831656130653737366464353437353263a502436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a6864303336633430386134353234373864a6024e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6c6c6563746976655f496e7374616e6365313a3a6832396437623861636430646431663531a702436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f656c656374696f6e733a3a6864316262316639616565353031323836a802416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a6839363135363934636266656563346462a902426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a6866326661643637386264666634373730aa02436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e7472616374733a3a6865636666393337666661353935366132ab02436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696d5f6f6e6c696e653a3a6865396637336636353965323164343131ac02653c6e6f64655f72756e74696d653a3a43616c6c2061732073725f7072696d6974697665733a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6865366434613766316565633561663865ad02583c6e6f64655f72756e74696d653a3a43616c6c2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6862353331636238353865323938363930ae02583c73726d6c5f626162653a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6863353536316237633731306632633539af025e3c73726d6c5f617574686f72736869703a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6832646632666438336632656164396338b0025b3c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6862376666346265626463386465616132b1025b3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6832303035636562333032366431636664b2025d3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6838656636323030356664393836613861b302603c73726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6863366537316138333437616237393437b402603c73726d6c5f636f6c6c6563746976653a3a43616c6c3c542c493e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6863623464333939326163376432636533b5025d3c73726d6c5f636f6e7472616374733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6835356337656461323135336366373732b6023973726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6865366235396363376330656539613636b7023773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833366437346636343139653935303735b802613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830653237323634646338323863393962b9027173726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a696e697469616c697a655f626c6f636b3a3a6830343433383838616235343662356438ba023773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6832613339366565346635393436316338bb0286013c28412c20422c20432c20442c20452c20462c20472c20482c20492c204a2c204b2c204c2c204d2c204e2c204f2c20502c2051292061732073725f7072696d6974697665733a3a7472616974733a3a4f6e496e697469616c697a653c4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6862643866356436373132643933333864bc027973726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a6837666661346335666566636666356439bd020c436f72655f76657273696f6ebe0212436f72655f657865637574655f626c6f636bbf024173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a6861343833323533633862386230396162c0026c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a6835613864386165636232643332343062c1023873726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a6862306162646235623134643465353630c20282013c28412c20422c20432c20442c20452c20462c20472c20482c20492c204a2c204b2c204c2c204d2c204e2c204f2c20502c2051292061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6834613038313634316331363332643861c3023373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6863353864366166643031653665613764c40215436f72655f696e697469616c697a655f626c6f636bc502114d657461646174615f6d65746164617461c602603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6862313136333934333262366238323036c702433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865326333656130663331616664363434c802623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865383930373662353839373366393932c902623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6831326337313436376537633230336666ca02623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6866356463356164333636313531353030cb02623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6835623233303931303264376564333539cc021c426c6f636b4275696c6465725f6170706c795f65787472696e736963cd021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636bce0220426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373cf023873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a6861663838366238613533323434616164d0021c426c6f636b4275696c6465725f636865636b5f696e686572656e7473d10218426c6f636b4275696c6465725f72616e646f6d5f73656564d2022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6ed3025673725f7072696d6974697665733a3a7472616e73616374696f6e5f76616c69646974793a3a56616c69645472616e73616374696f6e3a3a636f6d62696e655f776974683a3a6831333237373835313963356563373134d402214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572d502214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765d602204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765d7021e4772616e6470614170695f6772616e6470615f617574686f726974696573d80214426162654170695f737461727475705f64617461d9020d426162654170695f65706f6368da0218436f6e73656e7375734170695f617574686f726974696573db023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830626630326362356431343231643563dc023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6833326332313137616131313964646462dd02be0173726d6c5f636f6e7472616374733a3a5f494d504c5f454e434f44455f464f525f526177416c697665436f6e7472616374496e666f3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e7472616374733a3a526177416c697665436f6e7472616374496e666f3c436f6465486173682c42616c616e63652c426c6f636b4e756d6265723e3e3a3a656e636f64655f746f3a3a6830333031396235396230633565303563de023c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835653738313263326535383766336138df023e73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6832653332306130366534306263373333e00230636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830303138366630366366636233393965e1026b3c73726d6c5f636f6e7472616374733a3a5f5f4765744279746553747275637447617350726963653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831323937653934626234623331393138e202713c73726d6c5f636f6e7472616374733a3a5f5f47657442797465537472756374436f6e7472616374496e666f4f663c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831356663633937373139383066663961e302723c73726d6c5f636f6e7472616374733a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830373336343365316532386638386636e4024773726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6830303134653761653838393666656431e50298013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b4761734c696d697444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836323933353364633134333962386431e60297013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d617856616c756553697a6544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831363531353935303832653862363433e70293013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178446570746844656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833633730323537643734663966303434e80296013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a43616c6c4261736546656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837643534633062333230353030386132e90296013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a436f6e747261637446656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831383738366232346535343339303562ea029d013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5472616e73616374696f6e4279746546656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864323130333138383966623833626166eb029a013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a53757263686172676552657761726444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839643636363739303462633066303161ec029c013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a52656e744465706f7369744f666673657444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837303438303530373033373134653739ed0296013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a52656e744279746546656544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839653032303039643933303461333136ee029c013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a53746f7261676553697a654f666673657444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836653631633863663736303163666534ef029b013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a546f6d6273746f6e654465706f73697444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839376335613137306432663734346430f0029e013c73726d6c5f636f6e7472616374733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5369676e6564436c61696d48616e646963617044656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833326135613063303533336232346537f102850173726d6c5f636f6e7472616374733a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e7472616374733a3a5363686564756c653e3a3a6465636f64653a3a6831383266623166313336663762316166f202cc013c73726d6c5f636f6c6c6563746976653a3a566f74696e673c542c493e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c73726d6c5f636f6c6c6563746976653a3a566f7465733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6837643339613135396634613638326239f3028c0173726d6c5f636f6c6c6563746976653a3a5f494d504c5f4445434f44455f464f525f566f7465733a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6c6c6563746976653a3a566f7465733c4163636f756e7449643e3e3a3a6465636f64653a3a6832643432393434303730333636636233f4023f73726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6835323366313938366530646630643836f5024173726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6832653365636438323863383739393535f6024173726d6c5f636f6c6c6563746976653a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a6837336431363862656265313532663737f702463c616c6c6f633a3a626f7865643a3a426f783c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830643762653937613330343763653735f8023973726d6c5f636f6e7472616374733a3a6761733a3a726566756e645f756e757365645f6761733a3a6838313866393632316339316230343537f90234636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a6831303365623135656535646564646531fa023873726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a6830383262663632343263306632623461fb02cc013c73726d6c5f636f6c6c6563746976653a3a566f74696e673c542c493e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c73726d6c5f636f6c6c6563746976653a3a566f7465733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6861656437373063336565313436653663fc026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6861643334666633636666366665316235fd023c73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6862336662666537393032306265393735fe02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6834386165363866363430643637633930ff024573726d6c5f636f6e7472616374733a3a7761736d3a3a707265706172653a3a436f6e74726163744d6f64756c653a3a6e65773a3a68373437356366353665323338356534318003467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a6833326461336131663335633534626538810348616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a683637346166653166306130323465343082033c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a68336630636663326637346565656337618303537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a68383163333338666361303832363762378403a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a686664643761346163616662643161303785033a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a686633303131633431356339376365353886032d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a68363636643938316464366132376430638703507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a6862613763333530303062636130303664880330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683932363665303964363138393234383089033c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a68333739383539653330333963393636388a036b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68623164636337303363343663623964638b033c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68623635383930326631373535393638638c033e73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68663835666539373737653832616264358d03703c73726d6c5f617574686f72736869703a3a5f5f47657442797465537472756374446964536574556e636c65733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68343130303364663439323339376665318e034773726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68333034663035323735396230316264348f0398013c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686239363539613438323161636661376490033d73726d6c5f617574686f72736869703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683130663030303861393865653633333791033f73726d6c5f617574686f72736869703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68663765613765666566616631393237359203423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68663965633961656539353233393630339303f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68663836376561643438393337303834339403b20173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a6465636f64653a3a686566626161663766313061613930656195036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a683136363036366137303432666462353096034a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6164645f7265776172645f706f696e74735f746f5f76616c696461746f723a3a683735656331323130653264613130363497033673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a686133343062373339343239343636396698038d0173726d6c5f73797374656d3a3a5f494d504c5f454e434f44455f464f525f4576656e745265636f72643a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f73797374656d3a3a4576656e745265636f72643c452c543e3e3a3a656e636f64655f746f3a3a6831383165303465376138323761633563990330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68396130643239356566333862333764399a033973726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68626338333337653864313264346236349b033b73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68386563303065326165306565653331659c03693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68356632616561336465623162303632369d036e3c73726d6c5f73797374656d3a3a5f5f4765744279746553747275637452616e646f6d4d6174657269616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68613438386465323261623362626564359e034473726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68303539396532356662316566326537339f033873726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a74616b653a3a6837356266613036323466393030326231a0035373725f7072696d6974697665733a3a50657262696c6c3a3a66726f6d5f726174696f6e616c5f617070726f78696d6174696f6e3a3a7b7b636c6f737572657d7d3a3a6837346130386235616561303662323764a1035373725f7072696d6974697665733a3a50657262696c6c3a3a66726f6d5f726174696f6e616c5f617070726f78696d6174696f6e3a3a7b7b636c6f737572657d7d3a3a6865383661363338393838616435346161a2033173726d6c5f636f6e7472616374733a3a657865633a3a7472616e736665723a3a6862663830353466313834383466353839a30330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6861666139633866303530303439646130a40386013c73726d6c5f7374616b696e673a3a4d6f64756c653c543e2061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e456e64696e673c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f73657373696f6e5f656e64696e673a3a6832613234666264303663303234333532a5033d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f65787465726e616c3a3a6833356531373132666666373466393063a6033b73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f7075626c69633a3a6863383234336161666464663737653334a7033d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a6838313864663962306133383239316334a803a9013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6834613163653538373963373732656365a9033573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a6861366663323631343066353861643433aa033d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a6866636666623734373361373837333534ab033e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a6836633962383630386238383461313433ac03ef013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6839623362646538623237313239353830ad0380023c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2073726d6c5f64656d6f63726163793a3a436f6e76696374696f6e292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830376136373464663562323934383331ae03d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6833316131666565343761333837613666af036f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6865656561636265623434343731336162b0033973726d6c5f626162653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6831613733373937373165363531313763b103683c73726d6c5f626162653a3a5f5f4765744279746553747275637452616e646f6d6e6573733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830313132633334653937373838386530b2034273726d6c5f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6864653837393762623036323933663036b30397013c73726d6c5f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4578706563746564426c6f636b54696d6544656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837636434663762376361666466653533b40393013c73726d6c5f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a45706f63684475726174696f6e44656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861633339313932336630646561303562b5033f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a6864336565376466366531343632366162b6033873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a6837626664333464323134343062343535b7033c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6839623865373439303362613166616237b8033e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6866646263633263346636383265306163b9036f3c73726d6c5f64656d6f63726163793a3a5f5f476574427974655374727563744e65787445787465726e616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836376437386435646631303632323731ba036e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834323930336365663137353532346361bb03703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835646562366164353830366265346539bc034773726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6865333836303831323234393138383538bd0398013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a436f6f6c6f6666506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830623839323664386236623263313030be03a0013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a456d657267656e6379566f74696e67506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864643936336531386630643539383861bf0399013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d4465706f73697444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839633266363034646662653561616232c00397013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4c61756e6368506572696f6444656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837393135616137323139326261653861c103443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6836386536643931613539313934623031c203483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6835323464656336313866386533363731c303b5013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6831633631616464346133306331626537c4033573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a6862373137353137303439343332326261c503ef013c73726d6c5f64656d6f63726163793a3a426c61636b6c6973743c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c20616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e293e3e3a3a6765743a3a6865393534653832303430646532383064c603b50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a6833393463653862336266643631386531c7033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6832623333333738623965336532616637c8033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6836386433646164383736643865623336c903483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6862633938373830303863333662653266ca03483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6837623837323939626164376666626165cb033a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6831303835663934326165613066666435cc033c73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6831653964613665663737636163653537cd03723c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637443757272656e74457261526577617264733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864616431343838363463326230643566ce03703c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637443757272656e7445726153746172743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832353861326566303936323932613339cf03683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833393533663133633365306439616438d0036b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834303432353238653931353637613536d1036d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835376230323932323131336530373366d203763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832393237623461376534303233303233d3039e0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6837393139373261393137633237353836d4034573726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6831326164313066663466363966303438d50398013c73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426f6e64696e674475726174696f6e44656661756c74427974654765747465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836366661303833353962306264623630d6033773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a6836633933613435616433323637343635d70344636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a6832663966333337663331346430346261d8033973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6835323066333937386264646232376661d90330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6832383162643565356463633363633865da033e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a6862653062383765616639383834363763db0334636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a6836316630353339376265346165306436dc032e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a6865656163363335353030636638613332dd033c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a6861386333323331343935333633336265de03683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6832326536303831316239376361613731df036b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6833313464396364336663323362303032e0037d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6838343235363463313864343366306565e1036f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6834653832343164633166393264306465e2036f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6831366430333464363864636137656264e3036c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6830336336396535656266353063313036e4036f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6862626263366232363139386264373031e503443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839313834613132386161616566393339e60325616c6c6f633a3a666d743a3a666f726d61743a3a6830316632616438366163393537313166e703793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6863326538613330646462656461613462e8036b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6832306434326237363961666331303963e9032c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6861366438393436643533653864653566ea03713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6830313964323733313537306237653565eb03783c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6866313935616364666237303034356435ec037c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6862376632633030343763366262323131ed0382017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a73657269616c697a653a3a6863303933363734393566363861636234ee0386017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a6836326535643235666332313139663161ef03323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6835353664376238663535366263363963f003743c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a56617255696e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6839666632356462616530336539636139f103713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6866386261353830386362663033336237f2036f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6831383061393939346363313364656166f303457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6833343661393063316433323836303565f4034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6838636363623736663163326366313235f503397761736d695f76616c69646174696f6e3a3a76616c69646174655f6d656d6f72795f747970653a3a6834616434666439623033616666656132f603347761736d695f76616c69646174696f6e3a3a657870725f636f6e73745f747970653a3a6833376565666538356536656134653533f703553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837663965313062313761383235343565f8034a7761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a737465703a3a6834383364653935633161363461363563f903473c7761736d695f76616c69646174696f6e3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6832643737393163616533616639343330fa03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839343166666162333261613238643834fb03416861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a7472795f776974685f63617061636974793a3a6839316131643832316165666561623462fc033e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6866376632653563623862643162646665fd03457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6866646634393463363530663965333032fe0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6836636266366564636435643764353661ff033b636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a68656134643838343239623565386631648004347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f76616c75653a3a68333962623464666565633865336163668104347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f6c6162656c3a3a68306265623663623063666264383362368204407761736d695f76616c69646174696f6e3a3a7574696c3a3a4c6f63616c733a3a747970655f6f665f6c6f63616c3a3a68303962316539316364663361323835638304543c7761736d695f76616c69646174696f6e3a3a66756e633a3a537461636b56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68353262373862613035393164313065378404537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6c6f61643a3a68643631653439363063383835366639338504547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f73746f72653a3a68366264383738653965643435643134308604557761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f746573746f703a3a68656263623265346236356235623331398704547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f72656c6f703a3a68313065643039346235616632313966358804537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f756e6f703a3a68633437663530396438376362323431338904547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f62696e6f703a3a68623338343266346139323966303364388a04547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6376746f703a3a68613836306461386336626537623066638b04553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a426c6f636b5479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68626334663039353163653636626333668c0439636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a68386332653034306164313637313634348d0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68383833663961613434376433663434308e04303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68306562333530386131623964616565388f04303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68656636633035343338663334333237369004453c616c6c6f633a3a737472696e673a3a537472696e6720617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6830656338366664346535303535646566910423636f72653a3a666d743a3a77726974653a3a683263633535663738336132376161303292044c3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68376434363565363939343931383362339304553c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68343430663131396233306364383366329404303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683438373734633565333934323833323495043a636f72653a3a666d743a3a6275696c646572733a3a44656275675374727563743a3a6669656c643a3a6866326565303137626435353664666261960441707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a686535663861303461646332383866313297045a3c707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a4672616d6520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835626662636630363963393830393335980446707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a68646534363765613166633434376439399904453c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68623165623465333239306362663264349a044b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a68393230303336623534326131353238309b043f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a68336130383337643331383738633936629c0433636f72653a3a6f7074696f6e3a3a4f7074696f6e3c26543e3a3a636c6f6e65643a3a68373433326438386565653331353766649d04533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a68643630376234663532626135343434669e04323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68643466343861626239346363326466629f04613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831326332376662386135316161323330a004303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830376435323632303134396236393730a10430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830383334383934613965313131343030a204303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838393930636134353936346432353538a304303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864303639363464626265306635333034a404463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833363230363132373936373366363831a504303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837666638363233383562363432343436a604303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838306664323863366234313432386138a704303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862333333346337346662323765343063a804383c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a6862356632376432643432633533313963a904343c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a6864333732633038613461626365636263aa04363c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a666c7573683a3a6835653133333330613631633430366531ab0411727573745f626567696e5f756e77696e64ac044e73725f696f3a3a696d703a3a6578743a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6863343839343937333162663664613538ad04423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864646337663435393064333731386164ae04960173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f72616765456e747279547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f72616765456e747279547970653e3a3a656e636f64655f746f3a3a6861633536353632656363626263383462af04623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6834626364303631653731303631316333b004623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6833646134366334313938313066326233b1040a5f5f72675f616c6c6f63b2040c5f5f72675f6465616c6c6f63b3040c5f5f72675f7265616c6c6f63b404115f5f72675f616c6c6f635f7a65726f6564b5043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6839386630383364646366336530643539b6043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6861623731346430333235303038653933b7043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6838356462616235393333346166386562b804313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6838373362326233636138386434383161b90443636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a6866353332373965323066353236636366ba042e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a6865653139323635326330646133653662bb044a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831353934666636313964313766353962bc04323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837663466306566323134623135303866bd043d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a6833333765663538373237613238613566be044e636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68636238383338633162646231306235612e32343337bf0434636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a6834343432343361643936333761656136c004453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839663861393035663061343166626565c104483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833623163616232626333636335643662c204303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837306365383064366362336331373736c3042e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a6834653434386337323966353035343930c4048001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a6865376338616134366434653933636435c504533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6831303966653662636331366463343332c60430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6863616233653737643232336562623862c7042f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a6866353335666333343735643839373963c8042e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a6838396132343964633663626538643835c9043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6839643838613837643735393063376538ca043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6863626539656365346539623261666163cb043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6836383566373362343736636232376133cc043e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863616638613466613733323737393335cd04066d656d736574ce04066d656d637079cf04076d656d6d6f7665d004066d656d636d70d104095f5f6173686c746933d204095f5f6c736872746933d304085f5f6d756c746933d404095f5f75646976746933d504095f5f756d6f64746933d6040c5f5f756469766d6f64746934005f0970726f64756365727302086c616e677561676502045275737400045275737404323031380c70726f6365737365642d62790105727573746325312e33382e302d6e696768746c79202863373938646666616320323031392d30372d323729", "0x3ae31af9a378162eb2736f26855c9ad8": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0xbc3717660105a864bd63dcd430de64128d58bd0917fa8dd75aee827cf086e19c": "0x0000c16ff28623000000000000000000", - "0x68c8d2f39c4605e65218c22c5664917047e4900c797b7dd33999d94213c75049": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0x53d1471b684c8a776c80353e5981c960": "0x00407a10f35a00000000000000000000", "0x1ba14d232d3c301a93e35f55e3d7aef2d98dbb9cc0ce48f457b81b421e0f704d": "0x0000c16ff28623000000000000000000", - "0xa5e869ecc1b914a6b0cf5f02b874f5eb90f1739fbd3edd01e5835d1517fd9f72": "0x781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", - "0x717a2ee9c64ad3424e10e4461ec08296": "0x000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000400000000000100100000000020000000", - "0x26ac4a74e1ba94e0e7dbfc3b2aea083cf3c0f0d80eb999c7cebb340ee8934da9": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde780f0000c16ff286230f0000c16ff2862300", - "0xf4039aa8ae697861be900c58239e96f7": "0x0010a5d4e80000000000000000000000", - "0x3229a363ad5159bc2c48c9558128f00d2646f3a058cadf32077e9c9d9cca483f": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f", - "0xdd9b01f8462dc19488279cb351a6d861": "0x20a10700", - "0xd8bc278604e9f924a948f47f58be8f89": "0x04000000000000000000000000000000", - "0x62f532424b7b1c52f522857315040f27": "0x00407a10f35a00000000000000000000", - "0xfa8e9950d581fc080f26110dde7c7fd8": "0x109becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993327932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce4403919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", - "0xb9b861cab4bbce870c811515bd5f33d7": "0x00", - "0xc63b8a0db7e72fd87c88d8dcf4777b883f86728613c57148c4e5cdceb05b7a1a": "0x0c0001f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", - "0x5e0766c2f9e49ff3d748bdbde578a8fd": "0x0080f420e6b500000000000000000000", - "0x633daafcb669e97549c1b9d65660881016f969040bc16171709159437c31294a": "0x0f0000c16ff286230f0000c16ff2862300", - "0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000", - "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x1066bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", - "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", - "0x71020fee971bd00e8248d1830b8cffbe5b9cf4de1ea2911a1665c44fd70ab6f3": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630f0000c16ff286230f0000c16ff2862300", - "0x2b334d6ac6698775ed17edf8cd3cbd9dae56cead0d69cb54f6af6aaecba544d8": "0x0f0000c16ff286230f0000c16ff2862300", - "0xe7ea0ae62a742dc4e1a569cdb99af499": "0x0200000000000000", - "0x1b4b2c8255b431edbbb5a4f5c7dcde69": "0x0010a5d4e80000000000000000000000", - "0xf718f07ec955fb94f1b3069713461089": "0x0010a5d4e80000000000000000000000", - "0x3b7d32346a3315a351084927a27d06a7": "0x0010a5d4e80000000000000000000000", - "0xbde3e43a2a348359d103d64bc95928146bdd9ae3490e26da38d2e4d19c137507": "0x0000a0dec5adc9353600000000000000", - "0x2b89d3b6f46fc8a3aee48c9cb06d7670": "0x0010a5d4e80000000000000000000000", - "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", - "0xcf9a75deea0508104cd993c82daf57d3": "0x8096980000000000", - "0xfbb77d814ac81cfe0ef7030e8bd686f0": "0xe803000000000000", - "0xca0bd0e7fdd2e3998e5245f7c228191c": "0x96000000000000000000000000000000", - "0x579ab55d37b1220812be3c3df29d4858": "0x00000000", "0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000", - "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", - "0x27b3872d47181b4a2dc15f0da43e7026": "0xe803000000000000", - "0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000", - "0xc98362e2ca21b342cc749022ed9b560e4d29ec9862a960c2538c314f1d279635": "0x149ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e3180973474718099c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", - "0x92f53c21a80e624b3c606bc8ec0ce2a3003c4fe385bed33998bf4dc79b8970f2": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d650f0000c16ff286230f0000c16ff2862300", - "0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0c0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", - "0x6c7945a333fd28e51af43324746da2a45fd6a74613dcd61c6430fee856b550f8": "0x10809becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332807932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f805633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440803919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", - "0x934302c5ec4cb4f73a395e2184ab0aa6": "0x00e40b54020000000000000000000000", - "0xfd0cbba69a04d769ddcdbb15f5123c98041978f5241f33f78f62b48e3a02b740": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0x8b4621d5f16433d6024b5a31547c59ee24e749e051dbb4bc7e64502f2a4f62fb": "0x66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", - "0x799192c17c5cc562d709af11ace92e6a": "0x00040000", - "0x2d5205eddfc20f1a616c0391abb78a3920e823abe7ed33cfd7945dd1a1bf8651": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0xbf18c0c65fb39f32ee7c8016685c0a6056f8f924192efb2655be9a692d0b03b6": "0x00", - "0x637414312dac3b280120bf15b4f66cee": "0x00000000", - "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", - "0xa36baa0f89eff09b2facf282f27a11ba": "0x50c30000", - "0x51322b89410377cf0f1bdeeafd212f07": "0xe8030000000000000000000000000000", - "0x4517a8f9aafb0668d19c3cef51a8367afeda7eb83c7edcc4752585e5a496935e": "0x10809becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332807932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f805633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440803919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", + "0x90e2849b965314409e8bc00011f3004f": "0x04000000", + "0xeecb67c20ca6cc8ba4d4434687f61309": "0x109becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe969933201000000000000007932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f01000000000000005633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce44001000000000000003919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef0100000000000000", "0x50a63a871aced22e88ee6466fe5aa5d9": "0x9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809", - "0x0c5cbeca89340ea96c6f8fe1442df463": "0x0010a5d4e80000000000000000000000", - "0x0e4944cfd98d6f4cc374d16f5a4e3f9c": "0x0000000000000000", + "0x686f6c72b7b80bad8dba022335cb7c9e4556ac7ea200008da8046e3178eb89c1": "0x0f0000c16ff286230f0000c16ff2862300", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973f409469434914add1f77b486e5d845d79fb97e50667a4fd4066fc59fc02b72ff": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x637414312dac3b280120bf15b4f66cee": "0x00000000", + "0xfd0cbba69a04d769ddcdbb15f5123c98041978f5241f33f78f62b48e3a02b740": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0e", + "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", + "0x92f53c21a80e624b3c606bc8ec0ce2a3003c4fe385bed33998bf4dc79b8970f2": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d650f0000c16ff286230f0000c16ff2862300", + "0x77eef9fb1f954bfb3bbe274f703f6d00": "0x00000000", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b657973424b9d3c8374bdf058222242204c46ade91b3190a50218823d53e9814b9557f0": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x8cb577756012d928f17362e0741f9f2c": "0x0100000000000000", + "0x775f52f99da6e72a0984c26ae28fbfcd": "0x0000000000000000", + "0xccea67b51b4fa33ecbff70a8977ad91d9c60d620f3ab5ac9626dea15cde023b7": "0x0f0000c16ff286230f0000c16ff2862300", + "0x3a686561707061676573": "0x0800000000000000", "0xc1fdc3d212357bc2fa98f2a77b941f0c": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d6568655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde789c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", - "0xe18ad90fcd74459141a97efeed86f463": "0x08000000", - "0xfff675c76ad8a5dfbd7db9a4e80f7c0ece595ad1878d2b6fca6086b2483a055b": "0x0000c16ff28623000000000000000000", + "0x68c8d2f39c4605e65218c22c5664917047e4900c797b7dd33999d94213c75049": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0e", + "0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000", + "0x886726f904d8372fdabb7707870c2fad": "0x106e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f91060100000000000000482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e0100000000000000482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a010000000000000000299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f43780100000000000000", "0xa8e78ad25e03ac0281ec709fd3f128efb7e112239d0a7c3e1c86375109bff334": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x7935e46f94f24b82716c0142e2271de9": "0x8070000000000000", - "0x7e6064dc0e78ffebb59b3053826a9467": "0x10781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc152666bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", - "0x8cb577756012d928f17362e0741f9f2c": "0x0100000000000000", - "0x154ebcb2c318b2e1c23e43e65aea27cd1348c4c5157502d7669a31c7635019cc": "0x9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526", - "0x96f2cbaf8156f12db4af0b59d3e56f8f": "0x0010a5d4e80000000000000000000000", - "0x24b2518f9a9ee24ab0b62346d83d90b0": "0x11080000", - "0xbd393c7a86c2574659297d84a8c369613134cd3b80b8b92f816e3ff845991bf4": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993329becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332", - "0x8366297e853b97a38cca0f62019a717b": "0x00000000000000000000000000000000", - "0x90e2849b965314409e8bc00011f3004f": "0x04000000", - "0x46cef122497fefa60faf6c66d3ef05caf9870446796ae11f0a4f734fee993d8b": "0x00", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0xccea67b51b4fa33ecbff70a8977ad91d9c60d620f3ab5ac9626dea15cde023b7": "0x0f0000c16ff286230f0000c16ff2862300" - } + "0xc1bc13c775b3406279618b05c28523cb": "0x00", + "0x0c41b62474c49057a4476d0b96853c6d44e9c86c5fa130b0da3831c5eef546a0": "0x00", + "0xbf18c0c65fb39f32ee7c8016685c0a6056f8f924192efb2655be9a692d0b03b6": "0x00", + "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0x0000c16ff28623000000000000000000", + "0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000", + "0xbde3e43a2a348359d103d64bc95928146bdd9ae3490e26da38d2e4d19c137507": "0x0000a0dec5adc9353600000000000000", + "0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000", + "0x8f9a319405d14f3953657373696f6e204b65794f776e6572343a73657373696f6e3a6b6579732a2afb49dfe38fc8b2b25f22f4b0d6acccac7d6d1b5fa7cd3852ad4dfabbcb6f": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", + "0xf4adb4c4f708c4b753657373696f6e204e6578744b657973343a73657373696f6e3a6b657973711590f60a214f6f06502eb29dd14f55aa04e72e2fa12c098ba4fa5a00c57fa9": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e", + "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", + "0xa5e869ecc1b914a6b0cf5f02b874f5eb90f1739fbd3edd01e5835d1517fd9f72": "0x781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", + "0xf7327f83450f4e54b29a411237312742": "0x00", + "0x7e6064dc0e78ffebb59b3053826a9467": "0x109c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0x717a2ee9c64ad3424e10e4461ec08296": "0x0000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000008700000000000000af0000000000000001000000000000000100000000000000040000000000010010000000004000000020000000", + "0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300", + "0x6e4ab2ac5a7cf9b1829eacc84a75bde0804be01fc31c9419ea72407f50a33384": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663" + }, + { + }] } } diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 857eba782a27870621f15ac8ed5b02cca3809d09..acedb5c14bb42919cec5ef841df13812b00d3cfa 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -16,19 +16,22 @@ //! Substrate chain configurations. -use primitives::{ed25519, sr25519, Pair, crypto::UncheckedInto}; -use node_primitives::{AccountId, AuraId, Balance}; +use primitives::{Pair, Public, crypto::UncheckedInto}; +pub use node_primitives::{AccountId, Balance}; use node_runtime::{ - GrandpaConfig, BalancesConfig, ContractsConfig, ElectionsConfig, DemocracyConfig, CouncilConfig, - AuraConfig, IndicesConfig, SessionConfig, StakingConfig, SudoConfig, TechnicalCommitteeConfig, - SystemConfig, WASM_BINARY, Perbill, SessionKeys, StakerStatus, DAYS, DOLLARS, - MILLICENTS, + BabeConfig, BalancesConfig, ContractsConfig, CouncilConfig, DemocracyConfig, + ElectionsConfig, GrandpaConfig, ImOnlineConfig, IndicesConfig, Perbill, + SessionConfig, SessionKeys, StakerStatus, StakingConfig, SudoConfig, SystemConfig, + TechnicalCommitteeConfig, WASM_BINARY, }; +use node_runtime::constants::{time::*, currency::*}; pub use node_runtime::GenesisConfig; use substrate_service; use hex_literal::hex; use substrate_telemetry::TelemetryEndpoints; -use grandpa::AuthorityId as GrandpaId; +use grandpa_primitives::{AuthorityId as GrandpaId}; +use babe_primitives::{AuthorityId as BabeId}; +use im_online::AuthorityId as ImOnlineId; const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -37,11 +40,11 @@ pub type ChainSpec = substrate_service::ChainSpec; /// Flaming Fir testnet generator pub fn flaming_fir_config() -> Result { - ChainSpec::from_embedded(include_bytes!("../res/flaming-fir.json")) + ChainSpec::from_json_bytes(&include_bytes!("../res/flaming-fir.json")[..]) } -fn session_keys(key: ed25519::Public) -> SessionKeys { - SessionKeys { ed25519: key } +fn session_keys(grandpa: GrandpaId, babe: BabeId, im_online: ImOnlineId) -> SessionKeys { + SessionKeys { grandpa, babe, im_online, } } fn staging_testnet_config_genesis() -> GenesisConfig { @@ -51,11 +54,13 @@ fn staging_testnet_config_genesis() -> GenesisConfig { // and // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 inspect "$secret"//fir//$j//$i; done; done - let initial_authorities: Vec<(AccountId, AccountId, AuraId, GrandpaId)> = vec![( + let initial_authorities: Vec<(AccountId, AccountId, GrandpaId, BabeId, ImOnlineId)> = vec![( // 5Fbsd6WXDGiLTxunqeK5BATNiocfCqu9bS1yArVjCgeBLkVy hex!["9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12"].unchecked_into(), // 5EnCiV7wSHeNhjW3FSUwiJNkcc2SBkPLn5Nj93FmbLtBjQUq hex!["781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276"].unchecked_into(), + // 5EZaeQ8djPcq9pheJUhgerXQZt9YaHnMJpiHMRhwQeinqUW8 + hex!["6e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106"].unchecked_into(), // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC @@ -65,6 +70,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78"].unchecked_into(), // 5Gc4vr42hH1uDZc93Nayk5G7i687bAQdHHc9unLuyeawHipF hex!["c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e"].unchecked_into(), + // 5DhLtiaQd1L1LU9jaNeeu9HJkP6eyg3BwXA7iNMzKm7qqruQ + hex!["482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e"].unchecked_into(), // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE @@ -74,6 +81,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65"].unchecked_into(), // 5FeD54vGVNpFX3PndHPXJ2MDakc462vBCD5mgtWRnWYCpZU9 hex!["9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526"].unchecked_into(), + // 5DhKqkHRkndJu8vq7pi2Q5S3DfftWJHGxbEUNH43b46qNspH + hex!["482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a"].unchecked_into(), // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d @@ -83,6 +92,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { hex!["f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663"].unchecked_into(), // 5EPQdAQ39WQNLCRjWsCk5jErsCitHiY5ZmjfWzzbXDoAoYbn hex!["66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f"].unchecked_into(), + // 5C4vDQxA8LTck2xJEy4Yg1hM9qjDt4LvTQaMo4Y8ne43aU6x + hex!["00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378"].unchecked_into(), // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 @@ -116,18 +127,21 @@ fn staging_testnet_config_genesis() -> GenesisConfig { .collect::>(), }), session: Some(SessionConfig { - keys: initial_authorities.iter().map(|x| (x.0.clone(), session_keys(x.2.clone()))).collect::>(), + keys: initial_authorities.iter().map(|x| { + (x.0.clone(), session_keys(x.2.clone(), x.3.clone(), x.4.clone())) + }).collect::>(), }), staking: Some(StakingConfig { current_era: 0, offline_slash: Perbill::from_parts(1_000_000), - session_reward: Perbill::from_parts(2_065), - current_session_reward: 0, validator_count: 7, offline_slash_grace: 4, minimum_validator_count: 4, - stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), + stakers: initial_authorities.iter().map(|x| { + (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) + }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), + .. Default::default() }), democracy: Some(DemocracyConfig::default()), collective_Instance1: Some(CouncilConfig { @@ -151,12 +165,17 @@ fn staging_testnet_config_genesis() -> GenesisConfig { sudo: Some(SudoConfig { key: endowed_accounts[0].clone(), }), - aura: Some(AuraConfig { - authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + babe: Some(BabeConfig { + authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), + }), + im_online: Some(ImOnlineConfig { + gossip_at: 0, + keys: initial_authorities.iter().map(|x| x.4.clone()).collect(), }), grandpa: Some(GrandpaConfig { - authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), }), + membership_Instance1: Some(Default::default()), } } @@ -175,58 +194,46 @@ pub fn staging_testnet_config() -> ChainSpec { ) } -/// Helper function to generate AccountId from seed -pub fn get_account_id_from_seed(seed: &str) -> AccountId { - sr25519::Pair::from_string(&format!("//{}", seed), None) +/// 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() } -/// Helper function to generate AuraId from seed -pub fn get_aura_id_from_seed(seed: &str) -> AuraId { - ed25519::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} - -/// Helper function to generate GrandpaId from seed -pub fn get_grandpa_id_from_seed(seed: &str) -> GrandpaId { - ed25519::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} /// Helper function to generate stash, controller and session key from seed -pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, AuraId, GrandpaId) { +pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, GrandpaId, BabeId, ImOnlineId) { ( - get_account_id_from_seed(&format!("{}//stash", seed)), - get_account_id_from_seed(seed), - get_aura_id_from_seed(seed), - get_grandpa_id_from_seed(seed) + get_from_seed::(&format!("{}//stash", seed)), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), ) } /// Helper function to create GenesisConfig for testing pub fn testnet_genesis( - initial_authorities: Vec<(AccountId, AccountId, AuraId, GrandpaId)>, + initial_authorities: Vec<(AccountId, AccountId, GrandpaId, BabeId, ImOnlineId)>, root_key: AccountId, endowed_accounts: Option>, enable_println: bool, ) -> GenesisConfig { let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(|| { 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_from_seed::("Alice"), + get_from_seed::("Bob"), + get_from_seed::("Charlie"), + get_from_seed::("Dave"), + get_from_seed::("Eve"), + get_from_seed::("Ferdie"), + get_from_seed::("Alice//stash"), + get_from_seed::("Bob//stash"), + get_from_seed::("Charlie//stash"), + get_from_seed::("Dave//stash"), + get_from_seed::("Eve//stash"), + get_from_seed::("Ferdie//stash"), ] }); @@ -248,18 +255,21 @@ pub fn testnet_genesis( vesting: vec![], }), session: Some(SessionConfig { - keys: initial_authorities.iter().map(|x| (x.0.clone(), session_keys(x.2.clone()))).collect::>(), + keys: initial_authorities.iter().map(|x| { + (x.0.clone(), session_keys(x.2.clone(), x.3.clone(), x.4.clone())) + }).collect::>(), }), staking: Some(StakingConfig { current_era: 0, minimum_validator_count: 1, validator_count: 2, offline_slash: Perbill::zero(), - session_reward: Perbill::zero(), - current_session_reward: 0, offline_slash_grace: 0, - stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), + stakers: initial_authorities.iter().map(|x| { + (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) + }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), + .. Default::default() }), democracy: Some(DemocracyConfig::default()), collective_Instance1: Some(CouncilConfig { @@ -288,12 +298,17 @@ pub fn testnet_genesis( sudo: Some(SudoConfig { key: root_key, }), - aura: Some(AuraConfig { - authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + babe: Some(BabeConfig { + authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), + }), + im_online: Some(ImOnlineConfig{ + gossip_at: 0, + keys: initial_authorities.iter().map(|x| x.4.clone()).collect(), }), grandpa: Some(GrandpaConfig { - authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), }), + membership_Instance1: Some(Default::default()), } } @@ -302,7 +317,7 @@ fn development_config_genesis() -> GenesisConfig { vec![ get_authority_keys_from_seed("Alice"), ], - get_account_id_from_seed("Alice"), + get_from_seed::("Alice"), None, true, ) @@ -319,7 +334,7 @@ fn local_testnet_genesis() -> GenesisConfig { get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), ], - get_account_id_from_seed("Alice"), + get_from_seed::("Alice"), None, false, ) @@ -341,7 +356,7 @@ pub(crate) mod tests { vec![ get_authority_keys_from_seed("Alice"), ], - get_account_id_from_seed("Alice"), + get_from_seed::("Alice"), None, false, ) @@ -363,7 +378,16 @@ pub(crate) mod tests { /// Local testnet config (multivalidator Alice + Bob) pub fn integration_test_config_with_two_authorities() -> ChainSpec { - ChainSpec::from_genesis("Integration Test", "test", local_testnet_genesis, vec![], None, None, None, None) + ChainSpec::from_genesis( + "Integration Test", + "test", + local_testnet_genesis, + vec![], + None, + None, + None, + None, + ) } #[test] diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs index 211d16f148cc9b87e95749b0b5217b1ecb8891a2..6345a851f28ab115f8d3b846ef40ffd4458c1a5b 100644 --- a/node/cli/src/factory_impl.rs +++ b/node/cli/src/factory_impl.rs @@ -21,19 +21,13 @@ use rand::{Rng, SeedableRng}; use rand::rngs::StdRng; -use parity_codec::Decode; +use codec::{Encode, Decode}; use keyring::sr25519::Keyring; -use node_primitives::Hash; -use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, BalancesCall}; -use primitives::sr25519; -use primitives::crypto::Pair; -use parity_codec::Encode; -use sr_primitives::generic::Era; -use sr_primitives::traits::{Block as BlockT, Header as HeaderT}; -use substrate_service::ServiceFactory; +use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, SignedExtra, BalancesCall, ExistentialDeposit}; +use primitives::{sr25519, crypto::Pair}; +use sr_primitives::{generic::Era, traits::{Block as BlockT, Header as HeaderT, SignedExtension}}; use transaction_factory::RuntimeAdapter; use transaction_factory::modes::Mode; -use crate::service; use inherents::InherentData; use timestamp; use finality_tracker; @@ -45,15 +39,27 @@ pub struct FactoryState { block_no: N, mode: Mode, - start_number: u64, - rounds: u64, - round: u64, - block_in_round: u64, - num: u64, + start_number: u32, + rounds: u32, + round: u32, + block_in_round: u32, + num: u32, } type Number = <::Header as HeaderT>::Number; +impl FactoryState { + fn build_extra(index: node_primitives::Index, phase: u64) -> node_runtime::SignedExtra { + ( + system::CheckGenesis::new(), + system::CheckEra::from(Era::mortal(256, phase)), + system::CheckNonce::from(index), + system::CheckWeight::new(), + balances::TakeFees::from(0) + ) + } +} + impl RuntimeAdapter for FactoryState { type AccountId = node_primitives::AccountId; type Balance = node_primitives::Balance; @@ -71,9 +77,9 @@ impl RuntimeAdapter for FactoryState { ) -> FactoryState { FactoryState { mode, - num: num, + num: num as u32, round: 0, - rounds, + rounds: rounds as u32, block_in_round: 0, block_no: 0, start_number: 0, @@ -125,27 +131,26 @@ impl RuntimeAdapter for FactoryState { sender: &Self::AccountId, key: &Self::Secret, destination: &Self::AccountId, - amount: &Self::Number, + amount: &Self::Balance, + genesis_hash: &::Hash, prior_block_hash: &::Hash, ) -> ::Extrinsic { let index = self.extract_index(&sender, prior_block_hash); let phase = self.extract_phase(*prior_block_hash); - sign::(CheckedExtrinsic { - signed: Some((sender.clone(), index)), + sign::(CheckedExtrinsic { + signed: Some((sender.clone(), Self::build_extra(index, phase))), function: Call::Balances( BalancesCall::transfer( - indices::address::Address::Id( - destination.clone().into() - ), + indices::address::Address::Id(destination.clone().into()), (*amount).into() ) ) - }, key, &prior_block_hash, phase) + }, key, (genesis_hash.clone(), prior_block_hash.clone(), (), (), ())) } fn inherent_extrinsics(&self) -> InherentData { - let timestamp = self.block_no * MINIMUM_PERIOD; + let timestamp = self.block_no as u64 * MINIMUM_PERIOD; let mut inherent = InherentData::new(); inherent.put_data(timestamp::INHERENT_IDENTIFIER, ×tamp) @@ -155,9 +160,9 @@ impl RuntimeAdapter for FactoryState { inherent } - fn minimum_balance() -> Self::Number { + fn minimum_balance() -> Self::Balance { // TODO get correct amount via api. See #2587. - 1337 + ExistentialDeposit::get() } fn master_account_id() -> Self::AccountId { @@ -189,12 +194,12 @@ impl RuntimeAdapter for FactoryState { // This currently prevents the factory from being used // without a preceding purge of the database. if self.mode == Mode::MasterToN || self.mode == Mode::MasterTo1 { - self.block_no() + self.block_no() as Self::Index } else { match self.round() { 0 => // if round is 0 all transactions will be done with master as a sender - self.block_no(), + self.block_no() as Self::Index, _ => // if round is e.g. 1 every sender account will be new and not yet have // any transactions done @@ -210,12 +215,12 @@ impl RuntimeAdapter for FactoryState { // TODO get correct phase via api. See #2587. // This currently prevents the factory from being used // without a preceding purge of the database. - self.block_no + self.block_no() as Self::Phase } } -fn gen_seed_bytes(seed: u64) -> [u8; 32] { - let mut rng: StdRng = SeedableRng::seed_from_u64(seed); +fn gen_seed_bytes(seed: u32) -> [u8; 32] { + let mut rng: StdRng = SeedableRng::seed_from_u64(seed as u64); let mut seed_bytes = [0u8; 32]; for i in 0..32 { @@ -226,16 +231,14 @@ fn gen_seed_bytes(seed: u64) -> [u8; 32] { /// Creates an `UncheckedExtrinsic` containing the appropriate signature for /// a `CheckedExtrinsics`. -fn sign( +fn sign( xt: CheckedExtrinsic, key: &sr25519::Pair, - prior_block_hash: &Hash, - phase: u64, + additional_signed: ::AdditionalSigned, ) -> ::Extrinsic { let s = match xt.signed { - Some((signed, index)) => { - let era = Era::mortal(256, phase); - let payload = (index.into(), xt.function, era, prior_block_hash); + Some((signed, extra)) => { + let payload = (xt.function, extra.clone(), additional_signed); let signature = payload.using_encoded(|b| { if b.len() > 256 { key.sign(&sr_io::blake2_256(b)) @@ -244,8 +247,8 @@ fn sign( } }).into(); UncheckedExtrinsic { - signature: Some((indices::address::Address::Id(signed), signature, payload.0, era)), - function: payload.1, + signature: Some((indices::address::Address::Id(signed), signature, extra)), + function: payload.0, } } None => UncheckedExtrinsic { diff --git a/node/cli/src/lib.rs b/node/cli/src/lib.rs index b18fa57411ce5bdd04b971dbcbf7e0ab4c2b275a..4e3cfa7f0109217f81512f29fc3905e5cb1e97a2 100644 --- a/node/cli/src/lib.rs +++ b/node/cli/src/lib.rs @@ -26,14 +26,15 @@ mod factory_impl; use tokio::prelude::Future; use tokio::runtime::{Builder as RuntimeBuilder, Runtime}; -pub use cli::{VersionInfo, IntoExit, NoCustom, SharedParams}; +pub use cli::{VersionInfo, IntoExit, NoCustom, SharedParams, ExecutionStrategyParam}; use substrate_service::{ServiceFactory, Roles as ServiceRoles}; use std::ops::Deref; use log::info; use structopt::{StructOpt, clap::App}; -use cli::{AugmentClap, GetLogFilter}; +use cli::{AugmentClap, GetLogFilter, parse_and_prepare, ParseAndPrepare}; use crate::factory_impl::FactoryState; use transaction_factory::RuntimeAdapter; +use client::ExecutionStrategies; /// The chain specification option. #[derive(Clone, Debug, PartialEq)] @@ -102,6 +103,18 @@ pub struct FactoryCmd { #[allow(missing_docs)] #[structopt(flatten)] pub shared_params: SharedParams, + + /// The means of execution used when calling into the runtime while importing blocks. + #[structopt( + long = "execution", + value_name = "STRATEGY", + raw( + possible_values = "&ExecutionStrategyParam::variants()", + case_insensitive = "true", + default_value = r#""NativeElseWasm""# + ) + )] + pub execution: ExecutionStrategyParam, } impl AugmentClap for FactoryCmd { @@ -145,9 +158,8 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul T: Into + Clone, E: IntoExit, { - let ret = cli::parse_and_execute::( - load_spec, &version, "substrate-node", args, exit, - |exit, _cli_args, _custom_args, config| { + match parse_and_prepare::(&version, "substrate-node", args) { + ParseAndPrepare::Run(cmd) => cmd.run(load_spec, exit, |exit, _cli_args, _custom_args, config| { info!("{}", version.name); info!(" version {}", config.full_version()); info!(" by Parity Technologies, 2017-2019"); @@ -168,16 +180,24 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul exit ), }.map_err(|e| format!("{:?}", e)) - } - ); - - match &ret { - Ok(Some(CustomSubcommands::Factory(cli_args))) => { - let config = cli::create_config_with_db_path::( + }), + ParseAndPrepare::BuildSpec(cmd) => cmd.run(load_spec), + ParseAndPrepare::ExportBlocks(cmd) => cmd.run::(load_spec, exit), + ParseAndPrepare::ImportBlocks(cmd) => cmd.run::(load_spec, exit), + ParseAndPrepare::PurgeChain(cmd) => cmd.run(load_spec), + ParseAndPrepare::RevertChain(cmd) => cmd.run::(load_spec), + ParseAndPrepare::CustomCommand(CustomSubcommands::Factory(cli_args)) => { + let mut config = cli::create_config_with_db_path( load_spec, &cli_args.shared_params, &version, )?; + config.execution_strategies = ExecutionStrategies { + importing: cli_args.execution.into(), + block_construction: cli_args.execution.into(), + other: cli_args.execution.into(), + ..Default::default() + }; match ChainSpec::from(config.chain_spec.id()) { Some(ref c) if c == &ChainSpec::Development || c == &ChainSpec::LocalTestnet => {}, @@ -195,8 +215,7 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul ).map_err(|e| format!("Error in transaction factory: {}", e))?; Ok(()) - }, - _ => ret.map_err(Into::into).map(|_| ()) + } } } @@ -204,11 +223,11 @@ fn run_until_exit( mut runtime: Runtime, service: T, e: E, -) -> error::Result<()> - where - T: Deref> + Future + Send + 'static, - C: substrate_service::Components, - E: IntoExit, +) -> error::Result<()> where + T: Deref>, + T: Future + Send + 'static, + C: substrate_service::Components, + E: IntoExit, { let (exit_send, exit) = exit_future::signal(); @@ -219,11 +238,17 @@ fn run_until_exit( // but we need to keep holding a reference to the global telemetry guard let _telemetry = service.telemetry(); - let _ = runtime.block_on(service.select(e.into_exit())); + let service_res = { + let exit = e.into_exit().map_err(|_| error::Error::Other("Exit future failed.".into())); + let service = service.map_err(|err| error::Error::Service(err)); + let select = service.select(exit).map(|_| ()).map_err(|(err, _)| err); + runtime.block_on(select) + }; + exit_send.fire(); // TODO [andre]: timeout this future #1318 let _ = runtime.shutdown_on_idle().wait(); - Ok(()) + service_res } diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 3786d5bdd16283eaa65819b415d1c86b4ddf7273..90c76eda84cbe2f37215169aa90fe050307ff8cc 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -21,13 +21,12 @@ use std::sync::Arc; use std::time::Duration; -use aura::{import_queue, start_aura, AuraImportQueue, SlotDuration}; +use babe::{import_queue, start_babe, BabeImportQueue, Config}; use client::{self, LongestChain}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use node_executor; -use primitives::Pair; use futures::prelude::*; -use node_primitives::{AuraPair, Block}; +use node_primitives::Block; use node_runtime::{GenesisConfig, RuntimeApi}; use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, @@ -38,7 +37,6 @@ use transaction_pool::{self, txpool::{Pool as TransactionPool}}; use inherents::InherentDataProviders; use network::construct_simple_protocol; use substrate_service::construct_service_factory; -use log::info; use substrate_service::TelemetryOnConnect; construct_simple_protocol! { @@ -46,19 +44,40 @@ construct_simple_protocol! { pub struct NodeProtocol where Block = Block { } } +type BabeBlockImportForService = babe::BabeBlockImport< + FullBackend, + FullExecutor, + ::Block, + grandpa::BlockImportForService, + ::RuntimeApi, + client::Client< + FullBackend, + FullExecutor, + ::Block, + ::RuntimeApi + >, +>; + /// Node specific configuration pub struct NodeConfig { - /// grandpa connection to import block + /// GRANDPA and BABE connection to import block. // FIXME #1134 rather than putting this on the config, let's have an actual intermediate setup state - pub grandpa_import_setup: Option<(grandpa::BlockImportForService, grandpa::LinkHalfForService)>, + pub import_setup: Option<( + BabeBlockImportForService, + grandpa::LinkHalfForService, + babe::BabeLink, + )>, + /// Tasks that were created by previous setup steps and should be spawned. + pub tasks_to_spawn: Option + Send>>>, inherent_data_providers: InherentDataProviders, } impl Default for NodeConfig where F: substrate_service::ServiceFactory { fn default() -> NodeConfig { NodeConfig { - grandpa_import_setup: None, + import_setup: None, inherent_data_providers: InherentDataProviders::new(), + tasks_to_spawn: None, } } } @@ -69,63 +88,87 @@ construct_service_factory! { RuntimeApi = RuntimeApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, RuntimeDispatch = node_executor::Executor, - FullTransactionPoolApi = transaction_pool::ChainApi, FullExecutor, Block, RuntimeApi>, Block> - { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, - LightTransactionPoolApi = transaction_pool::ChainApi, LightExecutor, Block, RuntimeApi>, Block> - { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, + FullTransactionPoolApi = + transaction_pool::ChainApi< + client::Client, FullExecutor, Block, RuntimeApi>, + Block + > { + |config, client| + Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + }, + LightTransactionPoolApi = + transaction_pool::ChainApi< + client::Client, LightExecutor, Block, RuntimeApi>, + Block + > { + |config, client| + Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + }, Genesis = GenesisConfig, Configuration = NodeConfig, - FullService = FullComponents - { |config: FactoryFullConfiguration| - FullComponents::::new(config) }, + FullService = FullComponents { + |config: FactoryFullConfiguration| FullComponents::::new(config) + }, AuthoritySetup = { |mut service: Self::FullService| { - let (block_import, link_half) = service.config.custom.grandpa_import_setup.take() - .expect("Link Half and Block Import are present for Full Services or setup failed before. qed"); - - if let Some(aura_key) = service.authority_key::() { - info!("Using aura key {}", aura_key.public()); + let (block_import, link_half, babe_link) = + service.config_mut().custom.import_setup.take() + .expect("Link Half and Block Import are present for Full Services or setup failed before. qed"); + + // spawn any futures that were created in the previous setup steps + if let Some(tasks) = service.config_mut().custom.tasks_to_spawn.take() { + for task in tasks { + service.spawn_task( + task.select(service.on_exit()) + .map(|_| ()) + .map_err(|_| ()) + ); + } + } - let proposer = Arc::new(substrate_basic_authorship::ProposerFactory { + if service.config().roles.is_authority() { + let proposer = substrate_basic_authorship::ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - }); + }; let client = service.client(); let select_chain = service.select_chain() .ok_or(ServiceError::SelectChainRequired)?; - let aura = start_aura( - SlotDuration::get_or_compute(&*client)?, - Arc::new(aura_key), + let babe_config = babe::BabeParams { + config: Config::get_or_compute(&*client)?, + keystore: service.keystore(), client, select_chain, block_import, - proposer, - service.network(), - service.config.custom.inherent_data_providers.clone(), - service.config.force_authoring, - )?; - let select = aura.select(service.on_exit()).then(|_| Ok(())); - service.spawn_task(Box::new(select)); + env: proposer, + sync_oracle: service.network(), + inherent_data_providers: service.config() + .custom.inherent_data_providers.clone(), + force_authoring: service.config().force_authoring, + time_source: babe_link, + }; + + let babe = start_babe(babe_config)?; + let select = babe.select(service.on_exit()).then(|_| Ok(())); + + // the BABE authoring task is considered infallible, i.e. if it + // fails we take down the service with it. + service.spawn_essential_task(select); } - let grandpa_key = if service.config.disable_grandpa { - None - } else { - service.authority_key::() - }; - let config = grandpa::Config { - local_key: grandpa_key.map(Arc::new), // FIXME #1578 make this available through chainspec gossip_duration: Duration::from_millis(333), justification_period: 4096, - name: Some(service.config.name.clone()) + name: Some(service.config().name.clone()), + keystore: Some(service.keystore()), }; - match config.local_key { - None if !service.config.grandpa_voter => { + match (service.config().roles.is_authority(), service.config().disable_grandpa) { + (false, false) => { + // start the lightweight GRANDPA observer service.spawn_task(Box::new(grandpa::run_grandpa_observer( config, link_half, @@ -133,8 +176,8 @@ construct_service_factory! { service.on_exit(), )?)); }, - // Either config.local_key is set, or user forced voter service via `--grandpa-voter` flag. - _ => { + (true, false) => { + // start the full GRANDPA voter let telemetry_on_connect = TelemetryOnConnect { telemetry_connection_sinks: service.telemetry_on_connect_stream(), }; @@ -142,11 +185,22 @@ construct_service_factory! { config: config, link: link_half, network: service.network(), - inherent_data_providers: service.config.custom.inherent_data_providers.clone(), + inherent_data_providers: + service.config().custom.inherent_data_providers.clone(), on_exit: service.on_exit(), telemetry_on_connect: Some(telemetry_on_connect), }; - service.spawn_task(Box::new(grandpa::run_grandpa_voter(grandpa_config)?)); + + // the GRANDPA voter task is considered infallible, i.e. + // if it fails we take down the service with it. + service.spawn_essential_task(grandpa::run_grandpa_voter(grandpa_config)?); + }, + (_, true) => { + grandpa::setup_disabled_grandpa( + service.client(), + &service.config().custom.inherent_data_providers, + service.network(), + )?; }, } @@ -155,27 +209,38 @@ construct_service_factory! { }, LightService = LightComponents { |config| >::new(config) }, - FullImportQueue = AuraImportQueue - { |config: &mut FactoryFullConfiguration , client: Arc>, select_chain: Self::SelectChain| { - let slot_duration = SlotDuration::get_or_compute(&*client)?; + FullImportQueue = BabeImportQueue + { + | + config: &mut FactoryFullConfiguration, + client: Arc>, + select_chain: Self::SelectChain, + transaction_pool: Option>>, + | + { let (block_import, link_half) = grandpa::block_import::<_, _, _, RuntimeApi, FullClient, _>( client.clone(), client.clone(), select_chain )?; let justification_import = block_import.clone(); - config.custom.grandpa_import_setup = Some((block_import.clone(), link_half)); - - import_queue::<_, _, AuraPair>( - slot_duration, - Box::new(block_import), + let (import_queue, babe_link, babe_block_import, pruning_task) = import_queue( + Config::get_or_compute(&*client)?, + block_import, Some(Box::new(justification_import)), None, + client.clone(), client, config.custom.inherent_data_providers.clone(), - ).map_err(Into::into) + transaction_pool, + )?; + + config.custom.import_setup = Some((babe_block_import.clone(), link_half, babe_link)); + config.custom.tasks_to_spawn = Some(vec![Box::new(pruning_task)]); + + Ok(import_queue) }}, - LightImportQueue = AuraImportQueue + LightImportQueue = BabeImportQueue { |config: &FactoryFullConfiguration, client: Arc>| { #[allow(deprecated)] let fetch_checker = client.backend().blockchain().fetcher() @@ -185,17 +250,24 @@ construct_service_factory! { let block_import = grandpa::light_block_import::<_, _, _, RuntimeApi, LightClient>( client.clone(), Arc::new(fetch_checker), client.clone() )?; + let finality_proof_import = block_import.clone(); - let finality_proof_request_builder = finality_proof_import.create_finality_proof_request_builder(); + let finality_proof_request_builder = + finality_proof_import.create_finality_proof_request_builder(); - import_queue::<_, _, AuraPair>( - SlotDuration::get_or_compute(&*client)?, - Box::new(block_import), + // FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`. + let (import_queue, ..) = import_queue::<_, _, _, _, _, _, TransactionPool>( + Config::get_or_compute(&*client)?, + block_import, None, Some(Box::new(finality_proof_import)), + client.clone(), client, config.custom.inherent_data_providers.clone(), - ).map(|q| (q, finality_proof_request_builder)).map_err(Into::into) + None, + )?; + + Ok((import_queue, finality_proof_request_builder)) }}, SelectChain = LongestChain, Self::Block> { |config: &FactoryFullConfiguration, client: Arc>| { @@ -213,27 +285,32 @@ construct_service_factory! { #[cfg(test)] mod tests { use std::sync::Arc; - use aura::CompatibleDigestItem; - use consensus_common::{Environment, Proposer, ImportBlock, BlockOrigin, ForkChoiceStrategy}; + use babe::CompatibleDigestItem; + use consensus_common::{ + Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy + }; use node_primitives::DigestItem; - use node_runtime::{BalancesCall, Call, CENTS, SECS_PER_BLOCK, UncheckedExtrinsic}; - use parity_codec::{Compact, Encode, Decode}; + use node_runtime::{BalancesCall, Call, UncheckedExtrinsic}; + use node_runtime::constants::{currency::CENTS, time::SLOT_DURATION}; + use codec::{Encode, Decode}; use primitives::{ - crypto::Pair as CryptoPair, ed25519::Pair, blake2_256, + crypto::Pair as CryptoPair, blake2_256, sr25519::Public as AddressPublic, H256, }; use sr_primitives::{generic::{BlockId, Era, Digest}, traits::Block, OpaqueExtrinsic}; use timestamp; use finality_tracker; - use keyring::{ed25519::Keyring as AuthorityKeyring, sr25519::Keyring as AccountKeyring}; + use keyring::AccountKeyring; use substrate_service::ServiceFactory; use service_test::SyncService; use crate::service::Factory; #[cfg(feature = "rhd")] fn test_sync() { + use primitives::ed25519::Pair; + use {service_test, Factory}; - use client::{ImportBlock, BlockOrigin}; + use client::{BlockImportParams, BlockOrigin}; let alice: Arc = Arc::new(Keyring::Alice.into()); let bob: Arc = Arc::new(Keyring::Bob.into()); @@ -253,7 +330,7 @@ mod tests { }; let (proposer, _, _) = proposer_factory.init(&parent_header, &validators, alice.clone()).unwrap(); let block = proposer.propose().expect("Error making test block"); - ImportBlock { + BlockImportParams { origin: BlockOrigin::File, justification: Vec::new(), internal_justification: Vec::new(), @@ -263,7 +340,9 @@ mod tests { auxiliary: Vec::new(), } }; - let extrinsic_factory = |service: &SyncService<::FullService>| { + let extrinsic_factory = + |service: &SyncService<::FullService>| + { let payload = ( 0, Call::Balances(BalancesCall::transfer(RawAddress::Id(bob.public().0.into()), 69.into())), @@ -289,36 +368,59 @@ mod tests { #[test] #[ignore] fn test_sync() { + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = keystore::Store::open(keystore_path.path(), None) + .expect("Creates keystore"); + let alice = keystore.write().insert_ephemeral_from_seed::("//Alice") + .expect("Creates authority pair"); + let chain_spec = crate::chain_spec::tests::integration_test_config_with_single_authority(); - let alice = Arc::new(AuthorityKeyring::Alice.pair()); let mut slot_num = 1u64; let block_factory = |service: &SyncService<::FullService>| { let service = service.get(); let mut inherent_data = service - .config + .config() .custom .inherent_data_providers .create_inherent_data() .expect("Creates inherent data."); inherent_data.replace_data(finality_tracker::INHERENT_IDENTIFIER, &1u64); - inherent_data.replace_data(timestamp::INHERENT_IDENTIFIER, &(slot_num * SECS_PER_BLOCK)); let parent_id = BlockId::number(service.client().info().chain.best_number); let parent_header = service.client().header(&parent_id).unwrap().unwrap(); - let proposer_factory = Arc::new(substrate_basic_authorship::ProposerFactory { + let mut proposer_factory = substrate_basic_authorship::ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - }); + }; let mut digest = Digest::::default(); - digest.push(>::aura_pre_digest(slot_num)); - let proposer = proposer_factory.init(&parent_header).unwrap(); - let new_block = proposer.propose( + + // even though there's only one authority some slots might be empty, + // so we must keep trying the next slots until we can claim one. + let babe_pre_digest = loop { + inherent_data.replace_data(timestamp::INHERENT_IDENTIFIER, &(slot_num * SLOT_DURATION)); + if let Some(babe_pre_digest) = babe::test_helpers::claim_slot( + &*service.client(), + &parent_id, + slot_num, + (278, 1000), + &keystore, + ) { + break babe_pre_digest; + } + + slot_num += 1; + }; + + digest.push(::babe_pre_digest(babe_pre_digest)); + + let mut proposer = proposer_factory.init(&parent_header).unwrap(); + let new_block = futures03::executor::block_on(proposer.propose( inherent_data, digest, std::time::Duration::from_secs(1), - ).expect("Error making test block"); + )).expect("Error making test block"); let (new_header, new_body) = new_block.deconstruct(); let pre_hash = new_header.hash(); @@ -326,12 +428,12 @@ mod tests { // add it to a digest item. let to_sign = pre_hash.encode(); let signature = alice.sign(&to_sign[..]); - let item = >::aura_seal( - signature, + let item = ::babe_seal( + signature.into(), ); slot_num += 1; - ImportBlock { + BlockImportParams { origin: BlockOrigin::File, header: new_header, justification: None, @@ -355,19 +457,25 @@ mod tests { let signer = charlie.clone(); let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); - let era = Era::immortal(); - let raw_payload = (Compact(index), function, era, genesis_hash); + + let check_genesis = system::CheckGenesis::new(); + let check_era = system::CheckEra::from(Era::Immortal); + let check_nonce = system::CheckNonce::from(index); + let check_weight = system::CheckWeight::new(); + let take_fees = balances::TakeFees::from(0); + let extra = (check_genesis, check_era, check_nonce, check_weight, take_fees); + + let raw_payload = (function, extra.clone(), genesis_hash, genesis_hash); let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { signer.sign(&blake2_256(payload)[..]) } else { signer.sign(payload) }); let xt = UncheckedExtrinsic::new_signed( - index, - raw_payload.1, + raw_payload.0, from.into(), signature.into(), - era, + extra, ).encode(); let v: Vec = Decode::decode(&mut xt.as_slice()).unwrap(); diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index 345401141913c781e8970f136a9ff7fecbc12c96..d1886c2ab6ea928b153afaafe0ba2ed32a990909 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -6,8 +6,8 @@ description = "Substrate node implementation in Rust." edition = "2018" [dependencies] -trie-root = "0.14.0" -parity-codec = "4.1.1" +trie-root = "0.15.0" +codec = { package = "parity-scale-codec", version = "1.0.0" } runtime_io = { package = "sr-io", path = "../../core/sr-io" } state_machine = { package = "substrate-state-machine", path = "../../core/state-machine" } substrate-executor = { path = "../../core/executor" } @@ -19,7 +19,7 @@ node-runtime = { path = "../runtime" } [dev-dependencies] test-client = { package = "substrate-test-client", path = "../../core/test-client" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } +sr-primitives = { path = "../../core/sr-primitives" } runtime_support = { package = "srml-support", path = "../../srml/support" } balances = { package = "srml-balances", path = "../../srml/balances" } session = { package = "srml-session", path = "../../srml/session" } @@ -34,3 +34,4 @@ wabt = "~0.7.4" [features] benchmarks = [] +stress-test = [] diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index fbd537f4752e7a2cc62b234653a2fb87f68218ee..c2e442fd580b140a785d001bc56f7809b12ef81e 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -22,6 +22,7 @@ #[cfg(feature = "benchmarks")] extern crate test; pub use substrate_executor::NativeExecutor; +pub use substrate_executor::RuntimesCache; use substrate_executor::native_executor_instance; // Declare an instance of the native executor named `Executor`. Include the wasm binary as the @@ -35,29 +36,29 @@ native_executor_instance!( #[cfg(test)] mod tests { - use runtime_io; use super::Executor; - use substrate_executor::{WasmExecutor, NativeExecutionDispatch}; - use parity_codec::{Encode, Decode, Joiner}; - use keyring::{AuthorityKeyring, AccountKeyring}; - use runtime_support::{Hashable, StorageValue, StorageMap, traits::Currency}; - use state_machine::{CodeExecutor, Externalities, TestExternalities as CoreTestExternalities}; - use primitives::{ - twox_128, blake2_256, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, - NativeOrEncoded - }; - use node_primitives::{Hash, BlockNumber, AccountId}; - use runtime_primitives::traits::{Header as HeaderT, Hash as HashT}; - use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; use {balances, contracts, indices, staking, system, timestamp}; + use runtime_io; + use substrate_executor::WasmExecutor; + use codec::{Encode, Decode, Joiner}; + use keyring::{AccountKeyring, Ed25519Keyring, Sr25519Keyring}; + use runtime_support::{Hashable, StorageValue, StorageMap, assert_eq_error_rate, traits::Currency}; + use state_machine::{CodeExecutor, Externalities, TestExternalities as CoreTestExternalities}; + use primitives::{ twox_128, blake2_256, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, NativeOrEncoded}; + use node_primitives::{Hash, BlockNumber, AccountId, Balance, Index}; + use sr_primitives::traits::{Header as HeaderT, Hash as HashT, Convert}; + use sr_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; + use sr_primitives::weights::{WeightMultiplier, GetDispatchInfo}; use contracts::ContractAddressFor; use system::{EventRecord, Phase}; use node_runtime::{ Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, BuildStorage, GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, System, SystemConfig, - GrandpaConfig, IndicesConfig, ContractsConfig, Event, SessionKeys, - CENTS, DOLLARS, MILLICENTS, + GrandpaConfig, IndicesConfig, ContractsConfig, Event, SessionKeys, SignedExtra, + TransferFee, TransactionBaseFee, TransactionByteFee, }; + use node_runtime::constants::currency::*; + use node_runtime::impls::WeightToFee; use wabt; use primitives::map; @@ -78,10 +79,22 @@ mod tests { const GENESIS_HASH: [u8; 32] = [69u8; 32]; - const TX_FEE: u128 = 3 * CENTS + 460 * MILLICENTS; - type TestExternalities = CoreTestExternalities; + /// Default transfer fee + fn transfer_fee(extrinsic: &E) -> Balance { + let length_fee = TransactionBaseFee::get() + + TransactionByteFee::get() * + (extrinsic.encode().len() as Balance); + + let weight = default_transfer_call().get_dispatch_info().weight; + // NOTE: this is really hard to apply, since the multiplier of each block needs to be fetched + // before the block, while we compute this after the block. + // weight = >::next_weight_multiplier().apply_to(weight); + let weight_fee = ::WeightToFee::convert(weight); + length_fee + weight_fee + TransferFee::get() + } + fn alice() -> AccountId { AccountKeyring::Alice.into() } @@ -108,9 +121,8 @@ mod tests { fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { match xt.signed { - Some((signed, index)) => { - let era = Era::mortal(256, 0); - let payload = (index.into(), xt.function, era, GENESIS_HASH); + Some((signed, extra)) => { + let payload = (xt.function, extra.clone(), GENESIS_HASH, GENESIS_HASH); let key = AccountKeyring::from_public(&signed).unwrap(); let signature = payload.using_encoded(|b| { if b.len() > 256 { @@ -120,8 +132,8 @@ mod tests { } }).into(); UncheckedExtrinsic { - signature: Some((indices::address::Address::Id(signed), signature, payload.0, era)), - function: payload.1, + signature: Some((indices::address::Address::Id(signed), signature, extra)), + function: payload.0, } } None => UncheckedExtrinsic { @@ -131,14 +143,28 @@ mod tests { } } + fn signed_extra(nonce: Index, extra_fee: Balance) -> SignedExtra { + ( + system::CheckGenesis::new(), + system::CheckEra::from(Era::mortal(256, 0)), + system::CheckNonce::from(nonce), + system::CheckWeight::new(), + balances::TakeFees::from(extra_fee) + ) + } + + fn default_transfer_call() -> balances::Call { + balances::Call::transfer::(bob().into(), 69 * DOLLARS) + } + fn xt() -> UncheckedExtrinsic { sign(CheckedExtrinsic { - signed: Some((alice(), 0)), - function: Call::Balances(balances::Call::transfer::(bob().into(), 69 * DOLLARS)), + signed: Some((alice(), signed_extra(0, 0))), + function: Call::Balances(default_transfer_call()), }) } - fn from_block_number(n: u64) -> Header { + fn from_block_number(n: u32) -> Header { Header::new(n, Default::default(), Default::default(), [69; 32].into(), Default::default()) } @@ -148,25 +174,25 @@ mod tests { #[test] fn panic_execution_with_foreign_code_gives_error() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ + let mut t = TestExternalities::::new_with_code(BLOATY_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { - vec![0u8; 16] + 69_u128.encode() }, twox_128(>::key()).to_vec() => { - vec![0u8; 16] + 69_u128.encode() }, twox_128(>::key()).to_vec() => { - vec![0u8; 16] + 0_u128.encode() }, blake2_256(&>::key_for(0)).to_vec() => { vec![0u8; 32] } - ]); + ], map![])); let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_initialize_block", - &vec![].and(&from_block_number(1u64)), + &vec![].and(&from_block_number(1u32)), true, None, ).0; @@ -184,25 +210,25 @@ mod tests { #[test] fn bad_extrinsic_with_native_equivalent_code_gives_error() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { - vec![0u8; 16] + 69_u128.encode() }, twox_128(>::key()).to_vec() => { - vec![0u8; 16] + 69_u128.encode() }, twox_128(>::key()).to_vec() => { - vec![0u8; 16] + 0_u128.encode() }, blake2_256(&>::key_for(0)).to_vec() => { vec![0u8; 32] } - ]); + ], map![])); let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_initialize_block", - &vec![].and(&from_block_number(1u64)), + &vec![].and(&from_block_number(1u32)), true, None, ).0; @@ -220,7 +246,7 @@ mod tests { #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { (111 * DOLLARS).encode() }, @@ -229,12 +255,12 @@ mod tests { }, twox_128(>::key()).to_vec() => vec![0u8; 16], blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] - ]); + ], map![])); let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_initialize_block", - &vec![].and(&from_block_number(1u64)), + &vec![].and(&from_block_number(1u32)), true, None, ).0; @@ -249,14 +275,14 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt())); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } #[test] fn successful_execution_with_foreign_code_gives_ok() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ + let mut t = TestExternalities::::new_with_code(BLOATY_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { (111 * DOLLARS).encode() }, @@ -265,12 +291,12 @@ mod tests { }, twox_128(>::key()).to_vec() => vec![0u8; 16], blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] - ]); + ], map![])); let r = executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_initialize_block", - &vec![].and(&from_block_number(1u64)), + &vec![].and(&from_block_number(1u32)), true, None, ).0; @@ -285,26 +311,30 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt())); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } - fn to_session_keys(ring: &AuthorityKeyring) -> SessionKeys { + fn to_session_keys( + ed25519_keyring: &Ed25519Keyring, + sr25519_keyring: &Sr25519Keyring, + ) -> SessionKeys { SessionKeys { - ed25519: ring.to_owned().into(), + grandpa: ed25519_keyring.to_owned().public().into(), + babe: sr25519_keyring.to_owned().public().into(), + im_online: sr25519_keyring.to_owned().public().into(), } } fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { - let mut ext = TestExternalities::new_with_code_with_children(code, GenesisConfig { - aura: Some(Default::default()), + let mut ext = TestExternalities::new_with_code(code, GenesisConfig { system: Some(SystemConfig { changes_trie_config: if support_changes_trie { Some(ChangesTrieConfiguration { digest_interval: 2, digest_levels: 2, }) } else { None }, - ..Default::default() + .. Default::default() }), indices: Some(IndicesConfig { ids: vec![alice(), bob(), charlie(), dave(), eve(), ferdie()], @@ -322,9 +352,18 @@ mod tests { }), session: Some(SessionConfig { keys: vec![ - (alice(), to_session_keys(&AuthorityKeyring::Alice)), - (bob(), to_session_keys(&AuthorityKeyring::Bob)), - (charlie(), to_session_keys(&AuthorityKeyring::Charlie)), + (alice(), to_session_keys( + &Ed25519Keyring::Alice, + &Sr25519Keyring::Alice, + )), + (bob(), to_session_keys( + &Ed25519Keyring::Bob, + &Sr25519Keyring::Bob, + )), + (charlie(), to_session_keys( + &Ed25519Keyring::Charlie, + &Sr25519Keyring::Charlie, + )), ] }), staking: Some(StakingConfig { @@ -337,23 +376,25 @@ mod tests { validator_count: 3, minimum_validator_count: 0, offline_slash: Perbill::zero(), - session_reward: Perbill::zero(), - current_session_reward: 0, offline_slash_grace: 0, invulnerables: vec![alice(), bob(), charlie()], + .. Default::default() }), - democracy: Some(Default::default()), - collective_Instance1: Some(Default::default()), - collective_Instance2: Some(Default::default()), - elections: Some(Default::default()), contracts: Some(ContractsConfig { current_schedule: Default::default(), gas_price: 1 * MILLICENTS, }), - sudo: Some(Default::default()), + babe: Some(Default::default()), grandpa: Some(GrandpaConfig { authorities: vec![], }), + im_online: Some(Default::default()), + democracy: Some(Default::default()), + collective_Instance1: Some(Default::default()), + collective_Instance2: Some(Default::default()), + membership_Instance1: Some(Default::default()), + elections: Some(Default::default()), + sudo: Some(Default::default()), }.build_storage().unwrap()); ext.changes_trie_storage().insert(0, GENESIS_HASH.into(), Default::default()); ext @@ -365,13 +406,13 @@ mod tests { parent_hash: Hash, extrinsics: Vec, ) -> (Vec, Hash) { - use trie::ordered_trie_root; + use trie::{TrieConfiguration, trie_types::Layout}; // sign extrinsics. let extrinsics = extrinsics.into_iter().map(sign).collect::>(); // calculate the header fields that we can. - let extrinsics_root = ordered_trie_root::( + let extrinsics_root = Layout::::ordered_trie_root( extrinsics.iter().map(Encode::encode) ).to_fixed_bytes() .into(); @@ -385,7 +426,7 @@ mod tests { }; // execute the block to get the real header. - Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + executor().call::<_, NeverNativeValue, fn() -> _>( env, "Core_initialize_block", &header.encode(), @@ -394,7 +435,7 @@ mod tests { ).0.unwrap(); for i in extrinsics.iter() { - Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + executor().call::<_, NeverNativeValue, fn() -> _>( env, "BlockBuilder_apply_extrinsic", &i.encode(), @@ -403,7 +444,7 @@ mod tests { ).0.unwrap(); } - let header = match Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + let header = match executor().call::<_, NeverNativeValue, fn() -> _>( env, "BlockBuilder_finalize_block", &[0u8;0], @@ -426,10 +467,10 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), + function: Call::Timestamp(timestamp::Call::set(42 * 1000)), }, CheckedExtrinsic { - signed: Some((alice(), 0)), + signed: Some((alice(), signed_extra(0, 0))), function: Call::Balances(balances::Call::transfer(bob().into(), 69 * DOLLARS)), }, ] @@ -448,10 +489,10 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), + function: Call::Timestamp(timestamp::Call::set(42 * 1000)), }, CheckedExtrinsic { - signed: Some((alice(), 0)), + signed: Some((alice(), signed_extra(0, 0))), function: Call::Balances(balances::Call::transfer(bob().into(), 69 * DOLLARS)), }, ] @@ -463,14 +504,14 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(52)), + function: Call::Timestamp(timestamp::Call::set(52 * 1000)), }, CheckedExtrinsic { - signed: Some((bob(), 0)), + signed: Some((bob(), signed_extra(0, 0))), function: Call::Balances(balances::Call::transfer(alice().into(), 5 * DOLLARS)), }, CheckedExtrinsic { - signed: Some((alice(), 1)), + signed: Some((alice(), signed_extra(1, 0))), function: Call::Balances(balances::Call::transfer(bob().into(), 15 * DOLLARS)), } ] @@ -479,12 +520,11 @@ mod tests { // session change => consensus authorities change => authorities change digest item appears let digest = Header::decode(&mut &block2.0[..]).unwrap().digest; assert_eq!(digest.logs().len(), 0); -// assert!(digest.logs()[0].as_consensus().is_some()); (block1, block2) } - fn big_block() -> (Vec, Hash) { + fn block_with_size(time: u64, nonce: u32, size: usize) -> (Vec, Hash) { construct_block( &mut new_test_ext(COMPACT_CODE, false), 1, @@ -492,11 +532,11 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), + function: Call::Timestamp(timestamp::Call::set(time * 1000)), }, CheckedExtrinsic { - signed: Some((alice(), 0)), - function: Call::System(system::Call::remark(vec![0; 120000])), + signed: Some((alice(), signed_extra(nonce, 0))), + function: Call::System(system::Call::remark(vec![0; size])), } ] ) @@ -517,9 +557,7 @@ mod tests { ).0.unwrap(); runtime_io::with_externalities(&mut t, || { - // block1 transfers from alice 69 to bob. - // -1 is the default fee - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt())); assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); let events = vec![ EventRecord { @@ -545,7 +583,6 @@ mod tests { ]; assert_eq!(System::events(), events); }); - executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", @@ -555,11 +592,18 @@ mod tests { ).0.unwrap(); runtime_io::with_externalities(&mut t, || { - // bob sends 5, alice sends 15 | bob += 10, alice -= 10 - // 111 - 69 - 10 = 32 - assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * TX_FEE); - // 100 + 69 + 10 = 179 - assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - 1 * TX_FEE); + // NOTE: fees differ slightly in tests that execute more than one block due to the + // weight update. Hence, using `assert_eq_error_rate`. + assert_eq_error_rate!( + Balances::total_balance(&alice()), + 32 * DOLLARS - 2 * transfer_fee(&xt()), + 10_000 + ); + assert_eq_error_rate!( + Balances::total_balance(&bob()), + 179 * DOLLARS - transfer_fee(&xt()), + 10_000 + ); let events = vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), @@ -614,19 +658,23 @@ mod tests { WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); runtime_io::with_externalities(&mut t, || { - // block1 transfers from alice 69 to bob. - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - transfer_fee(&xt())); assert_eq!(Balances::total_balance(&bob()), 169 * DOLLARS); }); WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block2.0).unwrap(); runtime_io::with_externalities(&mut t, || { - // bob sends 5, alice sends 15 | bob += 10, alice -= 10 - // 111 - 69 - 10 = 32 - assert_eq!(Balances::total_balance(&alice()), 32 * DOLLARS - 2 * TX_FEE); - // 100 + 69 + 10 = 179 - assert_eq!(Balances::total_balance(&bob()), 179 * DOLLARS - 1 * TX_FEE); + assert_eq_error_rate!( + Balances::total_balance(&alice()), + 32 * DOLLARS - 2 * transfer_fee(&xt()), + 10_000 + ); + assert_eq_error_rate!( + Balances::total_balance(&bob()), + 179 * DOLLARS - 1 * transfer_fee(&xt()), + 10_000 + ); }); } @@ -643,7 +691,7 @@ mod tests { ;; ) -> u32 (import "env" "ext_call" (func $ext_call (param i32 i32 i64 i32 i32 i32 i32) (result i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func (export "deploy") ) @@ -658,7 +706,7 @@ mod tests { ) ) - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 0) (i32.const 0) (i32.const 4) @@ -724,7 +772,6 @@ mod tests { #[test] fn deploying_wasm_contract_should_work() { - let transfer_code = wabt::wat2wasm(CODE_TRANSFER).unwrap(); let transfer_ch = ::Hashing::hash(&transfer_code); @@ -741,22 +788,22 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42)), + function: Call::Timestamp(timestamp::Call::set(42 * 1000)), }, CheckedExtrinsic { - signed: Some((charlie(), 0)), + signed: Some((charlie(), signed_extra(0, 0))), function: Call::Contracts( contracts::Call::put_code::(10_000, transfer_code) ), }, CheckedExtrinsic { - signed: Some((charlie(), 1)), + signed: Some((charlie(), signed_extra(1, 0))), function: Call::Contracts( contracts::Call::create::(1 * DOLLARS, 10_000, transfer_ch, Vec::new()) ), }, CheckedExtrinsic { - signed: Some((charlie(), 2)), + signed: Some((charlie(), signed_extra(2, 0))), function: Call::Contracts( contracts::Call::call::( indices::address::Address::Id(addr.clone()), @@ -789,25 +836,24 @@ mod tests { fn wasm_big_block_import_fails() { let mut t = new_test_ext(COMPACT_CODE, false); - assert!( - WasmExecutor::new().call( - &mut t, - 4, - COMPACT_CODE, - "Core_execute_block", - &big_block().0 - ).is_err() + let result = WasmExecutor::new().call( + &mut t, + 4, + COMPACT_CODE, + "Core_execute_block", + &block_with_size(42, 0, 120_000).0 ); + assert!(result.is_err()); // Err(Wasmi(Trap(Trap { kind: Host(AllocatorOutOfSpace) }))) } #[test] fn native_big_block_import_succeeds() { let mut t = new_test_ext(COMPACT_CODE, false); - Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", - &big_block().0, + &block_with_size(42, 0, 120_000).0, true, None, ).0.unwrap(); @@ -818,10 +864,10 @@ mod tests { let mut t = new_test_ext(COMPACT_CODE, false); assert!( - Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", - &big_block().0, + &block_with_size(42, 0, 120_000).0, false, None, ).0.is_err() @@ -830,19 +876,19 @@ mod tests { #[test] fn panic_execution_gives_error() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ + let mut t = TestExternalities::::new_with_code(BLOATY_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { - vec![0u8; 16] + 0_u128.encode() }, twox_128(>::key()).to_vec() => { - vec![0u8; 16] + 0_u128.encode() }, twox_128(>::key()).to_vec() => vec![0u8; 16], blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] - ]); + ], map![])); let r = WasmExecutor::new() - .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); + .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u32))); assert!(r.is_ok()); let r = WasmExecutor::new() .call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); @@ -852,7 +898,7 @@ mod tests { #[test] fn successful_execution_gives_ok() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, (map![ blake2_256(&>::key_for(alice())).to_vec() => { (111 * DOLLARS).encode() }, @@ -861,10 +907,10 @@ mod tests { }, twox_128(>::key()).to_vec() => vec![0u8; 16], blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] - ]); + ], map![])); let r = WasmExecutor::new() - .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); + .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u32))); assert!(r.is_ok()); let r = WasmExecutor::new() .call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); @@ -872,7 +918,7 @@ mod tests { assert_eq!(r, Ok(ApplyOutcome::Success)); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * TX_FEE); + assert_eq!(Balances::total_balance(&alice()), 42 * DOLLARS - 1 * transfer_fee(&xt())); assert_eq!(Balances::total_balance(&bob()), 69 * DOLLARS); }); } @@ -884,7 +930,7 @@ mod tests { let block = Block::decode(&mut &block_data[..]).unwrap(); let mut t = new_test_ext(COMPACT_CODE, true); - Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", &block.encode(), @@ -900,8 +946,7 @@ mod tests { let block1 = changes_trie_block(); let mut t = new_test_ext(COMPACT_CODE, true); - WasmExecutor::new() - .call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); + WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); assert!(t.storage_changes_root(GENESIS_HASH.into()).unwrap().is_some()); } @@ -921,6 +966,292 @@ mod tests { client.import(BlockOrigin::Own, block).unwrap(); } + + #[test] + fn weight_multiplier_increases_and_decreases_on_big_weight() { + let mut t = new_test_ext(COMPACT_CODE, false); + + let mut prev_multiplier = WeightMultiplier::default(); + + runtime_io::with_externalities(&mut t, || { + assert_eq!(System::next_weight_multiplier(), prev_multiplier); + }); + + let mut tt = new_test_ext(COMPACT_CODE, false); + + // big one in terms of weight. + let block1 = construct_block( + &mut tt, + 1, + GENESIS_HASH.into(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(42 * 1000)), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(0, 0))), + function: Call::System(system::Call::fill_block()), + } + ] + ); + + // small one in terms of weight. + let block2 = construct_block( + &mut tt, + 2, + block1.1.clone(), + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(52 * 1000)), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(1, 0))), + function: Call::System(system::Call::remark(vec![0; 1])), + } + ] + ); + + println!("++ Block 1 size: {} / Block 2 size {}", block1.0.encode().len(), block2.0.encode().len()); + + // execute a big block. + executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_execute_block", + &block1.0, + true, + None, + ).0.unwrap(); + + // weight multiplier is increased for next block. + runtime_io::with_externalities(&mut t, || { + let fm = System::next_weight_multiplier(); + println!("After a big block: {:?} -> {:?}", prev_multiplier, fm); + assert!(fm > prev_multiplier); + prev_multiplier = fm; + }); + + // execute a big block. + executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_execute_block", + &block2.0, + true, + None, + ).0.unwrap(); + + // weight multiplier is increased for next block. + runtime_io::with_externalities(&mut t, || { + let fm = System::next_weight_multiplier(); + println!("After a small block: {:?} -> {:?}", prev_multiplier, fm); + assert!(fm < prev_multiplier); + }); + } + + #[test] + fn transaction_fee_is_correct_ultimate() { + // This uses the exact values of substrate-node. + // + // weight of transfer call as of now: 1_000_000 + // if weight of the cheapest weight would be 10^7, this would be 10^9, which is: + // - 1 MILLICENTS in substrate node. + // - 1 milldot based on current polkadot runtime. + // (this baed on assigning 0.1 CENT to the cheapest tx with `weight = 100`) + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, (map![ + blake2_256(&>::key_for(alice())).to_vec() => { + (100 * DOLLARS).encode() + }, + blake2_256(&>::key_for(bob())).to_vec() => { + (10 * DOLLARS).encode() + }, + twox_128(>::key()).to_vec() => { + (110 * DOLLARS).encode() + }, + twox_128(>::key()).to_vec() => vec![0u8; 16], + blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32] + ], map![])); + + let tip = 1_000_000; + let xt = sign(CheckedExtrinsic { + signed: Some((alice(), signed_extra(0, tip))), + function: Call::Balances(default_transfer_call()), + }); + + let r = executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_initialize_block", + &vec![].and(&from_block_number(1u32)), + true, + None, + ).0; + + assert!(r.is_ok()); + let r = executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "BlockBuilder_apply_extrinsic", + &vec![].and(&xt.clone()), + true, + None, + ).0; + assert!(r.is_ok()); + + runtime_io::with_externalities(&mut t, || { + assert_eq!(Balances::total_balance(&bob()), (10 + 69) * DOLLARS); + // Components deducted from alice's balances: + // - Weight fee + // - Length fee + // - Tip + // - Creation-fee of bob's account. + let mut balance_alice = (100 - 69) * DOLLARS; + + let length_fee = TransactionBaseFee::get() + + TransactionByteFee::get() * + (xt.clone().encode().len() as Balance); + balance_alice -= length_fee; + + let weight = default_transfer_call().get_dispatch_info().weight; + let weight_fee = WeightToFee::convert(weight); + + // we know that weight to fee multiplier is effect-less in block 1. + assert_eq!(weight_fee as Balance, MILLICENTS); + balance_alice -= weight_fee; + + balance_alice -= tip; + balance_alice -= TransferFee::get(); + + assert_eq!(Balances::total_balance(&alice()), balance_alice); + }); + } + + #[test] + #[should_panic] + #[cfg(feature = "stress-test")] + fn block_weight_capacity_report() { + // Just report how many transfer calls you could fit into a block. The number should at least + // be a few hundred (250 at the time of writing but can change over time). Runs until panic. + + // execution ext. + let mut t = new_test_ext(COMPACT_CODE, false); + // setup ext. + let mut tt = new_test_ext(COMPACT_CODE, false); + + let factor = 50; + let mut time = 10; + let mut nonce: Index = 0; + let mut block_number = 1; + let mut previous_hash: Hash = GENESIS_HASH.into(); + + loop { + let num_transfers = block_number * factor; + let mut xts = (0..num_transfers).map(|i| CheckedExtrinsic { + signed: Some((charlie(), signed_extra(nonce + i as Index, 0))), + function: Call::Balances(balances::Call::transfer(bob().into(), 0)), + }).collect::>(); + + xts.insert(0, CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(time * 1000)), + }); + + // NOTE: this is super slow. Can probably be improved. + let block = construct_block( + &mut tt, + block_number, + previous_hash, + xts + ); + + let len = block.0.len(); + print!( + "++ Executing block with {} transfers. Block size = {} bytes / {} kb / {} mb", + num_transfers, + len, + len / 1024, + len / 1024 / 1024, + ); + + let r = executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_execute_block", + &block.0, + true, + None, + ).0; + + println!(" || Result = {:?}", r); + assert!(r.is_ok()); + + previous_hash = block.1; + nonce += num_transfers; + time += 10; + block_number += 1; + } + } + + #[test] + #[should_panic] + #[cfg(feature = "stress-test")] + fn block_length_capacity_report() { + // Just report how big a block can get. Executes until panic. Should be ignored unless if + // manually inspected. The number should at least be a few megabytes (5 at the time of + // writing but can change over time). + + // execution ext. + let mut t = new_test_ext(COMPACT_CODE, false); + // setup ext. + let mut tt = new_test_ext(COMPACT_CODE, false); + + let factor = 256 * 1024; + let mut time = 10; + let mut nonce: Index = 0; + let mut block_number = 1; + let mut previous_hash: Hash = GENESIS_HASH.into(); + + loop { + // NOTE: this is super slow. Can probably be improved. + let block = construct_block( + &mut tt, + block_number, + previous_hash, + vec![ + CheckedExtrinsic { + signed: None, + function: Call::Timestamp(timestamp::Call::set(time * 1000)), + }, + CheckedExtrinsic { + signed: Some((charlie(), signed_extra(nonce, 0))), + function: Call::System(system::Call::remark(vec![0u8; (block_number * factor) as usize])), + }, + ] + ); + + let len = block.0.len(); + print!( + "++ Executing block with big remark. Block size = {} bytes / {} kb / {} mb", + len, + len / 1024, + len / 1024 / 1024, + ); + + let r = executor().call::<_, NeverNativeValue, fn() -> _>( + &mut t, + "Core_execute_block", + &block.0, + true, + None, + ).0; + + println!(" || Result = {:?}", r); + assert!(r.is_ok()); + + previous_hash = block.1; + nonce += 1; + time += 10; + block_number += 1; + } + } + #[cfg(feature = "benchmarks")] mod benches { use super::*; diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index c4be1ef6f22e780ebd507b4cbecdb15af345844a..654347273fb71d109bf005dcc2bb33d3bb0cedd1 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -6,21 +6,21 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } [dev-dependencies] substrate-serializer = { path = "../../core/serializer" } -pretty_assertions = "0.5" +pretty_assertions = "0.6.1" [features] default = ["std"] std = [ - "parity-codec/std", + "codec/std", "primitives/std", "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", "serde", ] diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 351bb4fa12ed5607c75c22018fb7076bc88cc991..431ba17c00bbeca51948fa2cd47a8dc2efe97ac3 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -20,12 +20,12 @@ #![cfg_attr(not(feature = "std"), no_std)] -use runtime_primitives::{ +use sr_primitives::{ generic, traits::{Verify, BlakeTwo256}, OpaqueExtrinsic, AnySignature }; /// An index to a block. -pub type BlockNumber = u64; +pub type BlockNumber = u32; /// Alias to 512-bit hash when used in the context of a transaction signature on the chain. pub type Signature = AnySignature; @@ -44,23 +44,15 @@ pub type Balance = u128; /// Type used for expressing timestamp. pub type Moment = u64; -/// The aura crypto scheme defined via the keypair type. -#[cfg(feature = "std")] -pub type AuraPair = primitives::ed25519::Pair; - -/// Identity of an Aura authority. -pub type AuraId = primitives::ed25519::Public; - -/// Signature for an Aura authority. -pub type AuraSignature = primitives::ed25519::Signature; - /// Index of a transaction in the chain. -pub type Index = u64; +pub type Index = u32; /// A hash of some data used by the chain. pub type Hash = primitives::H256; -/// A timestamp: seconds since the unix epoch. +/// A timestamp: milliseconds since the unix epoch. +/// `u64` is enough to represent a duration of half a billion years, when the +/// time scale is milliseconds. pub type Timestamp = u64; /// Digest item type. diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index 3bf28f7df2a2e6b030eed7a337a1e7f4bb2c8d45..7ffb29e0784ce59db45f9877fd2b6a2e48bb7890 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -8,16 +8,18 @@ build = "build.rs" [dependencies] integer-sqrt = { version = "0.1.2" } safe-mix = { version = "1.0", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } client = { package = "substrate-client", path = "../../core/client", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../../core/offchain/primitives", default-features = false } version = { package = "sr-version", path = "../../core/sr-version", default-features = false } support = { package = "srml-support", path = "../../srml/support", default-features = false } -aura = { package = "srml-aura", path = "../../srml/aura", default-features = false } authorship = { package = "srml-authorship", path = "../../srml/authorship", default-features = false } +babe = { package = "srml-babe", path = "../../srml/babe", default-features = false } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives", default-features = false } +consensus-primitives = { package = "substrate-consensus-common-primitives", path = "../../core/consensus/common/primitives", default-features = false } balances = { package = "srml-balances", path = "../../srml/balances", default-features = false } contracts = { package = "srml-contracts", path = "../../srml/contracts", default-features = false } collective = { package = "srml-collective", path = "../../srml/collective", default-features = false } @@ -27,17 +29,19 @@ executive = { package = "srml-executive", path = "../../srml/executive", default finality-tracker = { package = "srml-finality-tracker", path = "../../srml/finality-tracker", default-features = false } grandpa = { package = "srml-grandpa", path = "../../srml/grandpa", default-features = false } indices = { package = "srml-indices", path = "../../srml/indices", default-features = false } +membership = { package = "srml-membership", path = "../../srml/membership", default-features = false } session = { package = "srml-session", path = "../../srml/session", default-features = false, features = ["historical"] } staking = { package = "srml-staking", path = "../../srml/staking", default-features = false } system = { package = "srml-system", path = "../../srml/system", default-features = false } timestamp = { package = "srml-timestamp", path = "../../srml/timestamp", default-features = false } treasury = { package = "srml-treasury", path = "../../srml/treasury", default-features = false } sudo = { package = "srml-sudo", path = "../../srml/sudo", default-features = false } +im-online = { package = "srml-im-online", path = "../../srml/im-online", default-features = false } node-primitives = { path = "../primitives", default-features = false } -consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives", default-features = false } rustc-hex = { version = "2.0", optional = true } serde = { version = "1.0", optional = true } substrate-keyring = { path = "../../core/keyring", optional = true } +substrate-session = { path = "../../core/session", default-features = false } [build-dependencies] wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.2", path = "../../core/utils/wasm-builder-runner" } @@ -48,13 +52,15 @@ no_std = [ "contracts/core", ] std = [ - "parity-codec/std", - "substrate-primitives/std", + "codec/std", + "primitives/std", "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", "support/std", - "aura/std", "authorship/std", + "babe/std", + "babe-primitives/std", + "consensus-primitives/std", "balances/std", "contracts/std", "collective/std", @@ -64,6 +70,7 @@ std = [ "finality-tracker/std", "grandpa/std", "indices/std", + "membership/std", "session/std", "staking/std", "system/std", @@ -75,8 +82,9 @@ std = [ "serde", "safe-mix/std", "client/std", - "consensus_aura/std", "rustc-hex", "substrate-keyring", "offchain-primitives/std", + "im-online/std", + "substrate-session/std", ] diff --git a/node/runtime/build.rs b/node/runtime/build.rs index 39aecacb20e0fcbe4d5c6ee639e531a6734b1eeb..a5f22fd0171467ee714f04a3feb583137d5a890c 100644 --- a/node/runtime/build.rs +++ b/node/runtime/build.rs @@ -14,14 +14,17 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::{build_current_project, WasmBuilderSource}; +use wasm_builder_runner::{build_current_project_with_rustflags, WasmBuilderSource}; fn main() { - build_current_project( + build_current_project_with_rustflags( "wasm_binary.rs", WasmBuilderSource::CratesOrPath { path: "../../core/utils/wasm-builder", version: "1.0.4", }, + // This instructs LLD to export __heap_base as a global variable, which is used by the + // external memory allocator. + "-Clink-arg=--export=__heap_base", ); } diff --git a/node/runtime/src/constants.rs b/node/runtime/src/constants.rs new file mode 100644 index 0000000000000000000000000000000000000000..f728efb3be89ff096341e257a5422937cfed48a0 --- /dev/null +++ b/node/runtime/src/constants.rs @@ -0,0 +1,76 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! A set of constant values used in substrate runtime. + +/// Money matters. +pub mod currency { + use node_primitives::Balance; + + pub const MILLICENTS: Balance = 1_000_000_000; + pub const CENTS: Balance = 1_000 * MILLICENTS; // assume this is worth about a cent. + pub const DOLLARS: Balance = 100 * CENTS; +} + +/// Time. +pub mod time { + use node_primitives::{Moment, BlockNumber}; + + /// Since BABE is probabilistic this is the average expected block time that + /// we are targetting. Blocks will be produced at a minimum duration defined + /// by `SLOT_DURATION`, but some slots will not be allocated to any + /// authority and hence no block will be produced. We expect to have this + /// block time on average following the defined slot duration and the value + /// of `c` configured for BABE (where `1 - c` represents the probability of + /// a slot being empty). + /// This value is only used indirectly to define the unit constants below + /// that are expressed in blocks. The rest of the code should use + /// `SLOT_DURATION` instead (like the timestamp module for calculating the + /// minimum period). + /// + pub const MILLISECS_PER_BLOCK: Moment = 6000; + pub const SECS_PER_BLOCK: Moment = MILLISECS_PER_BLOCK / 1000; + + pub const SLOT_DURATION: Moment = 1650; + + pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 10 * MINUTES; + pub const EPOCH_DURATION_IN_SLOTS: u64 = { + const SLOT_FILL_RATE: f64 = MILLISECS_PER_BLOCK as f64 / SLOT_DURATION as f64; + + (EPOCH_DURATION_IN_BLOCKS as f64 * SLOT_FILL_RATE) as u64 + }; + + // These time units are defined in number of blocks. + pub const MINUTES: BlockNumber = 60 / (SECS_PER_BLOCK as BlockNumber); + pub const HOURS: BlockNumber = MINUTES * 60; + pub const DAYS: BlockNumber = HOURS * 24; +} + +// CRITICAL NOTE: The system module maintains two constants: a _maximum_ block weight and a +// _ratio_ of it yielding the portion which is accessible to normal transactions (reserving the rest +// for operational ones). `TARGET_BLOCK_FULLNESS` is entirely independent and the system module is +// not aware of if, nor should it care about it. This constant simply denotes on which ratio of the +// _maximum_ block weight we tweak the fees. It does NOT care about the type of the dispatch. +// +// For the system to be configured in a sane way, `TARGET_BLOCK_FULLNESS` should always be less than +// the ratio that `system` module uses to find normal transaction quota. +/// Fee-related. +pub mod fee { + pub use sr_primitives::Perbill; + + /// The block saturation level. Fees will be updates based on this value. + pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); +} diff --git a/node/runtime/src/impls.rs b/node/runtime/src/impls.rs new file mode 100644 index 0000000000000000000000000000000000000000..2e1fcc8826e035a174d36b1bbac79cae96015c57 --- /dev/null +++ b/node/runtime/src/impls.rs @@ -0,0 +1,302 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Some configurable implementations as associated type for the substrate runtime. + +use node_primitives::Balance; +use sr_primitives::weights::{Weight, WeightMultiplier}; +use sr_primitives::traits::{Convert, Saturating}; +use sr_primitives::Fixed64; +use support::traits::{OnUnbalanced, Currency}; +use crate::{Balances, Authorship, MaximumBlockWeight, NegativeImbalance}; +use crate::constants::fee::TARGET_BLOCK_FULLNESS; + +pub struct Author; +impl OnUnbalanced for Author { + fn on_unbalanced(amount: NegativeImbalance) { + Balances::resolve_creating(&Authorship::author(), amount); + } +} + +/// Struct that handles the conversion of Balance -> `u64`. This is used for staking's election +/// calculation. +pub struct CurrencyToVoteHandler; + +impl CurrencyToVoteHandler { + fn factor() -> Balance { (Balances::total_issuance() / u64::max_value() as Balance).max(1) } +} + +impl Convert for CurrencyToVoteHandler { + fn convert(x: Balance) -> u64 { (x / Self::factor()) as u64 } +} + +impl Convert for CurrencyToVoteHandler { + fn convert(x: u128) -> Balance { x * Self::factor() } +} + +/// 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, system::MaximumBlockWeight] +/// - [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. +/// +/// By default, substrate node will have a weight range of [0, 1_000_000_000]. +pub struct WeightToFee; +impl Convert for WeightToFee { + fn convert(x: Weight) -> Balance { + // substrate-node a weight of 10_000 (smallest non-zero weight) to be mapped to 10^7 units of + // fees, hence: + Balance::from(x).saturating_mul(1_000) + } +} + +/// A struct that updates the weight multiplier based on the saturation level of the previous block. +/// This should typically be called once per-block. +/// +/// This assumes that weight is a numeric value in the u32 range. +/// +/// Given `TARGET_BLOCK_FULLNESS = 1/2`, a block saturation greater than 1/2 will cause the system +/// fees to slightly grow and the opposite for block saturations less than 1/2. +/// +/// Formula: +/// diff = (target_weight - current_block_weight) +/// v = 0.00004 +/// next_weight = weight * (1 + (v . diff) + (v . diff)^2 / 2) +/// +/// https://research.web3.foundation/en/latest/polkadot/Token%20Economics/#relay-chain-transaction-fees +pub struct WeightMultiplierUpdateHandler; + +impl Convert<(Weight, WeightMultiplier), WeightMultiplier> for WeightMultiplierUpdateHandler { + fn convert(previous_state: (Weight, WeightMultiplier)) -> WeightMultiplier { + let (block_weight, multiplier) = previous_state; + let max_weight = MaximumBlockWeight::get(); + let target_weight = (TARGET_BLOCK_FULLNESS * max_weight) as u128; + let block_weight = block_weight as u128; + + // determines if the first_term is positive + let positive = block_weight >= target_weight; + let diff_abs = block_weight.max(target_weight) - block_weight.min(target_weight); + // diff is within u32, safe. + let diff = Fixed64::from_rational(diff_abs as i64, max_weight as u64); + let diff_squared = diff.saturating_mul(diff); + + // 0.00004 = 4/100_000 = 40_000/10^9 + let v = Fixed64::from_rational(4, 100_000); + // 0.00004^2 = 16/10^10 ~= 2/10^9. Taking the future /2 into account, then it is just 1 parts + // from a billionth. + let v_squared_2 = Fixed64::from_rational(1, 1_000_000_000); + + let first_term = v.saturating_mul(diff); + // It is very unlikely that this will exist (in our poor perbill estimate) but we are giving + // it a shot. + let second_term = v_squared_2.saturating_mul(diff_squared); + + if positive { + // Note: this is merely bounded by how big the multiplier and the inner value can go, + // not by any economical reasoning. + let excess = first_term.saturating_add(second_term); + multiplier.saturating_add(WeightMultiplier::from_fixed(excess)) + } else { + // first_term > second_term + let negative = first_term - second_term; + multiplier.saturating_sub(WeightMultiplier::from_fixed(negative)) + // despite the fact that apply_to saturates weight (final fee cannot go below 0) + // it is crucially important to stop here and don't further reduce the weight fee + // multiplier. While at -1, it means that the network is so un-congested that all + // transactions have no weight fee. We stop here and only increase if the network + // became more busy. + .max(WeightMultiplier::from_rational(-1, 1)) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use sr_primitives::weights::Weight; + use sr_primitives::Perbill; + use crate::{MaximumBlockWeight, AvailableBlockRatio, Runtime}; + use crate::constants::currency::*; + + fn max() -> Weight { + MaximumBlockWeight::get() + } + + fn target() -> Weight { + TARGET_BLOCK_FULLNESS * max() + } + + // poc reference implementation. + #[allow(dead_code)] + fn weight_multiplier_update(block_weight: Weight) -> Perbill { + let block_weight = block_weight as f32; + let v: f32 = 0.00004; + + // maximum tx weight + let m = max() as f32; + // Ideal saturation in terms of weight + let ss = target() as f32; + // Current saturation in terms of weight + let s = block_weight; + + let fm = 1.0 + (v * (s/m - ss/m)) + (v.powi(2) * (s/m - ss/m).powi(2)) / 2.0; + // return a per-bill-like value. + let fm = if fm >= 1.0 { fm - 1.0 } else { 1.0 - fm }; + Perbill::from_parts((fm * 1_000_000_000_f32) as u32) + } + + fn wm(parts: i64) -> WeightMultiplier { + WeightMultiplier::from_parts(parts) + } + + #[test] + fn empty_chain_simulation() { + // just a few txs per_block. + let block_weight = 1000; + let mut wm = WeightMultiplier::default(); + let mut iterations: u64 = 0; + loop { + let next = WeightMultiplierUpdateHandler::convert((block_weight, wm)); + wm = next; + if wm == WeightMultiplier::from_rational(-1, 1) { break; } + iterations += 1; + } + println!("iteration {}, new wm = {:?}. Weight fee is now zero", iterations, wm); + } + + #[test] + #[ignore] + fn congested_chain_simulation() { + // `cargo test congested_chain_simulation -- --nocapture` to get some insight. + // almost full. The entire quota of normal transactions is taken. + let block_weight = AvailableBlockRatio::get() * max(); + let tx_weight = 1000; + let mut wm = WeightMultiplier::default(); + let mut iterations: u64 = 0; + loop { + let next = WeightMultiplierUpdateHandler::convert((block_weight, wm)); + if wm == next { break; } + wm = next; + iterations += 1; + let fee = ::WeightToFee::convert(wm.apply_to(tx_weight)); + println!( + "iteration {}, new wm = {:?}. Fee at this point is: {} millicents, {} cents, {} dollars", + iterations, + wm, + fee / MILLICENTS, + fee / CENTS, + fee / DOLLARS + ); + } + } + + #[test] + fn stateless_weight_mul() { + // Light block. Fee is reduced a little. + assert_eq!( + WeightMultiplierUpdateHandler::convert((target() / 4, WeightMultiplier::default())), + wm(-7500) + ); + // a bit more. Fee is decreased less, meaning that the fee increases as the block grows. + assert_eq!( + WeightMultiplierUpdateHandler::convert((target() / 2, WeightMultiplier::default())), + wm(-5000) + ); + // ideal. Original fee. No changes. + assert_eq!( + WeightMultiplierUpdateHandler::convert((target(), WeightMultiplier::default())), + wm(0) + ); + // // More than ideal. Fee is increased. + assert_eq!( + WeightMultiplierUpdateHandler::convert(((target() * 2), WeightMultiplier::default())), + wm(10000) + ); + } + + #[test] + fn stateful_weight_mul_grow_to_infinity() { + assert_eq!( + WeightMultiplierUpdateHandler::convert((target() * 2, WeightMultiplier::default())), + wm(10000) + ); + assert_eq!( + WeightMultiplierUpdateHandler::convert((target() * 2, wm(10000))), + wm(20000) + ); + assert_eq!( + WeightMultiplierUpdateHandler::convert((target() * 2, wm(20000))), + wm(30000) + ); + // ... + assert_eq!( + WeightMultiplierUpdateHandler::convert((target() * 2, wm(1_000_000_000))), + wm(1_000_000_000 + 10000) + ); + } + + #[test] + fn stateful_weight_mil_collapse_to_minus_one() { + assert_eq!( + WeightMultiplierUpdateHandler::convert((0, WeightMultiplier::default())), + wm(-10000) + ); + assert_eq!( + WeightMultiplierUpdateHandler::convert((0, wm(-10000))), + wm(-20000) + ); + assert_eq!( + WeightMultiplierUpdateHandler::convert((0, wm(-20000))), + wm(-30000) + ); + // ... + assert_eq!( + WeightMultiplierUpdateHandler::convert((0, wm(1_000_000_000 * -1))), + wm(-1_000_000_000) + ); + } + + #[test] + fn weight_to_fee_should_not_overflow_on_large_weights() { + let kb = 1024 as Weight; + let mb = kb * kb; + let max_fm = WeightMultiplier::from_fixed(Fixed64::from_natural(i64::max_value())); + + vec![0, 1, 10, 1000, kb, 10 * kb, 100 * kb, mb, 10 * mb, Weight::max_value() / 2, Weight::max_value()] + .into_iter() + .for_each(|i| { + WeightMultiplierUpdateHandler::convert((i, WeightMultiplier::default())); + }); + + // Some values that are all above the target and will cause an increase. + let t = target(); + vec![t + 100, t * 2, t * 4] + .into_iter() + .for_each(|i| { + let fm = WeightMultiplierUpdateHandler::convert(( + i, + max_fm + )); + // won't grow. The convert saturates everything. + assert_eq!(fm, max_fm); + }); + } +} diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index f1903c006273af525869ae1576fa25d08302e2ce..3648e54e460330f335bd2ecee64ae5c3374b4808 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -22,40 +22,51 @@ use rstd::prelude::*; use support::{ - construct_runtime, parameter_types, traits::{SplitTwoWays, Currency, OnUnbalanced} + construct_runtime, parameter_types, traits::{SplitTwoWays, Currency} }; -use substrate_primitives::u32_trait::{_1, _2, _3, _4}; +use primitives::u32_trait::{_1, _2, _3, _4}; use node_primitives::{ - AccountId, AccountIndex, AuraId, Balance, BlockNumber, Hash, Index, + AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, Moment, Signature, }; +use babe::{AuthorityId as BabeId}; use grandpa::fg_primitives::{self, ScheduledChange}; use client::{ block_builder::api::{self as block_builder_api, InherentData, CheckInherentsResult}, runtime_api as client_api, impl_runtime_apis }; -use runtime_primitives::{ApplyResult, impl_opaque_keys, generic, create_runtime_str, key_types}; -use runtime_primitives::transaction_validity::TransactionValidity; -use runtime_primitives::traits::{ - BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, Convert, +use sr_primitives::{ApplyResult, impl_opaque_keys, generic, create_runtime_str, key_types}; +use sr_primitives::transaction_validity::TransactionValidity; +use sr_primitives::weights::Weight; +use sr_primitives::traits::{ + BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, }; use version::RuntimeVersion; use elections::VoteIndex; #[cfg(any(feature = "std", test))] use version::NativeVersion; -use substrate_primitives::OpaqueMetadata; +use primitives::OpaqueMetadata; use grandpa::{AuthorityId as GrandpaId, AuthorityWeight as GrandpaWeight}; +use im_online::{AuthorityId as ImOnlineId}; use finality_tracker::{DEFAULT_REPORT_LATENCY, DEFAULT_WINDOW_SIZE}; #[cfg(any(feature = "std", test))] -pub use runtime_primitives::BuildStorage; +pub use sr_primitives::BuildStorage; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; pub use contracts::Gas; -pub use runtime_primitives::{Permill, Perbill}; +pub use sr_primitives::{Permill, Perbill}; pub use support::StorageValue; pub use staking::StakerStatus; +/// Implementations of some helper traits passed into runtime modules as associated types. +pub mod impls; +use impls::{CurrencyToVoteHandler, WeightMultiplierUpdateHandler, Author, WeightToFee}; + +/// Constant values used within the runtime. +pub mod constants; +use constants::{time::*, currency::*}; + // Make the WASM binary available. #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); @@ -69,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 114, - impl_version: 114, + spec_version: 140, + impl_version: 140, apis: RUNTIME_API_VERSIONS, }; @@ -83,20 +94,8 @@ pub fn native_version() -> NativeVersion { } } -pub const MILLICENTS: Balance = 1_000_000_000; -pub const CENTS: Balance = 1_000 * MILLICENTS; // assume this is worth about a cent. -pub const DOLLARS: Balance = 100 * CENTS; - type NegativeImbalance = >::NegativeImbalance; -pub struct Author; - -impl OnUnbalanced for Author { - fn on_unbalanced(amount: NegativeImbalance) { - Balances::resolve_creating(&Authorship::author(), amount); - } -} - pub type DealWithFees = SplitTwoWays< Balance, NegativeImbalance, @@ -104,17 +103,16 @@ pub type DealWithFees = SplitTwoWays< _1, Author, // 1 part (20%) goes to the block author. >; -pub const SECS_PER_BLOCK: Moment = 6; -pub const MINUTES: Moment = 60 / SECS_PER_BLOCK; -pub const HOURS: Moment = MINUTES * 60; -pub const DAYS: Moment = HOURS * 24; - parameter_types! { pub const BlockHashCount: BlockNumber = 250; + pub const MaximumBlockWeight: Weight = 1_000_000_000; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); + pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; } impl system::Trait for Runtime { type Origin = Origin; + type Call = Call; type Index = Index; type BlockNumber = BlockNumber; type Hash = Hash; @@ -122,13 +120,22 @@ impl system::Trait for Runtime { type AccountId = AccountId; type Lookup = Indices; type Header = generic::Header; + type WeightMultiplierUpdate = WeightMultiplierUpdateHandler; type Event = Event; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } -impl aura::Trait for Runtime { - type HandleReport = aura::StakingSlasher; - type AuthorityId = AuraId; +parameter_types! { + pub const EpochDuration: u64 = EPOCH_DURATION_IN_SLOTS; + pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; +} + +impl babe::Trait for Runtime { + type EpochDuration = EpochDuration; + type ExpectedBlockTime = ExpectedBlockTime; } impl indices::Trait for Runtime { @@ -159,40 +166,39 @@ impl balances::Trait for Runtime { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = WeightToFee; } parameter_types! { - pub const MinimumPeriod: u64 = SECS_PER_BLOCK / 2; + pub const MinimumPeriod: Moment = SLOT_DURATION / 2; } impl timestamp::Trait for Runtime { type Moment = Moment; - type OnTimestampSet = Aura; + type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; } parameter_types! { - pub const UncleGenerations: u64 = 0; + pub const UncleGenerations: BlockNumber = 5; } -// TODO: #2986 implement this properly impl authorship::Trait for Runtime { - type FindAuthor = (); + type FindAuthor = session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); - type EventHandler = (); -} - -parameter_types! { - pub const Period: BlockNumber = 10 * MINUTES; - pub const Offset: BlockNumber = 0; + type EventHandler = Staking; } -type SessionHandlers = (Grandpa, Aura); +type SessionHandlers = (Grandpa, Babe, ImOnline); impl_opaque_keys! { pub struct SessionKeys { - #[id(key_types::ED25519)] - pub ed25519: GrandpaId, + #[id(key_types::GRANDPA)] + pub grandpa: GrandpaId, + #[id(key_types::BABE)] + pub babe: BabeId, + #[id(key_types::IM_ONLINE)] + pub im_online: ImOnlineId, } } @@ -205,7 +211,7 @@ impl_opaque_keys! { impl session::Trait for Runtime { type OnSessionEnding = Staking; type SessionHandler = SessionHandlers; - type ShouldEndSession = session::PeriodicSessions; + type ShouldEndSession = Babe; type Event = Event; type Keys = SessionKeys; type ValidatorId = AccountId; @@ -223,22 +229,9 @@ parameter_types! { pub const BondingDuration: staking::EraIndex = 24 * 28; } -pub struct CurrencyToVoteHandler; - -impl CurrencyToVoteHandler { - fn factor() -> u128 { (Balances::total_issuance() / u64::max_value() as u128).max(1) } -} - -impl Convert for CurrencyToVoteHandler { - fn convert(x: u128) -> u64 { (x / Self::factor()) as u64 } -} - -impl Convert for CurrencyToVoteHandler { - fn convert(x: u128) -> u128 { x * Self::factor() } -} - impl staking::Trait for Runtime { type Currency = Balances; + type Time = Timestamp; type CurrencyToVote = CurrencyToVoteHandler; type OnRewardMinted = Treasury; type Event = Event; @@ -255,7 +248,7 @@ parameter_types! { pub const EmergencyVotingPeriod: BlockNumber = 3 * 24 * 60 * MINUTES; pub const MinimumDeposit: Balance = 100 * DOLLARS; pub const EnactmentPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; - pub const CooloffPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; + pub const CooloffPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; } impl democracy::Trait for Runtime { @@ -267,17 +260,26 @@ impl democracy::Trait for Runtime { type VotingPeriod = VotingPeriod; type EmergencyVotingPeriod = EmergencyVotingPeriod; type MinimumDeposit = MinimumDeposit; - type ExternalOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilInstance>; - type ExternalMajorityOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilInstance>; - type ExternalPushOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalInstance>; - type EmergencyOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, CouncilInstance>; - type CancellationOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilInstance>; - type VetoOrigin = collective::EnsureMember; + /// A straight majority of the council can decide what their next motion is. + type ExternalOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>; + /// A super-majority can have the next scheduled referendum be a straight majority-carries vote. + type ExternalMajorityOrigin = collective::EnsureProportionAtLeast<_3, _4, AccountId, CouncilCollective>; + /// A unanimous council can have the next scheduled referendum be a straight default-carries + /// (NTB) vote. + type ExternalDefaultOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, CouncilCollective>; + /// Two thirds of the technical committee can have an ExternalMajority/ExternalDefault vote + /// be tabled immediately and with a shorter voting/enactment period. + type FastTrackOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalCollective>; + // To cancel a proposal which has been passed, 2/3 of the council must agree to it. + type CancellationOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>; + // Any single technical committee member may veto a coming council proposal, however they can + // only do it once and it lasts only for the cooloff period. + type VetoOrigin = collective::EnsureMember; type CooloffPeriod = CooloffPeriod; } -type CouncilInstance = collective::Instance1; -impl collective::Trait for Runtime { +type CouncilCollective = collective::Instance1; +impl collective::Trait for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; @@ -313,13 +315,23 @@ impl elections::Trait for Runtime { type DecayRatio = DecayRatio; } -type TechnicalInstance = collective::Instance2; -impl collective::Trait for Runtime { +type TechnicalCollective = collective::Instance2; +impl collective::Trait for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; } +impl membership::Trait for Runtime { + type Event = Event; + type AddOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type RemoveOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type SwapOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type ResetOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type MembershipInitialized = TechnicalCommittee; + type MembershipChanged = TechnicalCommittee; +} + parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); pub const ProposalBondMinimum: Balance = 1 * DOLLARS; @@ -329,8 +341,8 @@ parameter_types! { impl treasury::Trait for Runtime { type Currency = Balances; - type ApproveOrigin = collective::EnsureMembers<_4, AccountId, CouncilInstance>; - type RejectOrigin = collective::EnsureMembers<_2, AccountId, CouncilInstance>; + type ApproveOrigin = collective::EnsureMembers<_4, AccountId, CouncilCollective>; + type RejectOrigin = collective::EnsureMembers<_2, AccountId, CouncilCollective>; type Event = Event; type MintedForSpending = (); type ProposalRejection = (); @@ -379,6 +391,12 @@ impl sudo::Trait for Runtime { type Proposal = Call; } +impl im_online::Trait for Runtime { + type Call = Call; + type Event = Event; + type UncheckedExtrinsic = UncheckedExtrinsic; +} + impl grandpa::Trait for Runtime { type Event = Event; } @@ -401,9 +419,9 @@ construct_runtime!( UncheckedExtrinsic = UncheckedExtrinsic { System: system::{Module, Call, Storage, Config, Event}, - Aura: aura::{Module, Call, Storage, Config, Inherent(Timestamp)}, + Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp)}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, - Authorship: authorship::{Module, Call, Storage}, + Authorship: authorship::{Module, Call, Storage, Inherent}, Indices: indices, Balances: balances::{default, Error}, Staking: staking::{default, OfflineWorker}, @@ -412,11 +430,13 @@ construct_runtime!( Council: collective::::{Module, Call, Storage, Origin, Event, Config}, TechnicalCommittee: collective::::{Module, Call, Storage, Origin, Event, Config}, Elections: elections::{Module, Call, Storage, Event, Config}, + TechnicalMembership: membership::::{Module, Call, Storage, Event, Config}, FinalityTracker: finality_tracker::{Module, Call, Inherent}, Grandpa: grandpa::{Module, Call, Storage, Config, Event}, Treasury: treasury::{Module, Call, Storage, Event}, Contracts: contracts, Sudo: sudo, + ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, } ); @@ -430,12 +450,20 @@ pub type Block = generic::Block; 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 = ( + system::CheckGenesis, + system::CheckEra, + system::CheckNonce, + system::CheckWeight, + balances::TakeFees +); /// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; +pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Balances, Runtime, AllModules>; +pub type Executive = executive::Executive, Runtime, AllModules>; impl_runtime_apis! { impl client_api::Core for Runtime { @@ -510,12 +538,41 @@ impl_runtime_apis! { } } - impl consensus_aura::AuraApi for Runtime { - fn slot_duration() -> u64 { - Aura::slot_duration() + impl babe_primitives::BabeApi for Runtime { + fn startup_data() -> babe_primitives::BabeConfiguration { + // The choice of `c` parameter (where `1 - c` represents the + // probability of a slot being empty), is done in accordance to the + // slot duration and expected target block time, for safely + // resisting network delays of maximum two seconds. + // + babe_primitives::BabeConfiguration { + median_required_blocks: 1000, + slot_duration: Babe::slot_duration(), + c: (278, 1000), + } } - fn authorities() -> Vec { - Aura::authorities() + + fn epoch() -> babe_primitives::Epoch { + babe_primitives::Epoch { + start_slot: Babe::epoch_start_slot(), + authorities: Babe::authorities(), + epoch_index: Babe::epoch_index(), + randomness: Babe::randomness(), + duration: EpochDuration::get(), + } + } + } + + impl consensus_primitives::ConsensusApi for Runtime { + fn authorities() -> Vec { + Babe::authorities().into_iter().map(|(a, _)| a).collect() + } + } + + impl substrate_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + let seed = seed.as_ref().map(|s| rstd::str::from_utf8(&s).expect("Seed is an utf8 string")); + SessionKeys::generate(seed) } } } diff --git a/node/src/main.rs b/node/src/main.rs index 15b603e7a2706abe220785213169ea02273520f6..ca4a6b4c601de658896d0d9dbc43f006c2462ca7 100644 --- a/node/src/main.rs +++ b/node/src/main.rs @@ -55,7 +55,7 @@ fn main() { }; if let Err(e) = cli::run(::std::env::args(), Exit, version) { - eprintln!("Error starting the node: {}\n\n{:?}", e, e); + eprintln!("Fatal error: {}\n\n{:?}", e, e); std::process::exit(1) } } diff --git a/scripts/docker/subkey.Dockerfile b/scripts/docker/subkey.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..6d5c559ea03ddf2c42f557761c5393737183807d --- /dev/null +++ b/scripts/docker/subkey.Dockerfile @@ -0,0 +1,31 @@ +FROM debian:stretch-slim + +# metadata +ARG VCS_REF +ARG BUILD_DATE + +LABEL io.parity.image.authors="devops-team@parity.io" \ + io.parity.image.vendor="Parity Technologies" \ + io.parity.image.title="parity/subkey" \ + io.parity.image.description="Subkey: key generating utility for Substrate." \ + io.parity.image.source="https://github.com/paritytech/substrate/blob/${VCS_REF}/scripts/docker/subkey.Dockerfile" \ + io.parity.image.revision="${VCS_REF}" \ + io.parity.image.created="${BUILD_DATE}" \ + io.parity.image.documentation="https://github.com/paritytech/substrate/tree/${VCS_REF}/subkey" + +# show backtraces +ENV RUST_BACKTRACE 1 + +# add user +RUN useradd -m -u 1000 -U -s /bin/sh -d /subkey subkey + +# add subkey binary to docker image +COPY ./subkey /usr/local/bin + +USER subkey + +# check if executable works in this container +RUN /usr/local/bin/subkey --version + +ENTRYPOINT ["/usr/local/bin/subkey"] + diff --git a/scripts/docker/Dockerfile b/scripts/docker/substrate.Dockerfile similarity index 100% rename from scripts/docker/Dockerfile rename to scripts/docker/substrate.Dockerfile diff --git a/scripts/flamingfir-deploy.sh b/scripts/flamingfir-deploy.sh index 13be56dfbd2f5bb77143ee2df1a71cb55819d30b..596bb04ece091cd03f3c993d655f5d45770362ea 100755 --- a/scripts/flamingfir-deploy.sh +++ b/scripts/flamingfir-deploy.sh @@ -4,7 +4,7 @@ RETRY_COUNT=10 RETRY_ATTEMPT=0 SLEEP_TIME=15 TARGET_HOST="$1" -COMMIT=$(cat artifacts/VERSION) +COMMIT=$(cat artifacts/substrate/VERSION) DOWNLOAD_URL="https://releases.parity.io/substrate/x86_64-debian:stretch/${COMMIT}/substrate" POST_DATA='{"extra_vars":{"artifact_path":"'${DOWNLOAD_URL}'","target_host":"'${TARGET_HOST}'"}}' diff --git a/srml/README.adoc b/srml/README.adoc index 81b4f216e67e433466ec68292a31cff4ddd734ac..05da2de0a03572da454c95cae41fa20868eac22d 100644 --- a/srml/README.adoc +++ b/srml/README.adoc @@ -1,4 +1,26 @@ -= Runtime += SRML -Set of libs for the substrate runtime. +The Substrate Runtime Module Library (SRML) is a collection of runtime modules. + +== What are runtime modules? + +A Substrate runtime can be composed of several smaller components for separation of concerns. These components are called runtime _modules_. Each runtime module packages together a set of functions (dispatchable extrinsic calls, public or private, mutable or immutable), storage items, and events. + +There are four primary components that support runtime modules: + +=== system module + +https://github.com/paritytech/substrate/tree/master/srml/system[`system`] provides low-level APIs and utilities for other modules. https://github.com/paritytech/substrate/tree/master/srml/system[`system`] also defines all core types and extrinsic events for the Substrate runtime. *All modules depend on the system module.* + +=== executive module + +https://github.com/paritytech/substrate/tree/master/srml/executive[`executive`] dispatches incoming extrinsic calls to the respective modules in the runtime. + +=== support macros + +https://github.com/paritytech/substrate/tree/master/srml/support[`support` macros] are a collection of Rust macros to facilitate the implementation of common module components. https://github.com/paritytech/substrate/tree/master/srml/support[`support` macros] expand at runtime to generate types (e.g. `Module`, `Call`, `Store`, `Event`) which are thereafter used by the runtime to communicate with the modules. Common support macros include https://crates.parity.io/srml_support/macro.decl_module.html[`decl_module`], https://crates.parity.io/srml_support_procedural/macro.decl_storage.html[`decl_storage`], https://crates.parity.io/srml_support/macro.decl_event.html[`decl_event`], and https://crates.parity.io/srml_support/macro.ensure.html[`ensure`]. + +=== runtime + +The runtime expands the support macros to get type and trait implementations for each module before calling https://github.com/paritytech/substrate/tree/master/srml/executive[`executive`] to dispatch calls to the individual modules. To see an example of how this might look, see https://github.com/paritytech/substrate/blob/master/node/runtime/src/lib.rs[`../node/runtime`]. \ No newline at end of file diff --git a/srml/assets/Cargo.toml b/srml/assets/Cargo.toml index 977248a7a7ca144010f16bd0cfd011f6f15ead05..2badb461303cd4aa390a00840d4d25e0423ce9fc 100644 --- a/srml/assets/Cargo.toml +++ b/srml/assets/Cargo.toml @@ -6,16 +6,16 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } # Needed for various traits. In our case, `OnFinalize`. -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } # Needed for type-safe access to storage DB. srml-support = { path = "../support", default-features = false } # `system` module provides us with all sorts of useful stuff and macros depend on it being around. system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } sr-std = { path = "../../core/sr-std" } runtime_io = { package = "sr-io", path = "../../core/sr-io" } @@ -23,8 +23,8 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io" } default = ["std"] std = [ "serde", - "parity-codec/std", - "primitives/std", + "codec/std", + "sr-primitives/std", "srml-support/std", "system/std", ] diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index 19159bf60fba356fb649d86e2e951e7fb1571848..d5ae95c559539d82466cd8c010b0616a78a21645 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -131,9 +131,9 @@ #![cfg_attr(not(feature = "std"), no_std)] use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage, ensure}; -use primitives::traits::{Member, SimpleArithmetic, Zero, StaticLookup}; +use sr_primitives::traits::{Member, SimpleArithmetic, Zero, StaticLookup}; use system::ensure_signed; -use primitives::traits::One; +use sr_primitives::traits::One; /// The module configuration trait. pub trait Trait: system::Trait { @@ -241,10 +241,10 @@ mod tests { use runtime_io::with_externalities; use srml_support::{impl_outer_origin, assert_ok, assert_noop, parameter_types}; - use substrate_primitives::{H256, Blake2Hasher}; + use primitives::{H256, Blake2Hasher}; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are required. - use primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use sr_primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; impl_outer_origin! { pub enum Origin for Test {} @@ -257,18 +257,26 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; + type Call = (); type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; } impl Trait for Test { type Event = (); @@ -280,7 +288,7 @@ mod tests { // This function basically just builds a genesis storage key/value store according to // our desired mockup. fn new_test_ext() -> runtime_io::TestExternalities { - system::GenesisConfig::default().build_storage::().unwrap().0.into() + system::GenesisConfig::default().build_storage::().unwrap().into() } #[test] diff --git a/srml/aura/Cargo.toml b/srml/aura/Cargo.toml index c1bf922a581af181a4a10fa9f132426e24c56fab..955831ba299104ddd35f360bb2a99f43333aaef1 100644 --- a/srml/aura/Cargo.toml +++ b/srml/aura/Cargo.toml @@ -5,12 +5,13 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } -substrate-primitives = { path = "../../core/primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../../core/application-crypto", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } @@ -20,21 +21,22 @@ substrate-consensus-aura-primitives = { path = "../../core/consensus/aura/primit [dev-dependencies] lazy_static = "1.0" -parking_lot = "0.8.0" +parking_lot = "0.9.0" runtime_io = { package = "sr-io", path = "../../core/sr-io" } [features] default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "rstd/std", "srml-support/std", + "sr-primitives/std", "primitives/std", - "substrate-primitives/std", "system/std", "timestamp/std", "staking/std", "inherents/std", "substrate-consensus-aura-primitives/std", + "app-crypto/std", ] diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index 1e92d411f4e0125bcbbea348ece1dbbf03b1d37d..6d707fc8e195f79416a4f421042c0e9d8df7e125 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -51,11 +51,11 @@ pub use timestamp; use rstd::{result, prelude::*}; -use parity_codec::Encode; +use codec::Encode; use srml_support::{decl_storage, decl_module, Parameter, storage::StorageValue, traits::Get}; -use primitives::{ - traits::{SaturatedConversion, Saturating, Zero, One, Member, TypedKey}, - generic::DigestItem, +use app_crypto::AppPublic; +use sr_primitives::{ + traits::{SaturatedConversion, Saturating, Zero, One, Member, IsMember}, generic::DigestItem, }; use timestamp::OnTimestampSet; #[cfg(feature = "std")] @@ -65,7 +65,7 @@ use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent use inherents::{InherentDataProviders, ProvideInherentData}; use substrate_consensus_aura_primitives::{AURA_ENGINE_ID, ConsensusLog}; #[cfg(feature = "std")] -use parity_codec::Decode; +use codec::Decode; mod mock; mod tests; @@ -138,7 +138,7 @@ impl ProvideInherentData for InherentDataProvider { } fn error_to_string(&self, error: &[u8]) -> Option { - RuntimeString::decode(&mut &error[..]).map(Into::into) + RuntimeString::decode(&mut &error[..]).map(Into::into).ok() } } @@ -156,7 +156,7 @@ pub trait Trait: timestamp::Trait { type HandleReport: HandleReport; /// The identifier type for an authority. - type AuthorityId: Member + Parameter + TypedKey + Default; + type AuthorityId: Member + Parameter + AppPublic + Default; } decl_storage! { @@ -188,7 +188,7 @@ impl Module { impl session::OneSessionHandler for Module { type Key = T::AuthorityId; - fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + fn on_new_session<'a, I: 'a>(changed: bool, validators: I, _queued_validators: I) where I: Iterator { // instant changes @@ -210,6 +210,14 @@ impl session::OneSessionHandler for Module { } } +impl IsMember for Module { + fn is_member(authority_id: &T::AuthorityId) -> bool { + Self::authorities() + .iter() + .any(|id| id == authority_id) + } +} + /// A report of skipped authorities in Aura. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] diff --git a/srml/aura/src/mock.rs b/srml/aura/src/mock.rs index 0cce522c76032aee17174747d9489fed562ff977..aac3f63f974ae7031d6aadaaa632ea2092cfe852 100644 --- a/srml/aura/src/mock.rs +++ b/srml/aura/src/mock.rs @@ -18,14 +18,15 @@ #![cfg(test)] -use primitives::{ - traits::IdentityLookup, +use crate::{Trait, Module, GenesisConfig}; +use substrate_consensus_aura_primitives::ed25519::AuthorityId; +use sr_primitives::{ + traits::IdentityLookup, Perbill, testing::{Header, UintAuthorityId}, }; use srml_support::{impl_outer_origin, parameter_types}; use runtime_io; -use substrate_primitives::{H256, Blake2Hasher}; -use crate::{Trait, Module, GenesisConfig}; +use primitives::{H256, Blake2Hasher}; impl_outer_origin!{ pub enum Origin for Test {} @@ -37,6 +38,9 @@ pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); pub const MinimumPeriod: u64 = 1; } @@ -44,13 +48,18 @@ impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; + type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; } impl timestamp::Trait for Test { @@ -61,14 +70,14 @@ impl timestamp::Trait for Test { impl Trait for Test { type HandleReport = (); - type AuthorityId = UintAuthorityId; + type AuthorityId = AuthorityId; } pub fn new_test_ext(authorities: Vec) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(GenesisConfig::{ - authorities: authorities.into_iter().map(|a| UintAuthorityId(a)).collect(), - }.build_storage().unwrap().0); + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + GenesisConfig::{ + authorities: authorities.into_iter().map(|a| UintAuthorityId(a).to_public_key()).collect(), + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/srml/aura/src/tests.rs b/srml/aura/src/tests.rs index 3e20613c48f6119befbd3a1cede6004fedb5f5bc..12deeb99a8d3e52e056c679e09eb79ac15d6714a 100644 --- a/srml/aura/src/tests.rs +++ b/srml/aura/src/tests.rs @@ -20,7 +20,7 @@ use lazy_static::lazy_static; use crate::mock::{System, Aura, new_test_ext}; -use primitives::traits::Header; +use sr_primitives::traits::Header; use runtime_io::with_externalities; use parking_lot::Mutex; use crate::{AuraReport, HandleReport}; diff --git a/srml/authorship/Cargo.toml b/srml/authorship/Cargo.toml index 0cf2f1e256f0cbd839f76e1aeafff02251208a2a..e7f7b0941b6a293693dff357de98722778c5cead 100644 --- a/srml/authorship/Cargo.toml +++ b/srml/authorship/Cargo.toml @@ -6,10 +6,11 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -substrate-primitives = { path = "../../core/primitives", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } @@ -17,11 +18,12 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = [features] default = ["std"] std = [ - "parity-codec/std", - "substrate-primitives/std", + "codec/std", + "primitives/std", + "inherents/std", + "sr-primitives/std", "rstd/std", "srml-support/std", - "primitives/std", "system/std", "runtime_io/std", ] diff --git a/srml/authorship/src/lib.rs b/srml/authorship/src/lib.rs index 758eeb285e19746867748811358668e4fd9dcf06..32dd140e82ff57fe5d63c10f583066ba78d5b9f2 100644 --- a/srml/authorship/src/lib.rs +++ b/srml/authorship/src/lib.rs @@ -20,14 +20,70 @@ #![cfg_attr(not(feature = "std"), no_std)] -use rstd::prelude::*; +use rstd::{result, prelude::*}; use rstd::collections::btree_set::BTreeSet; use srml_support::{decl_module, decl_storage, for_each_tuple, StorageValue}; use srml_support::traits::{FindAuthor, VerifySeal, Get}; use srml_support::dispatch::Result as DispatchResult; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use system::ensure_none; -use primitives::traits::{SimpleArithmetic, Header as HeaderT, One, Zero}; +use sr_primitives::traits::{SimpleArithmetic, Header as HeaderT, One, Zero}; +use sr_primitives::weights::SimpleDispatchInfo; +use inherents::{ + RuntimeString, InherentIdentifier, ProvideInherent, + InherentData, MakeFatalError, +}; + +/// The identifier for the `uncles` inherent. +pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"uncles00"; + +/// Auxiliary trait to extract uncles inherent data. +pub trait UnclesInherentData { + /// Get uncles. + fn uncles(&self) -> Result, RuntimeString>; +} + +impl UnclesInherentData for InherentData { + fn uncles(&self) -> Result, RuntimeString> { + Ok(self.get_data(&INHERENT_IDENTIFIER)?.unwrap_or_default()) + } +} + +/// Provider for inherent data. +#[cfg(feature = "std")] +pub struct InherentDataProvider { + inner: F, + _marker: std::marker::PhantomData, +} + +#[cfg(feature = "std")] +impl InherentDataProvider { + pub fn new(uncles_oracle: F) -> Self { + InherentDataProvider { inner: uncles_oracle, _marker: Default::default() } + } +} + +#[cfg(feature = "std")] +impl inherents::ProvideInherentData for InherentDataProvider +where F: Fn() -> Vec +{ + fn inherent_identifier(&self) -> &'static InherentIdentifier { + &INHERENT_IDENTIFIER + } + + fn provide_inherent_data(&self, inherent_data: &mut InherentData) -> Result<(), RuntimeString> { + let uncles = (self.inner)(); + if !uncles.is_empty() { + inherent_data.put_data(INHERENT_IDENTIFIER, &uncles) + } else { + Ok(()) + } + } + + fn error_to_string(&self, _error: &[u8]) -> Option { + Some(format!("no further information")) + } +} pub trait Trait: system::Trait { /// Find the author of a block. @@ -100,16 +156,16 @@ pub trait FilterUncle { /// Do additional filtering on a seal-checked uncle block, with the accumulated /// filter. - fn filter_uncle(header: &Header, acc: Self::Accumulator) - -> Result<(Option, Self::Accumulator), &'static str>; + fn filter_uncle(header: &Header, acc: &mut Self::Accumulator) + -> Result, &'static str>; } impl FilterUncle for () { type Accumulator = (); - fn filter_uncle(_: &H, acc: Self::Accumulator) - -> Result<(Option, Self::Accumulator), &'static str> + fn filter_uncle(_: &H, _acc: &mut Self::Accumulator) + -> Result, &'static str> { - Ok((None, acc)) + Ok(None) } } @@ -123,10 +179,10 @@ impl> FilterUncle { type Accumulator = (); - fn filter_uncle(header: &Header, _acc: ()) - -> Result<(Option, ()), &'static str> + fn filter_uncle(header: &Header, _acc: &mut ()) + -> Result, &'static str> { - T::verify_seal(header).map(|author| (author, ())) + T::verify_seal(header) } } @@ -146,8 +202,8 @@ where { type Accumulator = BTreeSet<(Header::Number, Author)>; - fn filter_uncle(header: &Header, mut acc: Self::Accumulator) - -> Result<(Option, Self::Accumulator), &'static str> + fn filter_uncle(header: &Header, acc: &mut Self::Accumulator) + -> Result, &'static str> { let author = T::verify_seal(header)?; let number = header.number(); @@ -158,7 +214,7 @@ where } } - Ok((author, acc)) + Ok(author) } } @@ -217,6 +273,7 @@ decl_module! { } /// Provide a set of uncles. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_uncles(origin, new_uncles: Vec) -> DispatchResult { ensure_none(origin)?; @@ -254,6 +311,39 @@ impl Module { fn verify_and_import_uncles(new_uncles: Vec) -> DispatchResult { let now = >::block_number(); + let mut uncles = ::Uncles::get(); + uncles.push(UncleEntryItem::InclusionHeight(now)); + + let mut acc: >::Accumulator = Default::default(); + + for uncle in new_uncles { + let prev_uncles = uncles.iter().filter_map(|entry| + match entry { + UncleEntryItem::InclusionHeight(_) => None, + UncleEntryItem::Uncle(h, _) => Some(h), + }); + let author = Self::verify_uncle(&uncle, prev_uncles, &mut acc)?; + let hash = uncle.hash(); + + T::EventHandler::note_uncle( + author.clone().unwrap_or_default(), + now - uncle.number().clone(), + ); + uncles.push(UncleEntryItem::Uncle(hash, author)); + } + + ::Uncles::put(&uncles); + Ok(()) + } + + fn verify_uncle<'a, I: IntoIterator>( + uncle: &T::Header, + existing_uncles: I, + accumulator: &mut >::Accumulator, + ) -> Result, &'static str> + { + let now = >::block_number(); + let (minimum_height, maximum_height) = { let uncle_generations = T::UncleGenerations::get(); let min = if now >= uncle_generations { @@ -265,55 +355,82 @@ impl Module { (min, now) }; - let mut uncles = ::Uncles::get(); - uncles.push(UncleEntryItem::InclusionHeight(now)); + let hash = uncle.hash(); - let mut acc: >::Accumulator = Default::default(); + if uncle.number() < &One::one() { + return Err("uncle is genesis"); + } - for uncle in new_uncles { - let hash = uncle.hash(); + if uncle.number() > &maximum_height { + return Err("uncle is too high in chain"); + } - if uncle.number() < &One::one() { - return Err("uncle is genesis"); + { + let parent_number = uncle.number().clone() - One::one(); + let parent_hash = >::block_hash(&parent_number); + if &parent_hash != uncle.parent_hash() { + return Err("uncle parent not in chain"); } + } - if uncle.number() > &maximum_height { - return Err("uncles too high in chain"); - } + if uncle.number() < &minimum_height { + return Err("uncle not recent enough to be included"); + } - { - let parent_number = uncle.number().clone() - One::one(); - let parent_hash = >::block_hash(&parent_number); - if &parent_hash != uncle.parent_hash() { - return Err("uncle parent not in chain"); - } - } + let duplicate = existing_uncles.into_iter().find(|h| **h == hash).is_some(); + let in_chain = >::block_hash(uncle.number()) == hash; - if uncle.number() < &minimum_height { - return Err("uncle not recent enough to be included"); - } + if duplicate || in_chain { + return Err("uncle already included") + } - let duplicate = uncles.iter().find(|entry| match entry { - UncleEntryItem::InclusionHeight(_) => false, - UncleEntryItem::Uncle(h, _) => h == &hash, - }).is_some(); + // check uncle validity. + T::FilterUncle::filter_uncle(&uncle, accumulator) + } +} - let in_chain = >::block_hash(uncle.number()) == hash; +impl ProvideInherent for Module { + type Call = Call; + type Error = MakeFatalError<()>; + const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; + + fn create_inherent(data: &InherentData) -> Option { + let uncles = data.uncles().unwrap_or_default(); + let mut set_uncles = Vec::new(); + + if !uncles.is_empty() { + let prev_uncles = ::Uncles::get(); + let mut existing_hashes: Vec<_> = prev_uncles.into_iter().filter_map(|entry| + match entry { + UncleEntryItem::InclusionHeight(_) => None, + UncleEntryItem::Uncle(h, _) => Some(h), + } + ).collect(); - if duplicate || in_chain { return Err("uncle already included") } + let mut acc: >::Accumulator = Default::default(); - // check uncle validity. - let (author, temp_acc) = T::FilterUncle::filter_uncle(&uncle, acc)?; - acc = temp_acc; + for uncle in uncles { + match Self::verify_uncle(&uncle, &existing_hashes, &mut acc) { + Ok(_) => { + let hash = uncle.hash(); + set_uncles.push(uncle); + existing_hashes.push(hash); + } + Err(_) => { + // skip this uncle + } + } + } + } - T::EventHandler::note_uncle( - author.clone().unwrap_or_default(), - now - uncle.number().clone(), - ); - uncles.push(UncleEntryItem::Uncle(hash, author)); + if set_uncles.is_empty() { + None + } else { + Some(Call::set_uncles(set_uncles)) } + } - ::Uncles::put(&uncles); + fn check_inherent(_call: &Self::Call, _data: &InherentData) -> result::Result<(), Self::Error> { Ok(()) } } @@ -322,10 +439,11 @@ impl Module { mod tests { use super::*; use runtime_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::traits::{BlakeTwo256, IdentityLookup}; - use primitives::testing::Header; - use primitives::generic::DigestItem; + use primitives::{H256, Blake2Hasher}; + use sr_primitives::traits::{BlakeTwo256, IdentityLookup}; + use sr_primitives::testing::Header; + use sr_primitives::generic::DigestItem; + use sr_primitives::Perbill; use srml_support::{parameter_types, impl_outer_origin, ConsensusEngineId}; impl_outer_origin!{ @@ -337,19 +455,31 @@ mod tests { parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; + } + + parameter_types! { + pub const UncleGenerations: u64 = 5; } impl Trait for Test { @@ -372,7 +502,7 @@ mod tests { { for (id, data) in digests { if id == TEST_ID { - return u64::decode(&mut &data[..]); + return u64::decode(&mut &data[..]).ok(); } } @@ -380,10 +510,6 @@ mod tests { } } - parameter_types! { - pub const UncleGenerations: u64 = 5; - } - pub struct VerifyBlock; impl VerifySeal for VerifyBlock { @@ -399,8 +525,8 @@ mod tests { for (id, seal) in seals { if id == TEST_ID { match u64::decode(&mut &seal[..]) { - None => return Err("wrong seal"), - Some(a) => { + Err(_) => return Err("wrong seal"), + Ok(a) => { if a != author { return Err("wrong author in seal"); } @@ -424,7 +550,6 @@ mod tests { header } - fn create_header(number: u64, parent_hash: H256, state_root: H256) -> Header { Header::new( number, @@ -436,7 +561,7 @@ mod tests { } fn new_test_ext() -> runtime_io::TestExternalities { - let t = system::GenesisConfig::default().build_storage::().unwrap().0; + let t = system::GenesisConfig::default().build_storage::().unwrap(); t.into() } @@ -590,7 +715,7 @@ mod tests { let author_a = 42; let author_b = 43; - let mut acc: Option<>::Accumulator> = Some(Default::default()); + let mut acc: >::Accumulator = Default::default(); let header_a1 = seal_header( create_header(1, Default::default(), [1; 32].into()), author_a, @@ -610,13 +735,7 @@ mod tests { ); let mut check_filter = move |uncle| { - match Filter::filter_uncle(uncle, acc.take().unwrap()) { - Ok((author, a)) => { - acc = Some(a); - Ok(author) - } - Err(e) => Err(e), - } + Filter::filter_uncle(uncle, &mut acc) }; // same height, different author is OK. diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml index e8dc183b54de4f27ad9a83f59848aabbe55b642d..76bd849a95594d79b3e9920a3caf8aae40421bc5 100644 --- a/srml/babe/Cargo.toml +++ b/srml/babe/Cargo.toml @@ -6,35 +6,37 @@ edition = "2018" [dependencies] hex-literal = "0.2" -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0.93", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } +staking = { package = "srml-staking", path = "../staking", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } session = { package = "srml-session", path = "../session", default-features = false } babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives", default-features = false } -runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } +runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false, features = [ "wasm-nice-panic-message" ] } [dev-dependencies] lazy_static = "1.3.0" -parking_lot = "0.8.0" -substrate-primitives = { path = "../../core/primitives" } +parking_lot = "0.9.0" +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "rstd/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", "timestamp/std", "inherents/std", "babe-primitives/std", "session/std", "runtime_io/std", + "staking/std", ] diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index f1c8894a4d8f6338e1bcacfeb7654a2770379982..02099aace84e4c16047631d466019734e9326cd1 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -18,28 +18,28 @@ #![cfg_attr(not(feature = "std"), no_std)] #![forbid(unused_must_use, unsafe_code, unused_variables, dead_code)] + pub use timestamp; use rstd::{result, prelude::*}; -use srml_support::{decl_storage, decl_module, StorageValue, traits::FindAuthor, traits::Get}; -use timestamp::{OnTimestampSet, Trait}; -use primitives::{generic::DigestItem, traits::{SaturatedConversion, Saturating, RandomnessBeacon}}; -use primitives::ConsensusEngineId; +use srml_support::{decl_storage, decl_module, StorageValue, StorageMap, traits::FindAuthor, traits::Get}; +use timestamp::{OnTimestampSet}; +use sr_primitives::{generic::DigestItem, ConsensusEngineId}; +use sr_primitives::traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon, Convert}; #[cfg(feature = "std")] use timestamp::TimestampInherentData; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; -use babe_primitives::{BABE_ENGINE_ID, ConsensusLog}; -pub use babe_primitives::{AuthorityId, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH, PUBLIC_KEY_LENGTH}; +use babe_primitives::{BABE_ENGINE_ID, ConsensusLog, BabeWeight, Epoch, RawBabePreDigest}; +pub use babe_primitives::{AuthorityId, VRF_OUTPUT_LENGTH, PUBLIC_KEY_LENGTH}; /// The BABE inherent identifier. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"babeslot"; /// The type of the BABE inherent. pub type InherentType = u64; - /// Auxiliary trait to extract BABE inherent data. pub trait BabeInherentData { /// Get BABE inherent data. @@ -98,27 +98,42 @@ impl ProvideInherentData for InherentDataProvider { inherent_data: &mut InherentData, ) -> result::Result<(), RuntimeString> { let timestamp = inherent_data.timestamp_inherent_data()?; - let slot_num = timestamp / self.slot_duration; - inherent_data.put_data(INHERENT_IDENTIFIER, &slot_num) + let slot_number = timestamp / self.slot_duration; + inherent_data.put_data(INHERENT_IDENTIFIER, &slot_number) } fn error_to_string(&self, error: &[u8]) -> Option { - RuntimeString::decode(&mut &error[..]).map(Into::into) + RuntimeString::decode(&mut &error[..]).map(Into::into).ok() } } +pub trait Trait: timestamp::Trait { + type EpochDuration: Get; + type ExpectedBlockTime: Get; +} + /// The length of the BABE randomness pub const RANDOMNESS_LENGTH: usize = 32; +const UNDER_CONSTRUCTION_SEGMENT_LENGTH: usize = 256; + decl_storage! { trait Store for Module as Babe { - /// The last timestamp. - LastTimestamp get(last): T::Moment; + /// Current epoch index. + pub EpochIndex get(epoch_index): u64; + + /// Current epoch authorities. + pub Authorities get(authorities) config(): Vec<(AuthorityId, BabeWeight)>; + + /// Slot at which the current epoch started. It is possible that no + /// block was authored at the given slot and the epoch change was + /// signalled later than this. + pub EpochStartSlot get(epoch_start_slot): u64; - /// The current authorities set. - Authorities get(authorities): Vec; + /// Current slot number. + pub CurrentSlot get(current_slot): u64; - /// The epoch randomness. + /// The epoch randomness for the *current* epoch. /// /// # Security /// @@ -128,34 +143,62 @@ decl_storage! { /// (like everything else on-chain) it is public. For example, it can be /// used where a number is needed that cannot have been chosen by an /// adversary, for purposes such as public-coin zero-knowledge proofs. - EpochRandomness get(epoch_randomness): [u8; VRF_OUTPUT_LENGTH]; + // NOTE: the following fields don't use the constants to define the + // array size because the metadata API currently doesn't resolve the + // variable to its underlying value. + pub Randomness get(randomness): [u8; 32 /* RANDOMNESS_LENGTH */]; - /// The randomness under construction - UnderConstruction: [u8; VRF_OUTPUT_LENGTH]; + /// Next epoch randomness. + NextRandomness: [u8; 32 /* RANDOMNESS_LENGTH */]; - /// The randomness for the next epoch - NextEpochRandomness: [u8; VRF_OUTPUT_LENGTH]; - - /// The current epoch - EpochIndex get(epoch_index): u64; + /// Randomness under construction. + /// + /// We make a tradeoff between storage accesses and list length. + /// We store the under-construction randomness in segments of up to + /// `UNDER_CONSTRUCTION_SEGMENT_LENGTH`. + /// + /// Once a segment reaches this length, we begin the next one. + /// We reset all segments and return to `0` at the beginning of every + /// epoch. + SegmentIndex build(|_| 0): u32; + UnderConstruction: map u32 => Vec<[u8; 32 /* VRF_OUTPUT_LENGTH */]>; } } decl_module! { /// The BABE SRML module pub struct Module for enum Call where origin: T::Origin { + /// The number of **slots** that an epoch takes. We couple sessions to + /// epochs, i.e. we start a new session once the new epoch begins. + const EpochDuration: u64 = T::EpochDuration::get(); + + /// The expected average block time at which BABE should be creating + /// blocks. Since BABE is probabilistic it is not trivial to figure out + /// what the expected average block time should be based on the slot + /// duration and the security parameter `c` (where `1 - c` represents + /// the probability of a slot being empty). + const ExpectedBlockTime: T::Moment = T::ExpectedBlockTime::get(); + /// Initialization fn on_initialize() { - for i in Self::get_inherent_digests() + for digest in Self::get_inherent_digests() .logs .iter() .filter_map(|s| s.as_pre_runtime()) .filter_map(|(id, mut data)| if id == BABE_ENGINE_ID { - <[u8; VRF_OUTPUT_LENGTH]>::decode(&mut data) + RawBabePreDigest::decode(&mut data).ok() } else { None - }) { - Self::deposit_vrf_output(&i); + }) + { + if EpochStartSlot::get() == 0 { + EpochStartSlot::put(digest.slot_number); + } + + CurrentSlot::put(digest.slot_number); + Self::deposit_vrf_output(&digest.vrf_output); + + return; } } } @@ -163,28 +206,38 @@ decl_module! { impl RandomnessBeacon for Module { fn random() -> [u8; VRF_OUTPUT_LENGTH] { - Self::epoch_randomness() + Self::randomness() } } /// A BABE public key pub type BabeKey = [u8; PUBLIC_KEY_LENGTH]; -impl FindAuthor for Module { - fn find_author<'a, I>(digests: I) -> Option where +impl FindAuthor for Module { + fn find_author<'a, I>(digests: I) -> Option where I: 'a + IntoIterator { for (id, mut data) in digests.into_iter() { if id == BABE_ENGINE_ID { - let (_, _, i): ( - [u8; VRF_OUTPUT_LENGTH], - [u8; VRF_PROOF_LENGTH], - u64, - ) = Decode::decode(&mut data)?; - return Some(i) + return Some(RawBabePreDigest::decode(&mut data).ok()?.authority_index); } } - return None + return None; + } +} + +impl IsMember for Module { + fn is_member(authority_id: &AuthorityId) -> bool { + >::authorities() + .iter() + .any(|id| &id.0 == authority_id) + } +} + +impl session::ShouldEndSession for Module { + fn should_end_session(_: T::BlockNumber) -> bool { + let diff = CurrentSlot::get().saturating_sub(EpochStartSlot::get()); + diff >= T::EpochDuration::get() } } @@ -196,63 +249,148 @@ impl Module { ::MinimumPeriod::get().saturating_mul(2.into()) } - fn change_authorities(new: Vec) { - Authorities::put(&new); - + fn deposit_consensus(new: U) { let log: DigestItem = DigestItem::Consensus(BABE_ENGINE_ID, new.encode()); - >::deposit_log(log.into()); + >::deposit_log(log.into()) + } + + fn get_inherent_digests() -> system::DigestOf { + >::digest() } fn deposit_vrf_output(vrf_output: &[u8; VRF_OUTPUT_LENGTH]) { - UnderConstruction::mutate(|z| z.iter_mut().zip(vrf_output).for_each(|(x, y)| *x^=y)) + let segment_idx = ::get(); + let mut segment = ::get(&segment_idx); + if segment.len() < UNDER_CONSTRUCTION_SEGMENT_LENGTH { + // push onto current segment: not full. + segment.push(*vrf_output); + ::insert(&segment_idx, &segment); + } else { + // move onto the next segment and update the index. + let segment_idx = segment_idx + 1; + ::insert(&segment_idx, vec![*vrf_output].as_ref()); + ::put(&segment_idx); + } } - fn get_inherent_digests() -> system::DigestOf { - >::digest() + /// Call this function exactly once when an epoch changes, to update the + /// randomness. Returns the new randomness. + fn randomness_change_epoch(next_epoch_index: u64) -> [u8; RANDOMNESS_LENGTH] { + let this_randomness = NextRandomness::get(); + let segment_idx: u32 = ::mutate(|s| rstd::mem::replace(s, 0)); + + // overestimate to the segment being full. + let rho_size = segment_idx.saturating_add(1) as usize * UNDER_CONSTRUCTION_SEGMENT_LENGTH; + + let next_randomness = compute_randomness( + this_randomness, + next_epoch_index, + (0..segment_idx).flat_map(|i| ::take(&i)), + Some(rho_size), + ); + NextRandomness::put(&next_randomness); + this_randomness } + } impl OnTimestampSet for Module { fn on_timestamp_set(_moment: T::Moment) { } } -impl session::OneSessionHandler for Module { +impl session::OneSessionHandler for Module { type Key = AuthorityId; - - fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + fn on_new_session<'a, I: 'a>(_changed: bool, validators: I, queued_validators: I) where I: Iterator { - // instant changes - if changed { - let next_authorities = validators.map(|(_, k)| k).collect::>(); - let last_authorities = >::authorities(); - if next_authorities != last_authorities { - Self::change_authorities(next_authorities); - } - } + use staking::BalanceOf; + let to_votes = |b: BalanceOf| { + , u64>>::convert(b) + }; - let rho = UnderConstruction::get(); - UnderConstruction::put([0; 32]); - let last_epoch_randomness = EpochRandomness::get(); + // Update epoch index let epoch_index = EpochIndex::get() .checked_add(1) .expect("epoch indices will never reach 2^64 before the death of the universe; qed"); + EpochIndex::put(epoch_index); - EpochRandomness::put(NextEpochRandomness::get()); - let mut s = [0; 72]; - s[..32].copy_from_slice(&last_epoch_randomness); - s[32..40].copy_from_slice(&epoch_index.to_le_bytes()); - s[40..].copy_from_slice(&rho); - NextEpochRandomness::put(runtime_io::blake2_256(&s)) + + // Update authorities. + let authorities = validators.map(|(account, k)| { + (k, to_votes(staking::Module::::stakers(account).total)) + }).collect::>(); + + Authorities::put(authorities); + + // Update epoch start slot. + let now = CurrentSlot::get(); + EpochStartSlot::mutate(|previous| { + loop { + // on the first epoch we must account for skipping at least one + // whole epoch, in case the first block is authored with a slot + // number far in the past. + if now.saturating_sub(*previous) < T::EpochDuration::get() { + break; + } + + *previous = previous.saturating_add(T::EpochDuration::get()); + } + }); + + // Update epoch randomness. + let next_epoch_index = epoch_index + .checked_add(1) + .expect("epoch indices will never reach 2^64 before the death of the universe; qed"); + + // Returns randomness for the current epoch and computes the *next* + // epoch randomness. + let randomness = Self::randomness_change_epoch(next_epoch_index); + Randomness::put(randomness); + + // After we update the current epoch, we signal the *next* epoch change + // so that nodes can track changes. + let next_authorities = queued_validators.map(|(account, k)| { + (k, to_votes(staking::Module::::stakers(account).total)) + }).collect::>(); + + let next_epoch_start_slot = EpochStartSlot::get().saturating_add(T::EpochDuration::get()); + let next_randomness = NextRandomness::get(); + + let next = Epoch { + epoch_index: next_epoch_index, + start_slot: next_epoch_start_slot, + duration: T::EpochDuration::get(), + authorities: next_authorities, + randomness: next_randomness, + }; + + Self::deposit_consensus(ConsensusLog::NextEpochData(next)) } fn on_disabled(i: usize) { - let log: DigestItem = DigestItem::Consensus( - BABE_ENGINE_ID, - ConsensusLog::OnDisabled(i as u64).encode(), - ); - >::deposit_log(log.into()); + Self::deposit_consensus(ConsensusLog::OnDisabled(i as u32)) + } +} + +// compute randomness for a new epoch. rho is the concatenation of all +// VRF outputs in the prior epoch. +// +// an optional size hint as to how many VRF outputs there were may be provided. +fn compute_randomness( + last_epoch_randomness: [u8; RANDOMNESS_LENGTH], + epoch_index: u64, + rho: impl Iterator, + rho_size_hint: Option, +) -> [u8; RANDOMNESS_LENGTH] { + let mut s = Vec::with_capacity(40 + rho_size_hint.unwrap_or(0) * VRF_OUTPUT_LENGTH); + s.extend_from_slice(&last_epoch_randomness); + s.extend_from_slice(&epoch_index.to_le_bytes()); + + for vrf_output in rho { + s.extend_from_slice(&vrf_output[..]); } + + runtime_io::blake2_256(&s) } impl ProvideInherent for Module { @@ -272,10 +410,11 @@ impl ProvideInherent for Module { let timestamp_based_slot = (timestamp / Self::slot_duration()).saturated_into::(); let seal_slot = data.babe_inherent_data()?; + if timestamp_based_slot == seal_slot { Ok(()) } else { - Err(RuntimeString::from("timestamp set in block doesn’t match slot in seal").into()) + Err(RuntimeString::from("timestamp set in block doesn't match slot in seal").into()) } } } diff --git a/srml/balances/Cargo.toml b/srml/balances/Cargo.toml index a61b95b2ada4a4e4f593c8befbfc2840fc09ebfe..d3ac0c96b37efce873e3f13c1500f49d8ef853ce 100644 --- a/srml/balances/Cargo.toml +++ b/srml/balances/Cargo.toml @@ -7,16 +7,16 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } substrate-keyring = { path = "../../core/keyring", optional = true } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] -runtime_io = { package = "sr-io", path = "../../core/sr-io" } -substrate-primitives = { path = "../../core/primitives" } +runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] @@ -24,9 +24,9 @@ std = [ "serde", "safe-mix/std", "substrate-keyring", - "parity-codec/std", + "codec/std", "rstd/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", ] diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 30fb2a48e935cfea792c2ab6904aba1fe16f5d1f..66d0ee028495f411c7dee374012ec0b3455a0489 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -112,7 +112,7 @@ //! //! ``` //! use srml_support::traits::{WithdrawReasons, LockableCurrency}; -//! use primitives::traits::Bounded; +//! use sr_primitives::traits::Bounded; //! pub trait Trait: system::Trait { //! type Currency: LockableCurrency; //! } @@ -151,18 +151,20 @@ use rstd::prelude::*; use rstd::{cmp, result, mem}; -use parity_codec::{Codec, Encode, Decode}; +use codec::{Codec, Encode, Decode}; use srml_support::{StorageValue, StorageMap, Parameter, decl_event, decl_storage, decl_module}; use srml_support::traits::{ - UpdateBalanceOutcome, Currency, OnFreeBalanceZero, MakePayment, OnUnbalanced, + UpdateBalanceOutcome, Currency, OnFreeBalanceZero, OnUnbalanced, WithdrawReason, WithdrawReasons, LockIdentifier, LockableCurrency, ExistenceRequirement, - Imbalance, SignedImbalance, ReservableCurrency + Imbalance, SignedImbalance, ReservableCurrency, Get, }; -use srml_support::{dispatch::Result, traits::Get}; -use primitives::traits::{ - Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, - MaybeSerializeDebug, Saturating, Bounded +use srml_support::dispatch::Result; +use sr_primitives::traits::{ + Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug, + Saturating, Bounded, SignedExtension, SaturatedConversion, DispatchError, Convert, }; +use sr_primitives::transaction_validity::{TransactionPriority, ValidTransaction}; +use sr_primitives::weights::{DispatchInfo, SimpleDispatchInfo, Weight}; use system::{IsDeadAccount, OnNewAccount, ensure_signed, ensure_root}; mod mock; @@ -204,6 +206,9 @@ pub trait Subtrait: system::Trait { /// The fee to be paid for making a transaction; the per-byte portion. type TransactionByteFee: Get; + + /// Convert a weight value into a deductible fee based on the currency type. + type WeightToFee: Convert; } pub trait Trait: system::Trait { @@ -247,6 +252,9 @@ pub trait Trait: system::Trait { /// The fee to be paid for making a transaction; the per-byte portion. type TransactionByteFee: Get; + + /// Convert a weight value into a deductible fee based on the currency type. + type WeightToFee: Convert; } impl, I: Instance> Subtrait for T { @@ -258,6 +266,7 @@ impl, I: Instance> Subtrait for T { type CreationFee = T::CreationFee; type TransactionBaseFee = T::TransactionBaseFee; type TransactionByteFee = T::TransactionByteFee; + type WeightToFee = T::WeightToFee; } decl_event!( @@ -335,7 +344,7 @@ decl_storage! { // Total genesis `balance` minus `liquid` equals funds locked for vesting let locked = balance.saturating_sub(liquid); // Number of units unlocked per block after `begin` - let per_block = locked / length.max(primitives::traits::One::one()); + let per_block = locked / length.max(sr_primitives::traits::One::one()); (who.clone(), VestingSchedule { locked: locked, @@ -426,6 +435,7 @@ decl_module! { /// `T::DustRemoval::on_unbalanced` and `T::OnFreeBalanceZero::on_free_balance_zero`. /// /// # + #[weight = SimpleDispatchInfo::FixedNormal(1_000_000)] pub fn transfer( origin, dest: ::Source, @@ -449,6 +459,7 @@ decl_module! { /// - Independent of the arguments. /// - Contains a limited number of reads and writes. /// # + #[weight = SimpleDispatchInfo::FixedOperational(500_000)] fn set_balance( origin, who: ::Source, @@ -752,6 +763,7 @@ impl, I: Instance> PartialEq for ElevatedTrait { impl, I: Instance> Eq for ElevatedTrait {} impl, I: Instance> system::Trait for ElevatedTrait { type Origin = T::Origin; + type Call = T::Call; type Index = T::Index; type BlockNumber = T::BlockNumber; type Hash = T::Hash; @@ -759,8 +771,12 @@ impl, I: Instance> system::Trait for ElevatedTrait { type AccountId = T::AccountId; type Lookup = T::Lookup; type Header = T::Header; + type WeightMultiplierUpdate = T::WeightMultiplierUpdate; type Event = (); type BlockHashCount = T::BlockHashCount; + type MaximumBlockWeight = T::MaximumBlockWeight; + type MaximumBlockLength = T::MaximumBlockLength; + type AvailableBlockRatio = T::AvailableBlockRatio; } impl, I: Instance> Trait for ElevatedTrait { type Balance = T::Balance; @@ -775,6 +791,7 @@ impl, I: Instance> Trait for ElevatedTrait { type CreationFee = T::CreationFee; type TransactionBaseFee = T::TransactionBaseFee; type TransactionByteFee = T::TransactionByteFee; + type WeightToFee = T::WeightToFee; } impl, I: Instance> Currency for Module @@ -1144,18 +1161,86 @@ where } } -impl, I: Instance> MakePayment for Module { - fn make_payment(transactor: &T::AccountId, encoded_len: usize) -> Result { - let encoded_len = T::Balance::from(encoded_len as u32); - let transaction_fee = T::TransactionBaseFee::get() + T::TransactionByteFee::get() * encoded_len; - let imbalance = Self::withdraw( - transactor, - transaction_fee, +/// Require the transactor pay for themselves and maybe include a tip to gain additional priority +/// in the queue. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct TakeFees, I: Instance = DefaultInstance>(#[codec(compact)] T::Balance); + +impl, I: Instance> TakeFees { + /// utility constructor. Used only in client/factory code. + #[cfg(feature = "std")] + pub fn from(fee: T::Balance) -> Self { + Self(fee) + } + + /// Compute the final fee value for a particular transaction. + /// + /// The final fee is composed of: + /// - _length-fee_: This is the amount paid merely to pay for size of the transaction. + /// - _weight-fee_: This amount is computed based on the weight of the transaction. Unlike + /// size-fee, this is not input dependent and reflects the _complexity_ of the execution + /// and the time it consumes. + /// - (optional) _tip_: if included in the transaction, it will be added on top. Only signed + /// transactions can have a tip. + fn compute_fee(len: usize, info: DispatchInfo, tip: T::Balance) -> T::Balance { + let len_fee = if info.pay_length_fee() { + let len = T::Balance::from(len as u32); + let base = T::TransactionBaseFee::get(); + let per_byte = T::TransactionByteFee::get(); + base.saturating_add(per_byte.saturating_mul(len)) + } else { + Zero::zero() + }; + + let weight_fee = { + // cap the weight to the maximum defined in runtime, otherwise it will be the `Bounded` + // maximum of its data type, which is not desired. + let capped_weight = info.weight.min(::MaximumBlockWeight::get()); + let weight_update = >::next_weight_multiplier(); + let adjusted_weight = weight_update.apply_to(capped_weight); + T::WeightToFee::convert(adjusted_weight) + }; + + len_fee.saturating_add(weight_fee).saturating_add(tip) + } +} + +#[cfg(feature = "std")] +impl, I: Instance> rstd::fmt::Debug for TakeFees { + fn fmt(&self, f: &mut rstd::fmt::Formatter) -> rstd::fmt::Result { + self.0.fmt(f) + } +} + +impl, I: Instance + Clone + Eq> SignedExtension for TakeFees { + type AccountId = T::AccountId; + type Call = T::Call; + type AdditionalSigned = (); + type Pre = (); + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } + + fn validate( + &self, + who: &Self::AccountId, + _call: &Self::Call, + info: DispatchInfo, + len: usize, + ) -> rstd::result::Result { + // pay any fees. + let fee = Self::compute_fee(len, info, self.0); + let imbalance = >::withdraw( + who, + fee, WithdrawReason::TransactionPayment, - ExistenceRequirement::KeepAlive - )?; + ExistenceRequirement::KeepAlive, + ).map_err(|_| DispatchError::Payment)?; T::TransactionPayment::on_unbalanced(imbalance); - Ok(()) + + let mut r = ValidTransaction::default(); + // NOTE: we probably want to maximize the _fee (of any type) per weight unit_ here, which + // will be a bit more than setting the priority to tip. For now, this is enough. + r.priority = fee.saturated_into::(); + Ok(r) } } diff --git a/srml/balances/src/mock.rs b/srml/balances/src/mock.rs index 38dae9f25f6f52c9f0c371b88f353ce5b04882fd..954d500a1076be24ff02d607c7d40b0dd567f5a6 100644 --- a/srml/balances/src/mock.rs +++ b/srml/balances/src/mock.rs @@ -18,10 +18,12 @@ #![cfg(test)] -use primitives::{traits::{IdentityLookup}, testing::Header}; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::{Perbill, traits::{Convert, IdentityLookup}, testing::Header, + weights::{DispatchInfo, Weight}}; +use primitives::{H256, Blake2Hasher}; use runtime_io; -use srml_support::{impl_outer_origin, parameter_types, traits::Get}; +use srml_support::{impl_outer_origin, parameter_types}; +use srml_support::traits::Get; use std::cell::RefCell; use crate::{GenesisConfig, Module, Trait}; @@ -34,7 +36,9 @@ thread_local! { static TRANSFER_FEE: RefCell = RefCell::new(0); static CREATION_FEE: RefCell = RefCell::new(0); static TRANSACTION_BASE_FEE: RefCell = RefCell::new(0); - static TRANSACTION_BYTE_FEE: RefCell = RefCell::new(0); + static TRANSACTION_BYTE_FEE: RefCell = RefCell::new(1); + static TRANSACTION_WEIGHT_FEE: RefCell = RefCell::new(1); + static WEIGHT_TO_FEE: RefCell = RefCell::new(1); } pub struct ExistentialDeposit; @@ -62,23 +66,38 @@ impl Get for TransactionByteFee { fn get() -> u64 { TRANSACTION_BYTE_FEE.with(|v| *v.borrow()) } } +pub struct WeightToFee(u64); +impl Convert for WeightToFee { + fn convert(t: Weight) -> u64 { + WEIGHT_TO_FEE.with(|v| *v.borrow() * (t as u64)) + } +} + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Debug)] pub struct Runtime; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Runtime { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; + type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl Trait for Runtime { type Balance = u64; @@ -93,11 +112,13 @@ impl Trait for Runtime { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = WeightToFee; } pub struct ExtBuilder { transaction_base_fee: u64, transaction_byte_fee: u64, + weight_to_fee: u64, existential_deposit: u64, transfer_fee: u64, creation_fee: u64, @@ -109,6 +130,7 @@ impl Default for ExtBuilder { Self { transaction_base_fee: 0, transaction_byte_fee: 0, + weight_to_fee: 0, existential_deposit: 0, transfer_fee: 0, creation_fee: 0, @@ -118,6 +140,12 @@ impl Default for ExtBuilder { } } impl ExtBuilder { + pub fn transaction_fees(mut self, base_fee: u64, byte_fee: u64, weight_fee: u64) -> Self { + self.transaction_base_fee = base_fee; + self.transaction_byte_fee = byte_fee; + self.weight_to_fee = weight_fee; + self + } pub fn existential_deposit(mut self, existential_deposit: u64) -> Self { self.existential_deposit = existential_deposit; self @@ -131,11 +159,6 @@ impl ExtBuilder { self.creation_fee = creation_fee; self } - pub fn transaction_fees(mut self, base_fee: u64, byte_fee: u64) -> Self { - self.transaction_base_fee = base_fee; - self.transaction_byte_fee = byte_fee; - self - } pub fn monied(mut self, monied: bool) -> Self { self.monied = monied; if self.existential_deposit == 0 { @@ -153,11 +176,12 @@ impl ExtBuilder { CREATION_FEE.with(|v| *v.borrow_mut() = self.creation_fee); TRANSACTION_BASE_FEE.with(|v| *v.borrow_mut() = self.transaction_base_fee); TRANSACTION_BYTE_FEE.with(|v| *v.borrow_mut() = self.transaction_byte_fee); + WEIGHT_TO_FEE.with(|v| *v.borrow_mut() = self.weight_to_fee); } pub fn build(self) -> runtime_io::TestExternalities { self.set_associated_consts(); - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(GenesisConfig:: { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + GenesisConfig:: { balances: if self.monied { vec![ (1, 10 * self.existential_deposit), @@ -178,10 +202,18 @@ impl ExtBuilder { } else { vec![] }, - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } } pub type System = system::Module; pub type Balances = Module; + + +pub const CALL: &::Call = &(); + +/// create a transaction info struct from weight. Handy to avoid building the whole struct. +pub fn info_from_weight(w: Weight) -> DispatchInfo { + DispatchInfo { weight: w, ..Default::default() } +} diff --git a/srml/balances/src/tests.rs b/srml/balances/src/tests.rs index 582949fa05fd0322ed6ff5cd1b86647ac8c193d6..1220b2388541e119dd72881516a694ea7f1af038 100644 --- a/srml/balances/src/tests.rs +++ b/srml/balances/src/tests.rs @@ -19,12 +19,12 @@ #![cfg(test)] use super::*; -use mock::{Balances, ExtBuilder, Runtime, System}; +use mock::{Balances, ExtBuilder, Runtime, System, info_from_weight, CALL}; use runtime_io::with_externalities; use srml_support::{ assert_noop, assert_ok, assert_err, traits::{LockableCurrency, LockIdentifier, WithdrawReason, WithdrawReasons, - Currency, MakePayment, ReservableCurrency} + Currency, ReservableCurrency} }; const ID_1: LockIdentifier = *b"1 "; @@ -114,7 +114,7 @@ fn lock_reasons_should_work() { with_externalities( &mut ExtBuilder::default() .existential_deposit(1) - .monied(true).transaction_fees(0, 1) + .monied(true).transaction_fees(0, 1, 0) .build(), || { Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Transfer.into()); @@ -123,7 +123,14 @@ fn lock_reasons_should_work() { "account liquidity restrictions prevent withdrawal" ); assert_ok!(>::reserve(&1, 1)); - assert_ok!(>::make_payment(&1, 1)); + // NOTE: this causes a fee payment. + assert!( as SignedExtension>::pre_dispatch( + TakeFees::from(1), + &1, + CALL, + info_from_weight(1), + 0, + ).is_ok()); Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Reserve.into()); assert_ok!(>::transfer(&1, &2, 1)); @@ -131,15 +138,24 @@ fn lock_reasons_should_work() { >::reserve(&1, 1), "account liquidity restrictions prevent withdrawal" ); - assert_ok!(>::make_payment(&1, 1)); + assert!( as SignedExtension>::pre_dispatch( + TakeFees::from(1), + &1, + CALL, + info_from_weight(1), + 0, + ).is_ok()); Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::TransactionPayment.into()); assert_ok!(>::transfer(&1, &2, 1)); assert_ok!(>::reserve(&1, 1)); - assert_noop!( - >::make_payment(&1, 1), - "account liquidity restrictions prevent withdrawal" - ); + assert!( as SignedExtension>::pre_dispatch( + TakeFees::from(1), + &1, + CALL, + info_from_weight(1), + 0, + ).is_err()); } ); } @@ -736,3 +752,43 @@ fn liquid_funds_should_transfer_with_delayed_vesting() { } ); } + +#[test] +fn signed_extension_take_fees_work() { + with_externalities( + &mut ExtBuilder::default() + .existential_deposit(10) + .transaction_fees(10, 1, 5) + .monied(true) + .build(), + || { + let len = 10; + assert!(TakeFees::::from(0).pre_dispatch(&1, CALL, info_from_weight(5), len).is_ok()); + assert_eq!(Balances::free_balance(&1), 100 - 20 - 25); + assert!(TakeFees::::from(5 /* tipped */).pre_dispatch(&1, CALL, info_from_weight(3), len).is_ok()); + assert_eq!(Balances::free_balance(&1), 100 - 20 - 25 - 20 - 5 - 15); + } + ); +} + +#[test] +fn signed_extension_take_fees_is_bounded() { + with_externalities( + &mut ExtBuilder::default() + .existential_deposit(1000) + .transaction_fees(0, 0, 1) + .monied(true) + .build(), + || { + use sr_primitives::weights::Weight; + + // maximum weight possible + assert!(TakeFees::::from(0).pre_dispatch(&1, CALL, info_from_weight(Weight::max_value()), 10).is_ok()); + // fee will be proportional to what is the actual maximum weight in the runtime. + assert_eq!( + Balances::free_balance(&1), + (10000 - ::MaximumBlockWeight::get()) as u64 + ); + } + ); +} diff --git a/srml/collective/Cargo.toml b/srml/collective/Cargo.toml index cd0bb17871a4add8b4c88f38dd98495de4f87e01..7aaba7c29f7b8d2bb554d1de637e02de5b15ecca 100644 --- a/srml/collective/Cargo.toml +++ b/srml/collective/Cargo.toml @@ -7,11 +7,11 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } @@ -23,12 +23,12 @@ balances = { package = "srml-balances", path = "../balances" } default = ["std"] std = [ "safe-mix/std", - "parity-codec/std", - "substrate-primitives/std", + "codec/std", + "primitives/std", "rstd/std", "serde", "runtime_io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", ] diff --git a/srml/collective/src/lib.rs b/srml/collective/src/lib.rs index 2a86adf835c97a73c77637237e54056949b565d7..13f51259c599ced10e40bec7ba974fb365b2702b 100644 --- a/srml/collective/src/lib.rs +++ b/srml/collective/src/lib.rs @@ -16,13 +16,17 @@ //! Collective system: Members of a set of account IDs can make their collective feelings known //! through dispatched calls from one of two specialised origins. +//! +//! The membership can be provided in one of two ways: either directly, using the Root-dispatchable +//! function `set_members`, or indirectly, through implementing the `ChangeMembers` #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit="128"] use rstd::{prelude::*, result}; -use substrate_primitives::u32_trait::Value as U32; -use primitives::traits::{Hash, EnsureOrigin}; +use primitives::u32_trait::Value as U32; +use sr_primitives::traits::{Hash, EnsureOrigin}; +use sr_primitives::weights::SimpleDispatchInfo; use srml_support::{ dispatch::{RuntimeDispatchable, Parameter}, codec::{Encode, Decode}, traits::ChangeMembers, StorageValue, StorageMap, decl_module, decl_event, decl_storage, ensure @@ -118,6 +122,9 @@ decl_event!( } ); +// Note: this module is not benchmarked. The weights are obtained based on the similarity of the +// executed logic with other democracy function. Note that councillor operations are assigned to the +// operational class. decl_module! { pub struct Module, I: Instance=DefaultInstance> for enum Call where origin: ::Origin { fn deposit_event() = default; @@ -126,48 +133,21 @@ decl_module! { /// provide it pre-sorted. /// /// Requires root origin. + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn set_members(origin, new_members: Vec) { ensure_root(origin)?; - - // stable sorting since they will generally be provided sorted. - let mut old_members = >::get(); - old_members.sort(); let mut new_members = new_members; new_members.sort(); - let mut old_iter = old_members.iter(); - let mut new_iter = new_members.iter(); - let mut incoming = vec![]; - let mut outgoing = vec![]; - let mut old_i = old_iter.next(); - let mut new_i = new_iter.next(); - loop { - match (old_i, new_i) { - (None, None) => break, - (Some(old), Some(new)) if old == new => { - old_i = old_iter.next(); - new_i = new_iter.next(); - } - (Some(old), Some(new)) if old < new => { - outgoing.push(old.clone()); - old_i = old_iter.next(); - } - (Some(old), None) => { - outgoing.push(old.clone()); - old_i = old_iter.next(); - } - (_, Some(new)) => { - incoming.push(new.clone()); - new_i = new_iter.next(); - } - } - } - - Self::change_members(&incoming, &outgoing, &new_members); + >::mutate(|m| { + >::set_members_sorted(&new_members[..], m); + *m = new_members; + }); } /// Dispatch a proposal from a member using the `Member` origin. /// /// Origin must be a member of the collective. + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn execute(origin, proposal: Box<>::Proposal>) { let who = ensure_signed(origin)?; ensure!(Self::is_member(&who), "proposer not a member"); @@ -181,9 +161,9 @@ decl_module! { /// - Bounded storage reads and writes. /// - Argument `threshold` has bearing on weight. /// # + #[weight = SimpleDispatchInfo::FixedOperational(5_000_000)] fn propose(origin, #[compact] threshold: MemberCount, proposal: Box<>::Proposal>) { let who = ensure_signed(origin)?; - ensure!(Self::is_member(&who), "proposer not a member"); let proposal_hash = T::Hashing::hash_of(&proposal); @@ -210,9 +190,9 @@ decl_module! { /// - Bounded storage read and writes. /// - Will be slightly heavier if the proposal is approved / disapproved after the vote. /// # + #[weight = SimpleDispatchInfo::FixedOperational(200_000)] fn vote(origin, proposal: T::Hash, #[compact] index: ProposalIndex, approve: bool) { let who = ensure_signed(origin)?; - ensure!(Self::is_member(&who), "voter not a member"); let mut voting = Self::voting(&proposal).ok_or("proposal must exist")?; @@ -281,18 +261,18 @@ impl, I: Instance> Module { } impl, I: Instance> ChangeMembers for Module { - fn change_members(_incoming: &[T::AccountId], outgoing: &[T::AccountId], new: &[T::AccountId]) { + fn change_members_sorted(_incoming: &[T::AccountId], outgoing: &[T::AccountId], new: &[T::AccountId]) { // remove accounts from all current voting in motions. - let mut old = outgoing.to_vec(); - old.sort_unstable(); + let mut outgoing = outgoing.to_vec(); + outgoing.sort_unstable(); for h in Self::proposals().into_iter() { >::mutate(h, |v| if let Some(mut votes) = v.take() { votes.ayes = votes.ayes.into_iter() - .filter(|i| old.binary_search(i).is_err()) + .filter(|i| outgoing.binary_search(i).is_err()) .collect(); votes.nays = votes.nays.into_iter() - .filter(|i| old.binary_search(i).is_err()) + .filter(|i| outgoing.binary_search(i).is_err()) .collect(); *v = Some(votes); } @@ -395,26 +375,34 @@ mod tests { use system::{EventRecord, Phase}; use hex_literal::hex; use runtime_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::{ - traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, testing::Header, BuildStorage + use primitives::{H256, Blake2Hasher}; + use sr_primitives::{ + Perbill, traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, testing::Header, BuildStorage }; use crate as collective; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = Event; + type WeightMultiplierUpdate = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl Trait for Test { type Origin = Origin; @@ -427,8 +415,8 @@ mod tests { type Event = Event; } - pub type Block = primitives::generic::Block; - pub type UncheckedExtrinsic = primitives::generic::UncheckedMortalCompactExtrinsic; + pub type Block = sr_primitives::generic::Block; + pub type UncheckedExtrinsic = sr_primitives::generic::UncheckedExtrinsic; srml_support::construct_runtime!( pub enum Test where @@ -449,7 +437,7 @@ mod tests { phantom: Default::default(), }), collective: None, - }.build_storage().unwrap().0.into() + }.build_storage().unwrap().into() } #[test] @@ -477,7 +465,7 @@ mod tests { Collective::voting(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![1, 2], nays: vec![] }) ); - Collective::change_members(&[4], &[1], &[2, 3, 4]); + Collective::change_members_sorted(&[4], &[1], &[2, 3, 4]); assert_eq!( Collective::voting(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![2], nays: vec![] }) @@ -491,7 +479,7 @@ mod tests { Collective::voting(&hash), Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![3] }) ); - Collective::change_members(&[], &[3], &[2, 4]); + Collective::change_members_sorted(&[], &[3], &[2, 4]); assert_eq!( Collective::voting(&hash), Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![] }) @@ -553,7 +541,7 @@ mod tests { event: Event::collective_Instance1(RawEvent::Proposed( 1, 0, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), 3, )), topics: vec![], @@ -621,7 +609,7 @@ mod tests { event: Event::collective_Instance1(RawEvent::Proposed( 1, 0, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), 2, )), topics: vec![], @@ -630,7 +618,7 @@ mod tests { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Voted( 1, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), false, 0, 1, @@ -657,7 +645,7 @@ mod tests { RawEvent::Proposed( 1, 0, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), 3, )), topics: vec![], @@ -666,7 +654,7 @@ mod tests { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Voted( 2, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), false, 1, 1, @@ -676,7 +664,7 @@ mod tests { EventRecord { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Disapproved( - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), )), topics: vec![], } @@ -699,7 +687,7 @@ mod tests { event: Event::collective_Instance1(RawEvent::Proposed( 1, 0, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), 2, )), topics: vec![], @@ -708,7 +696,7 @@ mod tests { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Voted( 2, - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), true, 2, 0, @@ -718,14 +706,14 @@ mod tests { EventRecord { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Approved( - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), )), topics: vec![], }, EventRecord { phase: Phase::Finalization, event: Event::collective_Instance1(RawEvent::Executed( - hex!["10b209e55d0f37cd45574674bba42519a29bf0ccf3c85c3c773fcbacab820bb4"].into(), + hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), false, )), topics: vec![], diff --git a/srml/contracts/COMPLEXITY.md b/srml/contracts/COMPLEXITY.md index 6ae7b8fb73c284a4d9a91e9c3106f079939a2dbd..c582de4264f841f2b5d4024081b5ddb641bd6907 100644 --- a/srml/contracts/COMPLEXITY.md +++ b/srml/contracts/COMPLEXITY.md @@ -371,7 +371,7 @@ This function returns the size of the scratch buffer. **complexity**: This function is of constant complexity. -## ext_scratch_copy +## ext_scratch_read This function copies slice of data from the scratch buffer to the sandbox memory. The calling code specifies the slice length. Execution of the function consists of the following steps: @@ -379,6 +379,14 @@ This function copies slice of data from the scratch buffer to the sandbox memory **complexity**: The computing complexity of this function is proportional to the length of the slice. No additional memory is required. +## ext_scratch_write + +This function copies slice of data from the sandbox memory to the scratch buffer. The calling code specifies the slice length. Execution of the function consists of the following steps: + +1. Loading a slice from the sandbox memory into the (see sandboxing memory get) + +**complexity**: Complexity is proportional to the length of the slice. + ## ext_set_rent_allowance This function receives the following argument: diff --git a/srml/contracts/Cargo.toml b/srml/contracts/Cargo.toml index 19afc06406110c6ce9e3b9f127eb50f1089afef8..a013571edf3577faee1db3336611ece7a77e468f 100644 --- a/srml/contracts/Cargo.toml +++ b/srml/contracts/Cargo.toml @@ -7,11 +7,11 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } pwasm-utils = { version = "0.6.1", default-features = false } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } parity-wasm = { version = "0.31", default-features = false } wasmi-validation = { version = "0.1", default-features = false } -substrate-primitives = { path = "../../core/primitives", default-features = false } -runtime-primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } runtime-io = { package = "sr-io", path = "../../core/sr-io", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } sandbox = { package = "sr-sandbox", path = "../../core/sr-sandbox", default-features = false } @@ -33,9 +33,9 @@ core = [ ] std = [ "serde", - "parity-codec/std", - "substrate-primitives/std", - "runtime-primitives/std", + "codec/std", + "primitives/std", + "sr-primitives/std", "runtime-io/std", "rstd/std", "sandbox/std", diff --git a/srml/contracts/src/account_db.rs b/srml/contracts/src/account_db.rs index f91226641575cf1563981293b41bdb6ddf2d85d6..5cfd0d3a65fa8dc77c5584cefdcbd730cc401092 100644 --- a/srml/contracts/src/account_db.rs +++ b/srml/contracts/src/account_db.rs @@ -25,7 +25,7 @@ use rstd::cell::RefCell; use rstd::collections::btree_map::{BTreeMap, Entry}; use rstd::prelude::*; use runtime_io::blake2_256; -use runtime_primitives::traits::{Bounded, Zero}; +use sr_primitives::traits::{Bounded, Zero}; use srml_support::traits::{Currency, Get, Imbalance, SignedImbalance, UpdateBalanceOutcome}; use srml_support::{storage::child, StorageMap}; use system; diff --git a/srml/contracts/src/exec.rs b/srml/contracts/src/exec.rs index 4a83e606ac86b6862e82d127381558495165bea5..5ba02d43a0ffe68d1d99bdf4e260a4b35a043b47 100644 --- a/srml/contracts/src/exec.rs +++ b/srml/contracts/src/exec.rs @@ -21,7 +21,7 @@ use crate::gas::{Gas, GasMeter, Token, approx_gas_for_balance}; use crate::rent; use rstd::prelude::*; -use runtime_primitives::traits::{Bounded, CheckedAdd, CheckedSub, Zero}; +use sr_primitives::traits::{Bounded, CheckedAdd, CheckedSub, Zero}; use srml_support::traits::{WithdrawReason, Currency}; use timestamp; @@ -34,15 +34,54 @@ pub type BlockNumberOf = ::BlockNumber; /// A type that represents a topic of an event. At the moment a hash is used. pub type TopicOf = ::Hash; -#[cfg_attr(test, derive(Debug))] -pub struct InstantiateReceipt { - pub address: AccountId, +/// A status code return to the source of a contract call or instantiation indicating success or +/// failure. A code of 0 indicates success and that changes are applied. All other codes indicate +/// failure and that changes are reverted. The particular code in the case of failure is opaque and +/// may be interpreted by the calling contract. +pub type StatusCode = u8; + +/// The status code indicating success. +pub const STATUS_SUCCESS: StatusCode = 0; + +/// Output of a contract call or instantiation which ran to completion. +#[cfg_attr(test, derive(PartialEq, Eq, Debug))] +pub struct ExecReturnValue { + pub status: StatusCode, + pub data: Vec, +} + +impl ExecReturnValue { + /// Returns whether the call or instantiation exited with a successful status code. + pub fn is_success(&self) -> bool { + self.status == STATUS_SUCCESS + } } +/// An error indicating some failure to execute a contract call or instantiation. This can include +/// VM-specific errors during execution (eg. division by 0, OOB access, failure to satisfy some +/// precondition of a system call, etc.) or errors with the orchestration (eg. out-of-gas errors, a +/// non-existent destination contract, etc.). #[cfg_attr(test, derive(Debug))] -pub struct CallReceipt { - /// Output data received as a result of a call. - pub output_data: Vec, +pub struct ExecError { + pub reason: &'static str, + /// This is an allocated buffer that may be reused. The buffer must be cleared explicitly + /// before reuse. + pub buffer: Vec, +} + +pub type ExecResult = Result; + +/// Evaluate an expression of type Result<_, &'static str> and either resolve to the value if Ok or +/// wrap the error string into an ExecutionError with the provided buffer and return from the +/// enclosing function. This macro is used instead of .map_err(..)? in order to avoid taking +/// ownership of buffer unless there is an error. +macro_rules! try_or_exec_error { + ($e:expr, $buffer:expr) => { + match $e { + Ok(val) => val, + Err(reason) => return Err(ExecError { reason, buffer: $buffer }), + } + } } pub type StorageKey = [u8; 32]; @@ -74,8 +113,8 @@ pub trait Ext { code: &CodeHash, value: BalanceOf, gas_meter: &mut GasMeter, - input_data: &[u8], - ) -> Result>, &'static str>; + input_data: Vec, + ) -> Result<(AccountIdOf, ExecReturnValue), ExecError>; /// Call (possibly transferring some amount of funds) into the specified account. fn call( @@ -83,13 +122,21 @@ pub trait Ext { to: &AccountIdOf, value: BalanceOf, gas_meter: &mut GasMeter, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, - ) -> Result; + input_data: Vec, + ) -> ExecResult; /// Notes a call dispatch. fn note_dispatch_call(&mut self, call: CallOf); + /// Notes a restoration request. + fn note_restore_to( + &mut self, + dest: AccountIdOf, + code_hash: CodeHash, + rent_allowance: BalanceOf, + delta: Vec, + ); + /// Returns a reference to the account id of the caller. fn caller(&self) -> &AccountIdOf; @@ -141,66 +188,6 @@ pub trait Loader { fn load_main(&self, code_hash: &CodeHash) -> Result; } -/// An `EmptyOutputBuf` is used as an optimization for reusing empty vectors when -/// available. -/// -/// You can create this structure from a spare vector if you have any and then -/// you can fill it (only once), converting it to `OutputBuf`. -pub struct EmptyOutputBuf(Vec); - -impl EmptyOutputBuf { - /// Create an output buffer from a spare vector which is not longer needed. - /// - /// All contents are discarded, but capacity is preserved. - pub fn from_spare_vec(mut v: Vec) -> Self { - v.clear(); - EmptyOutputBuf(v) - } - - /// Create an output buffer ready for receiving a result. - /// - /// Use this function to create output buffer if you don't have a spare - /// vector. Otherwise, use `from_spare_vec`. - pub fn new() -> Self { - EmptyOutputBuf(Vec::new()) - } - - /// Write to the buffer result of the specified size. - /// - /// Calls closure with the buffer of the requested size. - pub fn fill Result<(), E>>(mut self, size: usize, f: F) -> Result { - assert!(self.0.len() == 0, "the vector is always cleared; it's written only once"); - self.0.resize(size, 0); - f(&mut self.0).map(|()| OutputBuf(self.0)) - } -} - -/// `OutputBuf` is the end result of filling an `EmptyOutputBuf`. -pub struct OutputBuf(Vec); - -#[must_use] -pub enum VmExecResult { - Ok, - Returned(OutputBuf), - /// A program executed some forbidden operation. - /// - /// This can include, e.g.: division by 0, OOB access or failure to satisfy some precondition - /// of a system call. - /// - /// Contains some vm-specific description of an trap. - Trap(&'static str), -} - -impl VmExecResult { - pub fn into_result(self) -> Result, &'static str> { - match self { - VmExecResult::Ok => Ok(Vec::new()), - VmExecResult::Returned(buf) => Ok(buf.0), - VmExecResult::Trap(description) => Err(description), - } - } -} - /// Struct that records a request to deposit an event with a list of topics. #[cfg_attr(any(feature = "std", test), derive(Debug, PartialEq, Eq))] pub struct IndexedEvent { @@ -218,20 +205,16 @@ pub struct IndexedEvent { /// /// Execution of code can end by either implicit termination (that is, reached the end of /// executable), explicit termination via returning a buffer or termination due to a trap. -/// -/// You can optionally provide a vector for collecting output if a spare is available. If you don't have -/// it will be created anyway. pub trait Vm { type Executable; fn execute>( &self, exec: &Self::Executable, - ext: &mut E, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, + ext: E, + input_data: Vec, gas_meter: &mut GasMeter, - ) -> VmExecResult; + ) -> ExecResult; } #[cfg_attr(test, derive(Debug, PartialEq, Eq))] @@ -254,13 +237,41 @@ impl Token for ExecFeeToken { } } +#[cfg_attr(any(feature = "std", test), derive(Debug, PartialEq, Eq, Clone))] +pub enum DeferredAction { + DepositEvent { + /// A list of topics this event will be deposited with. + topics: Vec, + /// The event to deposit. + event: Event, + }, + DispatchRuntimeCall { + /// The account id of the contract who dispatched this call. + origin: T::AccountId, + /// The call to dispatch. + call: ::Call, + }, + RestoreTo { + /// The account id of the contract which is removed during the restoration and transfers + /// its storage to the restored contract. + donor: T::AccountId, + /// The account id of the restored contract. + dest: T::AccountId, + /// The code hash of the restored contract. + code_hash: CodeHash, + /// The initial rent allowance to set. + rent_allowance: BalanceOf, + /// The keys to delete upon restoration. + delta: Vec, + }, +} + pub struct ExecutionContext<'a, T: Trait + 'a, V, L> { pub self_account: T::AccountId, pub self_trie_id: Option, pub overlay: OverlayAccountDb<'a, T>, pub depth: usize, - pub events: Vec>, - pub calls: Vec<(T::AccountId, T::Call)>, + pub deferred: Vec>, pub config: &'a Config, pub vm: &'a V, pub loader: &'a L, @@ -284,8 +295,7 @@ where self_account: origin, overlay: OverlayAccountDb::::new(&DirectAccountDb), depth: 0, - events: Vec::new(), - calls: Vec::new(), + deferred: Vec::new(), config: &cfg, vm: &vm, loader: &loader, @@ -294,16 +304,15 @@ where } } - fn nested(&self, overlay: OverlayAccountDb<'a, T>, dest: T::AccountId, trie_id: Option) - -> Self + fn nested<'b, 'c: 'b>(&'c self, dest: T::AccountId, trie_id: Option) + -> ExecutionContext<'b, T, V, L> { ExecutionContext { self_trie_id: trie_id, self_account: dest, - overlay, + overlay: OverlayAccountDb::new(&self.overlay), depth: self.depth + 1, - events: Vec::new(), - calls: Vec::new(), + deferred: Vec::new(), config: self.config, vm: self.vm, loader: self.loader, @@ -318,18 +327,23 @@ where dest: T::AccountId, value: BalanceOf, gas_meter: &mut GasMeter, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, - ) -> Result { + input_data: Vec, + ) -> ExecResult { if self.depth == self.config.max_depth as usize { - return Err("reached maximum depth, cannot make a call"); + return Err(ExecError { + reason: "reached maximum depth, cannot make a call", + buffer: input_data, + }); } if gas_meter .charge(self.config, ExecFeeToken::Call) .is_out_of_gas() { - return Err("not enough gas to pay base call fee"); + return Err(ExecError { + reason: "not enough gas to pay base call fee", + buffer: input_data, + }); } // Assumption: pay_rent doesn't collide with overlay because @@ -339,59 +353,49 @@ where // Calls to dead contracts always fail. if let Some(ContractInfo::Tombstone(_)) = contract_info { - return Err("contract has been evicted"); + return Err(ExecError { + reason: "contract has been evicted", + buffer: input_data, + }); }; - let mut output_data = Vec::new(); - - let (change_set, events, calls) = { - let mut nested = self.nested( - OverlayAccountDb::new(&self.overlay), - dest.clone(), - contract_info.and_then(|i| i.as_alive().map(|i| i.trie_id.clone())) - ); + let caller = self.self_account.clone(); + let dest_trie_id = contract_info.and_then(|i| i.as_alive().map(|i| i.trie_id.clone())); + self.with_nested_context(dest.clone(), dest_trie_id, |nested| { if value > BalanceOf::::zero() { - transfer( - gas_meter, - TransferCause::Call, - &self.self_account, - &dest, - value, - &mut nested, - )?; + try_or_exec_error!( + transfer( + gas_meter, + TransferCause::Call, + &caller, + &dest, + value, + nested, + ), + input_data + ); } // If code_hash is not none, then the destination account is a live contract, otherwise // it is a regular account since tombstone accounts have already been rejected. - if let Some(dest_code_hash) = self.overlay.get_code_hash(&dest) { - let executable = self.loader.load_main(&dest_code_hash)?; - output_data = self - .vm - .execute( - &executable, - &mut CallContext { - ctx: &mut nested, - caller: self.self_account.clone(), - value_transferred: value, - timestamp: self.timestamp.clone(), - block_number: self.block_number.clone(), - }, - input_data, - empty_output_buf, - gas_meter, - ) - .into_result()?; + match nested.overlay.get_code_hash(&dest) { + Some(dest_code_hash) => { + let executable = try_or_exec_error!( + nested.loader.load_main(&dest_code_hash), + input_data + ); + nested.vm + .execute( + &executable, + nested.new_call_context(caller, value), + input_data, + gas_meter, + ) + } + None => Ok(ExecReturnValue { status: STATUS_SUCCESS, data: Vec::new() }), } - - (nested.overlay.into_change_set(), nested.events, nested.calls) - }; - - self.overlay.commit(change_set); - self.events.extend(events); - self.calls.extend(calls); - - Ok(CallReceipt { output_data }) + }) } pub fn instantiate( @@ -399,75 +403,109 @@ where endowment: BalanceOf, gas_meter: &mut GasMeter, code_hash: &CodeHash, - input_data: &[u8], - ) -> Result, &'static str> { + input_data: Vec, + ) -> Result<(T::AccountId, ExecReturnValue), ExecError> { if self.depth == self.config.max_depth as usize { - return Err("reached maximum depth, cannot create"); + return Err(ExecError { + reason: "reached maximum depth, cannot create", + buffer: input_data, + }); } if gas_meter .charge(self.config, ExecFeeToken::Instantiate) .is_out_of_gas() { - return Err("not enough gas to pay base instantiate fee"); + return Err(ExecError { + reason: "not enough gas to pay base instantiate fee", + buffer: input_data, + }); } + let caller = self.self_account.clone(); let dest = T::DetermineContractAddress::contract_address_for( code_hash, - input_data, - &self.self_account, + &input_data, + &caller, ); - let (change_set, events, calls) = { - let mut overlay = OverlayAccountDb::new(&self.overlay); - - overlay.create_contract(&dest, code_hash.clone())?; + // TrieId has not been generated yet and storage is empty since contract is new. + let dest_trie_id = None; - // TrieId has not been generated yet and storage is empty since contract is new. - let mut nested = self.nested(overlay, dest.clone(), None); + let output = self.with_nested_context(dest.clone(), dest_trie_id, |nested| { + try_or_exec_error!( + nested.overlay.create_contract(&dest, code_hash.clone()), + input_data + ); // Send funds unconditionally here. If the `endowment` is below existential_deposit // then error will be returned here. - transfer( - gas_meter, - TransferCause::Instantiate, - &self.self_account, - &dest, - endowment, - &mut nested, - )?; - - let executable = self.loader.load_init(&code_hash)?; - self.vm + try_or_exec_error!( + transfer( + gas_meter, + TransferCause::Instantiate, + &caller, + &dest, + endowment, + nested, + ), + input_data + ); + + let executable = try_or_exec_error!( + nested.loader.load_init(&code_hash), + input_data + ); + let output = nested.vm .execute( &executable, - &mut CallContext { - ctx: &mut nested, - caller: self.self_account.clone(), - value_transferred: endowment, - timestamp: self.timestamp.clone(), - block_number: self.block_number.clone(), - }, + nested.new_call_context(caller.clone(), endowment), input_data, - EmptyOutputBuf::new(), gas_meter, - ) - .into_result()?; + )?; // Deposit an instantiation event. - nested.events.push(IndexedEvent { - event: RawEvent::Instantiated(self.self_account.clone(), dest.clone()), + nested.deferred.push(DeferredAction::DepositEvent { + event: RawEvent::Instantiated(caller.clone(), dest.clone()), topics: Vec::new(), }); - (nested.overlay.into_change_set(), nested.events, nested.calls) + Ok(output) + })?; + + Ok((dest, output)) + } + + fn new_call_context<'b>(&'b mut self, caller: T::AccountId, value: BalanceOf) + -> CallContext<'b, 'a, T, V, L> + { + let timestamp = self.timestamp.clone(); + let block_number = self.block_number.clone(); + CallContext { + ctx: self, + caller, + value_transferred: value, + timestamp, + block_number, + } + } + + fn with_nested_context(&mut self, dest: T::AccountId, trie_id: Option, func: F) + -> ExecResult + where F: FnOnce(&mut ExecutionContext) -> ExecResult + { + let (output, change_set, deferred) = { + let mut nested = self.nested(dest, trie_id); + let output = func(&mut nested)?; + (output, nested.overlay.into_change_set(), nested.deferred) }; - self.overlay.commit(change_set); - self.events.extend(events); - self.calls.extend(calls); + if output.is_success() { + self.overlay.commit(change_set); + self.deferred.extend(deferred); + } - Ok(InstantiateReceipt { address: dest }) + Ok(output) } } @@ -585,7 +623,7 @@ fn transfer<'a, T: Trait, V: Vm, L: Loader>( if transactor != dest { ctx.overlay.set_balance(transactor, new_from_balance); ctx.overlay.set_balance(dest, new_to_balance); - ctx.events.push(IndexedEvent { + ctx.deferred.push(DeferredAction::DepositEvent { event: RawEvent::Transfer(transactor.clone(), dest.clone(), value), topics: Vec::new(), }); @@ -632,8 +670,8 @@ where code_hash: &CodeHash, endowment: BalanceOf, gas_meter: &mut GasMeter, - input_data: &[u8], - ) -> Result>, &'static str> { + input_data: Vec, + ) -> Result<(AccountIdOf, ExecReturnValue), ExecError> { self.ctx.instantiate(endowment, gas_meter, code_hash, input_data) } @@ -642,18 +680,32 @@ where to: &T::AccountId, value: BalanceOf, gas_meter: &mut GasMeter, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, - ) -> Result { - self.ctx - .call(to.clone(), value, gas_meter, input_data, empty_output_buf) + input_data: Vec, + ) -> ExecResult { + self.ctx.call(to.clone(), value, gas_meter, input_data) } - /// Notes a call dispatch. fn note_dispatch_call(&mut self, call: CallOf) { - self.ctx.calls.push( - (self.ctx.self_account.clone(), call) - ); + self.ctx.deferred.push(DeferredAction::DispatchRuntimeCall { + origin: self.ctx.self_account.clone(), + call, + }); + } + + fn note_restore_to( + &mut self, + dest: AccountIdOf, + code_hash: CodeHash, + rent_allowance: BalanceOf, + delta: Vec, + ) { + self.ctx.deferred.push(DeferredAction::RestoreTo { + donor: self.ctx.self_account.clone(), + dest, + code_hash, + rent_allowance, + delta, + }); } fn address(&self) -> &T::AccountId { @@ -681,7 +733,7 @@ where } fn deposit_event(&mut self, topics: Vec, data: Vec) { - self.ctx.events.push(IndexedEvent { + self.ctx.deferred.push(DeferredAction::DepositEvent { topics, event: RawEvent::Contract(self.ctx.self_account.clone(), data), }); @@ -716,10 +768,11 @@ where #[cfg(test)] mod tests { use super::{ - BalanceOf, ExecFeeToken, ExecutionContext, Ext, Loader, EmptyOutputBuf, TransferFeeKind, TransferFeeToken, - Vm, VmExecResult, InstantiateReceipt, RawEvent, IndexedEvent, + BalanceOf, ExecFeeToken, ExecutionContext, Ext, Loader, TransferFeeKind, TransferFeeToken, + Vm, ExecResult, RawEvent, DeferredAction, }; use crate::account_db::AccountDb; + use crate::exec::{ExecReturnValue, ExecError, STATUS_SUCCESS}; use crate::gas::GasMeter; use crate::tests::{ExtBuilder, Test}; use crate::{CodeHash, Config}; @@ -734,18 +787,32 @@ mod tests { const BOB: u64 = 2; const CHARLIE: u64 = 3; + impl<'a, T, V, L> ExecutionContext<'a, T, V, L> + where T: crate::Trait + { + fn events(&self) -> Vec> { + self.deferred + .iter() + .filter(|action| match *action { + DeferredAction::DepositEvent { .. } => true, + _ => false, + }) + .cloned() + .collect() + } + } + struct MockCtx<'a> { ext: &'a mut dyn Ext, - input_data: &'a [u8], - empty_output_buf: Option, + input_data: Vec, gas_meter: &'a mut GasMeter, } #[derive(Clone)] - struct MockExecutable<'a>(Rc VmExecResult + 'a>); + struct MockExecutable<'a>(Rc ExecResult + 'a>); impl<'a> MockExecutable<'a> { - fn new(f: impl Fn(MockCtx) -> VmExecResult + 'a) -> Self { + fn new(f: impl Fn(MockCtx) -> ExecResult + 'a) -> Self { MockExecutable(Rc::new(f)) } } @@ -763,7 +830,7 @@ mod tests { } } - fn insert(&mut self, f: impl Fn(MockCtx) -> VmExecResult + 'a) -> CodeHash { + fn insert(&mut self, f: impl Fn(MockCtx) -> ExecResult + 'a) -> CodeHash { // Generate code hashes as monotonically increasing values. let code_hash = ::Hash::from_low_u64_be(self.counter); @@ -806,20 +873,22 @@ mod tests { fn execute>( &self, exec: &MockExecutable, - ext: &mut E, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, + mut ext: E, + input_data: Vec, gas_meter: &mut GasMeter, - ) -> VmExecResult { + ) -> ExecResult { (exec.0)(MockCtx { - ext, + ext: &mut ext, input_data, - empty_output_buf: Some(empty_output_buf), gas_meter, }) } } + fn exec_success() -> ExecResult { + Ok(ExecReturnValue { status: STATUS_SUCCESS, data: Vec::new() }) + } + #[test] fn it_works() { let value = Default::default(); @@ -833,7 +902,7 @@ mod tests { let mut loader = MockLoader::empty(); let exec_ch = loader.insert(|_ctx| { test_data.borrow_mut().push(1); - VmExecResult::Ok + exec_success() }); with_externalities(&mut ExtBuilder::default().build(), || { @@ -842,7 +911,7 @@ mod tests { ctx.overlay.create_contract(&BOB, exec_ch).unwrap(); assert_matches!( - ctx.call(BOB, value, &mut gas_meter, &data, EmptyOutputBuf::new()), + ctx.call(BOB, value, &mut gas_meter, data), Ok(_) ); }); @@ -866,7 +935,7 @@ mod tests { let mut gas_meter = GasMeter::::with_limit(1000, 1); - let result = ctx.call(dest, 0, &mut gas_meter, &[], EmptyOutputBuf::new()); + let result = ctx.call(dest, 0, &mut gas_meter, vec![]); assert_matches!(result, Ok(_)); let mut toks = gas_meter.tokens().iter(); @@ -876,7 +945,7 @@ mod tests { // This test verifies that base fee for instantiation is taken. with_externalities(&mut ExtBuilder::default().build(), || { let mut loader = MockLoader::empty(); - let code = loader.insert(|_| VmExecResult::Ok); + let code = loader.insert(|_| exec_success()); let vm = MockVm::new(); let cfg = Config::preload(); @@ -886,7 +955,7 @@ mod tests { let mut gas_meter = GasMeter::::with_limit(1000, 1); - let result = ctx.instantiate(0, &mut gas_meter, &code, &[]); + let result = ctx.instantiate(0, &mut gas_meter, &code, vec![]); assert_matches!(result, Ok(_)); let mut toks = gas_meter.tokens().iter(); @@ -910,19 +979,52 @@ mod tests { ctx.overlay.set_balance(&origin, 100); ctx.overlay.set_balance(&dest, 0); - let result = ctx.call( + let output = ctx.call( dest, 55, &mut GasMeter::::with_limit(1000, 1), - &[], - EmptyOutputBuf::new(), - ); - assert_matches!(result, Ok(_)); + vec![], + ).unwrap(); + + assert!(output.is_success()); assert_eq!(ctx.overlay.get_balance(&origin), 45); assert_eq!(ctx.overlay.get_balance(&dest), 55); }); } + #[test] + fn changes_are_reverted_on_failing_call() { + // This test verifies that a contract is able to transfer + // some funds to another account. + let origin = ALICE; + let dest = BOB; + + let vm = MockVm::new(); + let mut loader = MockLoader::empty(); + let return_ch = loader.insert( + |_| Ok(ExecReturnValue { status: 1, data: Vec::new() }) + ); + + with_externalities(&mut ExtBuilder::default().build(), || { + let cfg = Config::preload(); + let mut ctx = ExecutionContext::top_level(origin, &cfg, &vm, &loader); + ctx.overlay.create_contract(&BOB, return_ch).unwrap(); + ctx.overlay.set_balance(&origin, 100); + ctx.overlay.set_balance(&dest, 0); + + let output = ctx.call( + dest, + 55, + &mut GasMeter::::with_limit(1000, 1), + vec![], + ).unwrap(); + + assert!(!output.is_success()); + assert_eq!(ctx.overlay.get_balance(&origin), 100); + assert_eq!(ctx.overlay.get_balance(&dest), 0); + }); + } + #[test] fn transfer_fees() { let origin = ALICE; @@ -943,7 +1045,7 @@ mod tests { let mut gas_meter = GasMeter::::with_limit(1000, 1); - let result = ctx.call(dest, 50, &mut gas_meter, &[], EmptyOutputBuf::new()); + let result = ctx.call(dest, 50, &mut gas_meter, vec![]); assert_matches!(result, Ok(_)); let mut toks = gas_meter.tokens().iter(); @@ -972,7 +1074,7 @@ mod tests { let mut gas_meter = GasMeter::::with_limit(1000, 1); - let result = ctx.call(dest, 50, &mut gas_meter, &[], EmptyOutputBuf::new()); + let result = ctx.call(dest, 50, &mut gas_meter, vec![]); assert_matches!(result, Ok(_)); let mut toks = gas_meter.tokens().iter(); @@ -993,7 +1095,7 @@ mod tests { &mut ExtBuilder::default().existential_deposit(15).build(), || { let mut loader = MockLoader::empty(); - let code = loader.insert(|_| VmExecResult::Ok); + let code = loader.insert(|_| exec_success()); let vm = MockVm::new(); let cfg = Config::preload(); @@ -1004,7 +1106,7 @@ mod tests { let mut gas_meter = GasMeter::::with_limit(1000, 1); - let result = ctx.instantiate(50, &mut gas_meter, &code, &[]); + let result = ctx.instantiate(50, &mut gas_meter, &code, vec![]); assert_matches!(result, Ok(_)); let mut toks = gas_meter.tokens().iter(); @@ -1039,37 +1141,61 @@ mod tests { dest, 100, &mut GasMeter::::with_limit(1000, 1), - &[], - EmptyOutputBuf::new(), + vec![], ); - assert_matches!(result, Err("balance too low to send value")); + assert_matches!( + result, + Err(ExecError { reason: "balance too low to send value", buffer: _ }) + ); assert_eq!(ctx.overlay.get_balance(&origin), 0); assert_eq!(ctx.overlay.get_balance(&dest), 0); }); } #[test] - fn output_is_returned() { - // Verifies that if a contract returns data, this data + fn output_is_returned_on_success() { + // Verifies that if a contract returns data with a successful exit status, this data // is returned from the execution context. let origin = ALICE; let dest = BOB; let vm = MockVm::new(); let mut loader = MockLoader::empty(); - let return_ch = loader.insert(|mut ctx| { - #[derive(Debug)] - enum Void {} - let empty_output_buf = ctx.empty_output_buf.take().unwrap(); - let output_buf = - empty_output_buf.fill::(4, |data| { - data.copy_from_slice(&[1, 2, 3, 4]); - Ok(()) - }) - .expect("Ok is always returned"); - VmExecResult::Returned(output_buf) + let return_ch = loader.insert( + |_| Ok(ExecReturnValue { status: STATUS_SUCCESS, data: vec![1, 2, 3, 4] }) + ); + + with_externalities(&mut ExtBuilder::default().build(), || { + let cfg = Config::preload(); + let mut ctx = ExecutionContext::top_level(origin, &cfg, &vm, &loader); + ctx.overlay.create_contract(&BOB, return_ch).unwrap(); + + let result = ctx.call( + dest, + 0, + &mut GasMeter::::with_limit(1000, 1), + vec![], + ); + + let output = result.unwrap(); + assert!(output.is_success()); + assert_eq!(output.data, vec![1, 2, 3, 4]); }); + } + + #[test] + fn output_is_returned_on_failure() { + // Verifies that if a contract returns data with a failing exit status, this data + // is returned from the execution context. + let origin = ALICE; + let dest = BOB; + + let vm = MockVm::new(); + let mut loader = MockLoader::empty(); + let return_ch = loader.insert( + |_| Ok(ExecReturnValue { status: 1, data: vec![1, 2, 3, 4] }) + ); with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); @@ -1080,22 +1206,22 @@ mod tests { dest, 0, &mut GasMeter::::with_limit(1000, 1), - &[], - EmptyOutputBuf::new(), + vec![], ); - let output_data = result.unwrap().output_data; - assert_eq!(&output_data, &[1, 2, 3, 4]); + let output = result.unwrap(); + assert!(!output.is_success()); + assert_eq!(output.data, vec![1, 2, 3, 4]); }); } #[test] - fn input_data() { + fn input_data_to_call() { let vm = MockVm::new(); let mut loader = MockLoader::empty(); let input_data_ch = loader.insert(|ctx| { assert_eq!(ctx.input_data, &[1, 2, 3, 4]); - VmExecResult::Ok + exec_success() }); // This one tests passing the input data into a contract via call. @@ -1108,11 +1234,20 @@ mod tests { BOB, 0, &mut GasMeter::::with_limit(10000, 1), - &[1, 2, 3, 4], - EmptyOutputBuf::new(), + vec![1, 2, 3, 4], ); assert_matches!(result, Ok(_)); }); + } + + #[test] + fn input_data_to_instantiate() { + let vm = MockVm::new(); + let mut loader = MockLoader::empty(); + let input_data_ch = loader.insert(|ctx| { + assert_eq!(ctx.input_data, &[1, 2, 3, 4]); + exec_success() + }); // This one tests passing the input data into a contract via instantiate. with_externalities(&mut ExtBuilder::default().build(), || { @@ -1123,7 +1258,7 @@ mod tests { 0, &mut GasMeter::::with_limit(10000, 1), &input_data_ch, - &[1, 2, 3, 4], + vec![1, 2, 3, 4], ); assert_matches!(result, Ok(_)); }); @@ -1140,22 +1275,23 @@ mod tests { let mut loader = MockLoader::empty(); let recurse_ch = loader.insert(|ctx| { // Try to call into yourself. - let r = ctx - .ext - .call(&BOB, 0, ctx.gas_meter, &[], EmptyOutputBuf::new()); + let r = ctx.ext.call(&BOB, 0, ctx.gas_meter, vec![]); let mut reached_bottom = reached_bottom.borrow_mut(); if !*reached_bottom { // We are first time here, it means we just reached bottom. // Verify that we've got proper error and set `reached_bottom`. - assert_matches!(r, Err("reached maximum depth, cannot make a call")); + assert_matches!( + r, + Err(ExecError { reason: "reached maximum depth, cannot make a call", buffer: _ }) + ); *reached_bottom = true; } else { // We just unwinding stack here. assert_matches!(r, Ok(_)); } - VmExecResult::Ok + exec_success() }); with_externalities(&mut ExtBuilder::default().build(), || { @@ -1167,8 +1303,7 @@ mod tests { BOB, value, &mut GasMeter::::with_limit(100000, 1), - &[], - EmptyOutputBuf::new(), + vec![], ); assert_matches!(result, Ok(_)); @@ -1192,16 +1327,15 @@ mod tests { // Call into CHARLIE contract. assert_matches!( - ctx.ext - .call(&CHARLIE, 0, ctx.gas_meter, &[], EmptyOutputBuf::new()), + ctx.ext.call(&CHARLIE, 0, ctx.gas_meter, vec![]), Ok(_) ); - VmExecResult::Ok + exec_success() }); let charlie_ch = loader.insert(|ctx| { // Record the caller for charlie. *witnessed_caller_charlie.borrow_mut() = Some(*ctx.ext.caller()); - VmExecResult::Ok + exec_success() }); with_externalities(&mut ExtBuilder::default().build(), || { @@ -1215,8 +1349,7 @@ mod tests { dest, 0, &mut GasMeter::::with_limit(10000, 1), - &[], - EmptyOutputBuf::new(), + vec![], ); assert_matches!(result, Ok(_)); @@ -1237,15 +1370,14 @@ mod tests { // Call into charlie contract. assert_matches!( - ctx.ext - .call(&CHARLIE, 0, ctx.gas_meter, &[], EmptyOutputBuf::new()), + ctx.ext.call(&CHARLIE, 0, ctx.gas_meter, vec![]), Ok(_) ); - VmExecResult::Ok + exec_success() }); let charlie_ch = loader.insert(|ctx| { assert_eq!(*ctx.ext.address(), CHARLIE); - VmExecResult::Ok + exec_success() }); with_externalities(&mut ExtBuilder::default().build(), || { @@ -1258,8 +1390,7 @@ mod tests { BOB, 0, &mut GasMeter::::with_limit(10000, 1), - &[], - EmptyOutputBuf::new(), + vec![], ); assert_matches!(result, Ok(_)); @@ -1271,7 +1402,7 @@ mod tests { let vm = MockVm::new(); let mut loader = MockLoader::empty(); - let dummy_ch = loader.insert(|_| VmExecResult::Ok); + let dummy_ch = loader.insert(|_| exec_success()); with_externalities( &mut ExtBuilder::default().existential_deposit(15).build(), @@ -1284,7 +1415,7 @@ mod tests { 0, // <- zero endowment &mut GasMeter::::with_limit(10000, 1), &dummy_ch, - &[], + vec![], ), Err(_) ); @@ -1293,11 +1424,13 @@ mod tests { } #[test] - fn instantiation() { + fn instantiation_work_with_success_output() { let vm = MockVm::new(); let mut loader = MockLoader::empty(); - let dummy_ch = loader.insert(|_| VmExecResult::Ok); + let dummy_ch = loader.insert( + |_| Ok(ExecReturnValue { status: STATUS_SUCCESS, data: vec![80, 65, 83, 83] }) + ); with_externalities( &mut ExtBuilder::default().existential_deposit(15).build(), @@ -1311,20 +1444,20 @@ mod tests { 100, &mut GasMeter::::with_limit(10000, 1), &dummy_ch, - &[], + vec![], ), - Ok(InstantiateReceipt { address }) => address + Ok((address, ref output)) if output.data == vec![80, 65, 83, 83] => address ); // Check that the newly created account has the expected code hash and // there are instantiation event. assert_eq!(ctx.overlay.get_code_hash(&created_contract_address).unwrap(), dummy_ch); - assert_eq!(&ctx.events, &[ - IndexedEvent { + assert_eq!(&ctx.events(), &[ + DeferredAction::DepositEvent { event: RawEvent::Transfer(ALICE, created_contract_address, 100), topics: Vec::new(), }, - IndexedEvent { + DeferredAction::DepositEvent { event: RawEvent::Instantiated(ALICE, created_contract_address), topics: Vec::new(), } @@ -1333,29 +1466,60 @@ mod tests { ); } + #[test] + fn instantiation_fails_with_failing_output() { + let vm = MockVm::new(); + + let mut loader = MockLoader::empty(); + let dummy_ch = loader.insert( + |_| Ok(ExecReturnValue { status: 1, data: vec![70, 65, 73, 76] }) + ); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(15).build(), + || { + let cfg = Config::preload(); + let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); + ctx.overlay.set_balance(&ALICE, 1000); + + let created_contract_address = assert_matches!( + ctx.instantiate( + 100, + &mut GasMeter::::with_limit(10000, 1), + &dummy_ch, + vec![], + ), + Ok((address, ref output)) if output.data == vec![70, 65, 73, 76] => address + ); + + // Check that the account has not been created. + assert!(ctx.overlay.get_code_hash(&created_contract_address).is_none()); + assert!(ctx.events().is_empty()); + } + ); + } + #[test] fn instantiation_from_contract() { let vm = MockVm::new(); let mut loader = MockLoader::empty(); - let dummy_ch = loader.insert(|_| VmExecResult::Ok); + let dummy_ch = loader.insert(|_| exec_success()); let created_contract_address = Rc::new(RefCell::new(None::)); let creator_ch = loader.insert({ let dummy_ch = dummy_ch.clone(); let created_contract_address = Rc::clone(&created_contract_address); move |ctx| { // Instantiate a contract and save it's address in `created_contract_address`. - *created_contract_address.borrow_mut() = - ctx.ext.instantiate( - &dummy_ch, - 15u64, - ctx.gas_meter, - &[] - ) - .unwrap() - .address.into(); - - VmExecResult::Ok + let (address, output) = ctx.ext.instantiate( + &dummy_ch, + 15u64, + ctx.gas_meter, + vec![] + ).unwrap(); + + *created_contract_address.borrow_mut() = address.into(); + Ok(output) } }); @@ -1368,7 +1532,7 @@ mod tests { ctx.overlay.create_contract(&BOB, creator_ch).unwrap(); assert_matches!( - ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), &[], EmptyOutputBuf::new()), + ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), vec![]), Ok(_) ); @@ -1377,16 +1541,16 @@ mod tests { // Check that the newly created account has the expected code hash and // there are instantiation event. assert_eq!(ctx.overlay.get_code_hash(&created_contract_address).unwrap(), dummy_ch); - assert_eq!(&ctx.events, &[ - IndexedEvent { + assert_eq!(&ctx.events(), &[ + DeferredAction::DepositEvent { event: RawEvent::Transfer(ALICE, BOB, 20), topics: Vec::new(), }, - IndexedEvent { + DeferredAction::DepositEvent { event: RawEvent::Transfer(BOB, created_contract_address, 15), topics: Vec::new(), }, - IndexedEvent { + DeferredAction::DepositEvent { event: RawEvent::Instantiated(BOB, created_contract_address), topics: Vec::new(), }, @@ -1396,11 +1560,13 @@ mod tests { } #[test] - fn instantiation_fails() { + fn instantiation_traps() { let vm = MockVm::new(); let mut loader = MockLoader::empty(); - let dummy_ch = loader.insert(|_| VmExecResult::Trap("It's a trap!")); + let dummy_ch = loader.insert( + |_| Err(ExecError { reason: "It's a trap!", buffer: Vec::new() }) + ); let creator_ch = loader.insert({ let dummy_ch = dummy_ch.clone(); move |ctx| { @@ -1410,12 +1576,12 @@ mod tests { &dummy_ch, 15u64, ctx.gas_meter, - &[] + vec![] ), - Err("It's a trap!") + Err(ExecError { reason: "It's a trap!", buffer: _ }) ); - VmExecResult::Ok + exec_success() } }); @@ -1428,14 +1594,14 @@ mod tests { ctx.overlay.create_contract(&BOB, creator_ch).unwrap(); assert_matches!( - ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), &[], EmptyOutputBuf::new()), + ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), vec![]), Ok(_) ); // The contract wasn't created so we don't expect to see an instantiation // event here. - assert_eq!(&ctx.events, &[ - IndexedEvent { + assert_eq!(&ctx.events(), &[ + DeferredAction::DepositEvent { event: RawEvent::Transfer(ALICE, BOB, 20), topics: Vec::new(), }, @@ -1452,7 +1618,7 @@ mod tests { assert_eq!(ctx.ext.rent_allowance(), >::max_value()); ctx.ext.set_rent_allowance(10); assert_eq!(ctx.ext.rent_allowance(), 10); - VmExecResult::Ok + exec_success() }); with_externalities(&mut ExtBuilder::default().build(), || { @@ -1463,7 +1629,7 @@ mod tests { 0, &mut GasMeter::::with_limit(10000, 1), &rent_allowance_ch, - &[], + vec![], ); assert_matches!(result, Ok(_)); }); diff --git a/srml/contracts/src/gas.rs b/srml/contracts/src/gas.rs index 7c350f73818eaeeb5655a0eafe39b8c9e35fd5a4..d069d996938aba4e55a95936a19c296d8b36e9f8 100644 --- a/srml/contracts/src/gas.rs +++ b/srml/contracts/src/gas.rs @@ -16,8 +16,8 @@ use crate::{GasSpent, Module, Trait, BalanceOf, NegativeImbalanceOf}; use rstd::convert::TryFrom; -use runtime_primitives::PrimitiveError; -use runtime_primitives::traits::{CheckedMul, Zero, SaturatedConversion, SimpleArithmetic, UniqueSaturatedInto}; +use sr_primitives::PrimitiveError; +use sr_primitives::traits::{CheckedMul, Zero, SaturatedConversion, SimpleArithmetic, UniqueSaturatedInto}; use srml_support::StorageValue; use srml_support::traits::{Currency, ExistenceRequirement, Get, Imbalance, OnUnbalanced, WithdrawReason}; diff --git a/srml/contracts/src/lib.rs b/srml/contracts/src/lib.rs index ad277305a5e6ab14ba441c162ee308491d9e8bac..0d018e1451416665d854e58e3d25d14aabdc71a4 100644 --- a/srml/contracts/src/lib.rs +++ b/srml/contracts/src/lib.rs @@ -89,17 +89,18 @@ mod rent; #[cfg(test)] mod tests; -use crate::exec::ExecutionContext; +use crate::exec::{ExecutionContext, ExecResult}; use crate::account_db::{AccountDb, DirectAccountDb}; -pub use crate::gas::Gas; +pub use crate::gas::{Gas, GasMeter}; +use crate::wasm::{WasmLoader, WasmVm}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; -use substrate_primitives::crypto::UncheckedFrom; +use primitives::crypto::UncheckedFrom; use rstd::{prelude::*, marker::PhantomData}; -use parity_codec::{Codec, Encode, Decode}; +use codec::{Codec, Encode, Decode}; use runtime_io::blake2_256; -use runtime_primitives::traits::{ +use sr_primitives::traits::{ Hash, StaticLookup, Zero, MaybeSerializeDebug, Member }; use srml_support::dispatch::{Result, RuntimeDispatchable}; @@ -109,7 +110,7 @@ use srml_support::{ }; use srml_support::traits::{OnFreeBalanceZero, OnUnbalanced, Currency, Get}; use system::{ensure_signed, RawOrigin, ensure_root}; -use substrate_primitives::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX; +use primitives::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX; use timestamp; pub type CodeHash = ::Hash; @@ -332,7 +333,7 @@ pub trait Trait: timestamp::Trait { /// /// It is recommended (though not required) for this function to return a fee that would be taken /// by the Executive module for regular dispatch. - type ComputeDispatchFee: ComputeDispatchFee>; + type ComputeDispatchFee: ComputeDispatchFee<::Call, BalanceOf>; /// trie id generator type TrieIdGenerator: TrieIdGenerator; @@ -426,8 +427,8 @@ where /// The default dispatch fee computor computes the fee in the same way that /// the implementation of `MakePayment` for the Balances module does. pub struct DefaultDispatchFeeComputor(PhantomData); -impl ComputeDispatchFee> for DefaultDispatchFeeComputor { - fn compute_dispatch_fee(call: &T::Call) -> BalanceOf { +impl ComputeDispatchFee<::Call, BalanceOf> for DefaultDispatchFeeComputor { + fn compute_dispatch_fee(call: &::Call) -> BalanceOf { let encoded_len = call.using_encoded(|encoded| encoded.len() as u32); let base_fee = T::TransactionBaseFee::get(); let byte_fee = T::TransactionByteFee::get(); @@ -527,10 +528,10 @@ decl_module! { code: Vec ) -> Result { let origin = ensure_signed(origin)?; - let schedule = >::current_schedule(); let (mut gas_meter, imbalance) = gas::buy_gas::(&origin, gas_limit)?; + let schedule = >::current_schedule(); let result = wasm::save_code::(code, &mut gas_meter, &schedule); if let Ok(code_hash) = result { Self::deposit_event(RawEvent::CodeStored(code_hash)); @@ -558,45 +559,9 @@ decl_module! { let origin = ensure_signed(origin)?; let dest = T::Lookup::lookup(dest)?; - // Pay for the gas upfront. - // - // NOTE: it is very important to avoid any state changes before - // paying for the gas. - let (mut gas_meter, imbalance) = gas::buy_gas::(&origin, gas_limit)?; - - let cfg = Config::preload(); - let vm = crate::wasm::WasmVm::new(&cfg.schedule); - let loader = crate::wasm::WasmLoader::new(&cfg.schedule); - let mut ctx = ExecutionContext::top_level(origin.clone(), &cfg, &vm, &loader); - - let result = ctx.call(dest, value, &mut gas_meter, &data, exec::EmptyOutputBuf::new()); - - if let Ok(_) = result { - // Commit all changes that made it thus far into the persistent storage. - DirectAccountDb.commit(ctx.overlay.into_change_set()); - - // Then deposit all events produced. - ctx.events.into_iter().for_each(|indexed_event| { - >::deposit_event_indexed( - &*indexed_event.topics, - ::Event::from(indexed_event.event).into(), - ); - }); - } - - // Refund cost of the unused gas. - // - // NOTE: This should go after the commit to the storage, since the storage changes - // can alter the balance of the caller. - gas::refund_unused_gas::(&origin, gas_meter, imbalance); - - // Dispatch every recorded call with an appropriate origin. - ctx.calls.into_iter().for_each(|(who, call)| { - let result = call.dispatch(RawOrigin::Signed(who.clone()).into()); - Self::deposit_event(RawEvent::Dispatched(who, result.is_ok())); - }); - - result.map(|_| ()) + Self::execute_wasm(origin, gas_limit, |ctx, gas_meter| { + ctx.call(dest, value, gas_meter, data) + }) } /// Creates a new contract from the `codehash` generated by `put_code`, optionally transferring some balance. @@ -618,44 +583,10 @@ decl_module! { ) -> Result { let origin = ensure_signed(origin)?; - // Commit the gas upfront. - // - // NOTE: It is very important to avoid any state changes before - // paying for the gas. - let (mut gas_meter, imbalance) = gas::buy_gas::(&origin, gas_limit)?; - - let cfg = Config::preload(); - let vm = crate::wasm::WasmVm::new(&cfg.schedule); - let loader = crate::wasm::WasmLoader::new(&cfg.schedule); - let mut ctx = ExecutionContext::top_level(origin.clone(), &cfg, &vm, &loader); - let result = ctx.instantiate(endowment, &mut gas_meter, &code_hash, &data); - - if let Ok(_) = result { - // Commit all changes that made it thus far into the persistent storage. - DirectAccountDb.commit(ctx.overlay.into_change_set()); - - // Then deposit all events produced. - ctx.events.into_iter().for_each(|indexed_event| { - >::deposit_event_indexed( - &*indexed_event.topics, - ::Event::from(indexed_event.event).into(), - ); - }); - } - - // Refund cost of the unused gas. - // - // NOTE: This should go after the commit to the storage, since the storage changes - // can alter the balance of the caller. - gas::refund_unused_gas::(&origin, gas_meter, imbalance); - - // Dispatch every recorded call with an appropriate origin. - ctx.calls.into_iter().for_each(|(who, call)| { - let result = call.dispatch(RawOrigin::Signed(who.clone()).into()); - Self::deposit_event(RawEvent::Dispatched(who, result.is_ok())); - }); - - result.map(|_| ()) + Self::execute_wasm(origin, gas_limit, |ctx, gas_meter| { + ctx.instantiate(endowment, gas_meter, &code_hash, data) + .map(|(_address, output)| output) + }) } /// Allows block producers to claim a small reward for evicting a contract. If a block producer @@ -691,87 +622,147 @@ decl_module! { } } - /// Allows a contract to restore a tombstone by giving its storage. - /// - /// The contract that wants to restore (i.e. origin of the call, or `msg.sender` in Solidity terms) will compute a - /// tombstone with its storage and the given code_hash. If the computed tombstone - /// match the destination one, the destination contract is restored with the rent_allowance` specified, - /// while the origin sends all its funds to the destination and is removed. - fn restore_to( - origin, - dest: T::AccountId, - code_hash: CodeHash, - rent_allowance: BalanceOf, - delta: Vec - ) { - let origin = ensure_signed(origin)?; - - let mut origin_contract = >::get(&origin) - .and_then(|c| c.get_alive()) - .ok_or("Cannot restore from inexisting or tombstone contract")?; + fn on_finalize() { + GasSpent::kill(); + } + } +} - let current_block = >::block_number(); +impl Module { + fn execute_wasm( + origin: T::AccountId, + gas_limit: Gas, + func: impl FnOnce(&mut ExecutionContext, &mut GasMeter) -> ExecResult + ) -> Result { + // Pay for the gas upfront. + // + // NOTE: it is very important to avoid any state changes before + // paying for the gas. + let (mut gas_meter, imbalance) = gas::buy_gas::(&origin, gas_limit)?; + + let cfg = Config::preload(); + let vm = WasmVm::new(&cfg.schedule); + let loader = WasmLoader::new(&cfg.schedule); + let mut ctx = ExecutionContext::top_level(origin.clone(), &cfg, &vm, &loader); + + let result = func(&mut ctx, &mut gas_meter); + + if result.as_ref().map(|output| output.is_success()).unwrap_or(false) { + // Commit all changes that made it thus far into the persistent storage. + DirectAccountDb.commit(ctx.overlay.into_change_set()); + } - if origin_contract.last_write == Some(current_block) { - return Err("Origin TrieId written in the current block"); + // Refund cost of the unused gas. + // + // NOTE: This should go after the commit to the storage, since the storage changes + // can alter the balance of the caller. + gas::refund_unused_gas::(&origin, gas_meter, imbalance); + + // Execute deferred actions. + ctx.deferred.into_iter().for_each(|deferred| { + use self::exec::DeferredAction::*; + match deferred { + DepositEvent { + topics, + event, + } => >::deposit_event_indexed( + &*topics, + ::Event::from(event).into(), + ), + DispatchRuntimeCall { + origin: who, + call, + } => { + let result = call.dispatch(RawOrigin::Signed(who.clone()).into()); + Self::deposit_event(RawEvent::Dispatched(who, result.is_ok())); + } + RestoreTo { + donor, + dest, + code_hash, + rent_allowance, + delta, + } => { + let _result = Self::restore_to(donor, dest, code_hash, rent_allowance, delta); + } } + }); - let dest_tombstone = >::get(&dest) - .and_then(|c| c.get_tombstone()) - .ok_or("Cannot restore to inexisting or alive contract")?; + result + .map(|_| ()) + .map_err(|e| e.reason) + } - let last_write = if !delta.is_empty() { - Some(current_block) - } else { - origin_contract.last_write - }; + fn restore_to( + origin: T::AccountId, + dest: T::AccountId, + code_hash: CodeHash, + rent_allowance: BalanceOf, + delta: Vec + ) -> Result { + let mut origin_contract = >::get(&origin) + .and_then(|c| c.get_alive()) + .ok_or("Cannot restore from inexisting or tombstone contract")?; + + let current_block = >::block_number(); + + if origin_contract.last_write == Some(current_block) { + return Err("Origin TrieId written in the current block"); + } - let key_values_taken = delta.iter() - .filter_map(|key| { - child::get_raw(&origin_contract.trie_id, &blake2_256(key)).map(|value| { - child::kill(&origin_contract.trie_id, &blake2_256(key)); - (key, value) - }) - }) - .collect::>(); - - let tombstone = >::new( - // This operation is cheap enough because last_write (delta not included) - // is not this block as it has been checked earlier. - &runtime_io::child_storage_root(&origin_contract.trie_id)[..], - code_hash, - ); - - if tombstone != dest_tombstone { - for (key, value) in key_values_taken { - child::put_raw(&origin_contract.trie_id, &blake2_256(key), &value); - } + let dest_tombstone = >::get(&dest) + .and_then(|c| c.get_tombstone()) + .ok_or("Cannot restore to inexisting or alive contract")?; - return Err("Tombstones don't match"); + let last_write = if !delta.is_empty() { + Some(current_block) + } else { + origin_contract.last_write + }; + + let key_values_taken = delta.iter() + .filter_map(|key| { + child::get_raw(&origin_contract.trie_id, &blake2_256(key)).map(|value| { + child::kill(&origin_contract.trie_id, &blake2_256(key)); + (key, value) + }) + }) + .collect::>(); + + let tombstone = >::new( + // This operation is cheap enough because last_write (delta not included) + // is not this block as it has been checked earlier. + &runtime_io::child_storage_root(&origin_contract.trie_id)[..], + code_hash, + ); + + if tombstone != dest_tombstone { + for (key, value) in key_values_taken { + child::put_raw(&origin_contract.trie_id, &blake2_256(key), &value); } - origin_contract.storage_size -= key_values_taken.iter() - .map(|(_, value)| value.len() as u32) - .sum::(); - - >::remove(&origin); - >::insert(&dest, ContractInfo::Alive(RawAliveContractInfo { - trie_id: origin_contract.trie_id, - storage_size: origin_contract.storage_size, - code_hash, - rent_allowance, - deduct_block: current_block, - last_write, - })); - - let origin_free_balance = T::Currency::free_balance(&origin); - T::Currency::make_free_balance_be(&origin, >::zero()); - T::Currency::deposit_creating(&dest, origin_free_balance); + return Err("Tombstones don't match"); } - fn on_finalize() { - GasSpent::kill(); - } + origin_contract.storage_size -= key_values_taken.iter() + .map(|(_, value)| value.len() as u32) + .sum::(); + + >::remove(&origin); + >::insert(&dest, ContractInfo::Alive(RawAliveContractInfo { + trie_id: origin_contract.trie_id, + storage_size: origin_contract.storage_size, + code_hash, + rent_allowance, + deduct_block: current_block, + last_write, + })); + + let origin_free_balance = T::Currency::free_balance(&origin); + T::Currency::make_free_balance_be(&origin, >::zero()); + T::Currency::deposit_creating(&dest, origin_free_balance); + + Ok(()) } } @@ -824,10 +815,9 @@ decl_storage! { impl OnFreeBalanceZero for Module { fn on_free_balance_zero(who: &T::AccountId) { - if let Some(ContractInfo::Alive(info)) = >::get(who) { + if let Some(ContractInfo::Alive(info)) = >::take(who) { child::kill_storage(&info.trie_id); } - >::remove(who); } } diff --git a/srml/contracts/src/rent.rs b/srml/contracts/src/rent.rs index 96f8516a5f189c2bba8b23a60b9d350d99e7ae15..fea6cdc7f3969577c3e77fc342f6fe3806868eca 100644 --- a/srml/contracts/src/rent.rs +++ b/srml/contracts/src/rent.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use crate::{BalanceOf, ContractInfo, ContractInfoOf, TombstoneContractInfo, Trait, AliveContractInfo}; -use runtime_primitives::traits::{Bounded, CheckedDiv, CheckedMul, Saturating, Zero, +use sr_primitives::traits::{Bounded, CheckedDiv, CheckedMul, Saturating, Zero, SaturatedConversion}; use srml_support::traits::{Currency, ExistenceRequirement, Get, WithdrawReason}; use srml_support::StorageMap; diff --git a/srml/contracts/src/tests.rs b/srml/contracts/src/tests.rs index 3e63bc0defc89a5d4d07b55c1f844af5cfdf9bd4..9c338a5abd9ac9068f952859a08e9013ea304eb8 100644 --- a/srml/contracts/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -22,24 +22,25 @@ use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb}; use crate::{ BalanceOf, ComputeDispatchFee, ContractAddressFor, ContractInfo, ContractInfoOf, GenesisConfig, - Module, RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, TrieIdGenerator, + Module, RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, + TrieIdGenerator, Schedule, }; use assert_matches::assert_matches; use hex_literal::*; -use parity_codec::{Decode, Encode, KeyedVec}; +use codec::{Decode, Encode, KeyedVec}; use runtime_io; use runtime_io::with_externalities; -use runtime_primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, H256}; -use runtime_primitives::traits::{BlakeTwo256, Hash, IdentityLookup}; -use runtime_primitives::BuildStorage; +use sr_primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, H256}; +use sr_primitives::traits::{BlakeTwo256, Hash, IdentityLookup}; +use sr_primitives::{Perbill, BuildStorage}; use srml_support::{ assert_ok, assert_err, impl_outer_dispatch, impl_outer_event, impl_outer_origin, parameter_types, storage::child, StorageMap, StorageValue, traits::{Currency, Get}, }; use std::cell::RefCell; use std::sync::atomic::{AtomicUsize, Ordering}; -use substrate_primitives::storage::well_known_keys; -use substrate_primitives::Blake2Hasher; +use primitives::storage::well_known_keys; +use primitives::Blake2Hasher; use system::{self, EventRecord, Phase}; use {balances, wabt}; @@ -96,22 +97,28 @@ impl Get for BlockGasLimit { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const BalancesTransactionBaseFee: u64 = 0; + pub const BalancesTransactionByteFee: u64 = 0; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; + type Call = (); type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = MetaEvent; type BlockHashCount = BlockHashCount; -} -parameter_types! { - pub const BalancesTransactionBaseFee: u64 = 0; - pub const BalancesTransactionByteFee: u64 = 0; + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; } impl balances::Trait for Test { type Balance = u64; @@ -126,6 +133,7 @@ impl balances::Trait for Test { type CreationFee = CreationFee; type TransactionBaseFee = BalancesTransactionBaseFee; type TransactionByteFee = BalancesTransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const MinimumPeriod: u64 = 1; @@ -190,7 +198,7 @@ impl ContractAddressFor for DummyContractAddressFor { pub struct DummyTrieIdGenerator; impl TrieIdGenerator for DummyTrieIdGenerator { fn trie_id(account_id: &u64) -> TrieId { - use substrate_primitives::storage::well_known_keys; + use primitives::storage::well_known_keys; let new_seed = super::AccountCounter::mutate(|v| { *v = v.wrapping_add(1); @@ -270,12 +278,15 @@ impl ExtBuilder { balances::GenesisConfig:: { balances: vec![], vesting: vec![], - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); + }.assimilate_storage(&mut t).unwrap(); GenesisConfig:: { - current_schedule: Default::default(), + current_schedule: Schedule { + enable_println: true, + ..Default::default() + }, gas_price: self.gas_price, - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - runtime_io::TestExternalities::new_with_children(t) + }.assimilate_storage(&mut t).unwrap(); + runtime_io::TestExternalities::new(t) } } @@ -691,7 +702,7 @@ const CODE_SET_RENT: &str = r#" (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) (import "env" "ext_set_rent_allowance" (func $ext_set_rent_allowance (param i32 i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) ;; insert a value of 4 bytes into storage @@ -774,7 +785,7 @@ const CODE_SET_RENT: &str = r#" (i32.const 0) (i32.const 4) ) - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 0) (i32.const 0) (get_local $input_size) @@ -1166,7 +1177,7 @@ const CODE_CHECK_DEFAULT_RENT_ALLOWANCE: &str = r#" (module (import "env" "ext_rent_allowance" (func $ext_rent_allowance)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -1193,7 +1204,7 @@ const CODE_CHECK_DEFAULT_RENT_ALLOWANCE: &str = r#" ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -1250,17 +1261,24 @@ fn default_rent_allowance_on_create() { const CODE_RESTORATION: &str = r#" (module (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) - (import "env" "ext_dispatch_call" (func $ext_dispatch_call (param i32 i32))) + (import "env" "ext_restore_to" (func $ext_restore_to (param i32 i32 i32 i32 i32 i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func (export "call") - (call $ext_dispatch_call - ;; Pointer to the start of the encoded call buffer - (i32.const 200) - ;; The length of the encoded call buffer. - ;; - ;; NB: This is required to keep in sync with the values in `restoration`. - (i32.const 115) + (call $ext_restore_to + ;; Pointer and length of the encoded dest buffer. + (i32.const 256) + (i32.const 8) + ;; Pointer and length of the encoded code hash buffer + (i32.const 264) + (i32.const 32) + ;; Pointer and length of the encoded rent_allowance buffer + (i32.const 296) + (i32.const 8) + ;; Pointer and number of items in the delta buffer. + ;; This buffer specifies multiple keys for removal before restoration. + (i32.const 100) + (i32.const 1) ) ) (func (export "deploy") @@ -1284,17 +1302,20 @@ const CODE_RESTORATION: &str = r#" ;; Data to restore (data (i32.const 0) "\28") - ;; ACL + ;; Buffer that has ACL storage keys. (data (i32.const 100) "\01") - ;; Serialized version of `T::Call` that encodes a call to `restore_to` function. For more - ;; details check out the `ENCODED_CALL_LITERAL`. - (data (i32.const 200) - "\01\05\02\00\00\00\00\00\00\00\69\ae\df\b4\f6\c1\c3\98\e9\7f\8a\52\04\de\0f\95\ad\5e\7d\c3" - "\54\09\60\be\ab\11\a8\6c\56\9f\bf\cf\32\00\00\00\00\00\00\00\08\01\00\00\00\00\00\00\00\00" - "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00" - "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" + ;; Address of bob + (data (i32.const 256) "\02\00\00\00\00\00\00\00") + + ;; Code hash of SET_RENT + (data (i32.const 264) + "\14\eb\65\3c\86\98\d6\b2\3d\8d\3c\4a\54\c6\c4\71" + "\b9\fc\19\36\df\ca\a0\a1\f2\dc\ad\9d\e5\36\0b\25" ) + + ;; Rent allowance + (data (i32.const 296) "\32\00\00\00\00\00\00\00") ) "#; @@ -1319,45 +1340,9 @@ fn restoration_success() { } fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: bool) { + let (set_rent_wasm, set_rent_code_hash) = compile_module::(CODE_SET_RENT).unwrap(); let (restoration_wasm, restoration_code_hash) = compile_module::(CODE_RESTORATION).unwrap(); - let (set_rent_wasm, set_rent_code_hash) = compile_module::(CODE_SET_RENT).unwrap(); - - let acl_key = { - let mut s = [0u8; 32]; - s[0] = 1; - s - }; - - // This test can fail due to the encoding changes. In case it becomes too annoying - // let's rewrite so as we use this module controlled call or we serialize it in runtime. - let encoded = hex::encode(Encode::encode(&Call::Contract(super::Call::restore_to( - BOB, - set_rent_code_hash.into(), - ::Balance::from(50u32), - vec![acl_key, acl_key], - )))); - - // `ENCODED_CALL_LITERAL` is encoded `T::Call` represented as a byte array. There is an exact - // same copy of this (modulo hex notation differences) in `CODE_RESTORATION`. - // - // When this assert is triggered make sure that you update the literals here and in - // `CODE_RESTORATION`. Hopefully, we switch to automatic injection of the code. - const ENCODED_CALL_LITERAL: &str = - "0105020000000000000069aedfb4f6c1c398e97f8a5204de0f95ad5e7dc3540960beab11a86c569fbfcf320000\ - 0000000000080100000000000000000000000000000000000000000000000000000000000000010000000000000\ - 0000000000000000000000000000000000000000000000000"; - assert_eq!( - encoded, - ENCODED_CALL_LITERAL, - "The literal was changed and requires updating here and in `CODE_RESTORATION`", - ); - assert_eq!( - hex::decode(ENCODED_CALL_LITERAL).unwrap().len(), - 115, - "The size of the literal was changed and requires updating in `CODE_RESTORATION`", - ); - with_externalities( &mut ExtBuilder::default().existential_deposit(50).build(), @@ -1464,6 +1449,7 @@ fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: } else { // Here we expect that the restoration is succeeded. Check that the restoration // contract `DJANGO` ceased to exist and that `BOB` returned back. + println!("{:?}", ContractInfoOf::::get(BOB)); let bob_contract = ContractInfoOf::::get(BOB).unwrap() .get_alive().unwrap(); assert_eq!(bob_contract.rent_allowance, 50); @@ -1481,7 +1467,7 @@ const CODE_STORAGE_SIZE: &str = r#" (import "env" "ext_get_storage" (func $ext_get_storage (param i32) (result i32))) (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 16 16)) (func $assert (param i32) @@ -1503,7 +1489,7 @@ const CODE_STORAGE_SIZE: &str = r#" ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 32) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 4) ;; Count of bytes to copy. @@ -1585,3 +1571,357 @@ fn storage_max_value_limit() { } ); } + +const CODE_RETURN_WITH_DATA: &str = r#" +(module + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) + (import "env" "ext_scratch_write" (func $ext_scratch_write (param i32 i32))) + (import "env" "memory" (memory 1 1)) + + ;; Deploy routine is the same as call. + (func (export "deploy") (result i32) + (call $call) + ) + + ;; Call reads the first 4 bytes (LE) as the exit status and returns the rest as output data. + (func $call (export "call") (result i32) + (local $buf_size i32) + (local $exit_status i32) + + ;; Find out the size of the scratch buffer + (set_local $buf_size (call $ext_scratch_size)) + + ;; Copy scratch buffer into this contract memory. + (call $ext_scratch_read + (i32.const 0) ;; The pointer where to store the scratch buffer contents, + (i32.const 0) ;; Offset from the start of the scratch buffer. + (get_local $buf_size) ;; Count of bytes to copy. + ) + + ;; Copy all but the first 4 bytes of the input data as the output data. + (call $ext_scratch_write + (i32.const 4) ;; Offset from the start of the scratch buffer. + (i32.sub ;; Count of bytes to copy. + (get_local $buf_size) + (i32.const 4) + ) + ) + + ;; Return the first 4 bytes of the input data as the exit status. + (i32.load (i32.const 0)) + ) +) +"#; + +const CODE_CALLER_CONTRACT: &str = r#" +(module + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) + (import "env" "ext_balance" (func $ext_balance)) + (import "env" "ext_call" (func $ext_call (param i32 i32 i64 i32 i32 i32 i32) (result i32))) + (import "env" "ext_create" (func $ext_create (param i32 i32 i64 i32 i32 i32 i32) (result i32))) + (import "env" "ext_println" (func $ext_println (param i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func $assert (param i32) + (block $ok + (br_if $ok + (get_local 0) + ) + (unreachable) + ) + ) + + (func $current_balance (param $sp i32) (result i64) + (call $ext_balance) + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 8)) + ) + (call $ext_scratch_read + (i32.sub (get_local $sp) (i32.const 8)) + (i32.const 0) + (i32.const 8) + ) + (i64.load (i32.sub (get_local $sp) (i32.const 8))) + ) + + (func (export "deploy")) + + (func (export "call") + (local $sp i32) + (local $exit_code i32) + (local $balance i64) + + ;; Input data is the code hash of the contract to be deployed. + (call $assert + (i32.eq + (call $ext_scratch_size) + (i32.const 32) + ) + ) + + ;; Copy code hash from scratch buffer into this contract's memory. + (call $ext_scratch_read + (i32.const 24) ;; The pointer where to store the scratch buffer contents, + (i32.const 0) ;; Offset from the start of the scratch buffer. + (i32.const 32) ;; Count of bytes to copy. + ) + + ;; Read current balance into local variable. + (set_local $sp (i32.const 1024)) + (set_local $balance + (call $current_balance (get_local $sp)) + ) + + ;; Fail to deploy the contract since it returns a non-zero exit status. + (set_local $exit_code + (call $ext_create + (i32.const 24) ;; Pointer to the code hash. + (i32.const 32) ;; Length of the code hash. + (i64.const 0) ;; How much gas to devote for the execution. 0 = all. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 9) ;; Pointer to input data buffer address + (i32.const 7) ;; Length of input data buffer + ) + ) + + ;; Check non-zero exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x11)) + ) + + ;; Check that scratch buffer is empty since contract instantiation failed. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 0)) + ) + + ;; Check that balance has not changed. + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + + ;; Fail to deploy the contract due to insufficient gas. + (set_local $exit_code + (call $ext_create + (i32.const 24) ;; Pointer to the code hash. + (i32.const 32) ;; Length of the code hash. + (i64.const 200) ;; How much gas to devote for the execution. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 8) ;; Pointer to input data buffer address + (i32.const 8) ;; Length of input data buffer + ) + ) + + ;; Check for special trap exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x0100)) + ) + + ;; Check that scratch buffer is empty since contract instantiation failed. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 0)) + ) + + ;; Check that balance has not changed. + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + + ;; Deploy the contract successfully. + (set_local $exit_code + (call $ext_create + (i32.const 24) ;; Pointer to the code hash. + (i32.const 32) ;; Length of the code hash. + (i64.const 0) ;; How much gas to devote for the execution. 0 = all. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 8) ;; Pointer to input data buffer address + (i32.const 8) ;; Length of input data buffer + ) + ) + + ;; Check for success exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x00)) + ) + + ;; Check that scratch buffer contains the address of the new contract. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 8)) + ) + + ;; Copy contract address from scratch buffer into this contract's memory. + (call $ext_scratch_read + (i32.const 16) ;; The pointer where to store the scratch buffer contents, + (i32.const 0) ;; Offset from the start of the scratch buffer. + (i32.const 8) ;; Count of bytes to copy. + ) + + ;; Check that balance has been deducted. + (set_local $balance + (i64.sub (get_local $balance) (i64.load (i32.const 0))) + ) + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + + ;; Call the new contract and expect it to return failing exit code. + (set_local $exit_code + (call $ext_call + (i32.const 16) ;; Pointer to "callee" address. + (i32.const 8) ;; Length of "callee" address. + (i64.const 0) ;; How much gas to devote for the execution. 0 = all. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 9) ;; Pointer to input data buffer address + (i32.const 7) ;; Length of input data buffer + ) + ) + + ;; Check non-zero exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x11)) + ) + + ;; Check that scratch buffer contains the expected return data. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 3)) + ) + (i32.store + (i32.sub (get_local $sp) (i32.const 4)) + (i32.const 0) + ) + (call $ext_scratch_read + (i32.sub (get_local $sp) (i32.const 4)) + (i32.const 0) + (i32.const 3) + ) + (call $assert + (i32.eq + (i32.load (i32.sub (get_local $sp) (i32.const 4))) + (i32.const 0x00776655) + ) + ) + + ;; Check that balance has not changed. + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + + ;; Fail to call the contract due to insufficient gas. + (set_local $exit_code + (call $ext_call + (i32.const 16) ;; Pointer to "callee" address. + (i32.const 8) ;; Length of "callee" address. + (i64.const 100) ;; How much gas to devote for the execution. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 8) ;; Pointer to input data buffer address + (i32.const 8) ;; Length of input data buffer + ) + ) + + ;; Check for special trap exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x0100)) + ) + + ;; Check that scratch buffer is empty since call trapped. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 0)) + ) + + ;; Check that balance has not changed. + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + + ;; Call the contract successfully. + (set_local $exit_code + (call $ext_call + (i32.const 16) ;; Pointer to "callee" address. + (i32.const 8) ;; Length of "callee" address. + (i64.const 0) ;; How much gas to devote for the execution. 0 = all. + (i32.const 0) ;; Pointer to the buffer with value to transfer + (i32.const 8) ;; Length of the buffer with value to transfer. + (i32.const 8) ;; Pointer to input data buffer address + (i32.const 8) ;; Length of input data buffer + ) + ) + + ;; Check for success exit status. + (call $assert + (i32.eq (get_local $exit_code) (i32.const 0x00)) + ) + + ;; Check that scratch buffer contains the expected return data. + (call $assert + (i32.eq (call $ext_scratch_size) (i32.const 4)) + ) + (i32.store + (i32.sub (get_local $sp) (i32.const 4)) + (i32.const 0) + ) + (call $ext_scratch_read + (i32.sub (get_local $sp) (i32.const 4)) + (i32.const 0) + (i32.const 4) + ) + (call $assert + (i32.eq + (i32.load (i32.sub (get_local $sp) (i32.const 4))) + (i32.const 0x77665544) + ) + ) + + ;; Check that balance has been deducted. + (set_local $balance + (i64.sub (get_local $balance) (i64.load (i32.const 0))) + ) + (call $assert + (i64.eq (get_local $balance) (call $current_balance (get_local $sp))) + ) + ) + + (data (i32.const 0) "\00\80") ;; The value to transfer on instantiation and calls. + ;; Chosen to be greater than existential deposit. + (data (i32.const 8) "\00\11\22\33\44\55\66\77") ;; The input data to instantiations and calls. +) +"#; + +#[test] +fn deploy_and_call_other_contract() { + let (callee_wasm, callee_code_hash) = compile_module::(CODE_RETURN_WITH_DATA).unwrap(); + let (caller_wasm, caller_code_hash) = compile_module::(CODE_CALLER_CONTRACT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, callee_wasm)); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, caller_wasm)); + + assert_ok!(Contract::create( + Origin::signed(ALICE), + 100_000, + 100_000, + caller_code_hash.into(), + vec![], + )); + + // Call BOB contract, which attempts to instantiate and call the callee contract and + // makes various assertions on the results from those calls. + assert_ok!(Contract::call( + Origin::signed(ALICE), + BOB, + 0, + 200_000, + callee_code_hash.as_ref().to_vec(), + )); + } + ); +} diff --git a/srml/contracts/src/wasm/code_cache.rs b/srml/contracts/src/wasm/code_cache.rs index 140878f28b8c7018a09722da9b5b0a04ea85daaf..9e8fcab8c257315f1f64abd815be92987279cc5b 100644 --- a/srml/contracts/src/wasm/code_cache.rs +++ b/srml/contracts/src/wasm/code_cache.rs @@ -30,7 +30,7 @@ use crate::gas::{Gas, GasMeter, Token}; use crate::wasm::{prepare, runtime::Env, PrefabWasmModule}; use crate::{CodeHash, CodeStorage, PristineCode, Schedule, Trait}; use rstd::prelude::*; -use runtime_primitives::traits::{Hash, Bounded}; +use sr_primitives::traits::{Hash, Bounded}; use srml_support::StorageMap; /// Gas metering token that used for charging storing code into the code storage. diff --git a/srml/contracts/src/wasm/env_def/macros.rs b/srml/contracts/src/wasm/env_def/macros.rs index 4f8bce99040007420c98367894a384872d9379c8..af83c366233c64c696fde07b9ab913b05c4dcf31 100644 --- a/srml/contracts/src/wasm/env_def/macros.rs +++ b/srml/contracts/src/wasm/env_def/macros.rs @@ -195,7 +195,7 @@ macro_rules! define_env { mod tests { use parity_wasm::elements::FunctionType; use parity_wasm::elements::ValueType; - use runtime_primitives::traits::Zero; + use sr_primitives::traits::Zero; use sandbox::{self, ReturnValue, TypedValue}; use crate::wasm::tests::MockExt; use crate::wasm::Runtime; diff --git a/srml/contracts/src/wasm/mod.rs b/srml/contracts/src/wasm/mod.rs index 3a6d3ad56624f755d09865dde9130ddd29a4c2d6..99578fee2747f5623cb24e0f515c8d7a6ca4f25b 100644 --- a/srml/contracts/src/wasm/mod.rs +++ b/srml/contracts/src/wasm/mod.rs @@ -19,11 +19,11 @@ use crate::{CodeHash, Schedule, Trait}; use crate::wasm::env_def::FunctionImplProvider; -use crate::exec::{Ext, EmptyOutputBuf, VmExecResult}; +use crate::exec::{Ext, ExecResult}; use crate::gas::GasMeter; use rstd::prelude::*; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use sandbox; #[macro_use] @@ -109,11 +109,10 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a> { fn execute>( &self, exec: &WasmExecutable, - ext: &mut E, - input_data: &[u8], - empty_output_buf: EmptyOutputBuf, + mut ext: E, + input_data: Vec, gas_meter: &mut GasMeter, - ) -> VmExecResult { + ) -> ExecResult { let memory = sandbox::Memory::new(exec.prefab_module.initial, Some(exec.prefab_module.maximum)) .unwrap_or_else(|_| { @@ -133,39 +132,18 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a> { }); let mut runtime = Runtime::new( - ext, - input_data.to_vec(), - empty_output_buf, + &mut ext, + input_data, &self.schedule, memory, gas_meter, ); - // Instantiate the instance from the instrumented module code. - match sandbox::Instance::new(&exec.prefab_module.code, &imports, &mut runtime) { - // No errors or traps were generated on instantiation! That - // means we can now invoke the contract entrypoint. - Ok(mut instance) => { - let err = instance - .invoke(exec.entrypoint_name, &[], &mut runtime) - .err(); - to_execution_result(runtime, err) - } - // `start` function trapped. Treat it in the same manner as an execution error. - Err(err @ sandbox::Error::Execution) => to_execution_result(runtime, Some(err)), - Err(_err @ sandbox::Error::Module) => { - // `Error::Module` is returned only if instantiation or linking failed (i.e. - // wasm binary tried to import a function that is not provided by the host). - // This shouldn't happen because validation process ought to reject such binaries. - // - // Because panics are really undesirable in the runtime code, we treat this as - // a trap for now. Eventually, we might want to revisit this. - return VmExecResult::Trap("validation error"); - } - // Other instantiation errors. - // Return without executing anything. - Err(_) => return VmExecResult::Trap("during start function"), - } + // Instantiate the instance from the instrumented module code and invoke the contract + // entrypoint. + let result = sandbox::Instance::new(&exec.prefab_module.code, &imports, &mut runtime) + .and_then(|mut instance| instance.invoke(exec.entrypoint_name, &[], &mut runtime)); + to_execution_result(runtime, result) } } @@ -173,17 +151,27 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a> { mod tests { use super::*; use std::collections::HashMap; - use substrate_primitives::H256; - use crate::exec::{CallReceipt, Ext, InstantiateReceipt, EmptyOutputBuf, StorageKey}; + use primitives::H256; + use crate::exec::{Ext, StorageKey, ExecError, ExecReturnValue, STATUS_SUCCESS}; use crate::gas::{Gas, GasMeter}; use crate::tests::{Test, Call}; use crate::wasm::prepare::prepare_contract; use crate::CodeHash; use wabt; use hex_literal::hex; + use assert_matches::assert_matches; #[derive(Debug, PartialEq, Eq)] struct DispatchEntry(Call); + + #[derive(Debug, PartialEq, Eq)] + struct RestoreEntry { + dest: u64, + code_hash: H256, + rent_allowance: u64, + delta: Vec, + } + #[derive(Debug, PartialEq, Eq)] struct CreateEntry { code_hash: H256, @@ -191,6 +179,7 @@ mod tests { data: Vec, gas_left: u64, } + #[derive(Debug, PartialEq, Eq)] struct TransferEntry { to: u64, @@ -198,6 +187,7 @@ mod tests { data: Vec, gas_left: u64, } + #[derive(Default)] pub struct MockExt { storage: HashMap>, @@ -205,10 +195,12 @@ mod tests { creates: Vec, transfers: Vec, dispatches: Vec, + restores: Vec, // (topics, data) events: Vec<(Vec, Vec)>, next_account_id: u64, } + impl Ext for MockExt { type T = Test; @@ -226,8 +218,8 @@ mod tests { code_hash: &CodeHash, endowment: u64, gas_meter: &mut GasMeter, - data: &[u8], - ) -> Result, &'static str> { + data: Vec, + ) -> Result<(u64, ExecReturnValue), ExecError> { self.creates.push(CreateEntry { code_hash: code_hash.clone(), endowment, @@ -237,16 +229,15 @@ mod tests { let address = self.next_account_id; self.next_account_id += 1; - Ok(InstantiateReceipt { address }) + Ok((address, ExecReturnValue { status: STATUS_SUCCESS, data: Vec::new() })) } fn call( &mut self, to: &u64, value: u64, gas_meter: &mut GasMeter, - data: &[u8], - _output_data: EmptyOutputBuf, - ) -> Result { + data: Vec, + ) -> ExecResult { self.transfers.push(TransferEntry { to: *to, value, @@ -255,13 +246,25 @@ mod tests { }); // Assume for now that it was just a plain transfer. // TODO: Add tests for different call outcomes. - Ok(CallReceipt { - output_data: Vec::new(), - }) + Ok(ExecReturnValue { status: STATUS_SUCCESS, data: Vec::new() }) } fn note_dispatch_call(&mut self, call: Call) { self.dispatches.push(DispatchEntry(call)); } + fn note_restore_to( + &mut self, + dest: u64, + code_hash: H256, + rent_allowance: u64, + delta: Vec, + ) { + self.restores.push(RestoreEntry { + dest, + code_hash, + rent_allowance, + delta, + }); + } fn caller(&self) -> &u64 { &42 } @@ -300,13 +303,93 @@ mod tests { fn max_value_size(&self) -> u32 { 16_384 } } + impl Ext for &mut MockExt { + type T = ::T; + + fn get_storage(&self, key: &[u8; 32]) -> Option> { + (**self).get_storage(key) + } + fn set_storage(&mut self, key: [u8; 32], value: Option>) + -> Result<(), &'static str> + { + (**self).set_storage(key, value) + } + fn instantiate( + &mut self, + code: &CodeHash, + value: u64, + gas_meter: &mut GasMeter, + input_data: Vec, + ) -> Result<(u64, ExecReturnValue), ExecError> { + (**self).instantiate(code, value, gas_meter, input_data) + } + fn call( + &mut self, + to: &u64, + value: u64, + gas_meter: &mut GasMeter, + input_data: Vec, + ) -> ExecResult { + (**self).call(to, value, gas_meter, input_data) + } + fn note_dispatch_call(&mut self, call: Call) { + (**self).note_dispatch_call(call) + } + fn note_restore_to( + &mut self, + dest: u64, + code_hash: H256, + rent_allowance: u64, + delta: Vec, + ) { + (**self).note_restore_to( + dest, + code_hash, + rent_allowance, + delta, + ) + } + fn caller(&self) -> &u64 { + (**self).caller() + } + fn address(&self) -> &u64 { + (**self).address() + } + fn balance(&self) -> u64 { + (**self).balance() + } + fn value_transferred(&self) -> u64 { + (**self).value_transferred() + } + fn now(&self) -> &u64 { + (**self).now() + } + fn random(&self, subject: &[u8]) -> H256 { + (**self).random(subject) + } + fn deposit_event(&mut self, topics: Vec, data: Vec) { + (**self).deposit_event(topics, data) + } + fn set_rent_allowance(&mut self, rent_allowance: u64) { + (**self).set_rent_allowance(rent_allowance) + } + fn rent_allowance(&self) -> u64 { + (**self).rent_allowance() + } + fn block_number(&self) -> u64 { + (**self).block_number() + } + fn max_value_size(&self) -> u32 { + (**self).max_value_size() + } + } + fn execute( wat: &str, - input_data: &[u8], - output_data: &mut Vec, - ext: &mut E, + input_data: Vec, + ext: E, gas_meter: &mut GasMeter, - ) -> Result<(), &'static str> { + ) -> ExecResult { use crate::exec::Vm; let wasm = wabt::wat2wasm(wat).unwrap(); @@ -323,11 +406,7 @@ mod tests { let cfg = Default::default(); let vm = WasmVm::new(&cfg); - *output_data = vm - .execute(&exec, ext, input_data, EmptyOutputBuf::new(), gas_meter) - .into_result()?; - - Ok(()) + vm.execute(&exec, ext, input_data, gas_meter) } const CODE_TRANSFER: &str = r#" @@ -372,14 +451,12 @@ mod tests { #[test] fn contract_transfer() { let mut mock_ext = MockExt::default(); - execute( + let _ = execute( CODE_TRANSFER, - &[], - &mut Vec::new(), + vec![], &mut mock_ext, &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); assert_eq!( &mock_ext.transfers, @@ -436,14 +513,12 @@ mod tests { #[test] fn contract_create() { let mut mock_ext = MockExt::default(); - execute( + let _ = execute( CODE_CREATE, - &[], - &mut Vec::new(), + vec![], &mut mock_ext, &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); assert_eq!( &mock_ext.creates, @@ -498,14 +573,12 @@ mod tests { #[test] fn contract_call_limited_gas() { let mut mock_ext = MockExt::default(); - execute( + let _ = execute( &CODE_TRANSFER_LIMITED_GAS, - &[], - &mut Vec::new(), + vec![], &mut mock_ext, &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); assert_eq!( &mock_ext.transfers, @@ -522,7 +595,7 @@ mod tests { (module (import "env" "ext_get_storage" (func $ext_get_storage (param i32) (result i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "ext_return" (func $ext_return (param i32 i32))) (import "env" "memory" (memory 1 1)) @@ -558,7 +631,7 @@ mod tests { ) ;; Copy scratch buffer into this contract memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 36) ;; The pointer where to store the scratch buffer contents, ;; 36 = 4 + 32 (i32.const 0) ;; Offset from the start of the scratch buffer. @@ -593,17 +666,14 @@ mod tests { .storage .insert([0x11; 32], [0x22; 32].to_vec()); - let mut return_buf = Vec::new(); - execute( + let output = execute( CODE_GET_STORAGE, - &[], - &mut return_buf, - &mut mock_ext, + vec![], + mock_ext, &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); - assert_eq!(return_buf, [0x22; 32].to_vec()); + assert_eq!(output, ExecReturnValue { status: STATUS_SUCCESS, data: [0x22; 32].to_vec() }); } /// calls `ext_caller`, loads the address from the scratch buffer and @@ -612,7 +682,7 @@ mod tests { (module (import "env" "ext_caller" (func $ext_caller)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -637,7 +707,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -660,15 +730,12 @@ mod tests { #[test] fn caller() { - let mut mock_ext = MockExt::default(); - execute( + let _ = execute( CODE_CALLER, - &[], - &mut Vec::new(), - &mut mock_ext, + vec![], + MockExt::default(), &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); } /// calls `ext_address`, loads the address from the scratch buffer and @@ -677,7 +744,7 @@ mod tests { (module (import "env" "ext_address" (func $ext_address)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -702,7 +769,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -725,22 +792,19 @@ mod tests { #[test] fn address() { - let mut mock_ext = MockExt::default(); - execute( + let _ = execute( CODE_ADDRESS, - &[], - &mut Vec::new(), - &mut mock_ext, + vec![], + MockExt::default(), &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); } const CODE_BALANCE: &str = r#" (module (import "env" "ext_balance" (func $ext_balance)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -765,7 +829,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -787,23 +851,20 @@ mod tests { #[test] fn balance() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); - execute( + let _ = execute( CODE_BALANCE, - &[], - &mut Vec::new(), - &mut mock_ext, + vec![], + MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); } const CODE_GAS_PRICE: &str = r#" (module (import "env" "ext_gas_price" (func $ext_gas_price)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -828,7 +889,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -850,23 +911,20 @@ mod tests { #[test] fn gas_price() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1312); - execute( + let _ = execute( CODE_GAS_PRICE, - &[], - &mut Vec::new(), - &mut mock_ext, + vec![], + MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); } const CODE_GAS_LEFT: &str = r#" (module (import "env" "ext_gas_left" (func $ext_gas_left)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "ext_return" (func $ext_return (param i32 i32))) (import "env" "memory" (memory 1 1)) @@ -892,7 +950,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -911,20 +969,16 @@ mod tests { #[test] fn gas_left() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1312); - let mut return_buf = Vec::new(); - execute( + let output = execute( CODE_GAS_LEFT, - &[], - &mut return_buf, - &mut mock_ext, + vec![], + MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); - let gas_left = Gas::decode(&mut &return_buf[..]).unwrap(); + let gas_left = Gas::decode(&mut output.data.as_slice()).unwrap(); assert!(gas_left < 50_000, "gas_left must be less than initial"); assert!(gas_left > gas_meter.gas_left(), "gas_left must be greater than final"); } @@ -933,7 +987,7 @@ mod tests { (module (import "env" "ext_value_transferred" (func $ext_value_transferred)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -958,7 +1012,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -980,16 +1034,13 @@ mod tests { #[test] fn value_transferred() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); - execute( + let _ = execute( CODE_VALUE_TRANSFERRED, - &[], - &mut Vec::new(), - &mut mock_ext, + vec![], + MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); } const CODE_DISPATCH_CALL: &str = r#" @@ -1015,14 +1066,12 @@ mod tests { // let's rewrite so as we use this module controlled call or we serialize it in runtime. let mut mock_ext = MockExt::default(); - execute( + let _ = execute( CODE_DISPATCH_CALL, - &[], - &mut Vec::new(), + vec![], &mut mock_ext, &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); assert_eq!( &mock_ext.dispatches, @@ -1057,25 +1106,21 @@ mod tests { #[test] fn return_from_start_fn() { - let mut mock_ext = MockExt::default(); - let mut output_data = Vec::new(); - execute( + let output = execute( CODE_RETURN_FROM_START_FN, - &[], - &mut output_data, - &mut mock_ext, + vec![], + MockExt::default(), &mut GasMeter::with_limit(50_000, 1), - ) - .unwrap(); + ).unwrap(); - assert_eq!(output_data, vec![1, 2, 3, 4]); + assert_eq!(output, ExecReturnValue { status: STATUS_SUCCESS, data: vec![1, 2, 3, 4] }); } const CODE_TIMESTAMP_NOW: &str = r#" (module (import "env" "ext_now" (func $ext_now)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -1100,7 +1145,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -1122,23 +1167,20 @@ mod tests { #[test] fn now() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); - execute( + let _ = execute( CODE_TIMESTAMP_NOW, - &[], - &mut Vec::new(), - &mut mock_ext, + vec![], + MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); } const CODE_RANDOM: &str = r#" (module (import "env" "ext_random" (func $ext_random (param i32 i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "ext_return" (func $ext_return (param i32 i32))) (import "env" "memory" (memory 1 1)) @@ -1167,7 +1209,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 32) ;; Count of bytes to copy. @@ -1193,23 +1235,22 @@ mod tests { #[test] fn random() { - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); - let mut return_buf = Vec::new(); - execute( + let output = execute( CODE_RANDOM, - &[], - &mut return_buf, - &mut mock_ext, + vec![], + MockExt::default(), &mut gas_meter, - ) - .unwrap(); + ).unwrap(); // The mock ext just returns the same data that was passed as the subject. assert_eq!( - &return_buf, - &hex!("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F") + output, + ExecReturnValue { + status: STATUS_SUCCESS, + data: hex!("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F").to_vec(), + }, ); } @@ -1240,14 +1281,12 @@ mod tests { fn deposit_event() { let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); - execute( + let _ = execute( CODE_DEPOSIT_EVENT, - &[], - &mut Vec::new(), + vec![], &mut mock_ext, &mut gas_meter - ) - .unwrap(); + ).unwrap(); assert_eq!(mock_ext.events, vec![ (vec![H256::repeat_byte(0x33)], @@ -1291,18 +1330,16 @@ mod tests { #[test] fn deposit_event_max_topics() { // Checks that the runtime traps if there are more than `max_topic_events` topics. - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); - assert_eq!( + assert_matches!( execute( CODE_DEPOSIT_EVENT_MAX_TOPICS, - &[], - &mut Vec::new(), - &mut mock_ext, + vec![], + MockExt::default(), &mut gas_meter ), - Err("during execution"), + Err(ExecError { reason: "during execution", buffer: _ }) ); } @@ -1335,18 +1372,16 @@ mod tests { #[test] fn deposit_event_duplicates() { // Checks that the runtime traps if there are duplicates. - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); - assert_eq!( + assert_matches!( execute( CODE_DEPOSIT_EVENT_DUPLICATES, - &[], - &mut Vec::new(), - &mut mock_ext, + vec![], + MockExt::default(), &mut gas_meter ), - Err("during execution"), + Err(ExecError { reason: "during execution", buffer: _ }) ); } @@ -1356,7 +1391,7 @@ mod tests { (module (import "env" "ext_block_number" (func $ext_block_number)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) - (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -1381,7 +1416,7 @@ mod tests { ) ;; copy contents of the scratch buffer into the contract's memory. - (call $ext_scratch_copy + (call $ext_scratch_read (i32.const 8) ;; Pointer in memory to the place where to copy. (i32.const 0) ;; Offset from the start of the scratch buffer. (i32.const 8) ;; Count of bytes to copy. @@ -1404,15 +1439,137 @@ mod tests { #[test] fn block_number() { - let mut mock_ext = MockExt::default(); - execute( + let _ = execute( CODE_BLOCK_NUMBER, - &[], - &mut Vec::new(), - &mut mock_ext, + vec![], + MockExt::default(), + &mut GasMeter::with_limit(50_000, 1), + ).unwrap(); + } + + // asserts that the size of the input data is 4. + const CODE_SIMPLE_ASSERT: &str = r#" +(module + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + + (func $assert (param i32) + (block $ok + (br_if $ok + (get_local 0) + ) + (unreachable) + ) + ) + + (func (export "deploy")) + + (func (export "call") + (call $assert + (i32.eq + (call $ext_scratch_size) + (i32.const 4) + ) + ) + ) +) +"#; + + #[test] + fn output_buffer_capacity_preserved_on_success() { + let mut input_data = Vec::with_capacity(1_234); + input_data.extend_from_slice(&[1, 2, 3, 4][..]); + + let output = execute( + CODE_SIMPLE_ASSERT, + input_data, + MockExt::default(), + &mut GasMeter::with_limit(50_000, 1), + ).unwrap(); + + assert_eq!(output.data.len(), 0); + assert_eq!(output.data.capacity(), 1_234); + } + + #[test] + fn output_buffer_capacity_preserved_on_failure() { + let mut input_data = Vec::with_capacity(1_234); + input_data.extend_from_slice(&[1, 2, 3, 4, 5][..]); + + let error = execute( + CODE_SIMPLE_ASSERT, + input_data, + MockExt::default(), &mut GasMeter::with_limit(50_000, 1), + ).err().unwrap(); + + assert_eq!(error.buffer.capacity(), 1_234); + } + + const CODE_RETURN_WITH_DATA: &str = r#" +(module + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32))) + (import "env" "ext_scratch_write" (func $ext_scratch_write (param i32 i32))) + (import "env" "memory" (memory 1 1)) + + ;; Deploy routine is the same as call. + (func (export "deploy") (result i32) + (call $call) + ) + + ;; Call reads the first 4 bytes (LE) as the exit status and returns the rest as output data. + (func $call (export "call") (result i32) + (local $buf_size i32) + (local $exit_status i32) + + ;; Find out the size of the scratch buffer + (set_local $buf_size (call $ext_scratch_size)) + + ;; Copy scratch buffer into this contract memory. + (call $ext_scratch_read + (i32.const 0) ;; The pointer where to store the scratch buffer contents, + (i32.const 0) ;; Offset from the start of the scratch buffer. + (get_local $buf_size) ;; Count of bytes to copy. ) - .unwrap(); + + ;; Copy all but the first 4 bytes of the input data as the output data. + (call $ext_scratch_write + (i32.const 4) ;; Offset from the start of the scratch buffer. + (i32.sub ;; Count of bytes to copy. + (get_local $buf_size) + (i32.const 4) + ) + ) + + ;; Return the first 4 bytes of the input data as the exit status. + (i32.load (i32.const 0)) + ) +) +"#; + + #[test] + fn return_with_success_status() { + let output = execute( + CODE_RETURN_WITH_DATA, + hex!("00112233445566778899").to_vec(), + MockExt::default(), + &mut GasMeter::with_limit(50_000, 1), + ).unwrap(); + + assert_eq!(output, ExecReturnValue { status: 0, data: hex!("445566778899").to_vec() }); + assert!(output.is_success()); } + #[test] + fn return_with_failure_status() { + let output = execute( + CODE_RETURN_WITH_DATA, + hex!("112233445566778899").to_vec(), + MockExt::default(), + &mut GasMeter::with_limit(50_000, 1), + ).unwrap(); + + assert_eq!(output, ExecReturnValue { status: 17, data: hex!("5566778899").to_vec() }); + assert!(!output.is_success()); + } } diff --git a/srml/contracts/src/wasm/prepare.rs b/srml/contracts/src/wasm/prepare.rs index c135c45d3a8d0cab003d1dc93dbd5adc6fe1c492..41269772a8551cd56803df8444f7215e81b97c85 100644 --- a/srml/contracts/src/wasm/prepare.rs +++ b/srml/contracts/src/wasm/prepare.rs @@ -22,11 +22,11 @@ use crate::wasm::env_def::ImportSatisfyCheck; use crate::wasm::PrefabWasmModule; use crate::Schedule; -use parity_wasm::elements::{self, Internal, External, MemoryType, Type}; +use parity_wasm::elements::{self, Internal, External, MemoryType, Type, ValueType}; use pwasm_utils; use pwasm_utils::rules; use rstd::prelude::*; -use runtime_primitives::traits::{SaturatedConversion}; +use sr_primitives::traits::{SaturatedConversion}; struct ContractModule<'a> { /// A deserialized module. The module is valid (this is Guaranteed by `new` method). @@ -93,6 +93,50 @@ impl<'a> ContractModule<'a> { Ok(()) } + /// Ensures that no floating point types are in use. + fn ensure_no_floating_types(&self) -> Result<(), &'static str> { + if let Some(global_section) = self.module.global_section() { + for global in global_section.entries() { + match global.global_type().content_type() { + ValueType::F32 | ValueType::F64 => + return Err("use of floating point type in globals is forbidden"), + _ => {} + } + } + } + + if let Some(code_section) = self.module.code_section() { + for func_body in code_section.bodies() { + for local in func_body.locals() { + match local.value_type() { + ValueType::F32 | ValueType::F64 => + return Err("use of floating point type in locals is forbidden"), + _ => {} + } + } + } + } + + if let Some(type_section) = self.module.type_section() { + for wasm_type in type_section.types() { + match wasm_type { + Type::Function(func_type) => { + let return_type = func_type.return_type(); + for value_type in func_type.params().iter().chain(return_type.iter()) { + match value_type { + ValueType::F32 | ValueType::F64 => + return Err("use of floating point type in function types is forbidden"), + _ => {} + } + } + } + } + } + } + + Ok(()) + } + fn inject_gas_metering(self) -> Result { let gas_rules = rules::Set::new( @@ -183,14 +227,20 @@ impl<'a> ContractModule<'a> { }; // Then check the signature. - // Both "call" and "deploy" has a () -> () function type. + // Both "call" and "deploy" has a [] -> [] or [] -> [i32] function type. + // + // The [] -> [] signature predates the [] -> [i32] signature and is supported for + // backwards compatibility. This will likely be removed once ink! is updated to + // generate modules with the new function signatures. let func_ty_idx = func_entries.get(fn_idx as usize) .ok_or_else(|| "export refers to non-existent function")? .type_ref(); let Type::Function(ref func_ty) = types .get(func_ty_idx as usize) .ok_or_else(|| "function has a non-existent type")?; - if !(func_ty.params().is_empty() && func_ty.return_type().is_none()) { + if !func_ty.params().is_empty() || + !(func_ty.return_type().is_none() || + func_ty.return_type() == Some(ValueType::I32)) { return Err("entry point has wrong signature"); } } @@ -291,6 +341,7 @@ pub fn prepare_contract( contract_module.scan_exports()?; contract_module.ensure_no_internal_memory()?; contract_module.ensure_table_size_limit(schedule.max_table_size)?; + contract_module.ensure_no_floating_types()?; struct MemoryDefinition { initial: u32, @@ -740,5 +791,49 @@ mod tests { "#, Err("unknown export: expecting only deploy and call functions") ); + + prepare_test!(global_float, + r#" + (module + (global $x f32 (f32.const 0)) + (func (export "call")) + (func (export "deploy")) + ) + "#, + Err("use of floating point type in globals is forbidden") + ); + + prepare_test!(local_float, + r#" + (module + (func $foo (local f32)) + (func (export "call")) + (func (export "deploy")) + ) + "#, + Err("use of floating point type in locals is forbidden") + ); + + prepare_test!(param_float, + r#" + (module + (func $foo (param f32)) + (func (export "call")) + (func (export "deploy")) + ) + "#, + Err("use of floating point type in function types is forbidden") + ); + + prepare_test!(result_float, + r#" + (module + (func $foo (result f32) (f32.const 0)) + (func (export "call")) + (func (export "deploy")) + ) + "#, + Err("use of floating point type in function types is forbidden") + ); } } diff --git a/srml/contracts/src/wasm/runtime.rs b/srml/contracts/src/wasm/runtime.rs index 92d9b98acf2cd86877d5621269c686053a991151..ecc4dfc7fb592f40ae5504d654405af65cc9865e 100644 --- a/srml/contracts/src/wasm/runtime.rs +++ b/srml/contracts/src/wasm/runtime.rs @@ -18,16 +18,21 @@ use crate::{Schedule, Trait, CodeHash, ComputeDispatchFee, BalanceOf}; use crate::exec::{ - Ext, VmExecResult, OutputBuf, EmptyOutputBuf, CallReceipt, InstantiateReceipt, StorageKey, - TopicOf, + Ext, ExecResult, ExecError, ExecReturnValue, StorageKey, TopicOf, STATUS_SUCCESS, }; use crate::gas::{Gas, GasMeter, Token, GasMeterResult, approx_gas_for_balance}; use sandbox; use system; use rstd::prelude::*; +use rstd::convert::TryInto; use rstd::mem; -use parity_codec::{Decode, Encode}; -use runtime_primitives::traits::{Bounded, SaturatedConversion}; +use codec::{Decode, Encode}; +use sr_primitives::traits::{Bounded, SaturatedConversion}; + +/// The value returned from ext_call and ext_create contract external functions if the call or +/// instantiation traps. This value is chosen as if the execution does not trap, the return value +/// will always be an 8-bit integer, so 0x0100 is the smallest value that could not be returned. +const TRAP_RETURN_CODE: u32 = 0x0100; /// Enumerates all possible *special* trap conditions. /// @@ -35,15 +40,12 @@ use runtime_primitives::traits::{Bounded, SaturatedConversion}; /// to just terminate quickly in some cases. enum SpecialTrap { /// Signals that trap was generated in response to call `ext_return` host function. - Return(OutputBuf), + Return(Vec), } /// Can only be used for one call. pub(crate) struct Runtime<'a, E: Ext + 'a> { ext: &'a mut E, - // A VM can return a result only once and only by value. So - // we wrap output buffer to make it possible to take the buffer out. - empty_output_buf: Option, scratch_buf: Vec, schedule: &'a Schedule, memory: sandbox::Memory, @@ -54,14 +56,12 @@ impl<'a, E: Ext + 'a> Runtime<'a, E> { pub(crate) fn new( ext: &'a mut E, input_data: Vec, - empty_output_buf: EmptyOutputBuf, schedule: &'a Schedule, memory: sandbox::Memory, gas_meter: &'a mut GasMeter, ) -> Self { Runtime { ext, - empty_output_buf: Some(empty_output_buf), // Put the input data into the scratch buffer immediately. scratch_buf: input_data, schedule, @@ -78,20 +78,42 @@ impl<'a, E: Ext + 'a> Runtime<'a, E> { pub(crate) fn to_execution_result( runtime: Runtime, - sandbox_err: Option, -) -> VmExecResult { - // Check the exact type of the error. It could be plain trap or - // special runtime trap the we must recognize. - match (sandbox_err, runtime.special_trap) { + sandbox_result: Result, +) -> ExecResult { + // Special case. The trap was the result of the execution `return` host function. + if let Some(SpecialTrap::Return(data)) = runtime.special_trap { + return Ok(ExecReturnValue { status: STATUS_SUCCESS, data }); + } + + // Check the exact type of the error. + match sandbox_result { // No traps were generated. Proceed normally. - (None, None) => VmExecResult::Ok, - // Special case. The trap was the result of the execution `return` host function. - (Some(sandbox::Error::Execution), Some(SpecialTrap::Return(buf))) => VmExecResult::Returned(buf), + Ok(sandbox::ReturnValue::Unit) => { + let mut buffer = runtime.scratch_buf; + buffer.clear(); + Ok(ExecReturnValue { status: STATUS_SUCCESS, data: buffer }) + } + Ok(sandbox::ReturnValue::Value(sandbox::TypedValue::I32(exit_code))) => { + let status = (exit_code & 0xFF).try_into() + .expect("exit_code is masked into the range of a u8; qed"); + Ok(ExecReturnValue { status, data: runtime.scratch_buf }) + } + // This should never happen as the return type of exported functions should have been + // validated by the code preparation process. However, because panics are really + // undesirable in the runtime code, we treat this as a trap for now. Eventually, we might + // want to revisit this. + Ok(_) => Err(ExecError { reason: "return type error", buffer: runtime.scratch_buf }), + // `Error::Module` is returned only if instantiation or linking failed (i.e. + // wasm binary tried to import a function that is not provided by the host). + // This shouldn't happen because validation process ought to reject such binaries. + // + // Because panics are really undesirable in the runtime code, we treat this as + // a trap for now. Eventually, we might want to revisit this. + Err(sandbox::Error::Module) => + Err(ExecError { reason: "validation error", buffer: runtime.scratch_buf }), // Any other kind of a trap should result in a failure. - (Some(_), _) => VmExecResult::Trap("during execution"), - // Any other case (such as special trap flag without actual trap) signifies - // a logic error. - _ => unreachable!(), + Err(sandbox::Error::Execution) | Err(sandbox::Error::OutOfBounds) => + Err(ExecError { reason: "during execution", buffer: runtime.scratch_buf }), } } @@ -186,12 +208,29 @@ fn read_sandbox_memory( ) -> Result, sandbox::HostError> { charge_gas(ctx.gas_meter, ctx.schedule, RuntimeToken::ReadMemory(len))?; - let mut buf = Vec::new(); - buf.resize(len as usize, 0); + let mut buf = vec![0u8; len as usize]; + ctx.memory.get(ptr, buf.as_mut_slice()).map_err(|_| sandbox::HostError)?; + Ok(buf) +} - ctx.memory().get(ptr, &mut buf)?; +/// Read designated chunk from the sandbox memory into the scratch buffer, consuming an +/// appropriate amount of gas. Resizes the scratch buffer to the specified length on success. +/// +/// Returns `Err` if one of the following conditions occurs: +/// +/// - calculating the gas cost resulted in overflow. +/// - out of gas +/// - requested buffer is not within the bounds of the sandbox memory. +fn read_sandbox_memory_into_scratch( + ctx: &mut Runtime, + ptr: u32, + len: u32, +) -> Result<(), sandbox::HostError> { + charge_gas(ctx.gas_meter, ctx.schedule, RuntimeToken::ReadMemory(len))?; - Ok(buf) + ctx.scratch_buf.resize(len as usize, 0); + ctx.memory.get(ptr, ctx.scratch_buf.as_mut_slice()).map_err(|_| sandbox::HostError)?; + Ok(()) } /// Read designated chunk from the sandbox memory into the supplied buffer, consuming @@ -209,7 +248,25 @@ fn read_sandbox_memory_into_buf( ) -> Result<(), sandbox::HostError> { charge_gas(ctx.gas_meter, ctx.schedule, RuntimeToken::ReadMemory(buf.len() as u32))?; - ctx.memory().get(ptr, buf).map_err(Into::into) + ctx.memory.get(ptr, buf).map_err(Into::into) +} + +/// Read designated chunk from the sandbox memory, consuming an appropriate amount of +/// gas, and attempt to decode into the specified type. +/// +/// Returns `Err` if one of the following conditions occurs: +/// +/// - calculating the gas cost resulted in overflow. +/// - out of gas +/// - requested buffer is not within the bounds of the sandbox memory. +/// - the buffer contents cannot be decoded as the required type. +fn read_sandbox_memory_as( + ctx: &mut Runtime, + ptr: u32, + len: u32, +) -> Result { + let buf = read_sandbox_memory(ctx, ptr, len)?; + D::decode(&mut &buf[..]).map_err(|_| sandbox::HostError) } /// Write the given buffer to the designated location in the sandbox memory, consuming @@ -300,9 +357,15 @@ define_env!(Env, , // Make a call to another contract. // - // Returns 0 on the successful execution and puts the result data returned - // by the callee into the scratch buffer. Otherwise, returns 1 and clears the scratch - // buffer. + // If the called contract runs to completion, then this returns the status code the callee + // returns on exit in the bottom 8 bits of the return value. The top 24 bits are 0s. A status + // code of 0 indicates success, and any other code indicates a failure. On failure, any state + // changes made by the called contract are reverted. The scratch buffer is filled with the + // output data returned by the called contract, even in the case of a failure status. + // + // If the contract traps during execution or otherwise fails to complete successfully, then + // this function clears the scratch buffer and returns 0x0100. As with a failure status, any + // state changes made by the called contract are reverted. // // - callee_ptr: a pointer to the address of the callee contract. // Should be decodable as an `T::AccountId`. Traps otherwise. @@ -323,22 +386,14 @@ define_env!(Env, , input_data_ptr: u32, input_data_len: u32 ) -> u32 => { - let callee = { - let callee_buf = read_sandbox_memory(ctx, callee_ptr, callee_len)?; - <::T as system::Trait>::AccountId::decode(&mut &callee_buf[..]) - .ok_or_else(|| sandbox::HostError)? - }; - let value = { - let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; - BalanceOf::<::T>::decode(&mut &value_buf[..]) - .ok_or_else(|| sandbox::HostError)? - }; - let input_data = read_sandbox_memory(ctx, input_data_ptr, input_data_len)?; + let callee: <::T as system::Trait>::AccountId = + read_sandbox_memory_as(ctx, callee_ptr, callee_len)?; + let value: BalanceOf<::T> = + read_sandbox_memory_as(ctx, value_ptr, value_len)?; - // Grab the scratch buffer and put in its' place an empty one. - // We will use it for creating `EmptyOutputBuf` container for the call. - let scratch_buf = mem::replace(&mut ctx.scratch_buf, Vec::new()); - let empty_output_buf = EmptyOutputBuf::from_spare_vec(scratch_buf); + // Read input data into the scratch buffer, then take ownership of it. + read_sandbox_memory_into_scratch(ctx, input_data_ptr, input_data_len)?; + let input_data = mem::replace(&mut ctx.scratch_buf, Vec::new()); let nested_gas_limit = if gas == 0 { ctx.gas_meter.gas_left() @@ -353,36 +408,52 @@ define_env!(Env, , &callee, value, nested_meter, - &input_data, - empty_output_buf + input_data, ) - .map_err(|_| ()) + .map_err(|err| err.buffer) } // there is not enough gas to allocate for the nested call. - None => Err(()), + None => Err(input_data), } }); match call_outcome { - Ok(CallReceipt { output_data }) => { - ctx.scratch_buf = output_data; - Ok(0) + Ok(output) => { + ctx.scratch_buf = output.data; + Ok(output.status.into()) + }, + Err(buffer) => { + ctx.scratch_buf = buffer; + ctx.scratch_buf.clear(); + Ok(TRAP_RETURN_CODE) }, - Err(_) => Ok(1), } }, - // Instantiate a contract with code returned by the specified initializer code. + // Instantiate a contract with the specified code hash. + // + // This function creates an account and executes the constructor defined in the code specified + // by the code hash. + // + // If the constructor runs to completion, then this returns the status code that the newly + // created contract returns on exit in the bottom 8 bits of the return value. The top 24 bits + // are 0s. A status code of 0 indicates success, and any other code indicates a failure. On + // failure, any state changes made by the called contract are reverted and the contract is not + // instantiated. On a success status, the scratch buffer is filled with the encoded address of + // the newly created contract. In the case of a failure status, the scratch buffer is cleared. // + // If the contract traps during execution or otherwise fails to complete successfully, then + // this function clears the scratch buffer and returns 0x0100. As with a failure status, any + // state changes made by the called contract are reverted. + // This function creates an account and executes initializer code. After the execution, // the returned buffer is saved as the code of the created account. // - // Returns 0 on the successful contract creation and puts the address - // of the created contract into the scratch buffer. - // Otherwise, returns 1 and clears the scratch buffer. + // Returns 0 on the successful contract creation and puts the address of the created contract + // into the scratch buffer. Otherwise, returns non-zero value and clears the scratch buffer. // - // - init_code_ptr: a pointer to the buffer that contains the initializer code. - // - init_code_len: length of the initializer code buffer. + // - code_hash_ptr: a pointer to the buffer that contains the initializer code. + // - code_hash_len: length of the initializer code buffer. // - gas: how much gas to devote to the execution of the initializer code. // - value_ptr: a pointer to the buffer with value, how much value to send. // Should be decodable as a `T::Balance`. Traps otherwise. @@ -391,27 +462,22 @@ define_env!(Env, , // - input_data_len: length of the input data buffer. ext_create( ctx, - init_code_ptr: u32, - init_code_len: u32, + code_hash_ptr: u32, + code_hash_len: u32, gas: u64, value_ptr: u32, value_len: u32, input_data_ptr: u32, input_data_len: u32 ) -> u32 => { - let code_hash = { - let code_hash_buf = read_sandbox_memory(ctx, init_code_ptr, init_code_len)?; - ::T>>::decode(&mut &code_hash_buf[..]).ok_or_else(|| sandbox::HostError)? - }; - let value = { - let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; - BalanceOf::<::T>::decode(&mut &value_buf[..]) - .ok_or_else(|| sandbox::HostError)? - }; - let input_data = read_sandbox_memory(ctx, input_data_ptr, input_data_len)?; + let code_hash: CodeHash<::T> = + read_sandbox_memory_as(ctx, code_hash_ptr, code_hash_len)?; + let value: BalanceOf<::T> = + read_sandbox_memory_as(ctx, value_ptr, value_len)?; - // Clear the scratch buffer in any case. - ctx.scratch_buf.clear(); + // Read input data into the scratch buffer, then take ownership of it. + read_sandbox_memory_into_scratch(ctx, input_data_ptr, input_data_len)?; + let input_data = mem::replace(&mut ctx.scratch_buf, Vec::new()); let nested_gas_limit = if gas == 0 { ctx.gas_meter.gas_left() @@ -426,21 +492,30 @@ define_env!(Env, , &code_hash, value, nested_meter, - &input_data + input_data ) - .map_err(|_| ()) + .map_err(|err| err.buffer) } // there is not enough gas to allocate for the nested call. - None => Err(()), + None => Err(input_data), } }); match instantiate_outcome { - Ok(InstantiateReceipt { address }) => { - // Write the address to the scratch buffer. - address.encode_to(&mut ctx.scratch_buf); - Ok(0) + Ok((address, output)) => { + let is_success = output.is_success(); + ctx.scratch_buf = output.data; + ctx.scratch_buf.clear(); + if is_success { + // Write the address to the scratch buffer. + address.encode_to(&mut ctx.scratch_buf); + } + Ok(output.status.into()) + }, + Err(buffer) => { + ctx.scratch_buf = buffer; + ctx.scratch_buf.clear(); + Ok(TRAP_RETURN_CODE) }, - Err(_) => Ok(1), } }, @@ -449,33 +524,11 @@ define_env!(Env, , // // This is the only way to return a data buffer to the caller. ext_return(ctx, data_ptr: u32, data_len: u32) => { - match ctx - .gas_meter - .charge( - ctx.schedule, - RuntimeToken::ReturnData(data_len) - ) - { - GasMeterResult::Proceed => (), - GasMeterResult::OutOfGas => return Err(sandbox::HostError), - } + charge_gas(ctx.gas_meter, ctx.schedule, RuntimeToken::ReturnData(data_len))?; + + read_sandbox_memory_into_scratch(ctx, data_ptr, data_len)?; + let output_buf = mem::replace(&mut ctx.scratch_buf, Vec::new()); - let empty_output_buf = ctx - .empty_output_buf - .take() - .expect( - "`empty_output_buf` is taken only here; - `ext_return` traps; - `Runtime` can only be used only for one execution; - qed" - ); - let output_buf = empty_output_buf.fill( - data_len as usize, - |slice_mut| { - // Read the memory at the specified pointer to the provided slice. - ctx.memory.get(data_ptr, slice_mut) - } - )?; ctx.special_trap = Some(SpecialTrap::Return(output_buf)); // The trap mechanism is used to immediately terminate the execution. @@ -568,11 +621,8 @@ define_env!(Env, , // All calls made it to the top-level context will be dispatched before // finishing the execution of the calling extrinsic. ext_dispatch_call(ctx, call_ptr: u32, call_len: u32) => { - let call = { - let call_buf = read_sandbox_memory(ctx, call_ptr, call_len)?; - <<::T as Trait>::Call>::decode(&mut &call_buf[..]) - .ok_or_else(|| sandbox::HostError)? - }; + let call: <::T as Trait>::Call = + read_sandbox_memory_as(ctx, call_ptr, call_len)?; // Charge gas for dispatching this call. let fee = { @@ -586,9 +636,77 @@ define_env!(Env, , Ok(()) }, + // Record a request to restore the caller contract to the specified contract. + // + // At the finalization stage, i.e. when all changes from the extrinsic that invoked this + // contract are commited, this function will compute a tombstone hash from the caller's + // storage and the given code hash and if the hash matches the hash found in the tombstone at + // the specified address - kill the caller contract and restore the destination contract and set + // the specified `rent_allowance`. All caller's funds are transfered to the destination. + // + // This function doesn't perform restoration right away but defers it to the end of the + // transaction. If there is no tombstone in the destination address or if the hashes don't match + // then restoration is cancelled and no changes are made. + // + // `dest_ptr`, `dest_len` - the pointer and the length of a buffer that encodes `T::AccountId` + // with the address of the to be restored contract. + // `code_hash_ptr`, `code_hash_len` - the pointer and the length of a buffer that encodes + // a code hash of the to be restored contract. + // `rent_allowance_ptr`, `rent_allowance_len` - the pointer and the length of a buffer that + // encodes the rent allowance that must be set in the case of successful restoration. + // `delta_ptr` is the pointer to the start of a buffer that has `delta_count` storage keys + // laid out sequentially. + ext_restore_to( + ctx, + dest_ptr: u32, + dest_len: u32, + code_hash_ptr: u32, + code_hash_len: u32, + rent_allowance_ptr: u32, + rent_allowance_len: u32, + delta_ptr: u32, + delta_count: u32 + ) => { + let dest: <::T as system::Trait>::AccountId = + read_sandbox_memory_as(ctx, dest_ptr, dest_len)?; + let code_hash: CodeHash<::T> = + read_sandbox_memory_as(ctx, code_hash_ptr, code_hash_len)?; + let rent_allowance: BalanceOf<::T> = + read_sandbox_memory_as(ctx, rent_allowance_ptr, rent_allowance_len)?; + let delta = { + // We don't use `with_capacity` here to not eagerly allocate the user specified amount + // of memory. + let mut delta = Vec::new(); + let mut key_ptr = delta_ptr; + + for _ in 0..delta_count { + const KEY_SIZE: usize = 32; + + // Read the delta into the provided buffer and collect it into the buffer. + let mut delta_key: StorageKey = [0; KEY_SIZE]; + read_sandbox_memory_into_buf(ctx, key_ptr, &mut delta_key)?; + delta.push(delta_key); + + // Offset key_ptr to the next element. + key_ptr = key_ptr.checked_add(KEY_SIZE as u32).ok_or_else(|| sandbox::HostError)?; + } + + delta + }; + + ctx.ext.note_restore_to( + dest, + code_hash, + rent_allowance, + delta, + ); + + Ok(()) + }, + // Returns the size of the scratch buffer. // - // For more details on the scratch buffer see `ext_scratch_copy`. + // For more details on the scratch buffer see `ext_scratch_read`. ext_scratch_size(ctx) -> u32 => { Ok(ctx.scratch_buf.len() as u32) }, @@ -599,7 +717,7 @@ define_env!(Env, , // In order to get size of the scratch buffer use `ext_scratch_size`. At the start of contract // execution, the scratch buffer is filled with the input data. Whenever a contract calls // function that uses the scratch buffer the contents of the scratch buffer are overwritten. - ext_scratch_copy(ctx, dest_ptr: u32, offset: u32, len: u32) => { + ext_scratch_read(ctx, dest_ptr: u32, offset: u32, len: u32) => { let offset = offset as usize; if offset > ctx.scratch_buf.len() { // Offset can't be larger than scratch buffer length. @@ -624,6 +742,15 @@ define_env!(Env, , Ok(()) }, + // Copy data from contract memory starting from `src_ptr` with length `len` into the scratch + // buffer. This overwrites the entire scratch buffer and resizes to `len`. Specifying a `len` + // of zero clears the scratch buffer. + // + // This should be used before exiting a call or instantiation in order to set the return data. + ext_scratch_write(ctx, src_ptr: u32, len: u32) => { + read_sandbox_memory_into_scratch(ctx, src_ptr, len) + }, + // Deposit a contract event with the data buffer and optional list of topics. There is a limit // on the maximum number of topics specified by `max_event_topics`. // @@ -633,13 +760,9 @@ define_env!(Env, , // - data_ptr - a pointer to a raw data buffer which will saved along the event. // - data_len - the length of the data buffer. ext_deposit_event(ctx, topics_ptr: u32, topics_len: u32, data_ptr: u32, data_len: u32) => { - let mut topics = match topics_len { + let mut topics: Vec::::T>> = match topics_len { 0 => Vec::new(), - _ => { - let topics_buf = read_sandbox_memory(ctx, topics_ptr, topics_len)?; - Vec::::T>>::decode(&mut &topics_buf[..]) - .ok_or_else(|| sandbox::HostError)? - } + _ => read_sandbox_memory_as(ctx, topics_ptr, topics_len)?, }; // If there are more than `max_event_topics`, then trap. @@ -654,16 +777,11 @@ define_env!(Env, , let event_data = read_sandbox_memory(ctx, data_ptr, data_len)?; - match ctx - .gas_meter - .charge( - ctx.schedule, - RuntimeToken::DepositEvent(topics.len() as u32, data_len) - ) - { - GasMeterResult::Proceed => (), - GasMeterResult::OutOfGas => return Err(sandbox::HostError), - } + charge_gas( + ctx.gas_meter, + ctx.schedule, + RuntimeToken::DepositEvent(topics.len() as u32, data_len) + )?; ctx.ext.deposit_event(topics, event_data); Ok(()) @@ -675,11 +793,8 @@ define_env!(Env, , // Should be decodable as a `T::Balance`. Traps otherwise. // - value_len: length of the value buffer. ext_set_rent_allowance(ctx, value_ptr: u32, value_len: u32) => { - let value = { - let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; - BalanceOf::<::T>::decode(&mut &value_buf[..]) - .ok_or_else(|| sandbox::HostError)? - }; + let value: BalanceOf<::T> = + read_sandbox_memory_as(ctx, value_ptr, value_len)?; ctx.ext.set_rent_allowance(value); Ok(()) diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index 8c7a9f00d5ad10414ed7d8afe0fc15ea054ffbdd..efa871637485fbcb65ea720371e1b6f2ec8c8252 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -41,9 +41,10 @@ mod tests { pub use runtime_io::with_externalities; use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch, parameter_types}; use srml_support::traits::Get; - pub use substrate_primitives::{H256, Blake2Hasher, u32_trait::{_1, _2, _3, _4}}; - pub use primitives::traits::{BlakeTwo256, IdentityLookup}; - pub use primitives::testing::{Digest, DigestItem, Header}; + pub use primitives::{H256, Blake2Hasher, u32_trait::{_1, _2, _3, _4}}; + pub use sr_primitives::traits::{BlakeTwo256, IdentityLookup}; + pub use sr_primitives::testing::{Digest, DigestItem, Header}; + pub use sr_primitives::Perbill; pub use {seats, motions}; use std::cell::RefCell; @@ -100,25 +101,33 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = Event; type Error = Error; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } parameter_types! { pub const ExistentialDeposit: u64 = 0; pub const TransferFee: u64 = 0; pub const CreationFee: u64 = 0; - pub const TransactionBaseFee: u64 = 0; + pub const TransactionBaseFee: u64 = 1; pub const TransactionByteFee: u64 = 0; } impl balances::Trait for Test { @@ -135,6 +144,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const LaunchPeriod: u64 = 1; @@ -253,7 +263,7 @@ mod tests { (6, 60 * self.balance_factor) ], vesting: vec![], - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); + }.assimilate_storage(&mut t).unwrap(); seats::GenesisConfig:: { active_council: if self.with_council { vec![ (1, 10), @@ -263,8 +273,8 @@ mod tests { desired_seats: 2, presentation_duration: 2, term_duration: 5, - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - runtime_io::TestExternalities::new_with_children(t) + }.assimilate_storage(&mut t).unwrap(); + runtime_io::TestExternalities::new(t) } } diff --git a/srml/democracy/Cargo.toml b/srml/democracy/Cargo.toml index e7b06ca5975c16c230fe5c2d5fdcfbba4b6f58d5..b6341a8225638a04342fad4f9d65ab83510fd778 100644 --- a/srml/democracy/Cargo.toml +++ b/srml/democracy/Cargo.toml @@ -7,15 +7,15 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } balances = { package = "srml-balances", path = "../balances" } [features] @@ -23,10 +23,10 @@ default = ["std"] std = [ "serde", "safe-mix/std", - "parity-codec/std", + "codec/std", "rstd/std", "runtime_io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", ] diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 98ab111402cf8a05badac4ec1b752458ed446cad..610c2983676061415e2667b6ade44b02306c9f1e 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -20,11 +20,12 @@ use rstd::prelude::*; use rstd::{result, convert::TryFrom}; -use primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv, EnsureOrigin, Hash}; -use parity_codec::{Encode, Decode, Input, Output}; +use sr_primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv, EnsureOrigin, Hash}; +use sr_primitives::weights::SimpleDispatchInfo; +use codec::{Encode, Decode, Input, Output, Error}; use srml_support::{ decl_module, decl_storage, decl_event, ensure, - StorageValue, StorageMap, Parameter, RuntimeDispatchable, IsSubType, EnumerableStorageMap, + StorageValue, StorageMap, Parameter, Dispatchable, EnumerableStorageMap, traits::{ Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, OnFreeBalanceZero, Get @@ -60,6 +61,8 @@ pub enum Conviction { Locked4x, /// 5x votes, locked for 16x... Locked5x, + /// 6x votes, locked for 32x... + Locked6x, } impl Default for Conviction { @@ -77,6 +80,7 @@ impl From for u8 { Conviction::Locked3x => 3, Conviction::Locked4x => 4, Conviction::Locked5x => 5, + Conviction::Locked6x => 6, } } } @@ -91,6 +95,7 @@ impl TryFrom for Conviction { 3 => Conviction::Locked3x, 4 => Conviction::Locked4x, 5 => Conviction::Locked5x, + 6 => Conviction::Locked6x, _ => return Err(()), }) } @@ -107,6 +112,7 @@ impl Conviction { Conviction::Locked3x => 4, Conviction::Locked4x => 8, Conviction::Locked5x => 16, + Conviction::Locked6x => 32, } } @@ -133,7 +139,7 @@ impl Bounded for Conviction { } fn max_value() -> Self { - Conviction::Locked5x + Conviction::Locked6x } } @@ -153,12 +159,15 @@ impl Encode for Vote { } } +impl codec::EncodeLike for Vote {} + impl Decode for Vote { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> core::result::Result { let b = input.read_byte()?; - Some(Vote { + Ok(Vote { aye: (b & 0b1000_0000) == 0b1000_0000, - conviction: Conviction::try_from(b & 0b0111_1111).ok()?, + conviction: Conviction::try_from(b & 0b0111_1111) + .map_err(|_| Error::from("Invalid conviction"))?, }) } } @@ -174,7 +183,7 @@ pub const DEFAULT_EMERGENCY_VOTING_PERIOD: u32 = 0; pub const DEFAULT_COOLOFF_PERIOD: u32 = 0; pub trait Trait: system::Trait + Sized { - type Proposal: Parameter + RuntimeDispatchable + IsSubType, Self>; + type Proposal: Parameter + Dispatchable; type Event: From> + Into<::Event>; /// Currency type for this module. @@ -205,19 +214,20 @@ pub trait Trait: system::Trait + Sized { /// a majority-carries referendum. type ExternalMajorityOrigin: EnsureOrigin; + /// Origin from which the next tabled referendum may be forced; this allows for the tabling of + /// a negative-turnout-bias (default-carries) referendum. + type ExternalDefaultOrigin: EnsureOrigin; + /// Origin from which the next referendum proposed by the external majority may be immediately /// tabled to vote asynchronously in a similar manner to the emergency origin. It remains a /// majority-carries vote. - type ExternalPushOrigin: EnsureOrigin; + type FastTrackOrigin: EnsureOrigin; - /// Origin from which emergency referenda may be scheduled. - type EmergencyOrigin: EnsureOrigin; - - /// Minimum voting period allowed for an emergency referendum. + /// Minimum voting period allowed for an fast-track/emergency referendum. type EmergencyVotingPeriod: Get; - /// Origin from which any referenda may be cancelled in an emergency. - type CancellationOrigin: EnsureOrigin; + /// Origin from which any referendum may be cancelled in an emergency. + type CancellationOrigin: EnsureOrigin; /// Origin for anyone able to veto proposals. type VetoOrigin: EnsureOrigin; @@ -360,6 +370,7 @@ decl_module! { /// - O(1). /// - Two DB changes, one DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] fn propose(origin, proposal: Box, #[compact] value: BalanceOf @@ -387,6 +398,7 @@ decl_module! { /// - O(1). /// - One DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] fn second(origin, #[compact] proposal: PropIndex) { let who = ensure_signed(origin)?; let mut deposit = Self::deposit_of(proposal) @@ -404,6 +416,7 @@ decl_module! { /// - O(1). /// - One DB change, one DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(200_000)] fn vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote @@ -419,6 +432,7 @@ decl_module! { /// - O(1). /// - One DB change, one DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(200_000)] fn proxy_vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote @@ -427,33 +441,9 @@ decl_module! { Self::do_vote(who, ref_index, vote) } - /// Schedule an emergency referendum. - /// - /// This will create a new referendum for the `proposal`, approved as long as counted votes - /// exceed `threshold` and, if approved, enacted after the given `delay`. - /// - /// It may be called from either the Root or the Emergency origin. - fn emergency_propose(origin, - proposal: Box, - threshold: VoteThreshold, - voting_period: T::BlockNumber, - delay: T::BlockNumber - ) { - T::EmergencyOrigin::try_origin(origin) - .map(|_| ()) - .or_else(|origin| ensure_root(origin))?; - let now = >::block_number(); - // We don't consider it an error if `vote_period` is too low, but we do enforce the - // minimum. This is primarily due to practicality. If it's an emergency, we don't want - // to introduce more delays than is strictly needed by requiring a potentially costly - // resubmission in the case of a mistakenly low `vote_period`; better to just let the - // referendum take place with the lowest valid value. - let period = voting_period.max(T::EmergencyVotingPeriod::get()); - Self::inject_referendum(now + period, *proposal, threshold, delay).map(|_| ())?; - } - /// Schedule an emergency cancellation of a referendum. Cannot happen twice to the same /// referendum. + #[weight = SimpleDispatchInfo::FixedOperational(500_000)] fn emergency_cancel(origin, ref_index: ReferendumIndex) { T::CancellationOrigin::ensure_origin(origin)?; @@ -467,6 +457,7 @@ decl_module! { /// Schedule a referendum to be tabled once it is legal to schedule an external /// referendum. + #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] fn external_propose(origin, proposal: Box) { T::ExternalOrigin::ensure_origin(origin)?; ensure!(!>::exists(), "proposal already made"); @@ -479,16 +470,26 @@ decl_module! { /// Schedule a majority-carries referendum to be tabled next once it is legal to schedule /// an external referendum. + /// + /// Unlike `external_propose`, blacklisting has no effect on this and it may replace a + /// pre-scheduled `external_propose` call. + #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] fn external_propose_majority(origin, proposal: Box) { T::ExternalMajorityOrigin::ensure_origin(origin)?; - ensure!(!>::exists(), "proposal already made"); - let proposal_hash = T::Hashing::hash_of(&proposal); - if let Some((until, _)) = >::get(proposal_hash) { - ensure!(>::block_number() >= until, "proposal still blacklisted"); - } >::put((*proposal, VoteThreshold::SimpleMajority)); } + /// Schedule a negative-turnout-bias referendum to be tabled next once it is legal to + /// schedule an external referendum. + /// + /// Unlike `external_propose`, blacklisting has no effect on this and it may replace a + /// pre-scheduled `external_propose` call. + #[weight = SimpleDispatchInfo::FixedNormal(5_000_000)] + fn external_propose_default(origin, proposal: Box) { + T::ExternalDefaultOrigin::ensure_origin(origin)?; + >::put((*proposal, VoteThreshold::SuperMajorityAgainst)); + } + /// Schedule the currently externally-proposed majority-carries referendum to be tabled /// immediately. If there is no externally-proposed referendum currently, or if there is one /// but it is not a majority-carries referendum then it fails. @@ -497,14 +498,15 @@ decl_module! { /// - `voting_period`: The period that is allowed for voting on this proposal. /// - `delay`: The number of block after voting has ended in approval and this should be /// enacted. Increased to `EmergencyVotingPeriod` if too low. - fn external_push(origin, + #[weight = SimpleDispatchInfo::FixedNormal(200_000)] + fn fast_track(origin, proposal_hash: T::Hash, voting_period: T::BlockNumber, delay: T::BlockNumber ) { - T::ExternalPushOrigin::ensure_origin(origin)?; + T::FastTrackOrigin::ensure_origin(origin)?; let (proposal, threshold) = >::get().ok_or("no proposal made")?; - ensure!(threshold == VoteThreshold::SimpleMajority, "next external proposal not simple majority"); + ensure!(threshold != VoteThreshold::SuperMajorityApprove, "next external proposal not simple majority"); ensure!(proposal_hash == T::Hashing::hash_of(&proposal), "invalid hash"); >::kill(); @@ -515,6 +517,7 @@ decl_module! { } /// Veto and blacklist the external proposal hash. + #[weight = SimpleDispatchInfo::FixedNormal(200_000)] fn veto_external(origin, proposal_hash: T::Hash) { let who = T::VetoOrigin::ensure_origin(origin)?; @@ -539,12 +542,14 @@ decl_module! { } /// Remove a referendum. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn cancel_referendum(origin, #[compact] ref_index: ReferendumIndex) { ensure_root(origin)?; Self::clear_referendum(ref_index); } /// Cancel a proposal queued for enactment. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn cancel_queued( origin, #[compact] when: T::BlockNumber, @@ -573,6 +578,7 @@ decl_module! { /// # /// - One extra DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] fn set_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; ensure!(!>::exists(&proxy), "already a proxy"); @@ -584,6 +590,7 @@ decl_module! { /// # /// - One DB clear. /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] fn resign_proxy(origin) { let who = ensure_signed(origin)?; >::remove(who); @@ -594,6 +601,7 @@ decl_module! { /// # /// - One DB clear. /// # + #[weight = SimpleDispatchInfo::FixedNormal(100_000)] fn remove_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; ensure!(&Self::proxy(&proxy).ok_or("not a proxy")? == &who, "wrong proxy"); @@ -605,6 +613,7 @@ decl_module! { /// # /// - One extra DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] pub fn delegate(origin, to: T::AccountId, conviction: Conviction) { let who = ensure_signed(origin)?; >::insert(who.clone(), (to.clone(), conviction)); @@ -624,6 +633,7 @@ decl_module! { /// # /// - O(1). /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn undelegate(origin) { let who = ensure_signed(origin)?; ensure!(>::exists(&who), "not delegated"); @@ -973,8 +983,9 @@ mod tests { impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok, parameter_types, traits::Contains }; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::{traits::{BlakeTwo256, IdentityLookup, Bounded}, testing::Header}; + use primitives::{H256, Blake2Hasher}; + use sr_primitives::{traits::{BlakeTwo256, IdentityLookup, Bounded}, testing::Header}; + use sr_primitives::Perbill; use balances::BalanceLock; use system::EnsureSignedBy; @@ -999,18 +1010,26 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } parameter_types! { pub const ExistentialDeposit: u64 = 0; @@ -1032,6 +1051,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const LaunchPeriod: u64 = 2; @@ -1061,10 +1081,10 @@ mod tests { type VotingPeriod = VotingPeriod; type EmergencyVotingPeriod = EmergencyVotingPeriod; type MinimumDeposit = MinimumDeposit; - type EmergencyOrigin = EnsureSignedBy; type ExternalOrigin = EnsureSignedBy; type ExternalMajorityOrigin = EnsureSignedBy; - type ExternalPushOrigin = EnsureSignedBy; + type ExternalDefaultOrigin = EnsureSignedBy; + type FastTrackOrigin = EnsureSignedBy; type CancellationOrigin = EnsureSignedBy; type VetoOrigin = EnsureSignedBy; type CooloffPeriod = CooloffPeriod; @@ -1075,9 +1095,9 @@ mod tests { balances::GenesisConfig::{ balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], vesting: vec![], - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - GenesisConfig::default().assimilate_storage(&mut t.0, &mut t.1).unwrap(); - runtime_io::TestExternalities::new_with_children(t) + }.assimilate_storage(&mut t).unwrap(); + GenesisConfig::default().assimilate_storage(&mut t).unwrap(); + runtime_io::TestExternalities::new(t) } type System = system::Module; @@ -1318,64 +1338,6 @@ mod tests { }); } - #[test] - fn emergency_referendum_works() { - with_externalities(&mut new_test_ext(), || { - System::set_block_number(0); - assert_noop!(Democracy::emergency_propose( - Origin::signed(6), // invalid - Box::new(set_balance_proposal(2)), - VoteThreshold::SuperMajorityAgainst, - 0, - 0, - ), "bad origin: expected to be a root origin"); - assert_ok!(Democracy::emergency_propose( - Origin::signed(1), - Box::new(set_balance_proposal(2)), - VoteThreshold::SuperMajorityAgainst, - 0, - 0, - )); - assert_eq!( - Democracy::referendum_info(0), - Some(ReferendumInfo { - end: 1, - proposal: set_balance_proposal(2), - threshold: VoteThreshold::SuperMajorityAgainst, - delay: 0 - }) - ); - - assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); - fast_forward_to(1); - assert_eq!(Balances::free_balance(&42), 0); - fast_forward_to(2); - assert_eq!(Balances::free_balance(&42), 2); - - assert_ok!(Democracy::emergency_propose( - Origin::signed(1), - Box::new(set_balance_proposal(4)), - VoteThreshold::SuperMajorityAgainst, - 3, - 3 - )); - assert_eq!( - Democracy::referendum_info(1), - Some(ReferendumInfo { - end: 5, - proposal: set_balance_proposal(4), - threshold: VoteThreshold::SuperMajorityAgainst, - delay: 3 - }) - ); - assert_ok!(Democracy::vote(Origin::signed(1), 1, AYE)); - fast_forward_to(8); - assert_eq!(Balances::free_balance(&42), 2); - fast_forward_to(9); - assert_eq!(Balances::free_balance(&42), 4); - }); - } - #[test] fn external_referendum_works() { with_externalities(&mut new_test_ext(), || { @@ -1431,17 +1393,42 @@ mod tests { } #[test] - fn external_push_referendum_works() { + fn external_default_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::external_propose_default( + Origin::signed(3), + Box::new(set_balance_proposal(2)) + ), "Invalid origin"); + assert_ok!(Democracy::external_propose_default( + Origin::signed(1), + Box::new(set_balance_proposal(2)) + )); + fast_forward_to(1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityAgainst, + delay: 2, + }) + ); + }); + } + + #[test] + fn fast_track_referendum_works() { with_externalities(&mut new_test_ext(), || { System::set_block_number(0); let h = BlakeTwo256::hash_of(&set_balance_proposal(2)); - assert_noop!(Democracy::external_push(Origin::signed(5), h, 3, 2), "no proposal made"); + assert_noop!(Democracy::fast_track(Origin::signed(5), h, 3, 2), "no proposal made"); assert_ok!(Democracy::external_propose_majority( Origin::signed(3), Box::new(set_balance_proposal(2)) )); - assert_noop!(Democracy::external_push(Origin::signed(1), h, 3, 2), "Invalid origin"); - assert_ok!(Democracy::external_push(Origin::signed(5), h, 0, 0)); + assert_noop!(Democracy::fast_track(Origin::signed(1), h, 3, 2), "Invalid origin"); + assert_ok!(Democracy::fast_track(Origin::signed(5), h, 0, 0)); assert_eq!( Democracy::referendum_info(0), Some(ReferendumInfo { @@ -1455,7 +1442,7 @@ mod tests { } #[test] - fn external_push_referendum_fails_when_no_simple_majority() { + fn fast_track_referendum_fails_when_no_simple_majority() { with_externalities(&mut new_test_ext(), || { System::set_block_number(0); let h = BlakeTwo256::hash_of(&set_balance_proposal(2)); @@ -1464,7 +1451,7 @@ mod tests { Box::new(set_balance_proposal(2)) )); assert_noop!( - Democracy::external_push(Origin::signed(5), h, 3, 2), + Democracy::fast_track(Origin::signed(5), h, 3, 2), "next external proposal not simple majority" ); }); diff --git a/srml/democracy/src/vote_threshold.rs b/srml/democracy/src/vote_threshold.rs index ee42363d47f819d090eb8f8f9bbde0f143cbfc97..d304c36f32c95d7ba7523c0576f0bad4deed9d09 100644 --- a/srml/democracy/src/vote_threshold.rs +++ b/srml/democracy/src/vote_threshold.rs @@ -18,8 +18,8 @@ #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; -use parity_codec::{Encode, Decode}; -use primitives::traits::{Zero, IntegerSquareRoot}; +use codec::{Encode, Decode}; +use sr_primitives::traits::{Zero, IntegerSquareRoot}; use rstd::ops::{Add, Mul, Div, Rem}; /// A means of determining if a vote is past pass threshold. diff --git a/srml/elections/Cargo.toml b/srml/elections/Cargo.toml index cd0a43aeb53945958fc7f860f2da54632dc817e8..d6043bb2d02337d2363c91b74348ccdef3ded0ec 100644 --- a/srml/elections/Cargo.toml +++ b/srml/elections/Cargo.toml @@ -7,11 +7,11 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } @@ -23,12 +23,12 @@ balances = { package = "srml-balances", path = "../balances" } default = ["std"] std = [ "safe-mix/std", - "parity-codec/std", - "substrate-primitives/std", + "codec/std", + "primitives/std", "rstd/std", "serde", "runtime_io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", ] diff --git a/srml/elections/src/lib.rs b/srml/elections/src/lib.rs index 70321132e6ae9da39d4004c28349b8cb62898060..11a1704149cfc6e14bf8706533cc22a0e423d3be 100644 --- a/srml/elections/src/lib.rs +++ b/srml/elections/src/lib.rs @@ -24,7 +24,8 @@ #![recursion_limit="128"] use rstd::prelude::*; -use primitives::traits::{Zero, One, StaticLookup, Bounded, Saturating}; +use sr_primitives::traits::{Zero, One, StaticLookup, Bounded, Saturating}; +use sr_primitives::weights::SimpleDispatchInfo; use runtime_io::print; use srml_support::{ StorageValue, StorageMap, @@ -34,7 +35,7 @@ use srml_support::{ OnUnbalanced, ReservableCurrency, WithdrawReason, WithdrawReasons, ChangeMembers } }; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; use system::{self, ensure_signed, ensure_root}; // no polynomial attacks: @@ -300,6 +301,11 @@ decl_module! { /// approval voting). A reasonable default value is 24. const DecayRatio: u32 = T::DecayRatio::get(); + /// The chunk size of the voter vector. + const VOTER_SET_SIZE: u32 = VOTER_SET_SIZE as u32; + /// The chunk size of the approval vector. + const APPROVAL_SET_SIZE: u32 = APPROVAL_SET_SIZE as u32; + fn deposit_event() = default; /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots @@ -326,6 +332,7 @@ decl_module! { /// - Two extra DB entries, one DB change. /// - Argument `votes` is limited in length to number of candidates. /// # + #[weight = SimpleDispatchInfo::FixedNormal(2_500_000)] fn set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, hint: SetIndex) -> Result { let who = ensure_signed(origin)?; Self::do_set_approvals(who, votes, index, hint) @@ -337,6 +344,7 @@ decl_module! { /// # /// - Same as `set_approvals` with one additional storage read. /// # + #[weight = SimpleDispatchInfo::FixedNormal(2_500_000)] fn proxy_set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, @@ -358,6 +366,7 @@ decl_module! { /// - O(1). /// - Two fewer DB entries, one DB change. /// # + #[weight = SimpleDispatchInfo::FixedNormal(2_500_000)] fn reap_inactive_voter( origin, #[compact] reporter_index: u32, @@ -431,6 +440,7 @@ decl_module! { /// - O(1). /// - Two fewer DB entries, one DB change. /// # + #[weight = SimpleDispatchInfo::FixedNormal(1_250_000)] fn retract_voter(origin, #[compact] index: u32) { let who = ensure_signed(origin)?; @@ -458,6 +468,7 @@ decl_module! { /// - Independent of input. /// - Three DB changes. /// # + #[weight = SimpleDispatchInfo::FixedNormal(2_500_000)] fn submit_candidacy(origin, #[compact] slot: u32) { let who = ensure_signed(origin)?; @@ -493,6 +504,7 @@ decl_module! { /// - O(voters) compute. /// - One DB change. /// # + #[weight = SimpleDispatchInfo::FixedNormal(10_000_000)] fn present_winner( origin, candidate: ::Source, @@ -561,6 +573,7 @@ decl_module! { /// Set the desired member count; if lower than the current count, then seats will not be up /// election when they expire. If more, then a new vote will be started if one is not /// already in progress. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_desired_seats(origin, #[compact] count: u32) { ensure_root(origin)?; DesiredSeats::put(count); @@ -570,6 +583,7 @@ decl_module! { /// /// Note: A tally should happen instantly (if not already in a presentation /// period) to fill the seat if removal means that the desired members are not met. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn remove_member(origin, who: ::Source) { ensure_root(origin)?; let who = T::Lookup::lookup(who)?; @@ -579,11 +593,12 @@ decl_module! { .collect(); >::put(&new_set); let new_set = new_set.into_iter().map(|x| x.0).collect::>(); - T::ChangeMembers::change_members(&[], &[who], &new_set[..]); + T::ChangeMembers::change_members(&[], &[who], new_set); } /// Set the presentation duration. If there is currently a vote being presented for, will /// invoke `finalize_vote`. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_presentation_duration(origin, #[compact] count: T::BlockNumber) { ensure_root(origin)?; >::put(count); @@ -591,6 +606,7 @@ decl_module! { /// Set the presentation duration. If there is current a vote being presented for, will /// invoke `finalize_vote`. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_term_duration(origin, #[compact] count: T::BlockNumber) { ensure_root(origin)?; >::put(count); @@ -860,7 +876,7 @@ impl Module { >::put(&new_set); let new_set = new_set.into_iter().map(|x| x.0).collect::>(); - T::ChangeMembers::change_members(&incoming, &outgoing, &new_set[..]); + T::ChangeMembers::change_members(&incoming, &outgoing, new_set); // clear all except runners-up from candidate list. let candidates = Self::candidates(); @@ -1100,26 +1116,34 @@ mod tests { use std::cell::RefCell; use srml_support::{assert_ok, assert_err, assert_noop, parameter_types}; use runtime_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::{ - traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, testing::Header, BuildStorage + use primitives::{H256, Blake2Hasher}; + use sr_primitives::{ + Perbill, traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, testing::Header, BuildStorage }; use crate as elections; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = Event; + type WeightMultiplierUpdate = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } parameter_types! { pub const ExistentialDeposit: u64 = 0; @@ -1141,6 +1165,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const CandidacyBond: u64 = 3; @@ -1179,7 +1204,7 @@ mod tests { pub struct TestChangeMembers; impl ChangeMembers for TestChangeMembers { - fn change_members(incoming: &[u64], outgoing: &[u64], new: &[u64]) { + fn change_members_sorted(incoming: &[u64], outgoing: &[u64], new: &[u64]) { let mut old_plus_incoming = MEMBERS.with(|m| m.borrow().to_vec()); old_plus_incoming.extend_from_slice(incoming); old_plus_incoming.sort(); @@ -1210,8 +1235,8 @@ mod tests { type DecayRatio = DecayRatio; } - pub type Block = primitives::generic::Block; - pub type UncheckedExtrinsic = primitives::generic::UncheckedMortalCompactExtrinsic; + pub type Block = sr_primitives::generic::Block; + pub type UncheckedExtrinsic = sr_primitives::generic::UncheckedExtrinsic; srml_support::construct_runtime!( pub enum Test where @@ -1289,7 +1314,7 @@ mod tests { presentation_duration: 2, term_duration: 5, }), - }.build_storage().unwrap().0.into() + }.build_storage().unwrap().into() } } diff --git a/srml/example/Cargo.toml b/srml/example/Cargo.toml index f46ce5474924274de827bf42031be85341f2001c..87069a487a19a617f31fd08b9e3fcf05c2951516 100644 --- a/srml/example/Cargo.toml +++ b/srml/example/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } balances = { package = "srml-balances", path = "../balances", default-features = false } @@ -14,13 +14,13 @@ sr-primitives = { path = "../../core/sr-primitives", default-features = false } [dev-dependencies] sr-io = { path = "../../core/sr-io" } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "sr-primitives/std", "srml-support/std", "system/std", diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index 20ee1c6ba114ff182a8fdc4ce2cde0011819187f..0cfad989b156c7920c55c5aa9efdc9d38911de75 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -255,7 +255,7 @@ use srml_support::{StorageValue, dispatch::Result, decl_module, decl_storage, decl_event}; use system::{ensure_signed, ensure_root}; -use sr_primitives::weights::TransactionWeight; +use sr_primitives::weights::SimpleDispatchInfo; /// Our module's configuration trait. All our types and consts go in here. If the /// module is dependent on specific other modules, then their configuration traits @@ -396,19 +396,18 @@ decl_module! { // // If you don't respect these rules, it is likely that your chain will be attackable. // - // Each transaction can optionally indicate a weight. The weight is passed in as a - // custom attribute and the value can be anything that implements the `Weighable` - // trait. Most often using substrate's default `TransactionWeight` is enough for you. + // Each transaction can define an optional `#[weight]` attribute to convey a set of static + // information about its dispatch. The `system` and `executive` module then use this + // information to properly execute the transaction, whilst keeping the total load of the + // chain in a moderate rate. // - // A basic weight is a tuple of `(base_weight, byte_weight)`. Upon including each transaction - // in a block, the final weight is calculated as `base_weight + byte_weight * tx_size`. - // If this value, added to the weight of all included transactions, exceeds `MAX_TRANSACTION_WEIGHT`, - // the transaction is not included. If no weight attribute is provided, the `::default()` - // implementation of `TransactionWeight` is used. - // - // The example below showcases a transaction which is relatively costly, but less dependent on - // the input, hence `byte_weight` is configured smaller. - #[weight = TransactionWeight::Basic(100_000, 10)] + // The _right-hand-side_ value of the `#[weight]` attribute can be any type that implements + // a set of traits, namely [`WeighData`] and [`ClassifyDispatch`]. The former conveys the + // weight (a numeric representation of pure execution time and difficulty) of the + // transaction and the latter demonstrates the `DispatchClass` of the call. A higher weight + // means a larger transaction (less of which can be placed in a single block). See the + // `CheckWeight` signed extension struct in the `system` module for more information. + #[weight = SimpleDispatchInfo::FixedNormal(10_000)] fn accumulate_dummy(origin, increase_by: T::Balance) -> Result { // This is a public call, so we ensure that the origin is some signed account. let _sender = ensure_signed(origin)?; @@ -507,11 +506,11 @@ mod tests { use srml_support::{assert_ok, impl_outer_origin, parameter_types}; use sr_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; + use primitives::{H256, Blake2Hasher}; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. use sr_primitives::{ - traits::{BlakeTwo256, OnInitialize, OnFinalize, IdentityLookup}, testing::Header + Perbill, traits::{BlakeTwo256, OnInitialize, OnFinalize, IdentityLookup}, testing::Header }; impl_outer_origin! { @@ -525,18 +524,26 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; + type Call = (); type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } parameter_types! { pub const ExistentialDeposit: u64 = 0; @@ -558,6 +565,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } impl Trait for Test { type Event = (); @@ -567,15 +575,15 @@ mod tests { // This function basically just builds a genesis storage key/value store according to // our desired mockup. fn new_test_ext() -> sr_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); // We use default for brevity, but you can configure as desired if needed. - t.extend(balances::GenesisConfig::::default().build_storage().unwrap().0); - t.extend(GenesisConfig::{ + balances::GenesisConfig::::default().assimilate_storage(&mut t).unwrap(); + GenesisConfig::{ dummy: 42, // we configure the map with (key, value) pairs. bar: vec![(1, 2), (2, 3)], foo: 24, - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/srml/executive/Cargo.toml b/srml/executive/Cargo.toml index 27057fe523ab39b01baa4d57f085c0b991dd7c21..e398a951896ea6e59767981a72d2316040ae1c65 100644 --- a/srml/executive/Cargo.toml +++ b/srml/executive/Cargo.toml @@ -6,16 +6,16 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] hex-literal = "0.2.0" -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } srml-indices = { path = "../indices" } balances = { package = "srml-balances", path = "../balances" } @@ -25,8 +25,8 @@ std = [ "rstd/std", "srml-support/std", "serde", - "parity-codec/std", - "primitives/std", + "codec/std", + "sr-primitives/std", "runtime_io/std", "system/std", ] diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 354ed8b429905aff5b70fd5ef023e281fdee38b4..3bc2ad920df83855cfbc0753db2999da6bfea8f0 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -50,7 +50,7 @@ //! `Executive` type declaration from the node template. //! //! ``` -//! # use primitives::generic; +//! # use sr_primitives::generic; //! # use srml_executive as executive; //! # pub struct UncheckedExtrinsic {}; //! # pub struct Header {}; @@ -59,8 +59,8 @@ //! # pub type Balances = u64; //! # pub type AllModules = u64; //! # pub enum Runtime {}; -//! # use primitives::transaction_validity::TransactionValidity; -//! # use primitives::traits::ValidateUnsigned; +//! # use sr_primitives::transaction_validity::TransactionValidity; +//! # use sr_primitives::traits::ValidateUnsigned; //! # impl ValidateUnsigned for Runtime { //! # type Call = (); //! # @@ -69,30 +69,24 @@ //! # } //! # } //! /// Executive: handles dispatch to the various modules. -//! pub type Executive = executive::Executive; +//! pub type Executive = executive::Executive; //! ``` #![cfg_attr(not(feature = "std"), no_std)] use rstd::prelude::*; use rstd::marker::PhantomData; -use primitives::{ - generic::Digest, ApplyResult, ApplyOutcome, ApplyError, DispatchError, PrimitiveError, - traits::{ - self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalize, - OnInitialize, NumberFor, Block as BlockT, OffchainWorker, - ValidateUnsigned, - } -}; -use srml_support::{RuntimeDispatchable, traits::MakePayment}; -use parity_codec::{Codec, Encode}; +use rstd::result; +use sr_primitives::{generic::Digest, traits::{ + self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalize, PrimitiveError, + OnInitialize, NumberFor, Block as BlockT, OffchainWorker, ValidateUnsigned +}}; +use srml_support::Dispatchable; +use codec::{Codec, Encode}; use system::{extrinsics_root, DigestOf}; -use primitives::transaction_validity::{TransactionValidity, TransactionPriority, TransactionLongevity}; -use primitives::weights::Weighable; - -mod internal { - pub const MAX_TRANSACTIONS_WEIGHT: u32 = 4 * 1024 * 1024; -} +use sr_primitives::{ApplyOutcome, ApplyError}; +use sr_primitives::transaction_validity::TransactionValidity; +use sr_primitives::weights::GetDispatchInfo; /// Trait that can be used to execute a block. pub trait ExecuteBlock { @@ -104,28 +98,27 @@ pub type CheckedOf = >::Checked; pub type CallOf = as Applyable>::Call; pub type OriginOf = as RuntimeDispatchable>::Origin; -pub struct Executive( - PhantomData<(System, Block, Context, Payment, UnsignedValidator, AllModules)> +pub struct Executive( + PhantomData<(System, Block, Context, UnsignedValidator, AllModules)> ); impl< System: system::Trait, Block: traits::Block, Context: Default, - Payment: MakePayment, UnsignedValidator, AllModules: OnInitialize + OnFinalize + OffchainWorker, -> ExecuteBlock for Executive +> ExecuteBlock for Executive where Block::Extrinsic: Checkable + Codec, >::Error: Into, - CheckedOf: Applyable + Weighable, - CallOf: RuntimeDispatchable, + CheckedOf: Applyable + GetDispatchInfo, + CallOf: Dispatchable, OriginOf: From>, UnsignedValidator: ValidateUnsigned>, { fn execute_block(block: Block) { - Executive::::execute_block(block); + Executive::::execute_block(block); } } @@ -133,15 +126,14 @@ impl< System: system::Trait, Block: traits::Block, Context: Default, - Payment: MakePayment, UnsignedValidator, AllModules: OnInitialize + OnFinalize + OffchainWorker, -> Executive +> Executive where Block::Extrinsic: Checkable + Codec, >::Error: Into, - CheckedOf: Applyable + Weighable, - CallOf: RuntimeDispatchable, + CheckedOf: Applyable + GetDispatchInfo, + CallOf: Dispatchable, OriginOf: From>, UnsignedValidator: ValidateUnsigned>, { @@ -244,46 +236,24 @@ where to_note: Option>, ) -> ApplyResult { // Verify that the signature is good. - let xt = uxt.check(&Default::default()).map_err(|_| ApplyError::BadSignature)?; - // Check the weight of the block if that extrinsic is applied. - let weight = xt.weight(encoded_len); - if >::all_extrinsics_weight() + weight > internal::MAX_TRANSACTIONS_WEIGHT { - return Err(ApplyError::FullBlock); - } + let xt = uxt.check(&Default::default()).map_err(ApplyError::CantPay)?; - if let (Some(sender), Some(index)) = (xt.sender(), xt.index()) { - // check index - let expected_index = >::account_nonce(sender); - if index < &expected_index { - return Err(ApplyError::Stale) - } else if index > &expected_index { - return Err(ApplyError::Future) - } - // pay any fees - // TODO: propagate why can't pay #2952 - Payment::make_payment(sender, encoded_len).map_err(|_| ApplyError::CantPay)?; - - // AUDIT: Under no circumstances may this function panic from here onwards. - // FIXME: ensure this at compile-time (such as by not defining a panic function, forcing - // a linker error unless the compiler can prove it cannot be called). - // increment nonce in storage - >::inc_account_nonce(sender); - } - - // Make sure to `note_extrinsic` only after we know it's going to be executed - // to prevent it from leaking in storage. + // We don't need to make sure to `note_extrinsic` only after we know it's going to be + // executed to prevent it from leaking in storage since at this point, it will either + // execute or panic (and revert storage changes). if let Some(encoded) = to_note { >::note_extrinsic(encoded); } + // AUDIT: Under no circumstances may this function panic from here onwards. + // Decode parameters and dispatch - let (f, s) = xt.deconstruct(); - let r = f.dispatch(s.into()).map_err(Into::::into); + let dispatch_info = xt.get_dispatch_info(); + let r = Applyable::dispatch(xt, dispatch_info, encoded_len).map_err(DispatchError::from)?; + >::note_applied_extrinsic(&r, encoded_len as u32); - Ok(match r { - Ok(_) => ApplyOutcome::Success, - Err(e) => ApplyOutcome::Fail(e), + r.map(|_| ApplyOutcome::Success).map_err(ApplyOutcome::Fail) }) } @@ -316,11 +286,9 @@ where pub fn validate_transaction(uxt: Block::Extrinsic) -> TransactionValidity { // Note errors > 0 are from ApplyError const UNKNOWN_ERROR: i8 = -127; - const MISSING_SENDER: i8 = -20; const INVALID_INDEX: i8 = -10; - let encoded_len = uxt.encode().len(); - + let encoded_len = uxt.using_encoded(|d| d.len()); let xt = match uxt.check(&Default::default()) { // Checks out. Carry on. Ok(xt) => xt, @@ -337,39 +305,8 @@ where } }; - match (xt.sender(), xt.index()) { - (Some(sender), Some(index)) => { - // pay any fees - if Payment::make_payment(sender, encoded_len).is_err() { - return TransactionValidity::Invalid(ApplyError::CantPay as i8) - } - - // check index - let expected_index = >::account_nonce(sender); - if index < &expected_index { - return TransactionValidity::Invalid(ApplyError::Stale as i8) - } - - let index = *index; - let provides = vec![(sender, index).encode()]; - let requires = if expected_index < index { - vec![(sender, index - One::one()).encode()] - } else { - vec![] - }; - - TransactionValidity::Valid { - priority: encoded_len as TransactionPriority, - requires, - provides, - longevity: TransactionLongevity::max_value(), - propagate: true, - } - }, - (None, None) => UnsignedValidator::validate_unsigned(&xt.deconstruct().0), - (Some(_), None) => TransactionValidity::Invalid(INVALID_INDEX), - (None, Some(_)) => TransactionValidity::Invalid(MISSING_SENDER), - } + let dispatch_info = xt.get_dispatch_info(); + xt.validate::(dispatch_info, encoded_len) } /// Start an offchain worker and generate extrinsics. @@ -378,22 +315,25 @@ where } } + #[cfg(test)] mod tests { use super::*; use balances::Call; use runtime_io::with_externalities; - use substrate_primitives::{H256, Blake2Hasher}; - use primitives::traits::{Header as HeaderT, BlakeTwo256, IdentityLookup}; - use primitives::testing::{Digest, Header, Block}; + use primitives::{H256, Blake2Hasher}; + use sr_primitives::generic::Era; + use sr_primitives::Perbill; + use sr_primitives::weights::Weight; + use sr_primitives::traits::{Header as HeaderT, BlakeTwo256, IdentityLookup, ConvertInto}; + use sr_primitives::testing::{Digest, Header, Block}; use srml_support::{impl_outer_event, impl_outer_origin, parameter_types}; use srml_support::traits::{Currency, LockIdentifier, LockableCurrency, WithdrawReasons, WithdrawReason}; use system; use hex_literal::hex; impl_outer_origin! { - pub enum Origin for Runtime { - } + pub enum Origin for Runtime { } } impl_outer_event!{ @@ -407,18 +347,26 @@ mod tests { pub struct Runtime; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Runtime { type Origin = Origin; type Index = u64; + type Call = Call; type BlockNumber = u64; - type Hash = substrate_primitives::H256; + type Hash = primitives::H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = MetaEvent; type BlockHashCount = BlockHashCount; + type WeightMultiplierUpdate = (); + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const ExistentialDeposit: u64 = 0; @@ -440,6 +388,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = ConvertInto; } impl ValidateUnsigned for Runtime { @@ -447,37 +396,44 @@ mod tests { fn validate_unsigned(call: &Self::Call) -> TransactionValidity { match call { - Call::set_balance(_, _, _) => TransactionValidity::Valid { - priority: 0, - requires: vec![], - provides: vec![], - longevity: std::u64::MAX, - propagate: false, - }, + Call::set_balance(_, _, _) => TransactionValidity::Valid(Default::default()), _ => TransactionValidity::Invalid(0), } } } - type TestXt = primitives::testing::TestXt>; - type Executive = super::Executive< - Runtime, - Block, - system::ChainContext, - balances::Module, - Runtime, - () - >; + type SignedExtra = ( + system::CheckEra, + system::CheckNonce, + system::CheckWeight, + balances::TakeFees + ); + type TestXt = sr_primitives::testing::TestXt, SignedExtra>; + type Executive = super::Executive, system::ChainContext, Runtime, ()>; + + fn extra(nonce: u64, fee: u64) -> SignedExtra { + ( + system::CheckEra::from(Era::Immortal), + system::CheckNonce::from(nonce), + system::CheckWeight::new(), + balances::TakeFees::from(fee) + ) + } + + fn sign_extra(who: u64, nonce: u64, fee: u64) -> Option<(u64, SignedExtra)> { + Some((who, extra(nonce, fee))) + } #[test] fn balance_transfer_dispatch_works() { let mut t = system::GenesisConfig::default().build_storage::().unwrap(); balances::GenesisConfig:: { - balances: vec![(1, 111)], + balances: vec![(1, 211)], vesting: vec![], - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2, 69)); - let mut t = runtime_io::TestExternalities::::new_with_children(t); + }.assimilate_storage(&mut t).unwrap(); + let xt = sr_primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(2, 69)); + let weight = xt.get_dispatch_info().weight as u64; + let mut t = runtime_io::TestExternalities::::new(t); with_externalities(&mut t, || { Executive::initialize_block(&Header::new( 1, @@ -486,29 +442,30 @@ mod tests { [69u8; 32].into(), Digest::default(), )); - Executive::apply_extrinsic(xt).unwrap(); - assert_eq!(>::total_balance(&1), 42 - 10); + let r = Executive::apply_extrinsic(xt); + assert_eq!(r, Ok(ApplyOutcome::Success)); + assert_eq!(>::total_balance(&1), 142 - 10 - weight); assert_eq!(>::total_balance(&2), 69); }); } - fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(balances::GenesisConfig:: { - balances: vec![(1, 111)], + fn new_test_ext(balance_factor: u64) -> runtime_io::TestExternalities { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + balances::GenesisConfig:: { + balances: vec![(1, 111 * balance_factor)], vesting: vec![], - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } #[test] fn block_import_works() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(1), || { Executive::execute_block(Block { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("9159f07939faa7de6ec7f46e292144fc82112c42ead820dfb588f1788f3e8058").into(), + state_root: hex!("3e51b47b6cc8449eece93eee4b01f03b00a0ca7981c0b6c0447b6e0d50ca886d").into(), extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), digest: Digest { logs: vec![], }, }, @@ -520,7 +477,7 @@ mod tests { #[test] #[should_panic] fn block_import_of_bad_state_root_fails() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(1), || { Executive::execute_block(Block { header: Header { parent_hash: [69u8; 32].into(), @@ -537,7 +494,7 @@ mod tests { #[test] #[should_panic] fn block_import_of_bad_extrinsic_root_fails() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(1), || { Executive::execute_block(Block { header: Header { parent_hash: [69u8; 32].into(), @@ -553,8 +510,9 @@ mod tests { #[test] fn bad_extrinsic_not_inserted() { - let mut t = new_test_ext(); - let xt = primitives::testing::TestXt(Some(1), 42, Call::transfer(33, 69)); + let mut t = new_test_ext(1); + // bad nonce check! + let xt = sr_primitives::testing::TestXt(sign_extra(1, 30, 0), Call::transfer(33, 69)); with_externalities(&mut t, || { Executive::initialize_block(&Header::new( 1, @@ -570,67 +528,68 @@ mod tests { #[test] fn block_weight_limit_enforced() { - let run_test = |should_fail: bool| { - let mut t = new_test_ext(); - let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(33, 69)); - let xt2 = primitives::testing::TestXt(Some(1), 1, Call::transfer(33, 69)); - let encoded = xt2.encode(); - let len = if should_fail { (internal::MAX_TRANSACTIONS_WEIGHT - 1) as usize } else { encoded.len() }; - with_externalities(&mut t, || { - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - assert_eq!(>::all_extrinsics_weight(), 0); - - Executive::apply_extrinsic(xt).unwrap(); - let res = Executive::apply_extrinsic_with_len(xt2, len, Some(encoded)); - - if should_fail { - assert!(res.is_err()); - assert_eq!(>::all_extrinsics_weight(), 28); - assert_eq!(>::extrinsic_index(), Some(1)); + let mut t = new_test_ext(10000); + // given: TestXt uses the encoded len as fixed Len: + let xt = sr_primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer::(33, 0)); + let encoded = xt.encode(); + let encoded_len = encoded.len() as Weight; + let limit = AvailableBlockRatio::get() * MaximumBlockWeight::get(); + let num_to_exhaust_block = limit / encoded_len; + with_externalities(&mut t, || { + Executive::initialize_block(&Header::new( + 1, + H256::default(), + H256::default(), + [69u8; 32].into(), + Digest::default(), + )); + assert_eq!(>::all_extrinsics_weight(), 0); + + for nonce in 0..=num_to_exhaust_block { + let xt = sr_primitives::testing::TestXt(sign_extra(1, nonce.into(), 0), Call::transfer::(33, 0)); + let res = Executive::apply_extrinsic(xt); + if nonce != num_to_exhaust_block { + assert_eq!(res.unwrap(), ApplyOutcome::Success); + assert_eq!(>::all_extrinsics_weight(), encoded_len * (nonce + 1)); + assert_eq!(>::extrinsic_index(), Some(nonce as u32 + 1)); } else { - assert!(res.is_ok()); - assert_eq!(>::all_extrinsics_weight(), 56); - assert_eq!(>::extrinsic_index(), Some(2)); + assert_eq!(res, Err(ApplyError::FullBlock)); } - }); - }; - - run_test(false); - run_test(true); + } + }); } #[test] - fn default_block_weight() { - let xt = primitives::testing::TestXt(None, 0, Call::set_balance(33, 69, 69)); - let mut t = new_test_ext(); + fn block_weight_and_size_is_stored_per_tx() { + let xt = sr_primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(33, 0)); + let x1 = sr_primitives::testing::TestXt(sign_extra(1, 1, 0), Call::transfer(33, 0)); + let x2 = sr_primitives::testing::TestXt(sign_extra(1, 2, 0), Call::transfer(33, 0)); + let len = xt.clone().encode().len() as u32; + let mut t = new_test_ext(1); with_externalities(&mut t, || { - Executive::apply_extrinsic(xt.clone()).unwrap(); - Executive::apply_extrinsic(xt.clone()).unwrap(); - Executive::apply_extrinsic(xt.clone()).unwrap(); - assert_eq!( - >::all_extrinsics_weight(), - 3 * (0 /*base*/ + 22 /*len*/ * 1 /*byte*/) - ); + assert_eq!(>::all_extrinsics_weight(), 0); + assert_eq!(>::all_extrinsics_weight(), 0); + + assert_eq!(Executive::apply_extrinsic(xt.clone()).unwrap(), ApplyOutcome::Success); + assert_eq!(Executive::apply_extrinsic(x1.clone()).unwrap(), ApplyOutcome::Success); + assert_eq!(Executive::apply_extrinsic(x2.clone()).unwrap(), ApplyOutcome::Success); + + // default weight for `TestXt` == encoded length. + assert_eq!(>::all_extrinsics_weight(), (3 * len).into()); + assert_eq!(>::all_extrinsics_len(), 3 * len); + + let _ = >::finalize(); + + assert_eq!(>::all_extrinsics_weight(), 0); + assert_eq!(>::all_extrinsics_weight(), 0); }); } #[test] fn validate_unsigned() { - let xt = primitives::testing::TestXt(None, 0, Call::set_balance(33, 69, 69)); - let valid = TransactionValidity::Valid { - priority: 0, - requires: vec![], - provides: vec![], - longevity: 18446744073709551615, - propagate: false, - }; - let mut t = new_test_ext(); + let xt = sr_primitives::testing::TestXt(None, Call::set_balance(33, 69, 69)); + let valid = TransactionValidity::Valid(Default::default()); + let mut t = new_test_ext(1); with_externalities(&mut t, || { assert_eq!(Executive::validate_transaction(xt.clone()), valid); @@ -645,7 +604,7 @@ mod tests { fn can_pay_for_tx_fee_on_full_lock() { let id: LockIdentifier = *b"0 "; let execute_with_lock = |lock: WithdrawReasons| { - let mut t = new_test_ext(); + let mut t = new_test_ext(1); with_externalities(&mut t, || { as LockableCurrency>::set_lock( id, @@ -654,7 +613,8 @@ mod tests { 10, lock, ); - let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2, 10)); + let xt = sr_primitives::testing::TestXt(sign_extra(1, 0, 0), Call::transfer(2, 10)); + let weight = xt.get_dispatch_info().weight as u64; Executive::initialize_block(&Header::new( 1, H256::default(), @@ -670,7 +630,7 @@ mod tests { message: Some("account liquidity restrictions prevent withdrawal") })); // but tx fee has been deducted. the transaction failed on transfer, not on fee. - assert_eq!(>::total_balance(&1), 111 - 10); + assert_eq!(>::total_balance(&1), 111 - 10 - weight); } else { assert_eq!(Executive::apply_extrinsic(xt), Err(ApplyError::CantPay)); assert_eq!(>::total_balance(&1), 111); diff --git a/srml/finality-tracker/Cargo.toml b/srml/finality-tracker/Cargo.toml index e7eea0e152676dcde2ab5340759ce102f7c0de06..65ac540b6bcaee5e586bca231c47ab12c23c6644 100644 --- a/srml/finality-tracker/Cargo.toml +++ b/srml/finality-tracker/Cargo.toml @@ -6,25 +6,25 @@ edition = "2018" [dependencies] serde = { version = "1.0", default-features = false, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } srml-system = { path = "../system", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../../core/primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } sr-io = { path = "../../core/sr-io", default-features = false } [features] default = ["std"] std = [ "serde/std", - "parity-codec/std", + "codec/std", "rstd/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "srml-system/std", "inherents/std", ] diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index f9ccc363462220c0f7f88f257ec26daf622bc47d..26a0e0d4151214bae51eeb88f705508a00859c95 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -23,15 +23,15 @@ use inherents::{ InherentData, MakeFatalError, }; use srml_support::StorageValue; -use primitives::traits::{One, Zero, SaturatedConversion}; +use sr_primitives::traits::{One, Zero, SaturatedConversion}; use rstd::{prelude::*, result, cmp, vec}; -use parity_codec::Decode; +use codec::Decode; use srml_support::{decl_module, decl_storage, for_each_tuple}; use srml_support::traits::Get; use srml_system::{ensure_none, Trait as SystemTrait}; #[cfg(feature = "std")] -use parity_codec::Encode; +use codec::Encode; /// The identifier for the `finalnum` inherent. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"finalnum"; @@ -244,15 +244,16 @@ impl ProvideInherent for Module { const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; fn create_inherent(data: &InherentData) -> Option { - let final_num = - data.finalized_number().expect("Gets and decodes final number inherent data"); - - // make hint only when not same as last to avoid bloat. - Self::recent_hints().last().and_then(|last| if last == &final_num { - None + if let Ok(final_num) = data.finalized_number() { + // make hint only when not same as last to avoid bloat. + Self::recent_hints().last().and_then(|last| if last == &final_num { + None + } else { + Some(Call::final_hint(final_num)) + }) } else { - Some(Call::final_hint(final_num)) - }) + None + } } fn check_inherent(_call: &Self::Call, _data: &InherentData) -> result::Result<(), Self::Error> { @@ -265,9 +266,10 @@ mod tests { use super::*; use sr_io::{with_externalities, TestExternalities}; - use substrate_primitives::H256; - use primitives::traits::{BlakeTwo256, IdentityLookup, OnFinalize, Header as HeaderT}; - use primitives::testing::Header; + use primitives::H256; + use sr_primitives::traits::{BlakeTwo256, IdentityLookup, OnFinalize, Header as HeaderT}; + use sr_primitives::testing::Header; + use sr_primitives::Perbill; use srml_support::{assert_ok, impl_outer_origin, parameter_types}; use srml_system as system; use std::cell::RefCell; @@ -299,18 +301,26 @@ mod tests { parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const WindowSize: u64 = 11; @@ -328,7 +338,7 @@ mod tests { #[test] fn median_works() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { FinalityTracker::update_hint(Some(500)); assert_eq!(FinalityTracker::median(), 250); assert!(NOTIFICATIONS.with(|n| n.borrow().is_empty())); @@ -338,7 +348,7 @@ mod tests { #[test] fn notifies_when_stalled() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { let mut parent_hash = System::parent_hash(); for i in 2..106 { System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); @@ -357,7 +367,7 @@ mod tests { #[test] fn recent_notifications_prevent_stalling() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { let mut parent_hash = System::parent_hash(); for i in 2..106 { System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); diff --git a/srml/generic-asset/Cargo.toml b/srml/generic-asset/Cargo.toml index bfa49d8018e52484783caa7631ff17025b8baf30..65e21c3b11fbe8eb4b947a8521423fe2b5c3aa28 100644 --- a/srml/generic-asset/Cargo.toml +++ b/srml/generic-asset/Cargo.toml @@ -6,23 +6,23 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } support = { package = "srml-support", path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] runtime_io = { package = "sr-io", path = "../../core/sr-io" } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] std =[ "serde/std", - "parity-codec/std", + "codec/std", "rstd/std", - "primitives/std", + "sr-primitives/std", "support/std", "system/std", ] diff --git a/srml/generic-asset/src/lib.rs b/srml/generic-asset/src/lib.rs index 60370600a69a630ac9f10bba99d36a12390eef48..c93df7c0be8118fd01b5a061a1404a0c62cb2eb3 100644 --- a/srml/generic-asset/src/lib.rs +++ b/srml/generic-asset/src/lib.rs @@ -151,9 +151,9 @@ #![cfg_attr(not(feature = "std"), no_std)] -use parity_codec::{Decode, Encode, HasCompact, Input, Output}; +use codec::{Decode, Encode, HasCompact, Input, Output, Error}; -use primitives::traits::{ +use sr_primitives::traits::{ CheckedAdd, CheckedSub, MaybeSerializeDebug, Member, One, Saturating, SimpleArithmetic, Zero, Bounded }; @@ -284,10 +284,12 @@ impl Encode for PermissionVersions { } } +impl codec::EncodeLike for PermissionVersions {} + impl Decode for PermissionVersions { - fn decode(input: &mut I) -> Option { + fn decode(input: &mut I) -> core::result::Result { let version = PermissionVersionNumber::decode(input)?; - Some( + Ok( match version { PermissionVersionNumber::V1 => PermissionVersions::V1(Decode::decode(input)?) } @@ -336,7 +338,7 @@ decl_module! { >::put(next_id); >::insert(id, &options.initial_issuance); - >::insert(&id, &origin, options.initial_issuance); + >::insert(&id, &origin, &options.initial_issuance); >::insert(&id, permissions); Self::deposit_event(RawEvent::Created(id, origin, options)); @@ -477,14 +479,13 @@ decl_storage! { config(endowed_accounts): Vec; build(| - storage: &mut primitives::StorageOverlay, - _: &mut primitives::ChildrenStorageOverlay, + storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay), config: &GenesisConfig| { config.assets.iter().for_each(|asset_id| { config.endowed_accounts.iter().for_each(|account_id| { - storage.insert( + storage.0.insert( >::key_for(asset_id, account_id), - ::encode(&config.initial_balance) + ::encode(&config.initial_balance) ); }); }); @@ -560,7 +561,7 @@ impl Module { let permissions: PermissionVersions = options.permissions.clone().into(); >::insert(asset_id, &options.initial_issuance); - >::insert(&asset_id, &account_id, options.initial_issuance); + >::insert(&asset_id, &account_id, &options.initial_issuance); >::insert(&asset_id, permissions); Self::deposit_event(RawEvent::Created(asset_id, account_id, options)); @@ -768,13 +769,13 @@ impl Module { /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that /// the caller will do this. fn set_reserved_balance(asset_id: &T::AssetId, who: &T::AccountId, balance: T::Balance) { - >::insert(asset_id, who, balance); + >::insert(asset_id, who, &balance); } /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that /// the caller will do this. fn set_free_balance(asset_id: &T::AssetId, who: &T::AccountId, balance: T::Balance) { - >::insert(asset_id, who, balance); + >::insert(asset_id, who, &balance); } fn set_lock( @@ -1048,6 +1049,7 @@ impl PartialEq for ElevatedTrait { impl Eq for ElevatedTrait {} impl system::Trait for ElevatedTrait { type Origin = T::Origin; + type Call = T::Call; type Index = T::Index; type BlockNumber = T::BlockNumber; type Hash = T::Hash; @@ -1056,6 +1058,10 @@ impl system::Trait for ElevatedTrait { type Lookup = T::Lookup; type Header = T::Header; type Event = (); + type MaximumBlockWeight = T::MaximumBlockWeight; + type MaximumBlockLength = T::MaximumBlockLength; + type AvailableBlockRatio = T::AvailableBlockRatio; + type WeightMultiplierUpdate = (); type BlockHashCount = T::BlockHashCount; } impl Trait for ElevatedTrait { diff --git a/srml/generic-asset/src/mock.rs b/srml/generic-asset/src/mock.rs index 02e18fc335839638527b452d0cb131ab0b74d098..2c348a0175c4f3c46ab8d9691a67d9d3ff0cc9cb 100644 --- a/srml/generic-asset/src/mock.rs +++ b/srml/generic-asset/src/mock.rs @@ -20,11 +20,12 @@ #![cfg(test)] -use primitives::{ +use sr_primitives::{ + Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup}, }; -use substrate_primitives::{Blake2Hasher, H256}; +use primitives::{Blake2Hasher, H256}; use support::{parameter_types, impl_outer_event, impl_outer_origin}; use super::*; @@ -40,17 +41,25 @@ impl_outer_origin! { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = TestEvent; + type WeightMultiplierUpdate = (); + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; type BlockHashCount = BlockHashCount; } @@ -109,10 +118,9 @@ impl ExtBuilder { // builds genesis config pub fn build(self) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); - t.extend( - GenesisConfig:: { + GenesisConfig:: { assets: vec![self.asset_id], endowed_accounts: self.accounts, initial_balance: self.initial_balance, @@ -120,10 +128,7 @@ impl ExtBuilder { staking_asset_id: 16000, spending_asset_id: 16001, } - .build_storage() - .unwrap() - .0, - ); + .assimilate_storage(&mut t).unwrap(); t.into() } @@ -135,6 +140,5 @@ pub fn new_test_ext() -> runtime_io::TestExternalities { system::GenesisConfig::default() .build_storage::() .unwrap() - .0 .into() } diff --git a/srml/grandpa/Cargo.toml b/srml/grandpa/Cargo.toml index 2f13bd018fcaebca078e33d626a4568a77b339e4..2466b8e012ec538238fa38bc241cf7668dc58acc 100644 --- a/srml/grandpa/Cargo.toml +++ b/srml/grandpa/Cargo.toml @@ -6,11 +6,11 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } substrate-finality-grandpa-primitives = { path = "../../core/finality-grandpa/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } session = { package = "srml-session", path = "../session", default-features = false } @@ -23,12 +23,12 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io" } default = ["std"] std = [ "serde", - "parity-codec/std", - "substrate-primitives/std", + "codec/std", + "primitives/std", "substrate-finality-grandpa-primitives/std", "rstd/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", "session/std", "finality-tracker/std", diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs index ba60128a897cf583112d8ee0bc0b0e70dd78608b..3f4b26c17d74cf6debd807072b04018f4fe0d352 100644 --- a/srml/grandpa/src/lib.rs +++ b/srml/grandpa/src/lib.rs @@ -31,12 +31,12 @@ pub use substrate_finality_grandpa_primitives as fg_primitives; use rstd::prelude::*; -use parity_codec::{self as codec, Encode, Decode}; +use codec::{self as codec, Encode, Decode, Error}; use srml_support::{ decl_event, decl_storage, decl_module, dispatch::Result, storage::StorageValue }; -use primitives::{ - generic::{DigestItem, OpaqueDigestItemId}, traits::CurrentHeight +use sr_primitives::{ + generic::{DigestItem, OpaqueDigestItemId}, traits::Zero, }; use fg_primitives::{ScheduledChange, ConsensusLog, GRANDPA_ENGINE_ID}; pub use fg_primitives::{AuthorityId, AuthorityWeight}; @@ -78,11 +78,11 @@ pub struct StoredPendingChange { } impl Decode for StoredPendingChange { - fn decode(value: &mut I) -> Option { + fn decode(value: &mut I) -> core::result::Result { let old = OldStoredPendingChange::decode(value)?; let forced = >::decode(value).unwrap_or(None); - Some(StoredPendingChange { + Ok(StoredPendingChange { scheduled_at: old.scheduled_at, delay: old.delay, next_authorities: old.next_authorities, @@ -91,10 +91,42 @@ impl Decode for StoredPendingChange { } } +/// Current state of the GRANDPA authority set. State transitions must happen in +/// the same order of states defined below, e.g. `Paused` implies a prior +/// `PendingPause`. +#[derive(Decode, Encode)] +#[cfg_attr(test, derive(Debug, PartialEq))] +pub enum StoredState { + /// The current authority set is live, and GRANDPA is enabled. + Live, + /// There is a pending pause event which will be enacted at the given block + /// height. + PendingPause { + /// Block at which the intention to pause was scheduled. + scheduled_at: N, + /// Number of blocks after which the change will be enacted. + delay: N + }, + /// The current GRANDPA authority set is paused. + Paused, + /// There is a pending resume event which will be enacted at the given block + /// height. + PendingResume { + /// Block at which the intention to resume was scheduled. + scheduled_at: N, + /// Number of blocks after which the change will be enacted. + delay: N, + }, +} + decl_event!( pub enum Event { /// New authority set has been applied. NewAuthorities(Vec<(AuthorityId, u64)>), + /// Current authority set has been paused. + Paused, + /// Current authority set has been resumed. + Resumed, } ); @@ -103,6 +135,9 @@ decl_storage! { /// The current authority set. Authorities get(authorities) config(): Vec<(AuthorityId, AuthorityWeight)>; + /// State of the current authority set. + State get(state): StoredState = StoredState::Live; + /// Pending change: (signaled at, scheduled change). PendingChange: Option>; @@ -125,12 +160,14 @@ decl_module! { } fn on_finalize(block_number: T::BlockNumber) { + // check for scheduled pending authority set changes if let Some(pending_change) = >::get() { + // emit signal if we're at the block that scheduled the change if block_number == pending_change.scheduled_at { if let Some(median) = pending_change.forced { Self::deposit_log(ConsensusLog::ForcedChange( median, - ScheduledChange{ + ScheduledChange { delay: pending_change.delay, next_authorities: pending_change.next_authorities.clone(), } @@ -145,6 +182,7 @@ decl_module! { } } + // enact the change if we've reached the enacting block if block_number == pending_change.scheduled_at + pending_change.delay { Authorities::put(&pending_change.next_authorities); Self::deposit_event( @@ -153,6 +191,35 @@ decl_module! { >::kill(); } } + + // check for scheduled pending state changes + match >::get() { + StoredState::PendingPause { scheduled_at, delay } => { + // signal change to pause + if block_number == scheduled_at { + Self::deposit_log(ConsensusLog::Pause(delay)); + } + + // enact change to paused state + if block_number == scheduled_at + delay { + >::put(StoredState::Paused); + Self::deposit_event(Event::Paused); + } + }, + StoredState::PendingResume { scheduled_at, delay } => { + // signal change to resume + if block_number == scheduled_at { + Self::deposit_log(ConsensusLog::Resume(delay)); + } + + // enact change to live state + if block_number == scheduled_at + delay { + >::put(StoredState::Live); + Self::deposit_event(Event::Resumed); + } + }, + _ => {}, + } } } } @@ -163,6 +230,36 @@ impl Module { Authorities::get() } + pub fn schedule_pause(in_blocks: T::BlockNumber) -> Result { + if let StoredState::Live = >::get() { + let scheduled_at = >::block_number(); + >::put(StoredState::PendingPause { + delay: in_blocks, + scheduled_at, + }); + + Ok(()) + } else { + Err("Attempt to signal GRANDPA pause when the authority set isn't live \ + (either paused or already pending pause).") + } + } + + pub fn schedule_resume(in_blocks: T::BlockNumber) -> Result { + if let StoredState::Paused = >::get() { + let scheduled_at = >::block_number(); + >::put(StoredState::PendingResume { + delay: in_blocks, + scheduled_at, + }); + + Ok(()) + } else { + Err("Attempt to signal GRANDPA resume when the authority set isn't paused \ + (either live or already pending resume).") + } + } + /// Schedule a change in the authorities. /// /// The change will be applied at the end of execution of the block @@ -183,7 +280,7 @@ impl Module { forced: Option, ) -> Result { if !>::exists() { - let scheduled_at = system::ChainContext::::default().current_height(); + let scheduled_at = >::block_number(); if let Some(_) = forced { if Self::next_forced().map_or(false, |next| next > scheduled_at) { @@ -232,12 +329,24 @@ impl Module { { Self::grandpa_log(digest).and_then(|signal| signal.try_into_forced_change()) } + + pub fn pending_pause(digest: &DigestOf) + -> Option + { + Self::grandpa_log(digest).and_then(|signal| signal.try_into_pause()) + } + + pub fn pending_resume(digest: &DigestOf) + -> Option + { + Self::grandpa_log(digest).and_then(|signal| signal.try_into_resume()) + } } impl session::OneSessionHandler for Module { type Key = AuthorityId; - fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + fn on_new_session<'a, I: 'a>(changed: bool, validators: I, _queued_validators: I) where I: Iterator { // instant changes @@ -245,7 +354,6 @@ impl session::OneSessionHandler for Module { let next_authorities = validators.map(|(_, k)| (k, 1u64)).collect::>(); let last_authorities = >::grandpa_authorities(); if next_authorities != last_authorities { - use primitives::traits::Zero; if let Some((further_wait, median)) = >::take() { let _ = Self::schedule_change(next_authorities, further_wait, Some(median)); } else { @@ -254,6 +362,7 @@ impl session::OneSessionHandler for Module { } } } + fn on_disabled(i: usize) { Self::deposit_log(ConsensusLog::OnDisabled(i as u64)) } diff --git a/srml/grandpa/src/mock.rs b/srml/grandpa/src/mock.rs index a7a4d3e2c49d6124e1eff86b861e682b9c7dc7cb..87366b315fecb02be0d35c699f6a92390ba8432c 100644 --- a/srml/grandpa/src/mock.rs +++ b/srml/grandpa/src/mock.rs @@ -18,11 +18,11 @@ #![cfg(test)] -use primitives::{DigestItem, traits::IdentityLookup, testing::{Header, UintAuthorityId}}; +use sr_primitives::{Perbill, DigestItem, traits::IdentityLookup, testing::{Header, UintAuthorityId}}; use runtime_io; use srml_support::{impl_outer_origin, impl_outer_event, parameter_types}; -use substrate_primitives::{H256, Blake2Hasher}; -use parity_codec::{Encode, Decode}; +use primitives::{H256, Blake2Hasher}; +use codec::{Encode, Decode}; use crate::{AuthorityId, GenesisConfig, Trait, Module, ConsensusLog}; use substrate_finality_grandpa_primitives::GRANDPA_ENGINE_ID; @@ -43,18 +43,26 @@ impl Trait for Test { } parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; - type Hashing = primitives::traits::BlakeTwo256; + type Hashing = sr_primitives::traits::BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = TestEvent; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } mod grandpa { @@ -68,14 +76,16 @@ impl_outer_event!{ } pub fn to_authorities(vec: Vec<(u64, u64)>) -> Vec<(AuthorityId, u64)> { - vec.into_iter().map(|(id, weight)| (UintAuthorityId(id).into(), weight)).collect() + vec.into_iter() + .map(|(id, weight)| (UintAuthorityId(id).to_public_key::(), weight)) + .collect() } pub fn new_test_ext(authorities: Vec<(u64, u64)>) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(GenesisConfig { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + GenesisConfig { authorities: to_authorities(authorities), - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/srml/grandpa/src/tests.rs b/srml/grandpa/src/tests.rs index 763c4fce89cca0b271f16cf92052e60ff4266dba..adef602ce6f185ff4e0cdaef3ef929a9c57cd0e6 100644 --- a/srml/grandpa/src/tests.rs +++ b/srml/grandpa/src/tests.rs @@ -18,8 +18,8 @@ #![cfg(test)] -use primitives::testing::Digest; -use primitives::traits::{Header, OnFinalize}; +use sr_primitives::testing::Digest; +use sr_primitives::traits::{Header, OnFinalize}; use runtime_io::with_externalities; use crate::mock::*; use system::{EventRecord, Phase}; @@ -202,3 +202,83 @@ fn dispatch_forced_change() { let _ = header; }); } + +#[test] +fn schedule_pause_only_when_live() { + with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { + // we schedule a pause at block 1 with delay of 1 + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); + Grandpa::schedule_pause(1).unwrap(); + + // we've switched to the pending pause state + assert_eq!( + Grandpa::state(), + StoredState::PendingPause { + scheduled_at: 1u64, + delay: 1, + }, + ); + + Grandpa::on_finalize(1); + let _ = System::finalize(); + + System::initialize(&2, &Default::default(), &Default::default(), &Default::default()); + + // signaling a pause now should fail + assert!(Grandpa::schedule_pause(1).is_err()); + + Grandpa::on_finalize(2); + let _ = System::finalize(); + + // after finalizing block 2 the set should have switched to paused state + assert_eq!( + Grandpa::state(), + StoredState::Paused, + ); + }); +} + +#[test] +fn schedule_resume_only_when_paused() { + with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); + + // the set is currently live, resuming it is an error + assert!(Grandpa::schedule_resume(1).is_err()); + + assert_eq!( + Grandpa::state(), + StoredState::Live, + ); + + // we schedule a pause to be applied instantly + Grandpa::schedule_pause(0).unwrap(); + Grandpa::on_finalize(1); + let _ = System::finalize(); + + assert_eq!( + Grandpa::state(), + StoredState::Paused, + ); + + // we schedule the set to go back live in 2 blocks + System::initialize(&2, &Default::default(), &Default::default(), &Default::default()); + Grandpa::schedule_resume(2).unwrap(); + Grandpa::on_finalize(2); + let _ = System::finalize(); + + System::initialize(&3, &Default::default(), &Default::default(), &Default::default()); + Grandpa::on_finalize(3); + let _ = System::finalize(); + + System::initialize(&4, &Default::default(), &Default::default(), &Default::default()); + Grandpa::on_finalize(4); + let _ = System::finalize(); + + // it should be live at block 4 + assert_eq!( + Grandpa::state(), + StoredState::Live, + ); + }); +} diff --git a/srml/im-online/Cargo.toml b/srml/im-online/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..8f0e4cc39fa825a6dd85bbcb9b17e76cff612059 --- /dev/null +++ b/srml/im-online/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "srml-im-online" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } +app-crypto = { package = "substrate-application-crypto", path = "../../core/application-crypto", default-features = false } +rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } +serde = { version = "1.0", optional = true } +session = { package = "srml-session", path = "../session", default-features = false } +srml-support = { path = "../support", default-features = false } +sr-io = { package = "sr-io", path = "../../core/sr-io", default-features = false } +system = { package = "srml-system", path = "../system", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "sr-primitives/std", + "rstd/std", + "serde", + "session/std", + "srml-support/std", + "sr-io/std", + "system/std", + "app-crypto/std", +] diff --git a/srml/im-online/src/lib.rs b/srml/im-online/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..eff811d6cacf386ec680e41b21484521bebc35f4 --- /dev/null +++ b/srml/im-online/src/lib.rs @@ -0,0 +1,424 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! # I'm online Module +//! +//! If the local node is a validator (i.e. contains an authority key), this module +//! gossips a heartbeat transaction with each new session. The heartbeat functions +//! as a simple mechanism to signal that the node is online in the current era. +//! +//! Received heartbeats are tracked for one era and reset with each new era. The +//! module exposes two public functions to query if a heartbeat has been received +//! in the current era or session. +//! +//! The heartbeat is a signed transaction, which was signed using the session key +//! and includes the recent best block number of the local validators chain as well +//! as the [NetworkState](../../core/offchain/struct.NetworkState.html). +//! It is submitted as an Unsigned Transaction via off-chain workers. +//! +//! - [`im_online::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! - [`Module`](./struct.Module.html) +//! +//! ## Interface +//! +//! ### Public Functions +//! +//! - `is_online_in_current_session` - True if the validator sent a heartbeat in the current session. +//! +//! ## Usage +//! +//! ``` +//! use srml_support::{decl_module, dispatch::Result}; +//! use system::ensure_signed; +//! use srml_im_online::{self as im_online}; +//! +//! pub trait Trait: im_online::Trait {} +//! +//! decl_module! { +//! pub struct Module for enum Call where origin: T::Origin { +//! pub fn is_online(origin, authority_index: u32) -> Result { +//! let _sender = ensure_signed(origin)?; +//! let _is_online = >::is_online_in_current_session(authority_index); +//! Ok(()) +//! } +//! } +//! } +//! # fn main() { } +//! ``` +//! +//! ## Dependencies +//! +//! This module depends on the [Session module](../srml_session/index.html). + +// Ensure we're `no_std` when compiling for Wasm. +#![cfg_attr(not(feature = "std"), no_std)] + +use primitives::offchain::{OpaqueNetworkState, StorageKind}; +use codec::{Encode, Decode}; +use sr_primitives::{ + ApplyError, traits::{Extrinsic as ExtrinsicT}, + transaction_validity::{TransactionValidity, TransactionLongevity, ValidTransaction}, +}; +use rstd::prelude::*; +use session::SessionIndex; +use sr_io::Printable; +use srml_support::{ + StorageValue, decl_module, decl_event, decl_storage, StorageDoubleMap, print, +}; +use system::ensure_none; +use app_crypto::RuntimeAppPublic; + +mod app { + pub use app_crypto::sr25519 as crypto; + use app_crypto::{app_crypto, key_types::IM_ONLINE, sr25519}; + + app_crypto!(sr25519, IM_ONLINE); +} + +/// A Babe authority keypair. Necessarily equivalent to the schnorrkel public key used in +/// the main Babe module. If that ever changes, then this must, too. +#[cfg(feature = "std")] +pub type AuthorityPair = app::Pair; + +/// A Babe authority signature. +pub type AuthoritySignature = app::Signature; + +/// A Babe authority identifier. Necessarily equivalent to the schnorrkel public key used in +/// the main Babe module. If that ever changes, then this must, too. +pub type AuthorityId = app::Public; + +// The local storage database key under which the worker progress status +// is tracked. +const DB_KEY: &[u8] = b"srml/im-online-worker-status"; + +// It's important to persist the worker state, since e.g. the +// server could be restarted while starting the gossip process, but before +// finishing it. With every execution of the off-chain worker we check +// if we need to recover and resume gossipping or if there is already +// another off-chain worker in the process of gossipping. +#[derive(Encode, Decode, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +struct WorkerStatus { + done: bool, + gossipping_at: BlockNumber, +} + +// Error which may occur while executing the off-chain code. +enum OffchainErr { + DecodeWorkerStatus, + ExtrinsicCreation, + FailedSigning, + NetworkState, + SubmitTransaction, +} + +impl Printable for OffchainErr { + fn print(self) { + match self { + OffchainErr::DecodeWorkerStatus => print("Offchain error: decoding WorkerStatus failed!"), + OffchainErr::ExtrinsicCreation => print("Offchain error: extrinsic creation failed!"), + OffchainErr::FailedSigning => print("Offchain error: signing failed!"), + OffchainErr::NetworkState => print("Offchain error: fetching network state failed!"), + OffchainErr::SubmitTransaction => print("Offchain error: submitting transaction failed!"), + } + } +} + +pub type AuthIndex = u32; + +/// Heartbeat which is sent/received. +#[derive(Encode, Decode, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Heartbeat + where BlockNumber: PartialEq + Eq + Decode + Encode, +{ + block_number: BlockNumber, + network_state: OpaqueNetworkState, + session_index: SessionIndex, + authority_index: AuthIndex, +} + +pub trait Trait: system::Trait + session::Trait { + /// The overarching event type. + type Event: From + Into<::Event>; + + /// The function call. + type Call: From>; + + /// A extrinsic right from the external world. This is unchecked and so + /// can contain a signature. + type UncheckedExtrinsic: ExtrinsicT::Call> + Encode + Decode; +} + +decl_event!( + pub enum Event { + /// A new heartbeat was received from `AuthorityId` + HeartbeatReceived(AuthorityId), + } +); + +decl_storage! { + trait Store for Module as ImOnline { + /// The block number when we should gossip. + GossipAt get(gossip_at) config(): T::BlockNumber; + + /// The current set of keys that may issue a heartbeat. + Keys get(keys) config(): Vec; + + /// For each session index we keep a mapping of `AuthorityId` + /// to `offchain::OpaqueNetworkState`. + ReceivedHeartbeats get(received_heartbeats): double_map SessionIndex, + blake2_256(AuthIndex) => Vec; + } +} + + +decl_module! { + pub struct Module for enum Call where origin: T::Origin { + fn deposit_event() = default; + + fn heartbeat( + origin, + heartbeat: Heartbeat, + _signature: AuthoritySignature + ) { + ensure_none(origin)?; + + let current_session = >::current_index(); + let exists = ::exists( + ¤t_session, + &heartbeat.authority_index + ); + let keys = Keys::get(); + let public = keys.get(heartbeat.authority_index as usize); + if let (true, Some(public)) = (!exists, public) { + Self::deposit_event(Event::HeartbeatReceived(public.clone())); + + let network_state = heartbeat.network_state.encode(); + ::insert( + ¤t_session, + &heartbeat.authority_index, + &network_state + ); + } + } + + // Runs after every block. + fn offchain_worker(now: T::BlockNumber) { + // Only send messages if we are a potential validator. + if sr_io::is_validator() { + Self::offchain(now); + } + } + } +} + +impl Module { + /// Returns `true` if a heartbeat has been received for the authority at `authority_index` in + /// the authorities series, during the current session. Otherwise `false`. + pub fn is_online_in_current_session(authority_index: AuthIndex) -> bool { + let current_session = >::current_index(); + ::exists(¤t_session, &authority_index) + } + + fn offchain(now: T::BlockNumber) { + let next_gossip = >::get(); + let check = Self::check_not_yet_gossipped(now, next_gossip); + let (curr_worker_status, not_yet_gossipped) = match check { + Ok((s, v)) => (s, v), + Err(err) => { + print(err); + return; + }, + }; + if next_gossip < now && not_yet_gossipped { + let value_set = Self::compare_and_set_worker_status(now, false, curr_worker_status); + if !value_set { + // value could not be set in local storage, since the value was + // different from `curr_worker_status`. this indicates that + // another worker was running in parallel. + return; + } + + match Self::do_gossip_at(now) { + Ok(_) => {}, + Err(err) => print(err), + } + } + } + + fn do_gossip_at(block_number: T::BlockNumber) -> Result<(), OffchainErr> { + // we run only when a local authority key is configured + let authorities = Keys::get(); + let mut local_keys = app::Public::all(); + local_keys.sort(); + + for (authority_index, key) in authorities.into_iter() + .enumerate() + .filter_map(|(index, authority)| { + local_keys.binary_search(&authority) + .ok() + .map(|location| (index as u32, &local_keys[location])) + }) + { + let network_state = sr_io::network_state().map_err(|_| OffchainErr::NetworkState)?; + let heartbeat_data = Heartbeat { + block_number, + network_state, + session_index: >::current_index(), + authority_index, + }; + + let signature = key.sign(&heartbeat_data.encode()).ok_or(OffchainErr::FailedSigning)?; + let call = Call::heartbeat(heartbeat_data, signature); + let ex = T::UncheckedExtrinsic::new_unsigned(call.into()) + .ok_or(OffchainErr::ExtrinsicCreation)?; + sr_io::submit_transaction(&ex).map_err(|_| OffchainErr::SubmitTransaction)?; + + // once finished we set the worker status without comparing + // if the existing value changed in the meantime. this is + // because at this point the heartbeat was definitely submitted. + Self::set_worker_status(block_number, true); + } + Ok(()) + } + + fn compare_and_set_worker_status( + gossipping_at: T::BlockNumber, + done: bool, + curr_worker_status: Option>, + ) -> bool { + let enc = WorkerStatus { + done, + gossipping_at, + }; + sr_io::local_storage_compare_and_set( + StorageKind::PERSISTENT, + DB_KEY, + curr_worker_status.as_ref().map(Vec::as_slice), + &enc.encode() + ) + } + + fn set_worker_status( + gossipping_at: T::BlockNumber, + done: bool, + ) { + let enc = WorkerStatus { + done, + gossipping_at, + }; + sr_io::local_storage_set( + StorageKind::PERSISTENT, DB_KEY, &enc.encode()); + } + + // Checks if a heartbeat gossip already occurred at this block number. + // Returns a tuple of `(current worker status, bool)`, whereby the bool + // is true if not yet gossipped. + fn check_not_yet_gossipped( + now: T::BlockNumber, + next_gossip: T::BlockNumber, + ) -> Result<(Option>, bool), OffchainErr> { + let last_gossip = sr_io::local_storage_get(StorageKind::PERSISTENT, DB_KEY); + match last_gossip { + Some(last) => { + let worker_status: WorkerStatus = Decode::decode(&mut &last[..]) + .map_err(|_| OffchainErr::DecodeWorkerStatus)?; + + let was_aborted = !worker_status.done && worker_status.gossipping_at < now; + + // another off-chain worker is currently in the process of submitting + let already_submitting = + !worker_status.done && worker_status.gossipping_at == now; + + let not_yet_gossipped = + worker_status.done && worker_status.gossipping_at < next_gossip; + + let ret = (was_aborted && !already_submitting) || not_yet_gossipped; + Ok((Some(last), ret)) + }, + None => Ok((None, true)), + } + } + +} + +impl session::OneSessionHandler for Module { + type Key = AuthorityId; + + fn on_new_session<'a, I: 'a>(_changed: bool, _validators: I, next_validators: I) + where I: Iterator + { + // Reset heartbeats + ::remove_prefix(&>::current_index()); + + // Tell the offchain worker to start making the next session's heartbeats. + >::put(>::block_number()); + + // Remember who the authorities are for the new session. + Keys::put(next_validators.map(|x| x.1).collect::>()); + } + + fn on_disabled(_i: usize) { + // ignore + } +} + +impl srml_support::unsigned::ValidateUnsigned for Module { + type Call = Call; + + fn validate_unsigned(call: &Self::Call) -> srml_support::unsigned::TransactionValidity { + if let Call::heartbeat(heartbeat, signature) = call { + if >::is_online_in_current_session(heartbeat.authority_index) { + // we already received a heartbeat for this authority + return TransactionValidity::Invalid(ApplyError::Stale as i8); + } + + // check if session index from heartbeat is recent + let current_session = >::current_index(); + if heartbeat.session_index != current_session { + return TransactionValidity::Invalid(ApplyError::Stale as i8); + } + + // verify that the incoming (unverified) pubkey is actually an authority id + let keys = Keys::get(); + let authority_id = match keys.get(heartbeat.authority_index as usize) { + Some(id) => id, + None => return TransactionValidity::Invalid(ApplyError::BadSignature as i8), + }; + + // check signature (this is expensive so we do it last). + let signature_valid = heartbeat.using_encoded(|encoded_heartbeat| { + authority_id.verify(&encoded_heartbeat, &signature) + }); + + if !signature_valid { + return TransactionValidity::Invalid(ApplyError::BadSignature as i8); + } + + return TransactionValidity::Valid(ValidTransaction { + priority: 0, + requires: vec![], + provides: vec![(current_session, authority_id).encode()], + longevity: TransactionLongevity::max_value(), + propagate: true, + }) + } + + TransactionValidity::Invalid(0) + } +} diff --git a/srml/indices/Cargo.toml b/srml/indices/Cargo.toml index bc67132c86f1dc44531a48c83e25046c2455ad52..3cbf1d88dec9f1e8c88c43b2249519f4336e5fee 100644 --- a/srml/indices/Cargo.toml +++ b/srml/indices/Cargo.toml @@ -7,14 +7,14 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } substrate-keyring = { path = "../../core/keyring", optional = true } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime-io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } -substrate-primitives = { path = "../../core/primitives", default-features = false } [dev-dependencies] ref_thread_local = "0.0" @@ -25,11 +25,11 @@ std = [ "serde", "safe-mix/std", "substrate-keyring", - "parity-codec/std", - "substrate-primitives/std", + "codec/std", + "primitives/std", "rstd/std", "runtime-io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "system/std", ] diff --git a/srml/indices/src/address.rs b/srml/indices/src/address.rs index c76585d2169670f3e1e253f5f29d736458f4e0ea..caef4728fbf3fdb245fd5e099708604c31889bed 100644 --- a/srml/indices/src/address.rs +++ b/srml/indices/src/address.rs @@ -19,7 +19,8 @@ #[cfg(feature = "std")] use std::fmt; use rstd::convert::TryInto; -use crate::{Member, Decode, Encode, Input, Output}; +use crate::Member; +use codec::{Encode, Decode, Input, Output, Error}; /// An indices-aware address, which can be either a direct `AccountId` or /// an index. @@ -54,16 +55,16 @@ impl From for Address(a: T, b: T) -> Option { - if a < b { Some(b) } else { None } +fn need_more_than(a: T, b: T) -> Result { + if a < b { Ok(b) } else { Err("Invalid range".into()) } } impl Decode for Address where AccountId: Member + Decode, AccountIndex: Member + Decode + PartialOrd + Ord + From + Copy, { - fn decode(input: &mut I) -> Option { - Some(match input.read_byte()? { + fn decode(input: &mut I) -> Result { + Ok(match input.read_byte()? { x @ 0x00..=0xef => Address::Index(AccountIndex::from(x as u32)), 0xfc => Address::Index(AccountIndex::from( need_more_than(0xef, u16::decode(input)?)? as u32 @@ -75,7 +76,7 @@ impl Decode for Address where need_more_than(0xffffffffu32.into(), Decode::decode(input)?)? ), 0xff => Address::Id(Decode::decode(input)?), - _ => return None, + _ => return Err("Invalid address variant".into()), }) } } @@ -114,6 +115,11 @@ impl Encode for Address where } } +impl codec::EncodeLike for Address where + AccountId: Member + Encode, + AccountIndex: Member + Encode + PartialOrd + Ord + Copy + From + TryInto, +{} + impl Default for Address where AccountId: Member + Default, AccountIndex: Member, @@ -125,7 +131,7 @@ impl Default for Address where #[cfg(test)] mod tests { - use crate::{Encode, Decode}; + use codec::{Encode, Decode}; type Address = super::Address<[u8; 8], u32>; fn index(i: u32) -> Address { super::Address::Index(i) } @@ -135,7 +141,7 @@ mod tests { if let Some(ref a) = a { assert_eq!(d, &a.encode()[..]); } - assert_eq!(Address::decode(&mut &d[..]), a); + assert_eq!(Address::decode(&mut &d[..]).ok(), a); } #[test] diff --git a/srml/indices/src/lib.rs b/srml/indices/src/lib.rs index cbb2079fc824f8e79e0ce1cff0c3e44da63af4f6..8d4dda5abe87c72e5f9534a451d39669cdb836ab 100644 --- a/srml/indices/src/lib.rs +++ b/srml/indices/src/lib.rs @@ -20,9 +20,9 @@ #![cfg_attr(not(feature = "std"), no_std)] use rstd::{prelude::*, result, marker::PhantomData, convert::TryInto}; -use parity_codec::{Encode, Decode, Codec, Input, Output}; +use codec::{Encode, Codec}; use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage}; -use primitives::traits::{One, SimpleArithmetic, StaticLookup, Member}; +use sr_primitives::traits::{One, SimpleArithmetic, StaticLookup, Member}; use system::{IsDeadAccount, OnNewAccount}; use self::address::Address as RawAddress; diff --git a/srml/indices/src/mock.rs b/srml/indices/src/mock.rs index 53e8f314c94bbfa46d4e9d65bc66ca9daa1bb8c2..50b38eae28f91b5992c67a4159509fb211f9363c 100644 --- a/srml/indices/src/mock.rs +++ b/srml/indices/src/mock.rs @@ -20,8 +20,9 @@ use std::collections::HashSet; use ref_thread_local::{ref_thread_local, RefThreadLocal}; -use primitives::testing::Header; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::testing::Header; +use sr_primitives::Perbill; +use primitives::{H256, Blake2Hasher}; use srml_support::{impl_outer_origin, parameter_types}; use {runtime_io, system}; use crate::{GenesisConfig, Module, Trait, IsDeadAccount, OnNewAccount, ResolveHint}; @@ -66,18 +67,26 @@ impl ResolveHint for TestResolveHint { pub struct Runtime; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Runtime { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; + type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = u64; type Lookup = Indices; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl Trait for Runtime { type AccountIndex = u64; @@ -93,10 +102,10 @@ pub fn new_test_ext() -> runtime_io::TestExternalities { for i in 1..5 { h.insert(i); } } - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(GenesisConfig:: { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + GenesisConfig:: { ids: vec![1, 2, 3, 4] - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/srml/membership/Cargo.toml b/srml/membership/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..5126f41f8929aa52fbda89f8b8ce78ee056fd729 --- /dev/null +++ b/srml/membership/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "srml-membership" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +serde = { version = "1.0", optional = true } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false } +sr-std = { path = "../../core/sr-std", default-features = false } +sr-io = { path = "../../core/sr-io", default-features = false } +srml-support = { path = "../support", default-features = false } +system = { package = "srml-system", path = "../system", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } + +[dev-dependencies] +primitives = { package = "substrate-primitives", path = "../../core/primitives" } + +[features] +default = ["std"] +std = [ + "serde", + "codec/std", + "sr-primitives/std", + "sr-std/std", + "sr-io/std", + "srml-support/std", + "system/std", +] diff --git a/srml/membership/src/lib.rs b/srml/membership/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..f56a0ca0420a4febee1be3f7ba5196c875d4e9aa --- /dev/null +++ b/srml/membership/src/lib.rs @@ -0,0 +1,347 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! # Membership Module +//! +//! Allows control of membership of a set of `AccountId`s, useful for managing membership of of a +//! collective. + +// Ensure we're `no_std` when compiling for Wasm. +#![cfg_attr(not(feature = "std"), no_std)] + +use sr_std::prelude::*; +use srml_support::{ + StorageValue, decl_module, decl_storage, decl_event, + traits::{ChangeMembers} +}; +use system::ensure_root; +use sr_primitives::{traits::EnsureOrigin, weights::SimpleDispatchInfo}; + +pub trait Trait: system::Trait { + /// The overarching event type. + type Event: From> + Into<::Event>; + + /// Required origin for adding a member (though can always be Root). + type AddOrigin: EnsureOrigin; + + /// Required origin for removing a member (though can always be Root). + type RemoveOrigin: EnsureOrigin; + + /// Required origin for adding and removing a member in a single action. + type SwapOrigin: EnsureOrigin; + + /// Required origin for resetting membership. + type ResetOrigin: EnsureOrigin; + + /// The receiver of the signal for when the membership has been initialized. This happens pre- + /// genesis and will usually be the same as `MembershipChanged`. If you need to do something + /// different on initialization, then you can change this accordingly. + type MembershipInitialized: ChangeMembers; + + /// The receiver of the signal for when the membership has changed. + type MembershipChanged: ChangeMembers; +} + +decl_storage! { + trait Store for Module, I: Instance=DefaultInstance> as Membership { + /// The current membership, stored as an ordered Vec. + Members get(members): Vec; + } + add_extra_genesis { + config(members): Vec; + config(phantom): sr_std::marker::PhantomData; + build(| + storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay), + config: &GenesisConfig + | { + sr_io::with_storage(storage, || { + let mut members = config.members.clone(); + members.sort(); + T::MembershipInitialized::set_members_sorted(&members[..], &[]); + >::put(members); + }); + }) + } +} + +decl_event!( + pub enum Event where + ::AccountId, + >::Event, + { + /// The given member was added; see the transaction for who. + MemberAdded, + /// The given member was removed; see the transaction for who. + MemberRemoved, + /// Two members were swapped; see the transaction for who. + MembersSwapped, + /// The membership was reset; see the transaction for who the new set is. + MembersReset, + /// Phantom member, never used. + Dummy(sr_std::marker::PhantomData<(AccountId, Event)>), + } +); + +decl_module! { + pub struct Module, I: Instance=DefaultInstance> + for enum Call + where origin: T::Origin + { + fn deposit_event() = default; + + /// Add a member `who` to the set. + /// + /// May only be called from `AddOrigin` or root. + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn add_member(origin, who: T::AccountId) { + T::AddOrigin::try_origin(origin) + .map(|_| ()) + .or_else(ensure_root) + .map_err(|_| "bad origin")?; + + let mut members = >::get(); + let location = members.binary_search(&who).err().ok_or("already a member")?; + members.insert(location, who.clone()); + >::put(&members); + + T::MembershipChanged::change_members_sorted(&[who], &[], &members[..]); + + Self::deposit_event(RawEvent::MemberAdded); + } + + /// Remove a member `who` from the set. + /// + /// May only be called from `RemoveOrigin` or root. + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn remove_member(origin, who: T::AccountId) { + T::RemoveOrigin::try_origin(origin) + .map(|_| ()) + .or_else(ensure_root) + .map_err(|_| "bad origin")?; + + let mut members = >::get(); + let location = members.binary_search(&who).ok().ok_or("not a member")?; + members.remove(location); + >::put(&members); + + T::MembershipChanged::change_members_sorted(&[], &[who], &members[..]); + + Self::deposit_event(RawEvent::MemberRemoved); + } + + /// Swap out one member `remove` for another `add`. + /// + /// May only be called from `SwapOrigin` or root. + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn swap_member(origin, remove: T::AccountId, add: T::AccountId) { + T::SwapOrigin::try_origin(origin) + .map(|_| ()) + .or_else(ensure_root) + .map_err(|_| "bad origin")?; + + if remove == add { return Ok(()) } + + let mut members = >::get(); + let location = members.binary_search(&remove).ok().ok_or("not a member")?; + members[location] = add.clone(); + let _location = members.binary_search(&add).err().ok_or("already a member")?; + members.sort(); + >::put(&members); + + T::MembershipChanged::change_members_sorted( + &[add], + &[remove], + &members[..], + ); + + Self::deposit_event(RawEvent::MembersSwapped); + } + + /// Change the membership to a new set, disregarding the existing membership. Be nice and + /// pass `members` pre-sorted. + /// + /// May only be called from `ResetOrigin` or root. + #[weight = SimpleDispatchInfo::FixedNormal(50_000)] + fn reset_members(origin, members: Vec) { + T::ResetOrigin::try_origin(origin) + .map(|_| ()) + .or_else(ensure_root) + .map_err(|_| "bad origin")?; + + let mut members = members; + members.sort(); + >::mutate(|m| { + T::MembershipChanged::set_members_sorted(&members[..], m); + *m = members; + }); + + Self::deposit_event(RawEvent::MembersReset); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::cell::RefCell; + use srml_support::{assert_ok, assert_noop, impl_outer_origin, parameter_types}; + use sr_io::with_externalities; + use primitives::{H256, Blake2Hasher}; + // The testing primitives are very useful for avoiding having to work with signatures + // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. + use sr_primitives::{ + Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header + }; + use system::EnsureSignedBy; + + impl_outer_origin! { + pub enum Origin for Test {} + } + + // For testing the module, we construct most of a mock runtime. This means + // first constructing a configuration type (`Test`) which `impl`s each of the + // configuration traits of modules we want to use. + #[derive(Clone, Eq, PartialEq)] + pub struct Test; + parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); + } + impl system::Trait for Test { + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Call = (); + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type WeightMultiplierUpdate = (); + type Event = (); + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + } + parameter_types! { + pub const One: u64 = 1; + pub const Two: u64 = 2; + pub const Three: u64 = 3; + pub const Four: u64 = 4; + pub const Five: u64 = 5; + } + + thread_local! { + static MEMBERS: RefCell> = RefCell::new(vec![]); + } + + pub struct TestChangeMembers; + impl ChangeMembers for TestChangeMembers { + fn change_members_sorted(incoming: &[u64], outgoing: &[u64], new: &[u64]) { + let mut old_plus_incoming = MEMBERS.with(|m| m.borrow().to_vec()); + old_plus_incoming.extend_from_slice(incoming); + old_plus_incoming.sort(); + let mut new_plus_outgoing = new.to_vec(); + new_plus_outgoing.extend_from_slice(outgoing); + new_plus_outgoing.sort(); + assert_eq!(old_plus_incoming, new_plus_outgoing); + + MEMBERS.with(|m| *m.borrow_mut() = new.to_vec()); + } + } + + impl Trait for Test { + type Event = (); + type AddOrigin = EnsureSignedBy; + type RemoveOrigin = EnsureSignedBy; + type SwapOrigin = EnsureSignedBy; + type ResetOrigin = EnsureSignedBy; + type MembershipInitialized = TestChangeMembers; + type MembershipChanged = TestChangeMembers; + } + + type Membership = Module; + + // This function basically just builds a genesis storage key/value store according to + // our desired mockup. + fn new_test_ext() -> sr_io::TestExternalities { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + // We use default for brevity, but you can configure as desired if needed. + GenesisConfig::{ + members: vec![10, 20, 30], + .. Default::default() + }.assimilate_storage(&mut t).unwrap(); + t.into() + } + + #[test] + fn query_membership_works() { + with_externalities(&mut new_test_ext(), || { + assert_eq!(Membership::members(), vec![10, 20, 30]); + assert_eq!(MEMBERS.with(|m| m.borrow().clone()), vec![10, 20, 30]); + }); + } + + #[test] + fn add_member_works() { + with_externalities(&mut new_test_ext(), || { + assert_noop!(Membership::add_member(Origin::signed(5), 15), "bad origin"); + assert_noop!(Membership::add_member(Origin::signed(1), 10), "already a member"); + assert_ok!(Membership::add_member(Origin::signed(1), 15)); + assert_eq!(Membership::members(), vec![10, 15, 20, 30]); + assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); + }); + } + + #[test] + fn remove_member_works() { + with_externalities(&mut new_test_ext(), || { + assert_noop!(Membership::remove_member(Origin::signed(5), 20), "bad origin"); + assert_noop!(Membership::remove_member(Origin::signed(2), 15), "not a member"); + assert_ok!(Membership::remove_member(Origin::signed(2), 20)); + assert_eq!(Membership::members(), vec![10, 30]); + assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); + }); + } + + #[test] + fn swap_member_works() { + with_externalities(&mut new_test_ext(), || { + assert_noop!(Membership::swap_member(Origin::signed(5), 10, 25), "bad origin"); + assert_noop!(Membership::swap_member(Origin::signed(3), 15, 25), "not a member"); + assert_noop!(Membership::swap_member(Origin::signed(3), 10, 30), "already a member"); + assert_ok!(Membership::swap_member(Origin::signed(3), 20, 20)); + assert_eq!(Membership::members(), vec![10, 20, 30]); + assert_ok!(Membership::swap_member(Origin::signed(3), 10, 25)); + assert_eq!(Membership::members(), vec![20, 25, 30]); + assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); + }); + } + + #[test] + fn reset_members_works() { + with_externalities(&mut new_test_ext(), || { + assert_noop!(Membership::reset_members(Origin::signed(1), vec![20, 40, 30]), "bad origin"); + assert_ok!(Membership::reset_members(Origin::signed(4), vec![20, 40, 30])); + assert_eq!(Membership::members(), vec![20, 30, 40]); + assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members()); + }); + } +} diff --git a/srml/metadata/Cargo.toml b/srml/metadata/Cargo.toml index cdb7a41ff860dea57de64ac4bc12e4b00390b5d5..9fc9c6e46d5dbfaa1dbbf4a1a350a2d3d0ef9825 100644 --- a/srml/metadata/Cargo.toml +++ b/srml/metadata/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0", optional = true, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } @@ -13,7 +13,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives", [features] default = ["std"] std = [ - "parity-codec/std", + "codec/std", "rstd/std", "primitives/std", "serde", diff --git a/srml/metadata/src/lib.rs b/srml/metadata/src/lib.rs index fca2a1cfdcf0d5162a0bfe9d263dc987460ca73d..bf7c379000d760cffb39c950c0fc6eace93e2934 100644 --- a/srml/metadata/src/lib.rs +++ b/srml/metadata/src/lib.rs @@ -25,8 +25,8 @@ #[cfg(feature = "std")] use serde::Serialize; #[cfg(feature = "std")] -use parity_codec::{Decode, Input}; -use parity_codec::{Encode, Output}; +use codec::{Decode, Input, Error}; +use codec::{Encode, Output}; use rstd::vec::Vec; #[cfg(feature = "std")] @@ -59,11 +59,13 @@ impl Encode for DecodeDifferent where B: Encode + 'static, O: Encode } } +impl codec::EncodeLike for DecodeDifferent where B: Encode + 'static, O: Encode + 'static {} + #[cfg(feature = "std")] impl Decode for DecodeDifferent where B: 'static, O: Decode + 'static { - fn decode(input: &mut I) -> Option { - ::decode(input).and_then(|val| { - Some(DecodeDifferent::Decoded(val)) + fn decode(input: &mut I) -> Result { + ::decode(input).map(|val| { + DecodeDifferent::Decoded(val) }) } } @@ -144,6 +146,8 @@ impl Encode for FnEncode { } } +impl codec::EncodeLike for FnEncode {} + impl PartialEq for FnEncode { fn eq(&self, other: &Self) -> bool { self.0().eq(&other.0()) @@ -206,7 +210,7 @@ pub struct ModuleConstantMetadata { } /// A technical trait to store lazy initiated vec value as static dyn pointer. -pub trait DefaultByte { +pub trait DefaultByte: Send + Sync { fn default_byte(&self) -> Vec; } @@ -223,6 +227,8 @@ impl Encode for DefaultByteGetter { } } +impl codec::EncodeLike for DefaultByteGetter {} + impl PartialEq for DefaultByteGetter { fn eq(&self, other: &DefaultByteGetter) -> bool { let left = self.0.default_byte(); @@ -286,6 +292,15 @@ pub enum StorageEntryModifier { Default, } +/// All metadata of the storage. +#[derive(Clone, PartialEq, Eq, Encode)] +#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] +pub struct StorageMetadata { + /// The common prefix used by all storage entries. + pub prefix: DecodeDifferent<&'static str, StringBuf>, + pub entries: DecodeDifferent<&'static [StorageEntryMetadata], Vec>, +} + #[derive(Eq, Encode, PartialEq)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] /// Metadata prefixed by a u32 for reserved usage @@ -309,8 +324,10 @@ pub enum RuntimeMetadata { V4(RuntimeMetadataDeprecated), /// Version 5 for runtime metadata. No longer used. V5(RuntimeMetadataDeprecated), - /// Version 6 for runtime metadata. - V6(RuntimeMetadataV6), + /// Version 6 for runtime metadata. No longer used. + V6(RuntimeMetadataDeprecated), + /// Version 7 for runtime metadata. + V7(RuntimeMetadataV7), } /// Enum that should fail. @@ -322,27 +339,31 @@ impl Encode for RuntimeMetadataDeprecated { fn encode_to(&self, _dest: &mut W) {} } +impl codec::EncodeLike for RuntimeMetadataDeprecated {} + #[cfg(feature = "std")] impl Decode for RuntimeMetadataDeprecated { - fn decode(_input: &mut I) -> Option { - unimplemented!() + fn decode(_input: &mut I) -> Result { + Err("Decoding is not supported".into()) } } /// The metadata of a runtime. #[derive(Eq, Encode, PartialEq)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] -pub struct RuntimeMetadataV6 { +pub struct RuntimeMetadataV7 { pub modules: DecodeDifferentArray, } +/// The latest version of the metadata. +pub type RuntimeMetadataLastVersion = RuntimeMetadataV7; + /// All metadata about an runtime module. #[derive(Clone, PartialEq, Eq, Encode)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] pub struct ModuleMetadata { pub name: DecodeDifferentStr, - pub prefix: DecodeDifferent, StringBuf>, - pub storage: ODFnA, + pub storage: Option, StorageMetadata>>, pub calls: ODFnA, pub event: ODFnA, pub constants: DFnA, @@ -357,8 +378,8 @@ impl Into for RuntimeMetadataPrefixed { } } -impl Into for RuntimeMetadata { +impl Into for RuntimeMetadataLastVersion { fn into(self) -> RuntimeMetadataPrefixed { - RuntimeMetadataPrefixed(META_RESERVED, self) + RuntimeMetadataPrefixed(META_RESERVED, RuntimeMetadata::V7(self)) } } diff --git a/srml/session/Cargo.toml b/srml/session/Cargo.toml index 51b613497f47a373a7414d8825914bb27f38c666..d084ab4261b3cbd977872191589173d72c12573b 100644 --- a/srml/session/Cargo.toml +++ b/srml/session/Cargo.toml @@ -7,9 +7,9 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } @@ -17,7 +17,8 @@ substrate-trie = { path = "../../core/trie", default-features = false, optional runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } +app-crypto = { package = "substrate-application-crypto", path = "../../core/application-crypto" } lazy_static = "1.0" [features] @@ -26,10 +27,10 @@ historical = ["substrate-trie"] std = [ "serde", "safe-mix/std", - "parity-codec/std", + "codec/std", "rstd/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "timestamp/std", "substrate-trie/std" ] diff --git a/srml/session/src/historical.rs b/srml/session/src/historical.rs index c6755c3ba3592a10c7eaf9dca2e9e33ddf7f8b08..c0ffdeb464eb390f725a95fe3152efc4761b9a6e 100644 --- a/srml/session/src/historical.rs +++ b/srml/session/src/historical.rs @@ -26,15 +26,15 @@ //! Afterwards, the proofs can be fed to a consensus module when reporting misbehavior. use rstd::prelude::*; -use parity_codec::{Encode, Decode}; -use primitives::KeyTypeId; -use primitives::traits::{Convert, OpaqueKeys, Hash as HashT}; +use codec::{Encode, Decode}; +use sr_primitives::KeyTypeId; +use sr_primitives::traits::{Convert, OpaqueKeys, Hash as HashT}; use srml_support::{ StorageValue, StorageMap, decl_module, decl_storage, }; use srml_support::{Parameter, print}; -use substrate_trie::{MemoryDB, Trie, TrieMut, TrieDBMut, TrieDB, Recorder}; - +use substrate_trie::{MemoryDB, Trie, TrieMut, Recorder, EMPTY_PREFIX}; +use substrate_trie::trie_types::{TrieDBMut, TrieDB}; use super::{SessionIndex, Module as SessionModule}; /// Trait necessary for the historical module. @@ -100,9 +100,9 @@ impl Module { /// Specialization of the crate-level `OnSessionEnding` which returns the old /// set of full identification when changing the validator set. pub trait OnSessionEnding: crate::OnSessionEnding { - /// Returns the set of new validators, if any, along with the old validators - /// and their full identifications. - fn on_session_ending(ending: SessionIndex, applied_at: SessionIndex) + /// If there was a validator set change, its returns the set of new validators along with the + /// old validators and their full identifications. + fn on_session_ending(ending: SessionIndex, will_apply_at: SessionIndex) -> Option<(Vec, Vec<(ValidatorId, FullIdentification)>)>; } @@ -219,7 +219,7 @@ impl ProvingTrie { let mut memory_db = MemoryDB::default(); for node in nodes { - HashDBT::insert(&mut memory_db, &[], &node[..]); + HashDBT::insert(&mut memory_db, EMPTY_PREFIX, &node[..]); } ProvingTrie { @@ -235,13 +235,13 @@ impl ProvingTrie { let val_idx = (key_id, key_data).using_encoded(|s| { trie.get_with(s, &mut recorder) .ok()? - .and_then(|raw| u32::decode(&mut &*raw)) + .and_then(|raw| u32::decode(&mut &*raw).ok()) })?; val_idx.using_encoded(|s| { trie.get_with(s, &mut recorder) .ok()? - .and_then(|raw| >::decode(&mut &*raw)) + .and_then(|raw| >::decode(&mut &*raw).ok()) })?; Some(recorder.drain().into_iter().map(|r| r.data).collect()) @@ -258,11 +258,11 @@ impl ProvingTrie { let trie = TrieDB::new(&self.db, &self.root).ok()?; let val_idx = (key_id, key_data).using_encoded(|s| trie.get(s)) .ok()? - .and_then(|raw| u32::decode(&mut &*raw))?; + .and_then(|raw| u32::decode(&mut &*raw).ok())?; val_idx.using_encoded(|s| trie.get(s)) .ok()? - .and_then(|raw| >::decode(&mut &*raw)) + .and_then(|raw| >::decode(&mut &*raw).ok()) } } @@ -312,11 +312,8 @@ impl> srml_support::traits::KeyOwnerProofSystem<(KeyTyp mod tests { use super::*; use runtime_io::with_externalities; - use substrate_primitives::Blake2Hasher; - use primitives::{ - traits::OnInitialize, - testing::{UintAuthorityId, UINT_DUMMY_KEY}, - }; + use primitives::{Blake2Hasher, crypto::key_types::DUMMY}; + use sr_primitives::{traits::OnInitialize, testing::UintAuthorityId}; use crate::mock::{ NEXT_VALIDATORS, force_new_session, set_next_validators, Test, System, Session, @@ -326,13 +323,12 @@ mod tests { type Historical = Module; fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - let (storage, _child_storage) = crate::GenesisConfig:: { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + crate::GenesisConfig:: { keys: NEXT_VALIDATORS.with(|l| - l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i))).collect() + l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i).into())).collect() ), - }.build_storage().unwrap(); - t.extend(storage); + }.assimilate_storage(&mut t).unwrap(); runtime_io::TestExternalities::new(t) } @@ -346,15 +342,10 @@ mod tests { Session::on_initialize(1); let encoded_key_1 = UintAuthorityId(1).encode(); - let proof = Historical::prove((UINT_DUMMY_KEY, &encoded_key_1[..])).unwrap(); + let proof = Historical::prove((DUMMY, &encoded_key_1[..])).unwrap(); // proof-checking in the same session is OK. - assert!( - Historical::check_proof( - (UINT_DUMMY_KEY, &encoded_key_1[..]), - proof.clone(), - ).is_some() - ); + assert!(Historical::check_proof((DUMMY, &encoded_key_1[..]), proof.clone()).is_some()); set_next_validators(vec![1, 2, 4]); force_new_session(); @@ -370,12 +361,7 @@ mod tests { assert!(Session::current_index() > proof.session); // proof-checking in the next session is also OK. - assert!( - Historical::check_proof( - (UINT_DUMMY_KEY, &encoded_key_1[..]), - proof.clone(), - ).is_some() - ); + assert!(Historical::check_proof((DUMMY, &encoded_key_1[..]), proof.clone()).is_some()); set_next_validators(vec![1, 2, 5]); diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index 546513c953afb28bc7de5977dab6d9c59be31688..53c5c9b394f8b39e4c0b65bbc356bc2222eaac5d 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -120,14 +120,13 @@ #![cfg_attr(not(feature = "std"), no_std)] use rstd::{prelude::*, marker::PhantomData, ops::{Sub, Rem}}; -use parity_codec::{Decode, Encode}; -use primitives::KeyTypeId; -use primitives::traits::{Convert, Zero, Member, OpaqueKeys, TypedKey, Hash}; +use codec::Decode; +use sr_primitives::{KeyTypeId, AppKey}; +use sr_primitives::weights::SimpleDispatchInfo; +use sr_primitives::traits::{Convert, Zero, Member, OpaqueKeys}; use srml_support::{ - dispatch::Result, - storage, - ConsensusEngineId, StorageValue, for_each_tuple, decl_module, - decl_event, decl_storage, + dispatch::Result, ConsensusEngineId, StorageValue, StorageDoubleMap, for_each_tuple, + decl_module, decl_event, decl_storage, }; use srml_support::{ensure, traits::{OnFreeBalanceZero, Get, FindAuthor}, Parameter}; use system::{self, ensure_signed}; @@ -173,10 +172,13 @@ pub trait OnSessionEnding { /// Handle the fact that the session is ending, and optionally provide the new validator set. /// /// `ending_index` is the index of the currently ending session. - /// The returned validator set, if any, will not be applied until `next_index`. - /// `next_index` is guaranteed to be at least `ending_index + 1`, since session indices don't - /// repeat. - fn on_session_ending(ending_index: SessionIndex, next_index: SessionIndex) -> Option>; + /// The returned validator set, if any, will not be applied until `will_apply_at`. + /// `will_apply_at` is guaranteed to be at least `ending_index + 1`, since session indices don't + /// repeat, but it could be some time after in case we are staging authority set changes. + fn on_session_ending( + ending_index: SessionIndex, + will_apply_at: SessionIndex + ) -> Option>; } impl OnSessionEnding for () { @@ -186,7 +188,11 @@ impl OnSessionEnding for () { /// Handler for when a session keys set changes. pub trait SessionHandler { /// Session set has changed; act appropriately. - fn on_new_session(changed: bool, validators: &[(ValidatorId, Ks)]); + fn on_new_session( + changed: bool, + validators: &[(ValidatorId, Ks)], + queued_validators: &[(ValidatorId, Ks)], + ); /// A validator got disabled. Act accordingly until a new session begins. fn on_disabled(validator_index: usize); @@ -195,9 +201,9 @@ pub trait SessionHandler { /// One session-key type handler. pub trait OneSessionHandler { /// The key type expected. - type Key: Decode + Default + TypedKey; + type Key: Decode + Default + AppKey; - fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + fn on_new_session<'a, I: 'a>(changed: bool, validators: I, queued_validators: I) where I: Iterator, ValidatorId: 'a; fn on_disabled(i: usize); } @@ -205,19 +211,26 @@ pub trait OneSessionHandler { macro_rules! impl_session_handlers { () => ( impl SessionHandler for () { - fn on_new_session(_: bool, _: &[(AId, Ks)]) {} + fn on_new_session(_: bool, _: &[(AId, Ks)], _: &[(AId, Ks)]) {} fn on_disabled(_: usize) {} } ); ( $($t:ident)* ) => { impl ),*> SessionHandler for ( $( $t , )* ) { - fn on_new_session(changed: bool, validators: &[(AId, Ks)]) { + fn on_new_session( + changed: bool, + validators: &[(AId, Ks)], + queued_validators: &[(AId, Ks)], + ) { $( - let our_keys = validators.iter() - .map(|k| (&k.0, k.1.get::<$t::Key>(<$t::Key as TypedKey>::KEY_TYPE) - .unwrap_or_default())); - $t::on_new_session(changed, our_keys); + let our_keys: Box> = Box::new(validators.iter() + .map(|k| (&k.0, k.1.get::<$t::Key>(<$t::Key as AppKey>::ID) + .unwrap_or_default()))); + let queued_keys: Box> = Box::new(queued_validators.iter() + .map(|k| (&k.0, k.1.get::<$t::Key>(<$t::Key as AppKey>::ID) + .unwrap_or_default()))); + $t::on_new_session(changed, our_keys, queued_keys); )* } fn on_disabled(i: usize) { @@ -272,8 +285,7 @@ pub trait Trait: system::Trait { type SelectInitialValidators: SelectInitialValidators; } -const DEDUP_KEY_LEN: usize = 13; -const DEDUP_KEY_PREFIX: &[u8; DEDUP_KEY_LEN] = b":session:keys"; +const DEDUP_KEY_PREFIX: &[u8] = b":session:keys"; decl_storage! { trait Store for Module as Session { @@ -293,12 +305,22 @@ decl_storage! { /// will be used to determine the validator's session keys. QueuedKeys get(queued_keys): Vec<(T::ValidatorId, T::Keys)>; + /// The next session keys for a validator. + /// + /// The first key is always `DEDUP_KEY_PREFIX` to have all the data in the same branch of + /// the trie. Having all data in the same branch should prevent slowing down other queries. + NextKeys: double_map hasher(twox_64_concat) Vec, blake2_256(T::ValidatorId) => Option; + + /// The owner of a key. The second key is the `KeyTypeId` + the encoded key. + /// + /// The first key is always `DEDUP_KEY_PREFIX` to have all the data in the same branch of + /// the trie. Having all data in the same branch should prevent slowing down other queries. + KeyOwner: double_map hasher(twox_64_concat) Vec, blake2_256((KeyTypeId, Vec)) => Option; } add_extra_genesis { config(keys): Vec<(T::ValidatorId, T::Keys)>; build(| - storage: &mut primitives::StorageOverlay, - _: &mut primitives::ChildrenStorageOverlay, + storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay), config: &GenesisConfig | { runtime_io::with_storage(storage, || { @@ -343,6 +365,10 @@ decl_event!( decl_module! { pub struct Module for enum Call where origin: T::Origin { + /// Used as first key for `NextKeys` and `KeyOwner` to put all the data into the same branch + /// of the trie. + const DEDUP_KEY_PREFIX: &[u8] = DEDUP_KEY_PREFIX; + fn deposit_event() = default; /// Sets the session key(s) of the function caller to `key`. @@ -355,6 +381,7 @@ decl_module! { /// - O(log n) in number of accounts. /// - One extra DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(150_000)] fn set_keys(origin, keys: T::Keys, proof: Vec) -> Result { let who = ensure_signed(origin)?; @@ -420,14 +447,14 @@ impl Module { .map(|a| { let k = Self::load_keys(&a).unwrap_or_default(); (a, k) }) .collect::>(); - >::put(queued_amalgamated); + >::put(queued_amalgamated.clone()); QueuedChanged::put(next_changed); // Record that this happened. Self::deposit_event(Event::NewSession(session_index)); // Tell everyone about the new session keys. - T::SessionHandler::on_new_session::(changed, &session_keys); + T::SessionHandler::on_new_session::(changed, &session_keys, &queued_amalgamated); } /// Disable the validator of index `i`. @@ -483,47 +510,31 @@ impl Module { } } - // Child trie storage. - fn load_keys(v: &T::ValidatorId) -> Option { - storage::unhashed::get(&dedup_trie_key::(v)) + >::get(DEDUP_KEY_PREFIX, v) } fn take_keys(v: &T::ValidatorId) -> Option { - storage::unhashed::take(&dedup_trie_key::(v)) + >::take(DEDUP_KEY_PREFIX, v) } fn put_keys(v: &T::ValidatorId, keys: &T::Keys) { - storage::unhashed::put(&dedup_trie_key::(v), keys) + >::insert(DEDUP_KEY_PREFIX, v, keys); } fn key_owner(id: KeyTypeId, key_data: &[u8]) -> Option { - storage::unhashed::get(&dedup_trie_key::(&(id, key_data))) + >::get(DEDUP_KEY_PREFIX, &(id, key_data.to_vec())) } fn put_key_owner(id: KeyTypeId, key_data: &[u8], v: &T::ValidatorId) { - storage::unhashed::put(&dedup_trie_key::(&(id, key_data)), v); + >::insert(DEDUP_KEY_PREFIX, &(id, key_data.to_vec()), v) } fn clear_key_owner(id: KeyTypeId, key_data: &[u8]) { - storage::unhashed::kill(&dedup_trie_key::(&(id, key_data))); + >::remove(DEDUP_KEY_PREFIX, &(id, key_data.to_vec())); } } -fn dedup_trie_key(key: &K) -> [u8; 32 + DEDUP_KEY_LEN] { - key.using_encoded(|s| { - // take at most 32 bytes from the hash of the value. - let hash = ::Hashing::hash(s); - let hash: &[u8] = hash.as_ref(); - let len = rstd::cmp::min(hash.len(), 32); - - let mut data = [0; 32 + DEDUP_KEY_LEN]; - data[..DEDUP_KEY_LEN].copy_from_slice(DEDUP_KEY_PREFIX); - data[DEDUP_KEY_LEN..][..len].copy_from_slice(hash); - data - }) -} - impl OnFreeBalanceZero for Module { fn on_free_balance_zero(who: &T::ValidatorId) { Self::prune_dead_keys(who); @@ -553,8 +564,8 @@ mod tests { use super::*; use srml_support::assert_ok; use runtime_io::with_externalities; - use substrate_primitives::Blake2Hasher; - use primitives::{ + use primitives::{Blake2Hasher, crypto::key_types::DUMMY}; + use sr_primitives::{ traits::OnInitialize, testing::UintAuthorityId, }; @@ -567,10 +578,10 @@ mod tests { let mut t = system::GenesisConfig::default().build_storage::().unwrap(); GenesisConfig:: { keys: NEXT_VALIDATORS.with(|l| - l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i))).collect() + l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i).into())).collect() ), - }.assimilate_storage(&mut t.0, &mut t.1).unwrap(); - runtime_io::TestExternalities::new_with_children(t) + }.assimilate_storage(&mut t).unwrap(); + runtime_io::TestExternalities::new(t) } fn initialize_block(block: u64) { @@ -590,8 +601,8 @@ mod tests { #[test] fn put_get_keys() { with_externalities(&mut new_test_ext(), || { - Session::put_keys(&10, &UintAuthorityId(10)); - assert_eq!(Session::load_keys(&10), Some(UintAuthorityId(10))); + Session::put_keys(&10, &UintAuthorityId(10).into()); + assert_eq!(Session::load_keys(&10), Some(UintAuthorityId(10).into())); }) } @@ -600,9 +611,9 @@ mod tests { let mut ext = new_test_ext(); with_externalities(&mut ext, || { assert_eq!(Session::validators(), vec![1, 2, 3]); - assert_eq!(Session::load_keys(&1), Some(UintAuthorityId(1))); + assert_eq!(Session::load_keys(&1), Some(UintAuthorityId(1).into())); - let id = ::KEY_TYPE; + let id = DUMMY; assert_eq!(Session::key_owner(id, UintAuthorityId(1).get_raw(id)), Some(1)); Session::on_free_balance_zero(&1); @@ -620,8 +631,8 @@ mod tests { force_new_session(); initialize_block(1); assert_eq!(Session::queued_keys(), vec![ - (1, UintAuthorityId(1)), - (2, UintAuthorityId(2)), + (1, UintAuthorityId(1).into()), + (2, UintAuthorityId(2).into()), ]); assert_eq!(Session::validators(), vec![1, 2, 3]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]); @@ -629,20 +640,20 @@ mod tests { force_new_session(); initialize_block(2); assert_eq!(Session::queued_keys(), vec![ - (1, UintAuthorityId(1)), - (2, UintAuthorityId(2)), + (1, UintAuthorityId(1).into()), + (2, UintAuthorityId(2).into()), ]); assert_eq!(Session::validators(), vec![1, 2]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2)]); set_next_validators(vec![1, 2, 4]); - assert_ok!(Session::set_keys(Origin::signed(4), UintAuthorityId(4), vec![])); + assert_ok!(Session::set_keys(Origin::signed(4), UintAuthorityId(4).into(), vec![])); force_new_session(); initialize_block(3); assert_eq!(Session::queued_keys(), vec![ - (1, UintAuthorityId(1)), - (2, UintAuthorityId(2)), - (4, UintAuthorityId(4)), + (1, UintAuthorityId(1).into()), + (2, UintAuthorityId(2).into()), + (4, UintAuthorityId(4).into()), ]); assert_eq!(Session::validators(), vec![1, 2]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2)]); @@ -650,9 +661,9 @@ mod tests { force_new_session(); initialize_block(4); assert_eq!(Session::queued_keys(), vec![ - (1, UintAuthorityId(1)), - (2, UintAuthorityId(2)), - (4, UintAuthorityId(4)), + (1, UintAuthorityId(1).into()), + (2, UintAuthorityId(2).into()), + (4, UintAuthorityId(4).into()), ]); assert_eq!(Session::validators(), vec![1, 2, 4]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(4)]); @@ -695,7 +706,7 @@ mod tests { // Block 3: Set new key for validator 2; no visible change. initialize_block(3); - assert_ok!(Session::set_keys(Origin::signed(2), UintAuthorityId(5), vec![])); + assert_ok!(Session::set_keys(Origin::signed(2), UintAuthorityId(5).into(), vec![])); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]); // Block 4: Session rollover; no visible change. @@ -717,11 +728,11 @@ mod tests { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); Session::on_initialize(1); - assert!(Session::set_keys(Origin::signed(4), UintAuthorityId(1), vec![]).is_err()); - assert!(Session::set_keys(Origin::signed(1), UintAuthorityId(10), vec![]).is_ok()); + assert!(Session::set_keys(Origin::signed(4), UintAuthorityId(1).into(), vec![]).is_err()); + assert!(Session::set_keys(Origin::signed(1), UintAuthorityId(10).into(), vec![]).is_ok()); // is fine now that 1 has migrated off. - assert!(Session::set_keys(Origin::signed(4), UintAuthorityId(1), vec![]).is_ok()); + assert!(Session::set_keys(Origin::signed(4), UintAuthorityId(1).into(), vec![]).is_ok()); }); } @@ -751,7 +762,7 @@ mod tests { initialize_block(5); assert!(!session_changed()); - assert_ok!(Session::set_keys(Origin::signed(2), UintAuthorityId(5), vec![])); + assert_ok!(Session::set_keys(Origin::signed(2), UintAuthorityId(5).into(), vec![])); force_new_session(); initialize_block(6); assert!(!session_changed()); @@ -790,4 +801,18 @@ mod tests { assert!(P::should_end_session(13)); } + + #[test] + fn session_keys_generate_output_works_as_set_keys_input() { + with_externalities(&mut new_test_ext(), || { + let new_keys = mock::MockSessionKeys::generate(None); + assert_ok!( + Session::set_keys( + Origin::signed(2), + ::Keys::decode(&mut &new_keys[..]).expect("Decode keys"), + vec![], + ) + ); + }); + } } diff --git a/srml/session/src/mock.rs b/srml/session/src/mock.rs index ed7a6bf631359e132532b89fea5bf8f64f9eecf1..66bf93032d29f5ed41dd5f657645699d6f163af7 100644 --- a/srml/session/src/mock.rs +++ b/srml/session/src/mock.rs @@ -19,12 +19,25 @@ use super::*; use std::cell::RefCell; use srml_support::{impl_outer_origin, parameter_types}; -use substrate_primitives::H256; -use primitives::{ - traits::{BlakeTwo256, IdentityLookup, ConvertInto}, +use primitives::{crypto::key_types::DUMMY, H256}; +use sr_primitives::{ + Perbill, impl_opaque_keys, traits::{BlakeTwo256, IdentityLookup, ConvertInto}, testing::{Header, UintAuthorityId} }; +impl_opaque_keys! { + pub struct MockSessionKeys { + #[id(DUMMY)] + pub dummy: UintAuthorityId, + } +} + +impl From for MockSessionKeys { + fn from(dummy: UintAuthorityId) -> Self { + Self { dummy } + } +} + impl_outer_origin! { pub enum Origin for Test {} } @@ -49,10 +62,16 @@ impl ShouldEndSession for TestShouldEndSession { pub struct TestSessionHandler; impl SessionHandler for TestSessionHandler { - fn on_new_session(changed: bool, validators: &[(u64, T)]) { + fn on_new_session( + changed: bool, + validators: &[(u64, T)], + _queued_validators: &[(u64, T)], + ) { SESSION_CHANGED.with(|l| *l.borrow_mut() = changed); AUTHORITIES.with(|l| - *l.borrow_mut() = validators.iter().map(|(_, id)| id.get::(0).unwrap_or_default()).collect() + *l.borrow_mut() = validators.iter() + .map(|(_, id)| id.get::(DUMMY).unwrap_or_default()) + .collect() ); } fn on_disabled(_validator_index: usize) {} @@ -108,27 +127,36 @@ pub fn set_next_validators(next: Vec) { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; pub const MinimumPeriod: u64 = 5; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } + impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; } + impl timestamp::Trait for Test { type Moment = u64; type OnTimestampSet = (); type MinimumPeriod = MinimumPeriod; } - impl Trait for Test { type ShouldEndSession = TestShouldEndSession; #[cfg(feature = "historical")] @@ -138,7 +166,7 @@ impl Trait for Test { type SessionHandler = TestSessionHandler; type ValidatorId = u64; type ValidatorIdOf = ConvertInto; - type Keys = UintAuthorityId; + type Keys = MockSessionKeys; type Event = (); type SelectInitialValidators = (); } @@ -146,7 +174,7 @@ impl Trait for Test { #[cfg(feature = "historical")] impl crate::historical::Trait for Test { type FullIdentification = u64; - type FullIdentificationOf = primitives::traits::ConvertInto; + type FullIdentificationOf = sr_primitives::traits::ConvertInto; } pub type System = system::Module; diff --git a/srml/staking/Cargo.toml b/srml/staking/Cargo.toml index 74384495315cc536b150779752c53174c4c97248..5428d663f3f44cc7b0ab3c2d8f217dcf1717820d 100644 --- a/srml/staking/Cargo.toml +++ b/srml/staking/Cargo.toml @@ -7,19 +7,20 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } substrate-keyring = { path = "../../core/keyring", optional = true } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } session = { package = "srml-session", path = "../session", default-features = false, features = ["historical"] } +authorship = { package = "srml-authorship", path = "../authorship", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../../core/primitives" } -timestamp = { package = "srml-timestamp", path = "../timestamp" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } balances = { package = "srml-balances", path = "../balances" } +timestamp = { package = "srml-timestamp", path = "../timestamp" } rand = "0.6.5" [features] @@ -30,11 +31,12 @@ std = [ "serde", "safe-mix/std", "substrate-keyring", - "parity-codec/std", + "codec/std", "rstd/std", "runtime_io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", "session/std", "system/std", + "authorship/std", ] diff --git a/srml/staking/src/inflation.rs b/srml/staking/src/inflation.rs new file mode 100644 index 0000000000000000000000000000000000000000..80065886d7cac6a545a33391db4e4c41087e716f --- /dev/null +++ b/srml/staking/src/inflation.rs @@ -0,0 +1,386 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! This module expose one function `P_NPoS` (Payout NPoS) or `compute_total_payout` which returns +//! the total payout for the era given the era duration and the staking rate in NPoS. +//! The staking rate in NPoS is the total amount of tokens staked by nominators and validators, +//! divided by the total token supply. +//! +//! This payout is computed from the desired yearly inflation `I_NPoS`. +//! +//! `I_NPoS` is defined as such: +//! +//! let's introduce some constant: +//! * `I0` represents a tight upper-bound on our estimate of the operational costs of all +//! validators, expressed as a fraction of the total token supply. I_NPoS must be always +//! superior or equal to this value. +//! * `x_ideal` the ideal staking rate in NPoS. +//! * `i_ideal` the ideal yearly interest rate: the ideal total yearly amount of tokens minted to +//! pay all validators and nominators for NPoS, divided by the total amount of tokens staked by +//! them. `i(x) = I(x)/x` and `i(x_ideal) = i_deal` +//! * `d` decay rate. +//! +//! We define I_NPoS as a linear function from 0 to `x_ideal` and an exponential decrease after +//! `x_ideal` to 1. We choose exponential decrease for `I_NPoS` because this implies an exponential +//! decrease for the yearly interest rate as well, and we want the interest rate to fall sharply +//! beyond `x_ideal` to avoid illiquidity. +//! +//! Function is defined as such: +//! ```nocompile +//! for 0 < x < x_ideal: I_NPoS(x) = I0 + x*(i_ideal - I0/x_ideal) +//! for x_ideal < x < 1: I_NPoS(x) = I0 + (i_ideal*x_ideal - I0)*2^((x_ideal-x)/d) +//! ``` +//! +//! Thus we have the following properties: +//! * `I_NPoS > I0` +//! * `I_NPoS(0) = I0` +//! * `I_NPoS(x_ideal) = max(I_NPoS) = x_ideal*i_ideal` +//! * `i(x)` is monotone decreasing +//! +//! More details can be found [here](http://research.web3.foundation/en/latest/polkadot/Token%20Eco +//! nomics/#inflation-model) + + +use sr_primitives::{Perbill, traits::SimpleArithmetic}; + +/// Linear function truncated to positive part `y = max(0, b [+ or -] a*x)` for `P_NPoS` usage. +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +struct Linear { + // Negate the `a*x` term. + negative_a: bool, + // Per-billion representation of `a`, the x coefficient. + a: u32, + // Per-billion representation of `b`, the intercept. + b: u32, +} + +impl Linear { + /// Compute `f(n/d)*d`. This is useful to avoid loss of precision. + fn calculate_for_fraction_times_denominator(&self, n: N, d: N) -> N + where + N: SimpleArithmetic + Clone + { + if self.negative_a { + (Perbill::from_parts(self.b) * d).saturating_sub(Perbill::from_parts(self.a) * n) + } else { + (Perbill::from_parts(self.b) * d).saturating_add(Perbill::from_parts(self.a) * n) + } + } +} + +/// Piecewise Linear function for `P_NPoS` usage +#[derive(Debug, PartialEq, Eq)] +struct PiecewiseLinear { + /// Array of tuples of an abscissa in a per-billion representation and a linear function. + /// + /// Abscissas in the array must be in order from the lowest to the highest. + /// + /// The array defines a piecewise linear function as such: + /// * the n-th segment starts at the abscissa of the n-th element until the abscissa of the + /// n-th + 1 element, and is defined by the linear function of the n-th element + /// * last segment doesn't end + pieces: [(u32, Linear); 20], +} + +impl PiecewiseLinear { + /// Compute `f(n/d)*d`. This is useful to avoid loss of precision. + fn calculate_for_fraction_times_denominator(&self, n: N, d: N) -> N + where + N: SimpleArithmetic + Clone + { + let part = self.pieces.iter() + .take_while(|(abscissa, _)| n > Perbill::from_parts(*abscissa) * d.clone()) + .last() + .unwrap_or(&self.pieces[0]); + + part.1.calculate_for_fraction_times_denominator(n, d) + } +} + +/// Piecewise linear approximation of `I_NPoS`. +/// +/// Using the constants: +/// * `I_0` = 0.025; +/// * `i_ideal` = 0.2; +/// * `x_ideal` = 0.5; +/// * `d` = 0.05; +/// +/// This approximation is tested to be close to real one by an error less than 1% see +/// `i_npos_precision` test. +const I_NPOS: PiecewiseLinear = PiecewiseLinear { + pieces: [ + (0, Linear { negative_a: false, a: 150000000, b: 25000000 }), + (500000000, Linear { negative_a: true, a: 986493987, b: 593246993 }), + (507648979, Linear { negative_a: true, a: 884661327, b: 541551747 }), + (515726279, Linear { negative_a: true, a: 788373842, b: 491893761 }), + (524282719, Linear { negative_a: true, a: 697631517, b: 444319128 }), + (533378749, Linear { negative_a: true, a: 612434341, b: 398876765 }), + (543087019, Linear { negative_a: true, a: 532782338, b: 355618796 }), + (553495919, Linear { negative_a: true, a: 458675508, b: 314600968 }), + (564714479, Linear { negative_a: true, a: 390113843, b: 275883203 }), + (576879339, Linear { negative_a: true, a: 327097341, b: 239530285 }), + (590164929, Linear { negative_a: true, a: 269626004, b: 205612717 }), + (604798839, Linear { negative_a: true, a: 217699848, b: 174207838 }), + (621085859, Linear { negative_a: true, a: 171318873, b: 145401271 }), + (639447429, Linear { negative_a: true, a: 130483080, b: 119288928 }), + (660489879, Linear { negative_a: true, a: 95192479, b: 95979842 }), + (685131379, Linear { negative_a: true, a: 65447076, b: 75600334 }), + (714860569, Linear { negative_a: true, a: 41246910, b: 58300589 }), + (752334749, Linear { negative_a: true, a: 22592084, b: 44265915 }), + (803047659, Linear { negative_a: true, a: 9482996, b: 33738693 }), + (881691659, Linear { negative_a: true, a: 2572702, b: 27645944 }) + ] +}; + +/// Second per year for the Julian year (365.25 days). +const SECOND_PER_YEAR: u32 = 3600*24*36525/100; + +/// The total payout to all validators (and their nominators) per era. +/// +/// Named P_NPoS in the [paper](http://research.web3.foundation/en/latest/polkadot/Token%20Ec +/// onomics/#inflation-model). +/// +/// For x the staking rate in NPoS: `P_NPoS(x) = I_NPoS(x) * current_total_token / era_per_year` +/// i.e. `P_NPoS(x) = I_NPoS(x) * current_total_token * era_duration / year_duration` +/// +/// I_NPoS is the desired yearly inflation rate for nominated proof of stake. +pub fn compute_total_payout(npos_token_staked: N, total_tokens: N, era_duration: N) -> N +where + N: SimpleArithmetic + Clone +{ + let year_duration: N = SECOND_PER_YEAR.into(); + I_NPOS.calculate_for_fraction_times_denominator(npos_token_staked, total_tokens) + * era_duration / year_duration +} + +#[allow(non_upper_case_globals, non_snake_case)] // To stick with paper notations +#[cfg(test)] +mod test_inflation { + use std::convert::TryInto; + + // Function `y = a*x + b` using float used for testing precision of Linear + #[derive(Debug)] + struct LinearFloat { + a: f64, + b: f64, + } + + impl LinearFloat { + fn new(x0: f64, y0: f64, x1: f64, y1: f64) -> Self { + LinearFloat { + a: (y1 - y0) / (x1 - x0), + b: (x0*y1 - x1*y0) / (x0 - x1), + } + } + + fn compute(&self, x: f64) -> f64 { + self.a*x + self.b + } + } + + #[test] + fn linear_float_works() { + assert_eq!(LinearFloat::new(1.0, 2.0, 4.0, 3.0).compute(7.0), 4.0); + } + + // Constants defined in paper + const I_0: f64 = 0.025; + const i_ideal: f64 = 0.2; + const x_ideal: f64 = 0.5; + const d: f64 = 0.05; + + // Left part from `x_ideal` + fn I_left(x: f64) -> f64 { + I_0 + x * (i_ideal - I_0/x_ideal) + } + + // Right part from `x_ideal` + fn I_right(x: f64) -> f64 { + I_0 + (i_ideal*x_ideal - I_0) * 2_f64.powf((x_ideal-x)/d) + } + + // Definition of I_NPoS in float + fn I_full(x: f64) -> f64 { + if x <= x_ideal { + I_left(x) + } else { + I_right(x) + } + } + + // Compute approximation of I_NPoS into piecewise linear function + fn I_NPoS_points() -> super::PiecewiseLinear { + let mut points = vec![]; + + // Points for left part + points.push((0.0, I_0)); + points.push((x_ideal, I_left(x_ideal))); + + // Approximation for right part. + // + // We start from x_ideal (x0) and we try to find the next point (x1) for which the linear + // approximation of (x0, x1) doesn't deviate from float definition by an error of + // GEN_ERROR. + + // When computing deviation between linear approximation and float definition we iterate + // over all points with this step precision. + const STEP_PRECISION: f64 = 0.000_000_1; + // Max error used for generating points. + const GEN_ERROR: f64 = 0.000_1; + + let mut x0: f64 = x_ideal; + let mut x1: f64 = x0; + + // This is just a step used to find next x1: + // if x1 + step result in a not enought precise approximation we reduce step and try again. + // we stop as soon as step is less than STEP_PRECISION. + let mut step: f64 = 0.1; + + loop { + let next_x1 = x1 + step; + + if next_x1 >= 1.0 { + points.push((1.0, I_right(1.0))); + break; + } + + let y0 = I_right(x0); + let next_y1 = I_right(next_x1); + + let mut error_overflowed = false; + + // Test error is not overflowed + + // Quick test on one point + if (I_right((x0 + next_x1)/2.0) - (y0 + next_y1)/2.0).abs() > GEN_ERROR { + error_overflowed = true; + } + + // Long test on all points + if !error_overflowed { + let linear = LinearFloat::new(x0, y0, next_x1, next_y1); + let mut cursor = x0; + while cursor < x1 { + if (I_right(cursor) - linear.compute(cursor)).abs() > GEN_ERROR { + error_overflowed = true; + } + cursor += STEP_PRECISION; + } + } + + if error_overflowed { + if step <= STEP_PRECISION { + points.push((x1, I_right(x1))); + x0 = x1; + step = 0.1; + } else { + step /= 10.0; + } + } else { + x1 = next_x1; + } + } + + // Convert points to piecewise linear definition + let pieces: Vec<(u32, super::Linear)> = (0..points.len()-1) + .map(|i| { + let p0 = points[i]; + let p1 = points[i+1]; + + let linear = LinearFloat::new(p0.0, p0.1, p1.0, p1.1); + + // Needed if we want to use a Perbill later + assert!(linear.a.abs() <= 1.0); + // Needed if we want to use a Perbill later + assert!(linear.b.abs() <= 1.0); + // Needed to stick with our restrictive definition of linear + assert!(linear.b.signum() == 1.0); + + ( + (p0.0 * 1_000_000_000.0) as u32, + super::Linear { + negative_a: linear.a.signum() < 0.0, + a: (linear.a.abs() * 1_000_000_000.0) as u32, + b: (linear.b.abs() * 1_000_000_000.0) as u32, + } + ) + }) + .collect(); + + println!("Generated pieces: {:?}", pieces); + assert_eq!(pieces.len(), 20); + + super::PiecewiseLinear { pieces: (&pieces[..]).try_into().unwrap() } + } + + /// This test is only useful to generate a new set of points for the definition of I_NPoS. + #[test] + fn generate_I_NPOS() { + assert_eq!(super::I_NPOS, I_NPoS_points()); + } + + /// This test ensure that i_npos piecewise linear approximation is close to the actual function. + /// It does compare the result from a computation in integer of different capcity and in f64. + #[test] + fn i_npos_precision() { + const STEP_PRECISION: f64 = 0.000_001; + const ERROR: f64 = 0.000_2; + + macro_rules! test_for_value { + ($($total_token:expr => $type:ty,)*) => { + let mut x = 0.1; + while x <= 1.0 { + let expected = I_full(x); + $({ + let result = super::I_NPOS.calculate_for_fraction_times_denominator( + (x * $total_token as f64) as $type, + $total_token, + ) as f64; + let expected = expected * $total_token as f64; + let error = (ERROR * $total_token as f64).max(2.0); + + let diff = (result - expected).abs(); + if diff >= error { + println!("total_token: {}", $total_token); + println!("x: {}", x); + println!("diff: {}", diff); + println!("error: {}", error); + panic!("error overflowed"); + } + })* + x += STEP_PRECISION + } + } + } + + test_for_value!( + 1_000u32 => u32, + 1_000_000u32 => u32, + 1_000_000_000u32 => u32, + 1_000_000_000_000u64 => u64, + 1_000_000_000_000_000u64 => u64, + 1_000_000_000_000_000_000u64 => u64, + 1_000_000_000_000_000_000_000u128 => u128, + 1_000_000_000_000_000_000_000_000u128 => u128, + 1_000_000_000_000_000_000_000_000_000u128 => u128, + 1_000_000_000_000_000_000_000_000_000_000u128 => u128, + 1_000_000_000_000_000_000_000_000_000_000_000_000u128 => u128, + u32::max_value() => u32, + u64::max_value() => u64, + u128::max_value() => u128, + ); + } +} diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index c279619e8ca471b3378e23dd0dd73edaa0635104..3a39689646b2c486da17befd8d4b553ec8e4cbed 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -167,20 +167,31 @@ //! //! ### Reward Calculation //! -//! Rewards are recorded **per-session** and paid **per-era**. The value of the reward for each -//! session is calculated at the end of the session based on the timeliness of the session, then -//! accumulated to be paid later. The value of the new _per-session-reward_ is calculated at the end -//! of each era by multiplying `SlotStake` and `SessionReward` (`SessionReward` is the -//! multiplication factor, represented by a number between 0 and 1). Once a new era is triggered, -//! rewards are paid to the validators and their associated nominators. +//! Validators and nominators are rewarded at the end of each era. The total reward of an era is +//! calculated using the era duration and the staking rate (the total amount of tokens staked by +//! nominators and validators, divided by the total token supply). It aims to incentivise toward a +//! defined staking rate. The full specification can be found +//! [here](https://research.web3.foundation/en/latest/polkadot/Token%20Economics/#inflation-model). +//! +//! Total reward is split among validators and their nominators depending on the number of points +//! they received during the era. Points are added to a validator using +//! [`reward_by_ids`](./enum.Call.html#variant.reward_by_ids) or +//! [`reward_by_indices`](./enum.Call.html#variant.reward_by_indices). +//! +//! [`Module`](./struct.Module.html) implements +//! [`authorship::EventHandler`](../srml_authorship/trait.EventHandler.html) to add reward points +//! to block producer and block producer of referenced uncles. +//! +//! The validator and its nominator split their reward as following: //! //! The validator can declare an amount, named //! [`validator_payment`](./struct.ValidatorPrefs.html#structfield.validator_payment), that does not //! get shared with the nominators at each reward payout through its //! [`ValidatorPrefs`](./struct.ValidatorPrefs.html). This value gets deducted from the total reward -//! that can be paid. The remaining portion is split among the validator and all of the nominators -//! that nominated the validator, proportional to the value staked behind this validator (_i.e._ -//! dividing the [`own`](./struct.Exposure.html#structfield.own) or +//! that is paid to the validator and its nominators. The remaining portion is split among the +//! validator and all of the nominators that nominated the validator, proportional to the value +//! staked behind this validator (_i.e._ dividing the +//! [`own`](./struct.Exposure.html#structfield.own) or //! [`others`](./struct.Exposure.html#structfield.others) by //! [`total`](./struct.Exposure.html#structfield.total) in [`Exposure`](./struct.Exposure.html)). //! @@ -266,6 +277,7 @@ mod mock; mod tests; mod phragmen; +mod inflation; #[cfg(all(feature = "bench", test))] mod benches; @@ -273,21 +285,23 @@ mod benches; #[cfg(feature = "std")] use runtime_io::with_storage; use rstd::{prelude::*, result, collections::btree_map::BTreeMap}; -use parity_codec::{HasCompact, Encode, Decode}; +use codec::{HasCompact, Encode, Decode}; use srml_support::{ StorageValue, StorageMap, EnumerableStorageMap, decl_module, decl_event, decl_storage, ensure, traits::{ Currency, OnFreeBalanceZero, OnDilution, LockIdentifier, LockableCurrency, - WithdrawReasons, WithdrawReason, OnUnbalanced, Imbalance, Get + WithdrawReasons, WithdrawReason, OnUnbalanced, Imbalance, Get, Time } }; use session::{historical::OnSessionEnding, SelectInitialValidators, SessionIndex}; -use primitives::Perbill; -use primitives::traits::{ +use sr_primitives::Perbill; +use sr_primitives::weights::SimpleDispatchInfo; +use sr_primitives::traits::{ Convert, Zero, One, StaticLookup, CheckedSub, CheckedShl, Saturating, Bounded, + SaturatedConversion, SimpleArithmetic }; #[cfg(feature = "std")] -use primitives::{Serialize, Deserialize}; +use sr_primitives::{Serialize, Deserialize}; use system::{ensure_signed, ensure_root}; use phragmen::{elect, ACCURACY, ExtendedBalance, equalize}; @@ -302,6 +316,28 @@ const STAKING_ID: LockIdentifier = *b"staking "; /// Counter for the number of eras that have passed. pub type EraIndex = u32; +/// Reward points of an era. Used to split era total payout between validators. +#[derive(Encode, Decode, Default)] +pub struct EraRewards { + /// Total number of points. Equals the sum of reward points for each validator. + total: u32, + /// Reward at one index correspond to reward for validator in current_elected of this index. + /// Thus this reward vec is only valid for one elected set. + rewards: Vec, +} + +impl EraRewards { + /// Add the reward to the validator at the given index. Index must be valid + /// (i.e. `index < current_elected.len()`). + fn add_points_to_index(&mut self, index: u32, points: u32) { + if let Some(new_total) = self.total.checked_add(points) { + self.total = new_total; + self.rewards.resize((index as usize + 1).max(self.rewards.len()), 0); + self.rewards[index as usize] += points; // Addition is less than total + } + } +} + /// Indicates the initial status of the staker. #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum StakerStatus { @@ -429,11 +465,13 @@ pub struct Exposure { pub others: Vec>, } -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; type PositiveImbalanceOf = -<::Currency as Currency<::AccountId>>::PositiveImbalance; + <::Currency as Currency<::AccountId>>::PositiveImbalance; type NegativeImbalanceOf = -<::Currency as Currency<::AccountId>>::NegativeImbalance; + <::Currency as Currency<::AccountId>>::NegativeImbalance; +type MomentOf= <::Time as Time>::Moment; type RawAssignment = (::AccountId, ExtendedBalance); type Assignment = (::AccountId, ExtendedBalance, BalanceOf); @@ -447,7 +485,7 @@ pub const DEFAULT_BONDING_DURATION: u32 = 1; /// Means for interacting with a specialized version of the `session` trait. /// -/// This is needed because `Staking` sets the `ValidatorId` of the `session::Trait` +/// This is needed because `Staking` sets the `ValidatorIdOf` of the `session::Trait` pub trait SessionInterface: system::Trait { /// Disable a given validator by stash ID. fn disable_validator(validator: &AccountId) -> Result<(), ()>; @@ -485,6 +523,9 @@ pub trait Trait: system::Trait { /// The staking balance. type Currency: LockableCurrency; + /// Time used for computing era duration. + type Time: Time; + /// Convert a balance into a number used for election calculation. /// This must fit into a `u64` but is allowed to be sensibly lossy. /// TODO: #1377 @@ -514,6 +555,22 @@ pub trait Trait: system::Trait { type SessionInterface: self::SessionInterface; } +/// Mode of era-forcing. +#[derive(Copy, Clone, PartialEq, Eq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub enum Forcing { + /// Not forcing anything - just let whatever happen. + NotForcing, + /// Force a new era, then reset to `NotForcing` as soon as it is done. + ForceNew, + /// Avoid a new era indefinitely. + ForceNone, +} + +impl Default for Forcing { + fn default() -> Self { Forcing::NotForcing } +} + decl_storage! { trait Store for Module as Staking { @@ -522,8 +579,6 @@ decl_storage! { /// Minimum number of staking participants before emergency conditions are imposed. pub MinimumValidatorCount get(minimum_validator_count) config(): u32 = DEFAULT_MINIMUM_VALIDATOR_COUNT; - /// Maximum reward, per validator, that is provided per acceptable session. - pub SessionReward get(session_reward) config(): Perbill = Perbill::from_parts(60); /// Slash, per validator that is taken for the first time they are found to be offline. pub OfflineSlash get(offline_slash) config(): Perbill = Perbill::from_millionths(1000); /// Number of instances of offline reports before slashing begins for validators. @@ -561,12 +616,14 @@ decl_storage! { /// The current era index. pub CurrentEra get(current_era) config(): EraIndex; - /// Maximum reward, per validator, that is provided per acceptable session. - pub CurrentSessionReward get(current_session_reward) config(): BalanceOf; + /// The start of the current era. + pub CurrentEraStart get(current_era_start): MomentOf; - /// The accumulated reward for the current era. Reset to zero at the beginning of the era - /// and increased for every successfully finished session. - pub CurrentEraReward get(current_era_reward): BalanceOf; + /// The session index at which the current era started. + pub CurrentEraStartSessionIndex get(current_era_start_session_index): SessionIndex; + + /// Rewards for the current era. Using indices of current elected set. + CurrentEraRewards get(current_era_reward): EraRewards; /// The amount of balance actively at stake for each validator slot, currently. /// @@ -584,7 +641,7 @@ decl_storage! { pub RecentlyOffline get(recently_offline): Vec<(T::AccountId, T::BlockNumber, u32)>; /// True if the next session change will be a new era regardless of index. - pub ForceNewEra get(forcing_new_era): bool; + pub ForceEra get(force_era) config(): Forcing; /// A mapping from still-bonded eras to the first session index of that era. BondedEras: Vec<(EraIndex, SessionIndex)>; @@ -593,8 +650,7 @@ decl_storage! { config(stakers): Vec<(T::AccountId, T::AccountId, BalanceOf, StakerStatus)>; build(| - storage: &mut primitives::StorageOverlay, - _: &mut primitives::ChildrenStorageOverlay, + storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay), config: &GenesisConfig | { with_storage(storage, || { @@ -650,6 +706,13 @@ decl_module! { fn deposit_event() = default; + fn on_finalize() { + // Set the start of the first era. + if !>::exists() { + >::put(T::Time::now()); + } + } + /// Take the origin account as a stash and lock up `value` of its balance. `controller` will /// be the account that controls it. /// @@ -665,6 +728,7 @@ decl_module! { /// NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned unless /// the `origin` falls below _existential deposit_ and gets removed as dust. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn bond(origin, controller: ::Source, #[compact] value: BalanceOf, @@ -712,6 +776,7 @@ decl_module! { /// - O(1). /// - One DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn bond_extra(origin, #[compact] max_additional: BalanceOf) { let stash = ensure_signed(origin)?; @@ -751,6 +816,7 @@ decl_module! { /// The only way to clean the aforementioned storage item is also user-controlled via `withdraw_unbonded`. /// - One DB entry. /// + #[weight = SimpleDispatchInfo::FixedNormal(400_000)] fn unbond(origin, #[compact] value: BalanceOf) { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -792,6 +858,7 @@ decl_module! { /// - Contains a limited number of reads, yet the size of which could be large based on `ledger`. /// - Writes are limited to the `origin` account key. /// # + #[weight = SimpleDispatchInfo::FixedNormal(400_000)] fn withdraw_unbonded(origin) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -823,6 +890,7 @@ decl_module! { /// - Contains a limited number of reads. /// - Writes are limited to the `origin` account key. /// # + #[weight = SimpleDispatchInfo::FixedNormal(750_000)] fn validate(origin, prefs: ValidatorPrefs>) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -846,6 +914,7 @@ decl_module! { /// which is capped at `MAX_NOMINATIONS`. /// - Both the reads and writes follow a similar pattern. /// # + #[weight = SimpleDispatchInfo::FixedNormal(750_000)] fn nominate(origin, targets: Vec<::Source>) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -872,6 +941,7 @@ decl_module! { /// - Contains one read. /// - Writes are limited to the `origin` account key. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn chill(origin) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -891,6 +961,7 @@ decl_module! { /// - Contains a limited number of reads. /// - Writes are limited to the `origin` account key. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn set_payee(origin, payee: RewardDestination) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -898,7 +969,7 @@ decl_module! { >::insert(stash, payee); } - /// (Re-)set the payment target for a controller. + /// (Re-)set the controller of a stash. /// /// Effects will be felt at the beginning of the next era. /// @@ -909,6 +980,7 @@ decl_module! { /// - Contains a limited number of reads. /// - Writes are limited to the `origin` account key. /// # + #[weight = SimpleDispatchInfo::FixedNormal(750_000)] fn set_controller(origin, controller: ::Source) { let stash = ensure_signed(origin)?; let old_controller = Self::bonded(&stash).ok_or("not a stash")?; @@ -925,6 +997,7 @@ decl_module! { } /// The ideal number of validators. + #[weight = SimpleDispatchInfo::FixedOperational(150_000)] fn set_validator_count(origin, #[compact] new: u32) { ensure_root(origin)?; ValidatorCount::put(new); @@ -932,26 +1005,38 @@ decl_module! { // ----- Root calls. - /// Force there to be a new era. This also forces a new session immediately after. - /// `apply_rewards` should be true for validators to get the session reward. + /// Force there to be no new eras indefinitely. /// /// # - /// - Independent of the arguments. - /// - Triggers the Phragmen election. Expensive but not user-controlled. - /// - Depends on state: `O(|edges| * |validators|)`. + /// - No arguments. /// # + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] + fn force_no_eras(origin) { + ensure_root(origin)?; + ForceEra::put(Forcing::ForceNone); + } + + /// Force there to be a new era at the end of the next session. After this, it will be + /// reset to normal (non-forced) behaviour. + /// + /// # + /// - No arguments. + /// # + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn force_new_era(origin) { ensure_root(origin)?; - Self::apply_force_new_era() + ForceEra::put(Forcing::ForceNew); } /// Set the offline slash grace period. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_offline_slash_grace(origin, #[compact] new: u32) { ensure_root(origin)?; OfflineSlashGrace::put(new); } /// Set the validators who cannot be slashed (if any). + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_invulnerables(origin, validators: Vec) { ensure_root(origin)?; >::put(validators); @@ -1041,7 +1126,7 @@ impl Module { /// Reward a given validator by a specific amount. Add the reward to the validator's, and its /// nominators' balance, pro-rata based on their exposure, after having removed the validator's /// pre-payout cut. - fn reward_validator(stash: &T::AccountId, reward: BalanceOf) { + fn reward_validator(stash: &T::AccountId, reward: BalanceOf) -> PositiveImbalanceOf { let off_the_table = reward.min(Self::validators(stash).validator_payment); let reward = reward - off_the_table; let mut imbalance = >::zero(); @@ -1059,8 +1144,10 @@ impl Module { let per_u64 = Perbill::from_rational_approximation(exposure.own, total); per_u64 * reward }; + imbalance.maybe_subsume(Self::make_payout(stash, validator_cut + off_the_table)); - T::Reward::on_unbalanced(imbalance); + + imbalance } /// Session has just ended. Provide the validator set for the next session if it's an era-end, along @@ -1068,20 +1155,17 @@ impl Module { fn new_session(session_index: SessionIndex) -> Option<(Vec, Vec<(T::AccountId, Exposure>)>)> { - // accumulate good session reward - let reward = Self::current_session_reward(); - >::mutate(|r| *r += reward); - - if ForceNewEra::take() || session_index % T::SessionsPerEra::get() == 0 { - let validators = T::SessionInterface::validators(); - let prior = validators.into_iter() - .map(|v| { let e = Self::stakers(&v); (v, e) }) - .collect(); - - Self::new_era(session_index).map(move |new| (new, prior)) - } else { - None + match ForceEra::get() { + Forcing::ForceNew => ForceEra::kill(), + Forcing::NotForcing if session_index % T::SessionsPerEra::get() == 0 => (), + _ => return None, } + let validators = T::SessionInterface::validators(); + let prior = validators.into_iter() + .map(|v| { let e = Self::stakers(&v); (v, e) }) + .collect(); + + Self::new_era(session_index).map(move |new| (new, prior)) } /// The era has changed - enact new staking set. @@ -1090,22 +1174,46 @@ impl Module { /// get a chance to set their session keys. fn new_era(start_session_index: SessionIndex) -> Option> { // Payout - let reward = >::take(); - if !reward.is_zero() { + let rewards = CurrentEraRewards::take(); + let now = T::Time::now(); + let previous_era_start = >::mutate(|v| { + rstd::mem::replace(v, now.clone()) + }); + let era_duration = now - previous_era_start; + if !era_duration.is_zero() { let validators = Self::current_elected(); - for v in validators.iter() { - Self::reward_validator(v, reward); + + let validator_len: BalanceOf = (validators.len() as u32).into(); + let total_rewarded_stake = Self::slot_stake() * validator_len; + + let total_payout = inflation::compute_total_payout( + total_rewarded_stake.clone(), + T::Currency::total_issuance(), + // Era of duration more than u32::MAX is rewarded as u32::MAX. + >::from(era_duration.saturated_into::()), + ); + + let mut total_imbalance = >::zero(); + + let total_points = rewards.total; + for (v, points) in validators.iter().zip(rewards.rewards.into_iter()) { + if points != 0 { + let reward = multiply_by_rational(total_payout, points, total_points); + total_imbalance.subsume(Self::reward_validator(v, reward)); + } } - Self::deposit_event(RawEvent::Reward(reward)); - let len = validators.len() as u32; // validators length can never overflow u64 - let len: BalanceOf = len.into(); - let total_minted = reward * len; - let total_rewarded_stake = Self::slot_stake() * len; - T::OnRewardMinted::on_dilution(total_minted, total_rewarded_stake); + + let total_reward = total_imbalance.peek(); + Self::deposit_event(RawEvent::Reward(total_reward)); + T::Reward::on_unbalanced(total_imbalance); + T::OnRewardMinted::on_dilution(total_reward, total_rewarded_stake); } // Increment current era. let current_era = CurrentEra::mutate(|s| { *s += 1; *s }); + CurrentEraStartSessionIndex::mutate(|v| { + *v = start_session_index; + }); let bonding_duration = T::BondingDuration::get(); if current_era > bonding_duration { @@ -1127,16 +1235,13 @@ impl Module { } // Reassign all Stakers. - let (slot_stake, maybe_new_validators) = Self::select_validators(); - - // Update the balances for rewarding according to the stakes. - >::put(Self::session_reward() * slot_stake); + let (_slot_stake, maybe_new_validators) = Self::select_validators(); maybe_new_validators } fn slashable_balance_of(stash: &T::AccountId) -> BalanceOf { - Self::bonded(stash).and_then(Self::ledger).map(|l| l.total).unwrap_or_default() + Self::bonded(stash).and_then(Self::ledger).map(|l| l.active).unwrap_or_default() } /// Select a new validator set from the assembled stakers and their role preferences. @@ -1257,10 +1362,6 @@ impl Module { } } - fn apply_force_new_era() { - ForceNewEra::put(true); - } - /// Remove all associated data of a stash account from the staking system. /// /// This is called : @@ -1332,6 +1433,48 @@ impl Module { Self::deposit_event(event); } } + + /// Add reward points to validators using their stash account ID. + /// + /// Validators are keyed by stash account ID and must be in the current elected set. + /// + /// For each element in the iterator the given number of points in u32 is added to the + /// validator, thus duplicates are handled. + /// + /// At the end of the era each the total payout will be distributed among validator + /// relatively to their points. + /// + /// COMPLEXITY: Complexity is `number_of_validator_to_reward x current_elected_len`. + /// If you need to reward lots of validator consider using `reward_by_indices`. + pub fn reward_by_ids(validators_points: impl IntoIterator) { + CurrentEraRewards::mutate(|rewards| { + let current_elected = >::current_elected(); + for (validator, points) in validators_points.into_iter() { + if let Some(index) = current_elected.iter() + .position(|elected| *elected == validator) + { + rewards.add_points_to_index(index as u32, points); + } + } + }); + } + + /// Add reward points to validators using their validator index. + /// + /// For each element in the iterator the given number of points in u32 is added to the + /// validator, thus duplicates are handled. + pub fn reward_by_indices(validators_points: impl IntoIterator) { + // TODO: This can be optimised once #3302 is implemented. + let current_elected_len = >::current_elected().len() as u32; + + CurrentEraRewards::mutate(|rewards| { + for (validator_index, points) in validators_points.into_iter() { + if validator_index < current_elected_len { + rewards.add_points_to_index(validator_index, points); + } + } + }); + } } impl session::OnSessionEnding for Module { @@ -1354,6 +1497,47 @@ impl OnFreeBalanceZero for Module { } } +/// Add reward points to block authors: +/// * 20 points to the block producer for producing a (non-uncle) block in the relay chain, +/// * 2 points to the block producer for each reference to a previously unreferenced uncle, and +/// * 1 point to the producer of each referenced uncle block. +impl authorship::EventHandler for Module { + fn note_author(author: T::AccountId) { + Self::reward_by_ids(vec![(author, 20)]); + } + fn note_uncle(author: T::AccountId, _age: T::BlockNumber) { + Self::reward_by_ids(vec![ + (>::author(), 2), + (author, 1) + ]) + } +} + +// This is guarantee not to overflow on whatever values. +// `num` must be inferior to `den` otherwise it will be reduce to `den`. +fn multiply_by_rational(value: N, num: u32, den: u32) -> N + where N: SimpleArithmetic + Clone +{ + let num = num.min(den); + + let result_divisor_part = value.clone() / den.into() * num.into(); + + let result_remainder_part = { + let rem = value % den.into(); + + // Fits into u32 because den is u32 and remainder < den + let rem_u32 = rem.saturated_into::(); + + // Multiplication fits into u64 as both term are u32 + let rem_part = rem_u32 as u64 * num as u64 / den as u64; + + // Result fits into u32 as num < total_points + (rem_part as u32).into() + }; + + result_divisor_part + result_remainder_part +} + /// A `Convert` implementation that finds the stash of the given controller account, /// if any. pub struct StashOf(rstd::marker::PhantomData); diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 23648e88eb039d7ce8ed77239de8793e1a8b81ce..856ee999ca5f1a09d2f7ea2764b73c057cf06e4c 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -17,15 +17,16 @@ //! Test utilities use std::{collections::HashSet, cell::RefCell}; -use primitives::Perbill; -use primitives::traits::{IdentityLookup, Convert, OpaqueKeys, OnInitialize}; -use primitives::testing::{Header, UintAuthorityId}; -use substrate_primitives::{H256, Blake2Hasher}; +use sr_primitives::Perbill; +use sr_primitives::traits::{IdentityLookup, Convert, OpaqueKeys, OnInitialize}; +use sr_primitives::testing::{Header, UintAuthorityId}; +use primitives::{H256, Blake2Hasher}; use runtime_io; use srml_support::{assert_ok, impl_outer_origin, parameter_types, EnumerableStorageMap}; -use srml_support::traits::{Currency, Get}; -use crate::{EraIndex, GenesisConfig, Module, Trait, StakerStatus, - ValidatorPrefs, RewardDestination, Nominators +use srml_support::traits::{Currency, Get, FindAuthor}; +use crate::{ + EraIndex, GenesisConfig, Module, Trait, StakerStatus, ValidatorPrefs, RewardDestination, + Nominators, inflation }; /// The AccountId alias in this test module. @@ -50,7 +51,11 @@ thread_local! { pub struct TestSessionHandler; impl session::SessionHandler for TestSessionHandler { - fn on_new_session(_changed: bool, validators: &[(AccountId, Ks)]) { + fn on_new_session( + _changed: bool, + validators: &[(AccountId, Ks)], + _queued_validators: &[(AccountId, Ks)], + ) { SESSION.with(|x| *x.borrow_mut() = (validators.iter().map(|x| x.0.clone()).collect(), HashSet::new()) ); @@ -81,27 +86,45 @@ impl_outer_origin!{ pub enum Origin for Test {} } +/// Author of block is always 11 +pub struct Author11; +impl FindAuthor for Author11 { + fn find_author<'a, I>(_digests: I) -> Option + where I: 'a + IntoIterator + { + Some(11) + } +} + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Debug)] pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; - type BlockNumber = u64; + type BlockNumber = BlockNumber; + type Call = (); type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; + type Hashing = ::sr_primitives::traits::BlakeTwo256; type AccountId = AccountId; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { - pub const TransferFee: u64 = 0; - pub const CreationFee: u64 = 0; + pub const TransferFee: Balance = 0; + pub const CreationFee: Balance = 0; pub const TransactionBaseFee: u64 = 0; pub const TransactionByteFee: u64 = 0; } @@ -118,10 +141,12 @@ impl balances::Trait for Test { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const Period: BlockNumber = 1; pub const Offset: BlockNumber = 0; + pub const UncleGenerations: u64 = 0; } impl session::Trait for Test { type OnSessionEnding = session::historical::NoteHistoricalRoot; @@ -138,7 +163,12 @@ impl session::historical::Trait for Test { type FullIdentification = crate::Exposure; type FullIdentificationOf = crate::ExposureOf; } - +impl authorship::Trait for Test { + type FindAuthor = Author11; + type UncleGenerations = UncleGenerations; + type FilterUncle = (); + type EventHandler = Module; +} parameter_types! { pub const MinimumPeriod: u64 = 5; } @@ -153,6 +183,7 @@ parameter_types! { } impl Trait for Test { type Currency = balances::Module; + type Time = timestamp::Module; type CurrencyToVote = CurrencyToVoteHandler; type OnRewardMinted = (); type Event = (); @@ -165,7 +196,6 @@ impl Trait for Test { pub struct ExtBuilder { existential_deposit: u64, - reward: u64, validator_pool: bool, nominate: bool, validator_count: u32, @@ -178,7 +208,6 @@ impl Default for ExtBuilder { fn default() -> Self { Self { existential_deposit: 0, - reward: 10, validator_pool: false, nominate: true, validator_count: 2, @@ -223,7 +252,7 @@ impl ExtBuilder { } pub fn build(self) -> runtime_io::TestExternalities { self.set_associated_consts(); - let (mut t, mut c) = system::GenesisConfig::default().build_storage::().unwrap(); + let mut storage = system::GenesisConfig::default().build_storage::().unwrap(); let balance_factor = if self.existential_deposit > 0 { 256 } else { @@ -251,9 +280,11 @@ impl ExtBuilder { (41, balance_factor * 2000), (100, 2000 * balance_factor), (101, 2000 * balance_factor), + // This allow us to have a total_payout different from 0. + (999, 1_000_000_000_000), ], vesting: vec![], - }.assimilate_storage(&mut t, &mut c); + }.assimilate_storage(&mut storage); let stake_21 = if self.fair { 1000 } else { 2000 }; let stake_31 = if self.validator_pool { balance_factor * 1000 } else { 1 }; @@ -275,18 +306,17 @@ impl ExtBuilder { ], validator_count: self.validator_count, minimum_validator_count: self.minimum_validator_count, - session_reward: Perbill::from_millionths((1000000 * self.reward / balance_factor) as u32), offline_slash: Perbill::from_percent(5), - current_session_reward: self.reward, offline_slash_grace: 0, invulnerables: vec![], - }.assimilate_storage(&mut t, &mut c); + .. Default::default() + }.assimilate_storage(&mut storage); let _ = session::GenesisConfig:: { keys: validators.iter().map(|x| (*x, UintAuthorityId(*x))).collect(), - }.assimilate_storage(&mut t, &mut c); + }.assimilate_storage(&mut storage); - let mut ext = t.into(); + let mut ext = storage.into(); runtime_io::with_externalities(&mut ext, || { let validators = Session::validators(); SESSION.with(|x| @@ -368,8 +398,9 @@ pub fn bond_nominator(acc: u64, val: u64, target: Vec) { pub fn start_session(session_index: session::SessionIndex) { // Compensate for session delay let session_index = session_index + 1; - for i in 0..(session_index - Session::current_index()) { + for i in Session::current_index()..session_index { System::set_block_number((i + 1).into()); + Timestamp::set_timestamp(System::block_number()); Session::on_initialize(System::block_number()); } @@ -381,6 +412,24 @@ pub fn start_era(era_index: EraIndex) { assert_eq!(Staking::current_era(), era_index); } +pub fn current_total_payout_for_duration(duration: u64) -> u64 { + let res = inflation::compute_total_payout( + >::slot_stake()*2, + Balances::total_issuance(), + duration, + ); + + res +} + +pub fn reward_all_elected() { + let rewards = >::current_elected().iter() + .map(|v| (*v, 1)) + .collect::>(); + + >::reward_by_ids(rewards) +} + pub fn validator_controllers() -> Vec { Session::validators().into_iter().map(|s| Staking::bonded(&s).expect("no controller for validator")).collect() } diff --git a/srml/staking/src/phragmen.rs b/srml/staking/src/phragmen.rs index 39480bf689e7b60a3f672d4c41bbf1e656b6a5a2..14b8a3845f2c497e570c9404272a8d4698d3eaf2 100644 --- a/srml/staking/src/phragmen.rs +++ b/srml/staking/src/phragmen.rs @@ -17,8 +17,8 @@ //! Rust implementation of the Phragmén election algorithm. use rstd::{prelude::*, collections::btree_map::BTreeMap}; -use primitives::{PerU128}; -use primitives::traits::{Zero, Convert, Saturating}; +use sr_primitives::{PerU128}; +use sr_primitives::traits::{Zero, Convert, Saturating}; use crate::{BalanceOf, RawAssignment, ExpoMap, Trait, ValidatorPrefs, IndividualExposure}; type Fraction = PerU128; @@ -90,7 +90,7 @@ pub fn elect( minimum_validator_count: usize, validator_iter: FV, nominator_iter: FN, - stash_of: FS, + slashable_balance_of: FS, ) -> Option<(Vec, Vec<(T::AccountId, Vec>)>)> where FV: Iterator>)>, FN: Iterator)>, @@ -108,7 +108,7 @@ pub fn elect( let mut nominators: Vec> = Vec::with_capacity(validator_iter.size_hint().0 + nominator_iter.size_hint().0); let mut candidates = validator_iter.map(|(who, _)| { - let stash_balance = stash_of(&who); + let stash_balance = slashable_balance_of(&who); (Candidate { who, ..Default::default() }, stash_balance) }) .filter_map(|(mut c, s)| { @@ -135,7 +135,7 @@ pub fn elect( // 2- Collect the nominators with the associated votes. // Also collect approval stake along the way. nominators.extend(nominator_iter.map(|(who, nominees)| { - let nominator_stake = stash_of(&who); + let nominator_stake = slashable_balance_of(&who); let mut edges: Vec> = Vec::with_capacity(nominees.len()); for n in &nominees { if let Some(idx) = c_idx_cache.get(n) { diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index ee9c55f17376a7c77b49b1c7e8618c85890afa50..9b621e05d1350312f6245cc18a92085c35acebb2 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -19,7 +19,7 @@ use super::*; use runtime_io::with_externalities; use phragmen; -use primitives::traits::OnInitialize; +use sr_primitives::traits::OnInitialize; use srml_support::{assert_ok, assert_noop, assert_eq_uvec, EnumerableStorageMap}; use mock::*; use srml_support::traits::{Currency, ReservableCurrency}; @@ -82,11 +82,6 @@ fn basic_setup_works() { // Initial Era and session assert_eq!(Staking::current_era(), 0); - assert_eq!(Session::current_index(), 0); - - // initial rewards - assert_eq!(Staking::current_session_reward(), 10); - // initial slash_count of validators assert_eq!(Staking::slash_count(&11), 0); @@ -113,7 +108,7 @@ fn no_offline_should_work() { assert_eq!(Staking::slash_count(&10), 0); assert_eq!(Balances::free_balance(&10), 1); // New era is not being forced - assert!(!Staking::forcing_new_era()); + assert_eq!(Staking::force_era(), Forcing::NotForcing); }); } @@ -168,7 +163,7 @@ fn invulnerability_should_work() { assert!(>::exists(&11)); // New era not being forced // NOTE: new era is always forced once slashing happens -> new validators need to be chosen. - assert!(!Staking::forcing_new_era()); + assert_eq!(Staking::force_era(), Forcing::NotForcing); }); } @@ -301,6 +296,7 @@ fn slashing_does_not_cause_underflow() { assert_eq!(Staking::offline_slash_grace(), 0); // Set validator preference so that 2^unstake_threshold would cause overflow (greater than 64) + // FIXME: that doesn't overflow. >::insert(11, ValidatorPrefs { unstake_threshold: 10, validator_payment: 0, @@ -316,7 +312,6 @@ fn slashing_does_not_cause_underflow() { }); } - #[test] fn rewards_should_work() { // should check that: @@ -324,12 +319,16 @@ fn rewards_should_work() { // * rewards get paid per Era // * Check that nominators are also rewarded with_externalities(&mut ExtBuilder::default() - .build(), + .nominate(false) + .build(), || { + // Init some balances + let _ = Balances::make_free_balance_be(&2, 500); + let delay = 1; - // this test is only in the scope of one era. Since this variable changes - // at the last block/new era, we'll save it. - let session_reward = 10; + let init_balance_2 = Balances::total_balance(&2); + let init_balance_10 = Balances::total_balance(&10); + let init_balance_11 = Balances::total_balance(&11); // Set payee to controller assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); @@ -337,17 +336,13 @@ fn rewards_should_work() { // Initial config should be correct assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 0); - assert_eq!(Staking::current_session_reward(), 10); - - // check the balance of a validator accounts. - assert_eq!(Balances::total_balance(&11), 1000); - // and the nominator (to-be) - let _ = Balances::make_free_balance_be(&2, 500); - assert_eq!(Balances::total_balance(&2), 500); - // add a dummy nominator. + // Add a dummy nominator. + // + // Equal division indicates that the reward will be equally divided among validator and + // nominator. >::insert(&11, Exposure { - own: 500, // equal division indicates that the reward will be equally divided among validator and nominator. + own: 500, total: 1000, others: vec![IndividualExposure {who: 2, value: 500 }] }); @@ -362,10 +357,21 @@ fn rewards_should_work() { Session::on_initialize(System::block_number()); assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 1); - - // session triggered: the reward value stashed should be 10 -- defined in ExtBuilder genesis. - assert_eq!(Staking::current_session_reward(), session_reward); - assert_eq!(Staking::current_era_reward(), session_reward); + >::reward_by_ids(vec![(11, 50)]); + >::reward_by_ids(vec![(11, 50)]); + // This is the second validator of the current elected set. + >::reward_by_ids(vec![(21, 50)]); + // This must be no-op as it is not an elected validator. + >::reward_by_ids(vec![(1001, 10_000)]); + + // Compute total payout now for whole duration as other parameter won't change + let total_payout = current_total_payout_for_duration(9 * 5); + assert!(total_payout > 10); // Test is meaningful if reward something + + // No reward yet + assert_eq!(Balances::total_balance(&2), init_balance_2); + assert_eq!(Balances::total_balance(&10), init_balance_10); + assert_eq!(Balances::total_balance(&11), init_balance_11); block = 6; // Block 6 => Session 2 => Era 0 System::set_block_number(block); @@ -374,11 +380,6 @@ fn rewards_should_work() { assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 2); - // session reward is the same, - assert_eq!(Staking::current_session_reward(), session_reward); - // though 2 will be deducted while stashed in the era reward due to delay - assert_eq!(Staking::current_era_reward(), 2*session_reward); // - delay); - block = 9; // Block 9 => Session 3 => Era 1 System::set_block_number(block); Timestamp::set_timestamp(block*5); // back to being on time. no delays @@ -386,8 +387,10 @@ fn rewards_should_work() { assert_eq!(Staking::current_era(), 1); assert_eq!(Session::current_index(), 3); - assert_eq!(Balances::total_balance(&10), 1 + (3*session_reward)/2); - assert_eq!(Balances::total_balance(&2), 500 + (3*session_reward)/2); + // 11 validator has 2/3 of the total rewards and half half for it and its nominator + assert_eq!(Balances::total_balance(&2), init_balance_2 + total_payout/3); + assert_eq!(Balances::total_balance(&10), init_balance_10 + total_payout/3); + assert_eq!(Balances::total_balance(&11), init_balance_11); }); } @@ -400,49 +403,36 @@ fn multi_era_reward_should_work() { .nominate(false) .build(), || { - let session_reward = 10; - - // This is set by the test config builder. - assert_eq!(Staking::current_session_reward(), session_reward); - - // check the balance of a validator accounts. - assert_eq!(Balances::total_balance(&10), 1); + let init_balance_10 = Balances::total_balance(&10); // Set payee to controller assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); - start_session(0); - - // session triggered: the reward value stashed should be 10 - assert_eq!(Staking::current_session_reward(), session_reward); - assert_eq!(Staking::current_era_reward(), session_reward); + // Compute now as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 10); // Test is meaningfull if reward something + dbg!(>::slot_stake()); + >::reward_by_ids(vec![(11, 1)]); + start_session(0); start_session(1); - - assert_eq!(Staking::current_session_reward(), session_reward); - assert_eq!(Staking::current_era_reward(), 2*session_reward); - start_session(2); + start_session(3); - // 1 + sum of of the session rewards accumulated - let recorded_balance = 1 + 3*session_reward; - assert_eq!(Balances::total_balance(&10), recorded_balance); - - // the reward for next era will be: session_reward * slot_stake - let new_session_reward = Staking::session_reward() * Staking::slot_stake(); - assert_eq!(Staking::current_session_reward(), new_session_reward); + assert_eq!(Staking::current_era(), 1); + assert_eq!(Balances::total_balance(&10), init_balance_10 + total_payout_0); - // fast forward to next era: start_session(4); - // intermediate test. - assert_eq!(Staking::current_era_reward(), 2*new_session_reward); + let total_payout_1 = current_total_payout_for_duration(3); + assert!(total_payout_1 > 10); // Test is meaningfull if reward something + >::reward_by_ids(vec![(11, 101)]); // new era is triggered here. start_session(5); // pay time - assert_eq!(Balances::total_balance(&10), 3*new_session_reward + recorded_balance); + assert_eq!(Balances::total_balance(&10), init_balance_10 + total_payout_0 + total_payout_1); }); } @@ -457,6 +447,8 @@ fn staking_should_work() { .fair(false) // to give 20 more staked value .build(), || { + Timestamp::set_timestamp(1); // Initialize time. + // remember + compare this along with the test. assert_eq_uvec!(validator_controllers(), vec![20, 10]); @@ -622,10 +614,6 @@ fn nominating_and_rewards_should_work() { assert_ok!(Staking::set_payee(Origin::signed(30), RewardDestination::Controller)); assert_ok!(Staking::set_payee(Origin::signed(40), RewardDestination::Controller)); - // default reward for the first session. - let session_reward = 10; - assert_eq!(Staking::current_session_reward(), session_reward); - // give the man some money let initial_balance = 1000; for i in [1, 2, 3, 4, 5, 10, 11, 20, 21].iter() { @@ -640,14 +628,22 @@ fn nominating_and_rewards_should_work() { assert_ok!(Staking::bond(Origin::signed(3), 4, 1000, RewardDestination::Controller)); assert_ok!(Staking::nominate(Origin::signed(4), vec![11, 21, 41])); + // the total reward for era 0 + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 100); // Test is meaningfull if reward something + >::reward_by_ids(vec![(41, 1)]); + >::reward_by_ids(vec![(31, 1)]); + >::reward_by_ids(vec![(21, 10)]); // must be no-op + >::reward_by_ids(vec![(11, 10)]); // must be no-op + start_era(1); // 10 and 20 have more votes, they will be chosen by phragmen. assert_eq_uvec!(validator_controllers(), vec![20, 10]); // OLD validators must have already received some rewards. - assert_eq!(Balances::total_balance(&40), 1 + 3 * session_reward); - assert_eq!(Balances::total_balance(&30), 1 + 3 * session_reward); + assert_eq!(Balances::total_balance(&40), 1 + total_payout_0/2); + assert_eq!(Balances::total_balance(&30), 1 + total_payout_0/2); // ------ check the staked value of all parties. @@ -707,35 +703,41 @@ fn nominating_and_rewards_should_work() { assert_eq!(Staking::stakers(31).total, 0); assert_eq!(Staking::stakers(41).total, 0); + // the total reward for era 1 + let total_payout_1 = current_total_payout_for_duration(3); + assert!(total_payout_1 > 100); // Test is meaningfull if reward something + >::reward_by_ids(vec![(41, 10)]); // must be no-op + >::reward_by_ids(vec![(31, 10)]); // must be no-op + >::reward_by_ids(vec![(21, 2)]); + >::reward_by_ids(vec![(11, 1)]); start_era(2); - // next session reward. - let new_session_reward = Staking::session_reward() * 3 * Staking::slot_stake(); - // NOTE: some addition or substraction (-2, -3, +1) are due to arithmetic approximations + // nothing else will happen, era ends and rewards are paid again, + // it is expected that nominators will also be paid. See below + + let payout_for_10 = total_payout_1/3; + let payout_for_20 = 2*total_payout_1/3; if cfg!(feature = "equalize") { - // Both have: has [400/2000 ~ 1/5 from 10] + [600/2000 ~ 3/10 from 20]'s reward. ==> 1/5 + 3/10 = 1/2 - assert_eq!(Balances::total_balance(&2), initial_balance + new_session_reward/2 - 3); - assert_eq!(Balances::total_balance(&4), initial_balance + new_session_reward/2 - 3); - // Rest for validators. - assert_eq!(Balances::total_balance(&10), initial_balance + new_session_reward/2 + 1); - assert_eq!(Balances::total_balance(&20), initial_balance + new_session_reward/2 + 1); + // Nominator 2: has [400/2000 ~ 1/5 from 10] + [600/2000 ~ 3/10 from 20]'s reward. + assert_eq!(Balances::total_balance(&2), initial_balance + payout_for_10/5 + payout_for_20*3/10 - 1); + // Nominator 4: has [400/2000 ~ 1/5 from 20] + [600/2000 ~ 3/10 from 10]'s reward. + assert_eq!(Balances::total_balance(&4), initial_balance + payout_for_20/5 + payout_for_10*3/10); + + // Validator 10: got 1000 / 2000 external stake. + assert_eq!(Balances::total_balance(&10), initial_balance + payout_for_10/2); + // Validator 20: got 1000 / 2000 external stake. + assert_eq!(Balances::total_balance(&20), initial_balance + payout_for_20/2); } else { // Nominator 2: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> 2/9 + 3/11 - assert_eq!( - Balances::total_balance(&2), - initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11) - 2 - ); + assert_eq!(Balances::total_balance(&2), initial_balance + (2*payout_for_10/9 + 3*payout_for_20/11) - 2); // Nominator 4: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> 2/9 + 3/11 - assert_eq!( - Balances::total_balance(&4), - initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11) - 2 - ); + assert_eq!(Balances::total_balance(&4), initial_balance + (2*payout_for_10/9 + 3*payout_for_20/11) - 2); - // 10 got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9 - assert_eq!(Balances::total_balance(&10), initial_balance + 5*new_session_reward/9 - 1); - // 10 got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = 5/11 - assert_eq!(Balances::total_balance(&20), initial_balance + 5*new_session_reward/11 + 2); + // Validator 10: got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9 + assert_eq!(Balances::total_balance(&10), initial_balance + 5*payout_for_10/9 - 1); + // Validator 20: got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = 5/11 + assert_eq!(Balances::total_balance(&20), initial_balance + 5*payout_for_20/11); } check_exposure_all(); @@ -768,6 +770,10 @@ fn nominators_also_get_slashed() { assert_ok!(Staking::bond(Origin::signed(1), 2, nominator_stake, RewardDestination::default())); assert_ok!(Staking::nominate(Origin::signed(2), vec![20, 10])); + let total_payout = current_total_payout_for_duration(3); + assert!(total_payout > 100); // Test is meaningfull if reward something + >::reward_by_ids(vec![(11, 1)]); + // new era, pay rewards, start_era(1); @@ -783,7 +789,7 @@ fn nominators_also_get_slashed() { let nominator_slash = nominator_stake.min(total_slash - validator_slash); // initial + first era reward + slash - assert_eq!(Balances::total_balance(&10), initial_balance + 30 - validator_slash); + assert_eq!(Balances::total_balance(&10), initial_balance + total_payout - validator_slash); assert_eq!(Balances::total_balance(&2), initial_balance - nominator_slash); check_exposure_all(); check_nominator_all(); @@ -878,6 +884,43 @@ fn session_and_eras_work() { }); } +#[test] +fn forcing_new_era_works() { + with_externalities(&mut ExtBuilder::default().build(),|| { + // normal flow of session. + assert_eq!(Staking::current_era(), 0); + start_session(0); + assert_eq!(Staking::current_era(), 0); + start_session(1); + assert_eq!(Staking::current_era(), 0); + start_session(2); + assert_eq!(Staking::current_era(), 1); + + // no era change. + ForceEra::put(Forcing::ForceNone); + start_session(3); + assert_eq!(Staking::current_era(), 1); + start_session(4); + assert_eq!(Staking::current_era(), 1); + start_session(5); + assert_eq!(Staking::current_era(), 1); + start_session(6); + assert_eq!(Staking::current_era(), 1); + + // back to normal + ForceEra::put(Forcing::NotForcing); + start_session(7); + assert_eq!(Staking::current_era(), 1); + start_session(8); + assert_eq!(Staking::current_era(), 2); + + // forceful change + ForceEra::put(Forcing::ForceNew); + start_session(9); + assert_eq!(Staking::current_era(), 3); + }); +} + #[test] fn cannot_transfer_staked_balance() { // Tests that a stash account cannot transfer funds @@ -963,45 +1006,47 @@ fn reward_destination_works() { active: 1000, unlocking: vec![], })); - // Check current session reward is 10 - let session_reward0 = 3 * Staking::current_session_reward(); // 10 - // Move forward the system for payment - Timestamp::set_timestamp(5); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 100); // Test is meaningfull if reward something + >::reward_by_ids(vec![(11, 1)]); + start_era(1); // Check that RewardDestination is Staked (default) assert_eq!(Staking::payee(&11), RewardDestination::Staked); // Check that reward went to the stash account of validator - assert_eq!(Balances::free_balance(&11), 1000 + session_reward0); + assert_eq!(Balances::free_balance(&11), 1000 + total_payout_0); // Check that amount at stake increased accordingly assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, - total: 1000 + session_reward0, - active: 1000 + session_reward0, + total: 1000 + total_payout_0, + active: 1000 + total_payout_0, unlocking: vec![], })); - // Update current session reward - let session_reward1 = 3 * Staking::current_session_reward(); // 1010 (1* slot_stake) //Change RewardDestination to Stash >::insert(&11, RewardDestination::Stash); - // Move forward the system for payment - Timestamp::set_timestamp(10); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_1 = current_total_payout_for_duration(3); + assert!(total_payout_1 > 100); // Test is meaningfull if reward something + >::reward_by_ids(vec![(11, 1)]); + start_era(2); // Check that RewardDestination is Stash assert_eq!(Staking::payee(&11), RewardDestination::Stash); // Check that reward went to the stash account - assert_eq!(Balances::free_balance(&11), 1000 + session_reward0 + session_reward1); + assert_eq!(Balances::free_balance(&11), 1000 + total_payout_0 + total_payout_1); // Record this value - let recorded_stash_balance = 1000 + session_reward0 + session_reward1; + let recorded_stash_balance = 1000 + total_payout_0 + total_payout_1; // Check that amount at stake is NOT increased assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, - total: 1000 + session_reward0, - active: 1000 + session_reward0, + total: 1000 + total_payout_0, + active: 1000 + total_payout_0, unlocking: vec![], })); @@ -1011,20 +1056,22 @@ fn reward_destination_works() { // Check controller balance assert_eq!(Balances::free_balance(&10), 1); - // Move forward the system for payment - Timestamp::set_timestamp(15); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_2 = current_total_payout_for_duration(3); + assert!(total_payout_2 > 100); // Test is meaningfull if reward something + >::reward_by_ids(vec![(11, 1)]); + start_era(3); - let session_reward2 = 3 * Staking::current_session_reward(); // 1010 (1* slot_stake) // Check that RewardDestination is Controller assert_eq!(Staking::payee(&11), RewardDestination::Controller); // Check that reward went to the controller account - assert_eq!(Balances::free_balance(&10), 1 + session_reward2); + assert_eq!(Balances::free_balance(&10), 1 + total_payout_2); // Check that amount at stake is NOT increased assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, - total: 1000 + session_reward0, - active: 1000 + session_reward0, + total: 1000 + total_payout_0, + active: 1000 + total_payout_0, unlocking: vec![], })); // Check that amount in staked account is NOT increased. @@ -1041,10 +1088,8 @@ fn validator_payment_prefs_work() { .build(), || { // Initial config - let session_reward = 10; let validator_cut = 5; let stash_initial_balance = Balances::total_balance(&11); - assert_eq!(Staking::current_session_reward(), session_reward); // check the balance of a validator accounts. assert_eq!(Balances::total_balance(&10), 1); @@ -1065,35 +1110,15 @@ fn validator_payment_prefs_work() { validator_payment: validator_cut }); - // ------------ Fast forward - // Block 3 => Session 1 => Era 0 - let mut block = 3; - System::set_block_number(block); - Session::on_initialize(System::block_number()); - assert_eq!(Staking::current_era(), 0); - assert_eq!(Session::current_index(), 1); - - // session triggered: the reward value stashed should be 10 -- defined in ExtBuilder genesis. - assert_eq!(Staking::current_session_reward(), session_reward); - assert_eq!(Staking::current_era_reward(), session_reward); - - block = 6; // Block 6 => Session 2 => Era 0 - System::set_block_number(block); - Session::on_initialize(System::block_number()); - assert_eq!(Staking::current_era(), 0); - assert_eq!(Session::current_index(), 2); - - assert_eq!(Staking::current_session_reward(), session_reward); - assert_eq!(Staking::current_era_reward(), 2*session_reward); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 100); // Test is meaningfull if reward something + >::reward_by_ids(vec![(11, 1)]); - block = 9; // Block 9 => Session 3 => Era 1 - System::set_block_number(block); - Session::on_initialize(System::block_number()); - assert_eq!(Staking::current_era(), 1); - assert_eq!(Session::current_index(), 3); + start_era(1); // whats left to be shared is the sum of 3 rounds minus the validator's cut. - let shared_cut = 3 * session_reward - validator_cut; + let shared_cut = total_payout_0 - validator_cut; // Validator's payee is Staked account, 11, reward will be paid here. assert_eq!(Balances::total_balance(&11), stash_initial_balance + shared_cut/2 + validator_cut); // Controller account will not get any reward. @@ -1171,7 +1196,6 @@ fn bond_extra_and_withdraw_unbonded_works() { // Initial config should be correct assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 0); - assert_eq!(Staking::current_session_reward(), 10); // check the balance of a validator accounts. assert_eq!(Balances::total_balance(&10), 1); @@ -1300,22 +1324,31 @@ fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment( assert_eq!(Staking::stakers(&21).total, 69); >::insert(&20, StakingLedger { stash: 22, total: 69, active: 69, unlocking: vec![] }); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 100); // Test is meaningfull if reward something + >::reward_by_ids(vec![(11, 1)]); + >::reward_by_ids(vec![(21, 1)]); + // New era --> rewards are paid --> stakes are changed start_era(1); // -- new balances + reward - assert_eq!(Staking::stakers(&11).total, 1000 + 30); - assert_eq!(Staking::stakers(&21).total, 69 + 30); + assert_eq!(Staking::stakers(&11).total, 1000 + total_payout_0/2); + assert_eq!(Staking::stakers(&21).total, 69 + total_payout_0/2); + + let _11_balance = Balances::free_balance(&11); + assert_eq!(_11_balance, 1000 + total_payout_0/2); // -- slot stake should also be updated. - assert_eq!(Staking::slot_stake(), 69 + 30); + assert_eq!(Staking::slot_stake(), 69 + total_payout_0/2); // If 10 gets slashed now, it will be slashed by 5% of exposure.total * 2.pow(unstake_thresh) Staking::on_offline_validator(10, 4); // Confirm user has been reported assert_eq!(Staking::slash_count(&11), 4); // check the balance of 10 (slash will be deducted from free balance.) - assert_eq!(Balances::free_balance(&11), 1000 + 30 - 51 /*5% of 1030*/ * 8 /*2**3*/); + assert_eq!(Balances::free_balance(&11), _11_balance - _11_balance*5/100 * 2u64.pow(3)); check_exposure_all(); check_nominator_all(); @@ -1627,6 +1660,8 @@ fn switching_roles() { .nominate(false) .build(), || { + Timestamp::set_timestamp(1); // Initialize time. + // Reset reward destination for i in &[10, 20] { assert_ok!(Staking::set_payee(Origin::signed(*i), RewardDestination::Controller)); } @@ -1724,7 +1759,7 @@ fn bond_with_no_staked_value() { .nominate(false) .minimum_validator_count(1) .build(), || { - // Can't bond with 1 + // Can't bond with 1 assert_noop!( Staking::bond(Origin::signed(1), 2, 1, RewardDestination::Controller), "can not bond with value less than minimum balance" @@ -1759,7 +1794,6 @@ fn bond_with_no_staked_value() { assert_ok!(Staking::withdraw_unbonded(Origin::signed(2))); assert!(Staking::ledger(2).is_none()); assert_eq!(Balances::locks(&1).len(), 0); - }); } @@ -1777,13 +1811,16 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() { // setup assert_ok!(Staking::chill(Origin::signed(30))); assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); - let initial_balance_2 = Balances::free_balance(&2); - let initial_balance_10 = Balances::free_balance(&10); + let init_balance_2 = Balances::free_balance(&2); + let init_balance_10 = Balances::free_balance(&10); // Stingy validator. assert_ok!(Staking::bond(Origin::signed(1), 2, 1, RewardDestination::Controller)); assert_ok!(Staking::validate(Origin::signed(2), ValidatorPrefs::default())); + let total_payout_0 = current_total_payout_for_duration(3); + assert!(total_payout_0 > 100); // Test is meaningfull if reward something + reward_all_elected(); start_era(1); // 2 is elected. @@ -1792,26 +1829,25 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() { assert_eq!(Staking::slot_stake(), 1); // Old ones are rewarded. - assert_eq!(Balances::free_balance(&10), initial_balance_10 + 30); + assert_eq!(Balances::free_balance(&10), init_balance_10 + total_payout_0/3); // no rewards paid to 2. This was initial election. - assert_eq!(Balances::free_balance(&2), initial_balance_2); + assert_eq!(Balances::free_balance(&2), init_balance_2); + let total_payout_1 = current_total_payout_for_duration(3); + assert!(total_payout_1 > 100); // Test is meaningfull if reward something + reward_all_elected(); start_era(2); assert_eq_uvec!(validator_controllers(), vec![20, 10, 2]); assert_eq!(Staking::slot_stake(), 1); - let reward = Staking::current_session_reward(); - // 2 will not get the full reward, practically 1 - assert_eq!(Balances::free_balance(&2), initial_balance_2 + reward.max(3)); - // same for 10 - assert_eq!(Balances::free_balance(&10), initial_balance_10 + 30 + reward.max(3)); + assert_eq!(Balances::free_balance(&2), init_balance_2 + total_payout_1/3); + assert_eq!(Balances::free_balance(&10), init_balance_10 + total_payout_0/3 + total_payout_1/3); check_exposure_all(); check_nominator_all(); }); } - #[cfg(feature = "equalize")] #[test] fn phragmen_linear_worse_case_equalize() { @@ -2066,7 +2102,7 @@ fn reward_validator_slashing_validator_doesnt_overflow() { >::insert(&11, Exposure { total: stake, own: stake, others: vec![] }); // Check reward - Staking::reward_validator(&11, reward_slash); + let _ = Staking::reward_validator(&11, reward_slash); assert_eq!(Balances::total_balance(&11), stake * 2); // Set staker @@ -2082,3 +2118,71 @@ fn reward_validator_slashing_validator_doesnt_overflow() { assert_eq!(Balances::total_balance(&2), 1); }) } + +#[test] +fn reward_from_authorship_event_handler_works() { + with_externalities(&mut ExtBuilder::default() + .build(), + || { + use authorship::EventHandler; + + assert_eq!(>::author(), 11); + + >::note_author(11); + >::note_uncle(21, 1); + // An uncle author that is not currently elected doesn't get rewards, + // but the block producer does get reward for referencing it. + >::note_uncle(31, 1); + // Rewarding the same two times works. + >::note_uncle(11, 1); + + // Not mandatory but must be coherent with rewards + assert_eq!(>::get(), vec![21, 11]); + + // 21 is rewarded as an uncle producer + // 11 is rewarded as a block procuder and uncle referencer and uncle producer + assert_eq!(CurrentEraRewards::get().rewards, vec![1, 20+2*3 + 1]); + assert_eq!(CurrentEraRewards::get().total, 28); + }) +} + +#[test] +fn add_reward_points_fns_works() { + with_externalities(&mut ExtBuilder::default() + .build(), + || { + let validators = >::current_elected(); + // Not mandatory but must be coherent with rewards + assert_eq!(validators, vec![21, 11]); + + >::reward_by_indices(vec![ + (0, 1), + (1, 1), + (2, 1), + (1, 1), + ]); + + >::reward_by_ids(vec![ + (21, 1), + (11, 1), + (31, 1), + (11, 1), + ]); + + assert_eq!(CurrentEraRewards::get().rewards, vec![2, 4]); + assert_eq!(CurrentEraRewards::get().total, 6); + }) +} + +#[test] +fn unbonded_balance_is_not_slashable() { + with_externalities(&mut ExtBuilder::default().build(), || { + // total amount staked is slashable. + assert_eq!(Staking::slashable_balance_of(&11), 1000); + + assert_ok!(Staking::unbond(Origin::signed(10), 800)); + + // only the active portion. + assert_eq!(Staking::slashable_balance_of(&11), 200); + }) +} diff --git a/srml/sudo/Cargo.toml b/srml/sudo/Cargo.toml index 7a25075390d890307a996f096138d6392670c7a1..d0e2d5dbc55e494afbdb5a99b495622b613ad775 100644 --- a/srml/sudo/Cargo.toml +++ b/srml/sudo/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } sr-std = { path = "../../core/sr-std", default-features = false } sr-io = { path = "../../core/sr-io", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } @@ -16,13 +16,13 @@ system = { package = "srml-system", path = "../system", default-features = false [dev-dependencies] sr-io = { path = "../../core/sr-io", default-features = false } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "sr-std/std", "sr-io/std", "sr-primitives/std", diff --git a/srml/sudo/src/lib.rs b/srml/sudo/src/lib.rs index f2665102f7eb53d0d09e0bd642f59ad3019881ca..983e48441b948dfb6d91d4e37a3dae2ab202fb4f 100644 --- a/srml/sudo/src/lib.rs +++ b/srml/sudo/src/lib.rs @@ -88,6 +88,7 @@ use sr_std::prelude::*; use sr_primitives::traits::StaticLookup; +use sr_primitives::weights::SimpleDispatchInfo; use srml_support::{ StorageValue, Parameter, RuntimeDispatchable, decl_module, decl_event, decl_storage, ensure @@ -116,6 +117,7 @@ decl_module! { /// - Limited storage reads. /// - No DB writes. /// # + #[weight = SimpleDispatchInfo::FixedOperational(1_000_000)] fn sudo(origin, proposal: Box) { // This is a public call, so we ensure that the origin is some signed account. let sender = ensure_signed(origin)?; diff --git a/srml/support/Cargo.toml b/srml/support/Cargo.toml index 88cad9651a81e994bb9ca147f25214bbc5860bde..2befc11b19538def8b23f695cdea80925c50ae0e 100644 --- a/srml/support/Cargo.toml +++ b/srml/support/Cargo.toml @@ -6,12 +6,12 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } -codec = { package = "parity-codec", version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } srml-metadata = { path = "../metadata", default-features = false } sr-std = { path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } -substrate-primitives = { path = "../../core/primitives", default-features = false } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } srml-support-procedural = { path = "./procedural" } paste = "0.1" @@ -20,7 +20,7 @@ bitmask = { version = "0.5", default-features = false } [dev-dependencies] pretty_assertions = "0.6.1" -srml-system = { path = "../system", default-features = false } +srml-system = { path = "../system" } [features] default = ["std"] diff --git a/srml/support/procedural/src/lib.rs b/srml/support/procedural/src/lib.rs index b8bcb15de1b4b31f461c1911009c39c6995d2e20..78051ee8f2735e4fe72b8482bf9dfcdf139bbd42 100644 --- a/srml/support/procedural/src/lib.rs +++ b/srml/support/procedural/src/lib.rs @@ -18,7 +18,7 @@ //! Proc macro of Support code for the runtime. // end::description[] -#![recursion_limit="256"] +#![recursion_limit="512"] extern crate proc_macro; @@ -83,6 +83,14 @@ use proc_macro::TokenStream; /// If the second key is untrusted, a cryptographic `hasher` such as `blake2_256` must be used. /// Otherwise, other items in storage with the same first key can be compromised. /// +/// Supported hashers (ordered from least to best security): +/// +/// * `twox_64_concat` - TwoX with 64bit + key concatenated. +/// * `twox_128` - TwoX with 128bit. +/// * `twox_256` - TwoX with with 256bit. +/// * `blake2_128` - Blake2 with 128bit. +/// * `blake2_256` - Blake2 with 256bit. +/// /// Basic storage can be extended as such: /// /// `#vis #name get(#getter) config(#field_name) build(#closure): #type = #default;` diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs index d5dc91635bbc9aafa74a4dcade8d1d4ce9efd81a..dd936636735141231ee6352e14c4032a00ad35df 100644 --- a/srml/support/procedural/src/storage/impls.rs +++ b/srml/support/procedural/src/storage/impls.rs @@ -200,10 +200,13 @@ impl<'a, I: Iterator> Impls<'a, I> { } = instance_opts; let final_prefix = if let Some(instance) = instance { - let const_name = syn::Ident::new(&format!("{}{}", PREFIX_FOR, name.to_string()), proc_macro2::Span::call_site()); - quote!{ #instance::#const_name.as_bytes() } + let const_name = syn::Ident::new( + &format!("{}{}", PREFIX_FOR, name.to_string()), + proc_macro2::Span::call_site(), + ); + quote! { #instance::#const_name.as_bytes() } } else { - quote!{ #prefix.as_bytes() } + quote! { #prefix.as_bytes() } }; let trait_required = ext::type_contains_ident(value_type, traitinstance) @@ -352,6 +355,12 @@ impl<'a, I: Iterator> Impls<'a, I> { } }; + let mutate_map = if type_infos.is_option { + quote! { .map(|(data, linkage)| (Some(data), Some(linkage))) } + } else { + quote! { .map(|(data, linkage)| (data, Some(linkage))) } + }; + let trait_required = ext::type_contains_ident(value_type, traitinstance) || ext::type_contains_ident(kty, traitinstance); @@ -442,7 +451,7 @@ impl<'a, I: Iterator> Impls<'a, I> { fn remove_linkage>(linkage: Linkage<#kty>, storage: &mut S); /// Read the contained data and it's linkage. - fn read_with_linkage(storage: &S, key: &[u8]) -> Option<(#value_type, Linkage<#kty>)> + fn read_with_linkage(storage: &S, key: &[u8]) -> Option<(#typ, Linkage<#kty>)> where S: #scrate::HashedStorage<#scrate::#hasher>; @@ -504,7 +513,7 @@ impl<'a, I: Iterator> Impls<'a, I> { fn read_with_linkage>( storage: &S, key: &[u8], - ) -> Option<(#value_type, self::#inner_module::Linkage<#kty>)> { + ) -> Option<(#typ, self::#inner_module::Linkage<#kty>)> { storage.get(key) } @@ -586,14 +595,12 @@ impl<'a, I: Iterator> Impls<'a, I> { fn take>(key: &#kty, storage: &mut S) -> Self::Query { use self::#inner_module::Utils; - let res: Option<(#value_type, self::#inner_module::Linkage<#kty>)> = storage.take(&*#as_map::key_for(key)); - match res { - Some((data, linkage)) => { - Self::remove_linkage(linkage, storage); - data - }, - None => #fielddefault, - } + let res: Option<(#typ, self::#inner_module::Linkage<#kty>)> = storage.take(&*#as_map::key_for(key)); + + res.map(|(d, l)| { + Self::remove_linkage(l, storage); + d + }).#option_simple_1(|| #fielddefault) } /// Remove the value under a key. @@ -602,7 +609,33 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Store a value to be associated with the given key from the map. - fn insert>(key: &#kty, val: &#typ, storage: &mut S) { + fn insert>( + key: &#kty, + val: &#typ, + storage: &mut S, + ) { + use self::#inner_module::Utils; + + let key_for = &*#as_map::key_for(key); + let linkage = match Self::read_with_linkage(storage, key_for) { + // overwrite but reuse existing linkage + Some((_data, linkage)) => linkage, + // create new linkage + None => Self::new_head_linkage(storage, key), + }; + + storage.put(key_for, &(val, linkage)) + } + + /// Store a value under this key into the provided storage instance; this can take any reference + /// type that derefs to `T` (and has `Encode` implemented). + /// Store a value under this key into the provided storage instance. + fn insert_ref(key: &#kty, val: &Arg, storage: &mut S) + where + #typ: AsRef, + Arg: ?Sized + #scrate::codec::Encode, + S: #scrate::HashedStorage<#scrate::#hasher> + { use self::#inner_module::Utils; let key_for = &*#as_map::key_for(key); @@ -612,6 +645,7 @@ impl<'a, I: Iterator> Impls<'a, I> { // create new linkage None => Self::new_head_linkage(storage, key), }; + storage.put(key_for, &(val, linkage)) } @@ -625,11 +659,11 @@ impl<'a, I: Iterator> Impls<'a, I> { let key_for = &*#as_map::key_for(key); let (mut val, linkage) = Self::read_with_linkage(storage, key_for) - .map(|(data, linkage)| (data, Some(linkage))) + #mutate_map .unwrap_or_else(|| (#fielddefault, None)); let ret = f(&mut val); - #mutate_impl ; + #mutate_impl; ret } } @@ -694,13 +728,18 @@ impl<'a, I: Iterator> Impls<'a, I> { let mutate_impl = if !is_option { quote!{ - #as_double_map::insert(key1, key2, &val, storage) + #as_double_map::insert(k1, k2, &val, storage) } } else { quote!{ match val { - Some(ref val) => #as_double_map::insert(key1, key2, &val, storage), - None => #as_double_map::remove(key1, key2, storage), + Some(ref val) => #as_double_map::insert::( + k1, + k2, + val, + storage, + ), + None => #as_double_map::remove(k1, k2, storage), } } }; @@ -751,7 +790,10 @@ impl<'a, I: Iterator> Impls<'a, I> { { type Query = #value_type; - fn prefix_for(k1: &#k1ty) -> Vec { + fn prefix_for(k1: &KArg1) -> #scrate::rstd::vec::Vec where + KArg1: ?Sized + #scrate::codec::Encode, + #k1ty: #scrate::rstd::borrow::Borrow, + { use #scrate::storage::hashed::generator::StorageHasher; let mut key = #as_double_map::prefix().to_vec(); @@ -763,7 +805,15 @@ impl<'a, I: Iterator> Impls<'a, I> { #final_prefix } - fn key_for(k1: &#k1ty, k2: &#k2ty) -> Vec { + fn key_for( + k1: &KArg1, + k2: &KArg2, + ) -> #scrate::rstd::vec::Vec where + #k1ty: #scrate::rstd::borrow::Borrow, + #k2ty: #scrate::rstd::borrow::Borrow, + KArg1: ?Sized + #scrate::codec::Encode, + KArg2: ?Sized + #scrate::codec::Encode, + { use #scrate::storage::hashed::generator::StorageHasher; let mut key = #as_double_map::prefix_for(k1); @@ -771,25 +821,50 @@ impl<'a, I: Iterator> Impls<'a, I> { key } - fn get(key1: &#k1ty, key2: &#k2ty, storage: &S) -> Self::Query { - let key = #as_double_map::key_for(key1, key2); + fn get( + k1: &KArg1, + k2: &KArg2, + storage: &S, + ) -> Self::Query where + #k1ty: #scrate::rstd::borrow::Borrow, + #k2ty: #scrate::rstd::borrow::Borrow, + KArg1: ?Sized + #scrate::codec::Encode, + KArg2: ?Sized + #scrate::codec::Encode, + { + let key = #as_double_map::key_for(k1, k2); storage.get(&key).#option_simple_1(|| #fielddefault) } - fn take(key1: &#k1ty, key2: &#k2ty, storage: &mut S) -> Self::Query { - let key = #as_double_map::key_for(key1, key2); + fn take( + k1: &KArg1, + k2: &KArg2, + storage: &mut S, + ) -> Self::Query where + #k1ty: #scrate::rstd::borrow::Borrow, + #k2ty: #scrate::rstd::borrow::Borrow, + KArg1: ?Sized + #scrate::codec::Encode, + KArg2: ?Sized + #scrate::codec::Encode, + { + let key = #as_double_map::key_for(k1, k2); storage.take(&key).#option_simple_1(|| #fielddefault) } - fn mutate(key1: &#k1ty, key2: &#k2ty, f: F, storage: &mut S) -> R - where + fn mutate( + k1: &KArg1, + k2: &KArg2, + f: F, + storage: &mut S, + ) -> R where + #k1ty: #scrate::rstd::borrow::Borrow, + #k2ty: #scrate::rstd::borrow::Borrow, + KArg1: ?Sized + #scrate::codec::Encode, + KArg2: ?Sized + #scrate::codec::Encode, F: FnOnce(&mut Self::Query) -> R, - S: #scrate::UnhashedStorage, { - let mut val = #as_double_map::get(key1, key2, storage); + let mut val = #as_double_map::get(k1, k2, storage); let ret = f(&mut val); - #mutate_impl ; + #mutate_impl; ret } } diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index 6f0cf93179eafb2c5379ec2cbe1be0883088503e..d378907cb1e72fbc2af14dc66beac2340b477af9 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -138,13 +138,14 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { &instance_opts.instance, &storage_lines, ); - let (store_default_struct, store_functions_to_metadata) = store_functions_to_metadata( + let (store_default_struct, store_metadata) = store_functions_to_metadata( &scrate, &traitinstance, &traittype, &instance_opts, &storage_lines, &where_clause, + &cratename, ); let InstanceOpts { @@ -153,7 +154,6 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { .. } = instance_opts; - let cratename_string = cratename.to_string(); let expanded = quote! { #scrate_decl #decl_storage_items @@ -171,12 +171,8 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { { #impl_store_fns #[doc(hidden)] - pub fn store_metadata_functions() -> &'static [#scrate::metadata::StorageEntryMetadata] { - #store_functions_to_metadata - } - #[doc(hidden)] - pub fn store_metadata_name() -> &'static str { - #cratename_string + pub fn storage_metadata() -> #scrate::metadata::StorageMetadata { + #store_metadata } } @@ -384,7 +380,7 @@ fn decl_store_extra_genesis( } let mut has_scall = false; - let mut scall = quote!{ ( |_, _, _| {} ) }; + let mut scall = quote!{ ( |_, _| {} ) }; let mut genesis_extrafields = TokenStream2::new(); let mut genesis_extrafields_default = TokenStream2::new(); @@ -535,43 +531,46 @@ fn decl_store_extra_genesis( impl#fparam_impl GenesisConfig#sparam #genesis_where_clause { pub fn build_storage #fn_generic (self) -> std::result::Result< ( - #scrate::runtime_primitives::StorageOverlay, - #scrate::runtime_primitives::ChildrenStorageOverlay, + #scrate::sr_primitives::StorageOverlay, + #scrate::sr_primitives::ChildrenStorageOverlay, ), String > #fn_where_clause { - let mut storage = Default::default(); - let mut child_storage = Default::default(); - self.assimilate_storage::<#fn_traitinstance>(&mut storage, &mut child_storage)?; - Ok((storage, child_storage)) + let mut storage = (Default::default(), Default::default()); + self.assimilate_storage::<#fn_traitinstance>(&mut storage)?; + Ok(storage) } /// Assimilate the storage for this module into pre-existing overlays. pub fn assimilate_storage #fn_generic ( self, - r: &mut #scrate::runtime_primitives::StorageOverlay, - c: &mut #scrate::runtime_primitives::ChildrenStorageOverlay, + tuple_storage: &mut ( + #scrate::sr_primitives::StorageOverlay, + #scrate::sr_primitives::ChildrenStorageOverlay, + ), ) -> std::result::Result<(), String> #fn_where_clause { - let storage = r; + let storage = &mut tuple_storage.0; #builders - #scall(storage, c, &self); + #scall(tuple_storage, &self); Ok(()) } } #[cfg(feature = "std")] - impl#build_storage_impl #scrate::runtime_primitives::#impl_trait + impl#build_storage_impl #scrate::sr_primitives::#impl_trait for GenesisConfig#sparam #build_storage_where_clause { fn build_module_genesis_storage( self, - r: &mut #scrate::runtime_primitives::StorageOverlay, - c: &mut #scrate::runtime_primitives::ChildrenStorageOverlay, + storage: &mut ( + #scrate::sr_primitives::StorageOverlay, + #scrate::sr_primitives::ChildrenStorageOverlay, + ), ) -> std::result::Result<(), String> { - self.assimilate_storage::<#fn_traitinstance> (r, c) + self.assimilate_storage::<#fn_traitinstance> (storage) } } }; @@ -583,22 +582,25 @@ fn decl_store_extra_genesis( } fn create_and_impl_instance( - prefix: &str, + instance_prefix: &str, ident: &Ident, doc: &TokenStream2, const_names: &[(Ident, String)], scrate: &TokenStream2, instantiable: &Ident, + cratename: &Ident, ) -> TokenStream2 { let mut const_impls = TokenStream2::new(); for (const_name, partial_const_value) in const_names { - let const_value = format!("{}{}", partial_const_value, prefix); + let const_value = format!("{}{}", instance_prefix, partial_const_value); const_impls.extend(quote! { const #const_name: &'static str = #const_value; }); } + let prefix = format!("{}{}", instance_prefix, cratename.to_string()); + quote! { // Those trait are derived because of wrong bounds for generics #[cfg_attr(feature = "std", derive(Debug))] @@ -606,6 +608,7 @@ fn create_and_impl_instance( #doc pub struct #ident; impl #instantiable for #ident { + const PREFIX: &'static str = #prefix; #const_impls } } @@ -620,7 +623,6 @@ fn decl_storage_items( storage_lines: &ext::Punctuated, where_clause: &Option, ) -> TokenStream2 { - let mut impls = TokenStream2::new(); let InstanceOpts { @@ -686,6 +688,8 @@ fn decl_storage_items( /// Defines storage prefixes, they must be unique. #hide pub trait #instantiable: 'static { + /// The prefix used by any storage entry of an instance. + const PREFIX: &'static str; #const_impls } }); @@ -707,9 +711,11 @@ fn decl_storage_items( ); // Impl Instance trait for instances - for (prefix, ident, doc) in instances { + for (instance_prefix, ident, doc) in instances { impls.extend( - create_and_impl_instance(&prefix, &ident, &doc, &const_names, scrate, &instantiable) + create_and_impl_instance( + &instance_prefix, &ident, &doc, &const_names, scrate, &instantiable, cratename + ) ); } } @@ -725,7 +731,13 @@ fn decl_storage_items( } else { impls.extend( create_and_impl_instance( - "", &inherent_instance, "e!(#[doc(hidden)]), &const_names, scrate, &instantiable + "", + &inherent_instance, + "e!(#[doc(hidden)]), + &const_names, + scrate, + &instantiable, + cratename, ) ); } @@ -780,10 +792,7 @@ fn decl_storage_items( impls } - -fn decl_store_items( - storage_lines: &ext::Punctuated, -) -> TokenStream2 { +fn decl_store_items(storage_lines: &ext::Punctuated) -> TokenStream2 { storage_lines.inner.iter().map(|sline| &sline.name) .fold(TokenStream2::new(), |mut items, name| { items.extend(quote!(type #name;)); @@ -905,15 +914,17 @@ fn impl_store_fns( }; quote!{ - pub fn #get_fn(k1: KArg1, k2: KArg2) -> #value_type + pub fn #get_fn(k1: &KArg1, k2: &KArg2) -> #value_type where - KArg1: #scrate::rstd::borrow::Borrow<#key1_type>, - KArg2: #scrate::rstd::borrow::Borrow<#key2_type>, + #key1_type: #scrate::rstd::borrow::Borrow, + #key2_type: #scrate::rstd::borrow::Borrow, + KArg1: ?Sized + #scrate::codec::Encode, + KArg2: ?Sized + #scrate::codec::Encode, { < #name<#struct_trait #instance> as #scrate::storage::unhashed::generator::StorageDoubleMap<#key1_type, #key2_type, #typ> - >::get(k1.borrow(), k2.borrow(), &#scrate::storage::RuntimeStorage) + >::get(k1, k2, &#scrate::storage::RuntimeStorage) } } } @@ -931,8 +942,8 @@ fn store_functions_to_metadata ( instance_opts: &InstanceOpts, storage_lines: &ext::Punctuated, where_clause: &Option, + cratename: &Ident, ) -> (TokenStream2, TokenStream2) { - let InstanceOpts { comma_instance, equal_default_instance, @@ -1061,6 +1072,12 @@ fn store_functions_to_metadata ( } } + unsafe impl<#traitinstance: #traittype, #instance #bound_instantiable> Send + for #struct_name<#traitinstance, #instance> #where_clause {} + + unsafe impl<#traitinstance: #traittype, #instance #bound_instantiable> Sync + for #struct_name<#traitinstance, #instance> #where_clause {} + #[cfg(not(feature = "std"))] impl<#traitinstance: #traittype, #instance #bound_instantiable> #scrate::metadata::DefaultByte for #struct_name<#traitinstance, #instance> #where_clause @@ -1075,11 +1092,14 @@ fn store_functions_to_metadata ( default_getter_struct_def.extend(def_get); } + + let prefix = cratename.to_string(); + let prefix = instance.as_ref().map_or_else(|| quote!(#prefix), |i| quote!(#i::PREFIX)); + (default_getter_struct_def, quote!{ - { - &[ - #items - ] + #scrate::metadata::StorageMetadata { + prefix: #scrate::metadata::DecodeDifferent::Encode(#prefix), + entries: #scrate::metadata::DecodeDifferent::Encode(&[ #items ][..]), } }) } diff --git a/srml/support/procedural/tools/src/lib.rs b/srml/support/procedural/tools/src/lib.rs index 1b8a580773d0b6eee6a0f2e16a2d04cc9fb96490..2b08104ca71ba9e218d2d494fb2962d6a8fad8d3 100644 --- a/srml/support/procedural/tools/src/lib.rs +++ b/srml/support/procedural/tools/src/lib.rs @@ -37,8 +37,8 @@ fn generate_hidden_includes_mod_name(unique_id: &str) -> Ident { /// Generates the access to the `srml-support` crate. pub fn generate_crate_access(unique_id: &str, def_crate: &str) -> TokenStream { - if ::std::env::var("CARGO_PKG_NAME").unwrap() == def_crate { - quote::quote!( crate ) + if std::env::var("CARGO_PKG_NAME").unwrap() == def_crate { + quote::quote!( srml_support ) } else { let mod_name = generate_hidden_includes_mod_name(unique_id); quote::quote!( self::#mod_name::hidden_include ) diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index 10031f50a9d915ccfc72c67ce3bfa16291d39b07..31b077bbc2dac1e0f2a858d9b50b0c73f37a39f4 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -25,7 +25,12 @@ pub use srml_metadata::{ FunctionMetadata, DecodeDifferent, DecodeDifferentArray, FunctionArgumentMetadata, ModuleConstantMetadata, DefaultByte, DefaultByteGetter, }; -pub use sr_primitives::{DispatchError, weights::{TransactionWeight, Weighable, Weight}}; +pub use sr_primitives::{ + weights::{ + SimpleDispatchInfo, GetDispatchInfo, DispatchInfo, WeighData, ClassifyDispatch, + TransactionPriority + }, traits::{Dispatchable, DispatchResult}, DispatchError +}; /// A type that cannot be instantiated. pub enum Never {} @@ -722,7 +727,7 @@ macro_rules! decl_module { { $( $error_type )* } [ $( $dispatchables )* ] $(#[doc = $doc_attr])* - #[weight = $crate::dispatch::TransactionWeight::default()] + #[weight = $crate::dispatch::SimpleDispatchInfo::default()] $fn_vis fn $fn_name( $from $(, $(#[$codec_attr])* $param_name : $param )* ) $( -> $result )* { $( $impl )* } @@ -890,7 +895,7 @@ macro_rules! decl_module { fn on_initialize() { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnInitialize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnInitialize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn on_initialize(_block_number_not_used: $trait_instance::BlockNumber) { $( $impl )* } @@ -903,7 +908,7 @@ macro_rules! decl_module { fn on_initialize($param:ident : $param_ty:ty) { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnInitialize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnInitialize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn on_initialize($param: $param_ty) { $( $impl )* } @@ -915,7 +920,7 @@ macro_rules! decl_module { { $( $other_where_bounds:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnInitialize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnInitialize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* {} }; @@ -926,7 +931,7 @@ macro_rules! decl_module { fn on_finalize() { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnFinalize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnFinalize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn on_finalize(_block_number_not_used: $trait_instance::BlockNumber) { $( $impl )* } @@ -939,7 +944,7 @@ macro_rules! decl_module { fn on_finalize($param:ident : $param_ty:ty) { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnFinalize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnFinalize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn on_finalize($param: $param_ty) { $( $impl )* } @@ -951,7 +956,7 @@ macro_rules! decl_module { { $( $other_where_bounds:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OnFinalize<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OnFinalize<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { } @@ -963,7 +968,7 @@ macro_rules! decl_module { fn offchain_worker() { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn generate_extrinsics(_block_number_not_used: $trait_instance::BlockNumber) { $( $impl )* } @@ -976,7 +981,7 @@ macro_rules! decl_module { fn offchain_worker($param:ident : $param_ty:ty) { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* { fn generate_extrinsics($param: $param_ty) { $( $impl )* } @@ -988,7 +993,7 @@ macro_rules! decl_module { { $( $other_where_bounds:tt )* } ) => { impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> - $crate::runtime_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> + $crate::sr_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )* {} }; @@ -1255,14 +1260,38 @@ macro_rules! decl_module { } // Implement weight calculation function for Call - impl<$trait_instance: $trait_name $(, $instance: $instantiable)?> $crate::dispatch::Weighable + impl<$trait_instance: $trait_name $(, $instance: $instantiable)?> $crate::dispatch::GetDispatchInfo for $call_type<$trait_instance $(, $instance)?> where $( $other_where_bounds )* { - fn weight(&self, _len: usize) -> $crate::dispatch::Weight { - match self { - $( $call_type::$fn_name(..) => $crate::dispatch::Weighable::weight(&$weight, _len), )* - $call_type::__PhantomItem(_, _) => { unreachable!("__PhantomItem should never be used.") }, - } + fn get_dispatch_info(&self) -> $crate::dispatch::DispatchInfo { + $( + if let $call_type::$fn_name($( ref $param_name ),*) = self { + let weight = >::weigh_data( + &$weight, + ($( $param_name, )*) + ); + let class = >::classify_dispatch( + &$weight, + ($( $param_name, )*) + ); + return $crate::dispatch::DispatchInfo { weight, class }; + } + if let $call_type::__PhantomItem(_, _) = self { unreachable!("__PhantomItem should never be used.") } + )* + // Defensive only: this function must have already returned at this point. + // all dispatchable function will have a weight which has the `::default` + // implementation of `SimpleDispatchInfo`. Nonetheless, we create one if it does + // not exist. + let weight = >::weigh_data( + &$crate::dispatch::SimpleDispatchInfo::default(), + () + ); + let class = >::classify_dispatch( + &$crate::dispatch::SimpleDispatchInfo::default(), + () + ); + $crate::dispatch::DispatchInfo { weight, class } + } } @@ -1386,7 +1415,7 @@ macro_rules! decl_module { } pub trait IsSubType, R> { - fn is_aux_sub_type(&self) -> Option<&CallableCallFor>; + fn is_sub_type(&self) -> Option<&CallableCallFor>; } /// Implement a meta-dispatch module to dispatch to other dispatchers. @@ -1408,10 +1437,10 @@ macro_rules! impl_outer_dispatch { $camelcase ( $crate::dispatch::CallableCallFor<$camelcase, $runtime> ) ,)* } - impl $crate::dispatch::Weighable for $call_type { - fn weight(&self, len: usize) -> $crate::dispatch::Weight { + impl $crate::dispatch::GetDispatchInfo for $call_type { + fn get_dispatch_info(&self) -> $crate::dispatch::DispatchInfo { match self { - $( $call_type::$camelcase(call) => call.weight(len), )* + $( $call_type::$camelcase(call) => call.get_dispatch_info(), )* } } } @@ -1437,7 +1466,7 @@ macro_rules! impl_outer_dispatch { $( impl $crate::dispatch::IsSubType<$camelcase, $runtime> for $call_type { #[allow(unreachable_patterns)] - fn is_aux_sub_type(&self) -> Option<&$crate::dispatch::CallableCallFor<$camelcase, $runtime>> { + fn is_sub_type(&self) -> Option<&$crate::dispatch::CallableCallFor<$camelcase, $runtime>> { match *self { $call_type::$camelcase(ref r) => Some(r), // May be unreachable @@ -1598,6 +1627,14 @@ macro_rules! __impl_module_constants_metadata { $crate::dispatch::Encode::encode(&value) } } + + unsafe impl<$const_trait_instance: 'static + $const_trait_name $( + , $const_instance: $const_instantiable)? + > Send for $default_byte_name <$const_trait_instance $(, $const_instance)?> {} + + unsafe impl<$const_trait_instance: 'static + $const_trait_name $( + , $const_instance: $const_instantiable)? + > Sync for $default_byte_name <$const_trait_instance $(, $const_instance)?> {} )* &[ $( @@ -1762,7 +1799,8 @@ macro_rules! __check_reserved_fn_name { #[allow(dead_code)] mod tests { use super::*; - use crate::runtime_primitives::traits::{OnInitialize, OnFinalize}; + use crate::sr_primitives::traits::{OnInitialize, OnFinalize}; + use sr_primitives::weights::{DispatchInfo, DispatchClass}; pub trait Trait: system::Trait + Sized where Self::AccountId: From { type Origin; @@ -1788,7 +1826,7 @@ mod tests { fn aux_0(_origin) -> Result { unreachable!() } fn aux_1(_origin, #[compact] _data: u32) -> Result { unreachable!() } fn aux_2(_origin, _data: i32, _data2: String) -> Result { unreachable!() } - #[weight = TransactionWeight::Basic(10, 100)] + #[weight = SimpleDispatchInfo::FixedNormal(3)] fn aux_3(_origin) -> Result { unreachable!() } fn aux_4(_origin, _data: i32) -> Result { unreachable!() } fn aux_5(_origin, _data: i32, #[compact] _data2: u32) -> Result { unreachable!() } @@ -1797,8 +1835,8 @@ mod tests { fn on_finalize(n: T::BlockNumber) { if n.into() == 42 { panic!("on_finalize") } } fn offchain_worker() {} - #[weight = TransactionWeight::Max] - fn weighted(_origin) { unreachable!() } + #[weight = SimpleDispatchInfo::FixedOperational(5)] + fn operational(_origin) { unreachable!() } } } @@ -1864,7 +1902,7 @@ mod tests { documentation: DecodeDifferent::Encode(&[]), }, FunctionMetadata { - name: DecodeDifferent::Encode("weighted"), + name: DecodeDifferent::Encode("operational"), arguments: DecodeDifferent::Encode(&[]), documentation: DecodeDifferent::Encode(&[]), }, @@ -1938,11 +1976,20 @@ mod tests { #[test] fn weight_should_attach_to_call_enum() { - // max weight. not dependent on input. - assert_eq!(Call::::weighted().weight(100), 3 * 1024 * 1024); + // operational. + assert_eq!( + Call::::operational().get_dispatch_info(), + DispatchInfo { weight: 5, class: DispatchClass::Operational }, + ); // default weight. - assert_eq!(Call::::aux_0().weight(5), 5 /*tx-len*/); + assert_eq!( + Call::::aux_0().get_dispatch_info(), + DispatchInfo { weight: 10_000, class: DispatchClass::Normal }, + ); // custom basic - assert_eq!(Call::::aux_3().weight(5), 10 + 100 * 5 ); + assert_eq!( + Call::::aux_3().get_dispatch_info(), + DispatchInfo { weight: 3, class: DispatchClass::Normal }, + ); } } diff --git a/srml/support/src/double_map.rs b/srml/support/src/double_map.rs index d35570ae4f7b6d34bc681ec96ba50e5384f61f19..aec7f497a63913391256237b7a8df1a360ab3ccb 100644 --- a/srml/support/src/double_map.rs +++ b/srml/support/src/double_map.rs @@ -34,8 +34,8 @@ use sr_std::borrow::Borrow; /// /// Hasher are implemented in derive_key* methods. pub trait StorageDoubleMapWithHasher { - type Key1: Codec; - type Key2: Codec; + type Key1: Encode; + type Key2: Encode; type Value: Codec + Default; const PREFIX: &'static [u8]; diff --git a/srml/support/src/inherent.rs b/srml/support/src/inherent.rs index d886abbca7e373ece226eed2fdd0a4c7c011f51c..1b6d8fbdd7ed93588da2892c1ccc3357c900fd2f 100644 --- a/srml/support/src/inherent.rs +++ b/srml/support/src/inherent.rs @@ -17,7 +17,7 @@ #[doc(hidden)] pub use crate::rstd::vec::Vec; #[doc(hidden)] -pub use crate::runtime_primitives::traits::{Block as BlockT, Extrinsic}; +pub use crate::sr_primitives::traits::{Block as BlockT, Extrinsic}; #[doc(hidden)] pub use inherents::{InherentData, ProvideInherent, CheckInherentsResult, IsFatalError}; diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index 7a29b880cb2e6e4a9228b81fa9182ba2d3f83a89..5f5d24d8c9d4826dfd9899accdd62bfb084b0730 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -18,6 +18,9 @@ #![cfg_attr(not(feature = "std"), no_std)] +/// Export ourself as `srml_support` to make tests happy. +extern crate self as srml_support; + #[macro_use] extern crate bitmask; @@ -32,7 +35,6 @@ pub use codec; pub use once_cell; #[doc(hidden)] pub use paste; -pub use sr_primitives as runtime_primitives; pub use self::storage::hashed::generator::{ HashedStorage, Twox256, Twox128, Blake2_256, Blake2_128, Twox64Concat @@ -70,7 +72,7 @@ pub use self::dispatch::{ }; pub use self::double_map::StorageDoubleMapWithHasher; pub use runtime_io::{print, storage_root, Printable}; -pub use runtime_primitives::ConsensusEngineId; +pub use sr_primitives::{self, ConsensusEngineId}; /// Macro for easily creating a new implementation of the `Get` trait. Use similarly to /// how you would declare a `const`: @@ -102,7 +104,7 @@ macro_rules! parameter_types { () => (); (IMPL $name:ident , $type:ty , $value:expr) => { impl $name { - fn get() -> $type { + pub fn get() -> $type { $value } } @@ -227,6 +229,37 @@ macro_rules! __assert_eq_uvec { } } +/// Checks that `$x` is equal to `$y` with an error rate of `$error`. +/// +/// # Example +/// +/// ```rust +/// # fn main() { +/// srml_support::assert_eq_error_rate!(10, 10, 0); +/// srml_support::assert_eq_error_rate!(10, 11, 1); +/// srml_support::assert_eq_error_rate!(12, 10, 2); +/// # } +/// ``` +/// +/// ```rust,should_panic +/// # fn main() { +/// srml_support::assert_eq_error_rate!(12, 10, 1); +/// # } +/// ``` +#[macro_export] +#[cfg(feature = "std")] +macro_rules! assert_eq_error_rate { + ($x:expr, $y:expr, $error:expr) => { + assert!( + ($x) >= (($y) - ($error)) && ($x) <= (($y) + ($error)), + "{:?} != {:?} (with error rate {:?})", + $x, + $y, + $error, + ); + }; +} + /// The void type - it cannot exist. // Oh rust, you crack me up... #[derive(Clone, Eq, PartialEq)] @@ -258,9 +291,8 @@ mod tests { use codec::Codec; use runtime_io::{with_externalities, Blake2Hasher}; pub use srml_metadata::{ - DecodeDifferent, StorageEntryMetadata, - StorageEntryType, StorageEntryModifier, - DefaultByte, DefaultByteGetter, StorageHasher + DecodeDifferent, StorageEntryMetadata, StorageMetadata, StorageEntryType, + StorageEntryModifier, DefaultByte, DefaultByteGetter, StorageHasher }; pub use rstd::marker::PhantomData; @@ -283,6 +315,7 @@ mod tests { decl_storage! { trait Store for Module as Example { pub Data get(data) build(|_| vec![(15u32, 42u64)]): linked_map hasher(twox_64_concat) u32 => u64; + pub OptionLinkedMap: linked_map u32 => Option; pub GenericData get(generic_data): linked_map hasher(twox_128) T::BlockNumber => T::BlockNumber; pub GenericData2 get(generic_data2): linked_map T::BlockNumber => Option; @@ -301,11 +334,21 @@ mod tests { } fn new_test_ext() -> runtime_io::TestExternalities { - GenesisConfig::default().build_storage().unwrap().0.into() + GenesisConfig::default().build_storage().unwrap().into() } type Map = Data; + #[test] + fn linked_map_issue_3318() { + with_externalities(&mut new_test_ext(), || { + OptionLinkedMap::insert(1, 1); + assert_eq!(OptionLinkedMap::get(1), Some(1)); + OptionLinkedMap::insert(1, 2); + assert_eq!(OptionLinkedMap::get(1), Some(2)); + }); + } + #[test] fn linked_map_basic_insert_remove_should_work() { with_externalities(&mut new_test_ext(), || { @@ -394,32 +437,32 @@ mod tests { // get / insert / take let key1 = 17u32; let key2 = 18u32; - assert_eq!(DoubleMap::get(key1, key2), 0u64); - DoubleMap::insert(key1, key2, 4u64); - assert_eq!(DoubleMap::get(key1, key2), 4u64); - assert_eq!(DoubleMap::take(key1, key2), 4u64); - assert_eq!(DoubleMap::get(key1, key2), 0u64); + assert_eq!(DoubleMap::get(&key1, &key2), 0u64); + DoubleMap::insert(&key1, &key2, &4u64); + assert_eq!(DoubleMap::get(&key1, &key2), 4u64); + assert_eq!(DoubleMap::take(&key1, &key2), 4u64); + assert_eq!(DoubleMap::get(&key1, &key2), 0u64); // mutate - DoubleMap::mutate(key1, key2, |val| { + DoubleMap::mutate(&key1, &key2, |val| { *val = 15; }); - assert_eq!(DoubleMap::get(key1, key2), 15u64); + assert_eq!(DoubleMap::get(&key1, &key2), 15u64); // remove - DoubleMap::remove(key1, key2); - assert_eq!(DoubleMap::get(key1, key2), 0u64); + DoubleMap::remove(&key1, &key2); + assert_eq!(DoubleMap::get(&key1, &key2), 0u64); // remove prefix - DoubleMap::insert(key1, key2, 4u64); - DoubleMap::insert(key1, key2+1, 4u64); - DoubleMap::insert(key1+1, key2, 4u64); - DoubleMap::insert(key1+1, key2+1, 4u64); - DoubleMap::remove_prefix(key1); - assert_eq!(DoubleMap::get(key1, key2), 0u64); - assert_eq!(DoubleMap::get(key1, key2+1), 0u64); - assert_eq!(DoubleMap::get(key1+1, key2), 4u64); - assert_eq!(DoubleMap::get(key1+1, key2+1), 4u64); + DoubleMap::insert(&key1, &key2, &4u64); + DoubleMap::insert(&key1, &(key2 + 1), &4u64); + DoubleMap::insert(&(key1 + 1), &key2, &4u64); + DoubleMap::insert(&(key1 + 1), &(key2 + 1), &4u64); + DoubleMap::remove_prefix(&key1); + assert_eq!(DoubleMap::get(&key1, &key2), 0u64); + assert_eq!(DoubleMap::get(&key1, &(key2 + 1)), 0u64); + assert_eq!(DoubleMap::get(&(key1 + 1), &key2), 4u64); + assert_eq!(DoubleMap::get(&(key1 + 1), &(key2 + 1)), 4u64); }); } @@ -432,118 +475,139 @@ mod tests { let key1 = 17u32; let key2 = 18u32; - DoubleMap::insert(key1, key2, vec![1]); - DoubleMap::append(key1, key2, &[2, 3]).unwrap(); - assert_eq!(DoubleMap::get(key1, key2), vec![1, 2, 3]); + DoubleMap::insert(&key1, &key2, &vec![1]); + DoubleMap::append(&key1, &key2, &[2, 3]).unwrap(); + assert_eq!(DoubleMap::get(&key1, &key2), &[1, 2, 3]); }); } - const EXPECTED_METADATA: &[StorageEntryMetadata] = &[ - StorageEntryMetadata { - name: DecodeDifferent::Encode("Data"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map{ - hasher: StorageHasher::Twox64Concat, - key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), is_linked: true - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructData(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GenericData"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map{ - hasher: StorageHasher::Twox128, - key: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode("T::BlockNumber"), - is_linked: true - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGenericData(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GenericData2"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map{ - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode("T::BlockNumber"), - is_linked: true - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGenericData2(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("DataDM"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Twox64Concat, - key1: DecodeDifferent::Encode("u32"), - key2: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("u64"), - key2_hasher: StorageHasher::Blake2_256, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructDataDM(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GenericDataDM"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Blake2_256, - key1: DecodeDifferent::Encode("T::BlockNumber"), - key2: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode("T::BlockNumber"), - key2_hasher: StorageHasher::Twox128, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGenericDataDM(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GenericData2DM"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Blake2_256, - key1: DecodeDifferent::Encode("T::BlockNumber"), - key2: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode("T::BlockNumber"), - key2_hasher: StorageHasher::Twox256, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("AppendableDM"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Blake2_256, - key1: DecodeDifferent::Encode("u32"), - key2: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode("Vec"), - key2_hasher: StorageHasher::Blake2_256, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - ]; + const EXPECTED_METADATA: StorageMetadata = StorageMetadata { + prefix: DecodeDifferent::Encode("Example"), + entries: DecodeDifferent::Encode( + &[ + StorageEntryMetadata { + name: DecodeDifferent::Encode("Data"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map{ + hasher: StorageHasher::Twox64Concat, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("u64"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructData(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("OptionLinkedMap"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("u32"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructOptionLinkedMap(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GenericData"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map{ + hasher: StorageHasher::Twox128, + key: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("T::BlockNumber"), + is_linked: true + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericData(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GenericData2"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map{ + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("T::BlockNumber"), + is_linked: true + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericData2(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("DataDM"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::DoubleMap{ + hasher: StorageHasher::Twox64Concat, + key1: DecodeDifferent::Encode("u32"), + key2: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("u64"), + key2_hasher: StorageHasher::Blake2_256, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructDataDM(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GenericDataDM"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::DoubleMap{ + hasher: StorageHasher::Blake2_256, + key1: DecodeDifferent::Encode("T::BlockNumber"), + key2: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("T::BlockNumber"), + key2_hasher: StorageHasher::Twox128, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericDataDM(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GenericData2DM"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::DoubleMap{ + hasher: StorageHasher::Blake2_256, + key1: DecodeDifferent::Encode("T::BlockNumber"), + key2: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("T::BlockNumber"), + key2_hasher: StorageHasher::Twox256, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("AppendableDM"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::DoubleMap{ + hasher: StorageHasher::Blake2_256, + key1: DecodeDifferent::Encode("u32"), + key2: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("Vec"), + key2_hasher: StorageHasher::Blake2_256, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + ] + ), + }; #[test] fn store_metadata() { - let metadata = Module::::store_metadata_functions(); - assert_eq!(EXPECTED_METADATA, metadata); + let metadata = Module::::storage_metadata(); + pretty_assertions::assert_eq!(EXPECTED_METADATA, metadata); } } diff --git a/srml/support/src/metadata.rs b/srml/support/src/metadata.rs index bdb3671e3431546f223ae8116de76ac293808bf3..4bc1f906dad55821f6e8326d31177d582849fc33 100644 --- a/srml/support/src/metadata.rs +++ b/srml/support/src/metadata.rs @@ -15,16 +15,42 @@ // along with Substrate. If not, see . pub use srml_metadata::{ - DecodeDifferent, FnEncode, RuntimeMetadata, ModuleMetadata, RuntimeMetadataV6, - DefaultByteGetter, RuntimeMetadataPrefixed, StorageEntryMetadata, + DecodeDifferent, FnEncode, RuntimeMetadata, ModuleMetadata, RuntimeMetadataLastVersion, + DefaultByteGetter, RuntimeMetadataPrefixed, StorageEntryMetadata, StorageMetadata, StorageEntryType, StorageEntryModifier, DefaultByte, StorageHasher }; /// Implements the metadata support for the given runtime and all its modules. /// /// Example: -/// ```compile_fail -/// impl_runtime_metadata!(for RUNTIME_NAME with modules MODULE0, MODULE2, MODULE3 with Storage); +/// ``` +///# mod module0 { +///# pub trait Trait { +///# type Origin; +///# type BlockNumber; +///# } +///# srml_support::decl_module! { +///# pub struct Module for enum Call where origin: T::Origin {} +///# } +///# +///# srml_support::decl_storage! { +///# trait Store for Module as TestStorage {} +///# } +///# } +///# use module0 as module1; +///# use module0 as module2; +///# impl module0::Trait for Runtime { +///# type Origin = u32; +///# type BlockNumber = u32; +///# } +/// +/// struct Runtime; +/// srml_support::impl_runtime_metadata! { +/// for Runtime with modules +/// module0::Module as Module0 with, +/// module1::Module as Module1 with, +/// module2::Module as Module2 with Storage, +/// }; /// ``` /// /// In this example, just `MODULE3` implements the `Storage` trait. @@ -36,11 +62,9 @@ macro_rules! impl_runtime_metadata { ) => { impl $runtime { pub fn metadata() -> $crate::metadata::RuntimeMetadataPrefixed { - $crate::metadata::RuntimeMetadata::V6 ( - $crate::metadata::RuntimeMetadataV6 { + $crate::metadata::RuntimeMetadataLastVersion { modules: $crate::__runtime_modules_to_metadata!($runtime;; $( $rest )*), - } - ).into() + }.into() } } } @@ -52,17 +76,22 @@ macro_rules! __runtime_modules_to_metadata { ( $runtime: ident; $( $metadata:expr ),*; - $mod:ident::$module:ident $( < $instance:ident > )? $(with)+ $($kw:ident)*, + $mod:ident::$module:ident $( < $instance:ident > )? as $name:ident $(with)+ $($kw:ident)*, $( $rest:tt )* ) => { $crate::__runtime_modules_to_metadata!( $runtime; $( $metadata, )* $crate::metadata::ModuleMetadata { - name: $crate::metadata::DecodeDifferent::Encode(stringify!($mod)), - prefix: $crate::__runtime_modules_to_metadata_calls_storagename!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*), - storage: $crate::__runtime_modules_to_metadata_calls_storage!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*), - calls: $crate::__runtime_modules_to_metadata_calls_call!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*), - event: $crate::__runtime_modules_to_metadata_calls_event!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*), + name: $crate::metadata::DecodeDifferent::Encode(stringify!($name)), + storage: $crate::__runtime_modules_to_metadata_calls_storage!( + $mod, $module $( <$instance> )?, $runtime, $(with $kw)* + ), + calls: $crate::__runtime_modules_to_metadata_calls_call!( + $mod, $module $( <$instance> )?, $runtime, $(with $kw)* + ), + event: $crate::__runtime_modules_to_metadata_calls_event!( + $mod, $module $( <$instance> )?, $runtime, $(with $kw)* + ), constants: $crate::metadata::DecodeDifferent::Encode( $crate::metadata::FnEncode( $mod::$module::<$runtime $(, $mod::$instance )?>::module_constants_metadata @@ -103,7 +132,9 @@ macro_rules! __runtime_modules_to_metadata_calls_call { with $_:ident $(with $kws:ident)* ) => { - $crate::__runtime_modules_to_metadata_calls_call!( $mod, $module $( <$instance> )?, $runtime, $(with $kws)* ); + $crate::__runtime_modules_to_metadata_calls_call! { + $mod, $module $( <$instance> )?, $runtime, $(with $kws)* + }; }; ( $mod: ident, @@ -151,42 +182,6 @@ macro_rules! __runtime_modules_to_metadata_calls_event { }; } -#[macro_export] -#[doc(hidden)] -macro_rules! __runtime_modules_to_metadata_calls_storagename { - ( - $mod: ident, - $module: ident $( <$instance:ident> )?, - $runtime: ident, - with Storage - $(with $kws:ident)* - ) => { - $crate::metadata::DecodeDifferent::Encode( - $crate::metadata::FnEncode( - $mod::$module::<$runtime $(, $mod::$instance )?>::store_metadata_name - ) - ) - }; - ( - $mod: ident, - $module: ident $( <$instance:ident> )?, - $runtime: ident, - with $_:ident - $(with $kws:ident)* - ) => { - $crate::__runtime_modules_to_metadata_calls_storagename!( $mod, $module $( <$instance> )?, $runtime, $(with $kws)* ); - }; - ( - $mod: ident, - $module: ident $( <$instance:ident> )?, - $runtime: ident, - ) => { - $crate::metadata::DecodeDifferent::Encode( - $crate::metadata::FnEncode(|| "") - ) - }; -} - #[macro_export] #[doc(hidden)] macro_rules! __runtime_modules_to_metadata_calls_storage { @@ -199,7 +194,7 @@ macro_rules! __runtime_modules_to_metadata_calls_storage { ) => { Some($crate::metadata::DecodeDifferent::Encode( $crate::metadata::FnEncode( - $mod::$module::<$runtime $(, $mod::$instance )?>::store_metadata_functions + $mod::$module::<$runtime $(, $mod::$instance )?>::storage_metadata ) )) }; @@ -210,7 +205,9 @@ macro_rules! __runtime_modules_to_metadata_calls_storage { with $_:ident $(with $kws:ident)* ) => { - $crate::__runtime_modules_to_metadata_calls_storage!( $mod, $module $( <$instance> )?, $runtime, $(with $kws)* ); + $crate::__runtime_modules_to_metadata_calls_storage! { + $mod, $module $( <$instance> )?, $runtime, $(with $kws)* + }; }; ( $mod: ident, @@ -327,7 +324,7 @@ mod tests { StorageMethod : Option; } add_extra_genesis { - build(|_, _, _| {}); + build(|_, _| {}); } } } @@ -381,9 +378,9 @@ mod tests { impl_runtime_metadata!( for TestRuntime with modules - system::Module with Event, - event_module::Module with Event Call, - event_module2::Module with Event Storage Call, + system::Module as System with Event, + event_module::Module as Module with Event Call, + event_module2::Module as Module2 with Event Storage Call, ); struct ConstantBlockNumberByteGetter; @@ -407,110 +404,110 @@ mod tests { } } - const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V6( - RuntimeMetadataV6 { - modules: DecodeDifferent::Encode(&[ - ModuleMetadata { - name: DecodeDifferent::Encode("system"), - prefix: DecodeDifferent::Encode(FnEncode(|| "")), - storage: None, - calls: None, - event: Some(DecodeDifferent::Encode( - FnEncode(||&[ - EventMetadata { - name: DecodeDifferent::Encode("SystemEvent"), - arguments: DecodeDifferent::Encode(&[]), - documentation: DecodeDifferent::Encode(&[]) - } - ]) - )), - constants: DecodeDifferent::Encode( - FnEncode(|| &[ - ModuleConstantMetadata { - name: DecodeDifferent::Encode("BlockNumber"), - ty: DecodeDifferent::Encode("T::BlockNumber"), - value: DecodeDifferent::Encode( - DefaultByteGetter(&ConstantBlockNumberByteGetter) - ), - documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]), - }, - ModuleConstantMetadata { - name: DecodeDifferent::Encode("GetType"), - ty: DecodeDifferent::Encode("T::AccountId"), - value: DecodeDifferent::Encode( - DefaultByteGetter(&ConstantGetTypeByteGetter) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - ModuleConstantMetadata { - name: DecodeDifferent::Encode("ASSOCIATED_CONST"), - ty: DecodeDifferent::Encode("u64"), - value: DecodeDifferent::Encode( - DefaultByteGetter(&ConstantAssociatedConstByteGetter) - ), - documentation: DecodeDifferent::Encode(&[]), - } - ]) - ), - }, - ModuleMetadata { - name: DecodeDifferent::Encode("event_module"), - prefix: DecodeDifferent::Encode(FnEncode(|| "")), - storage: None, - calls: Some( - DecodeDifferent::Encode(FnEncode(|| &[ - FunctionMetadata { - name: DecodeDifferent::Encode("aux_0"), - arguments: DecodeDifferent::Encode(&[]), - documentation: DecodeDifferent::Encode(&[]), - } - ]))), - event: Some(DecodeDifferent::Encode( - FnEncode(||&[ - EventMetadata { - name: DecodeDifferent::Encode("TestEvent"), - arguments: DecodeDifferent::Encode(&["Balance"]), - documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]) - } - ]) - )), - constants: DecodeDifferent::Encode(FnEncode(|| &[])), - }, - ModuleMetadata { - name: DecodeDifferent::Encode("event_module2"), - prefix: DecodeDifferent::Encode(FnEncode(||"TestStorage")), - storage: Some(DecodeDifferent::Encode( - FnEncode(||&[ - StorageEntryMetadata { - name: DecodeDifferent::Encode("StorageMethod"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter( - &event_module2::__GetByteStructStorageMethod( - std::marker::PhantomData:: + const EXPECTED_METADATA: RuntimeMetadataLastVersion = RuntimeMetadataLastVersion { + modules: DecodeDifferent::Encode(&[ + ModuleMetadata { + name: DecodeDifferent::Encode("System"), + storage: None, + calls: None, + event: Some(DecodeDifferent::Encode( + FnEncode(||&[ + EventMetadata { + name: DecodeDifferent::Encode("SystemEvent"), + arguments: DecodeDifferent::Encode(&[]), + documentation: DecodeDifferent::Encode(&[]) + } + ]) + )), + constants: DecodeDifferent::Encode( + FnEncode(|| &[ + ModuleConstantMetadata { + name: DecodeDifferent::Encode("BlockNumber"), + ty: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode( + DefaultByteGetter(&ConstantBlockNumberByteGetter) + ), + documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]), + }, + ModuleConstantMetadata { + name: DecodeDifferent::Encode("GetType"), + ty: DecodeDifferent::Encode("T::AccountId"), + value: DecodeDifferent::Encode( + DefaultByteGetter(&ConstantGetTypeByteGetter) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + ModuleConstantMetadata { + name: DecodeDifferent::Encode("ASSOCIATED_CONST"), + ty: DecodeDifferent::Encode("u64"), + value: DecodeDifferent::Encode( + DefaultByteGetter(&ConstantAssociatedConstByteGetter) + ), + documentation: DecodeDifferent::Encode(&[]), + } + ]) + ), + }, + ModuleMetadata { + name: DecodeDifferent::Encode("Module"), + storage: None, + calls: Some( + DecodeDifferent::Encode(FnEncode(|| &[ + FunctionMetadata { + name: DecodeDifferent::Encode("aux_0"), + arguments: DecodeDifferent::Encode(&[]), + documentation: DecodeDifferent::Encode(&[]), + } + ]))), + event: Some(DecodeDifferent::Encode( + FnEncode(||&[ + EventMetadata { + name: DecodeDifferent::Encode("TestEvent"), + arguments: DecodeDifferent::Encode(&["Balance"]), + documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]) + } + ]) + )), + constants: DecodeDifferent::Encode(FnEncode(|| &[])), + }, + ModuleMetadata { + name: DecodeDifferent::Encode("Module2"), + storage: Some(DecodeDifferent::Encode( + FnEncode(|| StorageMetadata { + prefix: DecodeDifferent::Encode("TestStorage"), + entries: DecodeDifferent::Encode( + &[ + StorageEntryMetadata { + name: DecodeDifferent::Encode("StorageMethod"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter( + &event_module2::__GetByteStructStorageMethod( + std::marker::PhantomData:: + ) ) - ) - ), - documentation: DecodeDifferent::Encode(&[]), - } - ]) - )), - calls: Some(DecodeDifferent::Encode(FnEncode(|| &[]))), - event: Some(DecodeDifferent::Encode( - FnEncode(||&[ - EventMetadata { - name: DecodeDifferent::Encode("TestEvent"), - arguments: DecodeDifferent::Encode(&["Balance"]), - documentation: DecodeDifferent::Encode(&[]) - } - ]) - )), - constants: DecodeDifferent::Encode(FnEncode(|| &[])), - }, - ]) - } - ); + ), + documentation: DecodeDifferent::Encode(&[]), + } + ] + ) + }), + )), + calls: Some(DecodeDifferent::Encode(FnEncode(|| &[]))), + event: Some(DecodeDifferent::Encode( + FnEncode(||&[ + EventMetadata { + name: DecodeDifferent::Encode("TestEvent"), + arguments: DecodeDifferent::Encode(&["Balance"]), + documentation: DecodeDifferent::Encode(&[]) + } + ]) + )), + constants: DecodeDifferent::Encode(FnEncode(|| &[])), + }, + ]) + }; #[test] fn runtime_metadata() { diff --git a/srml/support/src/runtime.rs b/srml/support/src/runtime.rs index 4461e37518698a3c145a726a58ece426c9759a3c..9aae241dba18aac3426a4d22b7be4b224d965e09 100644 --- a/srml/support/src/runtime.rs +++ b/srml/support/src/runtime.rs @@ -194,10 +194,10 @@ macro_rules! construct_runtime { #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] pub struct $runtime; - impl $crate::runtime_primitives::traits::GetNodeBlockType for $runtime { + impl $crate::sr_primitives::traits::GetNodeBlockType for $runtime { type NodeBlock = $node_block; } - impl $crate::runtime_primitives::traits::GetRuntimeBlockType for $runtime { + impl $crate::sr_primitives::traits::GetRuntimeBlockType for $runtime { type RuntimeBlock = $block; } $crate::__decl_outer_event!( @@ -576,7 +576,9 @@ macro_rules! __decl_runtime_metadata { $runtime; { $( $parsed )* - $module $( < $module_instance > )? { $( $( $leading_module )* )? $( $modules )* } + $module $( < $module_instance > )? as $name { + $( $( $leading_module )* )? $( $modules )* + } }; $( $rest )* ); @@ -618,11 +620,18 @@ macro_rules! __decl_runtime_metadata { // end of decl ( $runtime:ident; - { $( $parsed_modules:ident $( < $module_instance:ident > )? { $( $withs:ident )* } )* }; + { + $( + $parsed_modules:ident $( < $module_instance:ident > )? as $parsed_name:ident { + $( $withs:ident )* + } + )* + }; ) => { $crate::impl_runtime_metadata!( for $runtime with modules - $( $parsed_modules::Module $( < $module_instance > )? with $( $withs )* , )* + $( $parsed_modules::Module $( < $module_instance > )? as $parsed_name + with $( $withs )* , )* ); } } @@ -689,7 +698,7 @@ macro_rules! __decl_outer_config { }; ) => { $crate::paste::item! { - $crate::runtime_primitives::impl_outer_config!( + $crate::sr_primitives::impl_outer_config!( pub struct GenesisConfig for $runtime { $( [< $parsed_name Config >] => diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs index cff375e1f634fa464f4a41c725be7d0f8f22aeaa..f8b8fb5483e1e163744afd51a8172004602b89f9 100644 --- a/srml/support/src/storage/hashed/generator.rs +++ b/srml/support/src/storage/hashed/generator.rs @@ -27,7 +27,7 @@ pub trait StorageHasher: 'static { fn hash(x: &[u8]) -> Self::Output; } -/// Hash storage keys with `concat(twox128(key), key)` +/// Hash storage keys with `concat(twox64(key), key)` pub struct Twox64Concat; impl StorageHasher for Twox64Concat { type Output = Vec; @@ -208,7 +208,7 @@ pub trait StorageValue { let new_val = ::append( storage.get_raw(Self::key()).unwrap_or_default(), items, - ).ok_or_else(|| "Could not append given item")?; + ).map_err(|_| "Could not append given item")?; storage.put_raw(Self::key(), &new_val); Ok(()) } @@ -238,6 +238,23 @@ pub trait StorageMap { /// Take the value under a key. fn take>(key: &K, storage: &mut S) -> Self::Query; + /// Swap the values of two keys. + fn swap>(key1: &K, key2: &K, storage: &mut S) { + let k1 = Self::key_for(key1); + let k2 = Self::key_for(key2); + let v1 = storage.get_raw(&k1[..]); + if let Some(val) = storage.get_raw(&k2[..]) { + storage.put_raw(&k1[..], &val[..]); + } else { + storage.kill(&k1[..]) + } + if let Some(val) = v1 { + storage.put_raw(&k2[..], &val[..]); + } else { + storage.kill(&k2[..]) + } + } + /// Store a value to be associated with the given key from the map. fn insert>(key: &K, val: &V, storage: &mut S) { storage.put(&Self::key_for(key)[..], val); @@ -246,7 +263,7 @@ pub trait StorageMap { /// Store a value under this key into the provided storage instance; this can take any reference /// type that derefs to `T` (and has `Encode` implemented). /// Store a value under this key into the provided storage instance. - fn insert_ref>( + fn insert_ref>( key: &K, val: &Arg, storage: &mut S @@ -286,7 +303,7 @@ pub trait AppendableStorageMap: StorageMap::append( storage.get_raw(&k[..]).unwrap_or_default(), items, - ).ok_or_else(|| "Could not append given item")?; + ).map_err(|_| "Could not append given item")?; storage.put_raw(&k[..], &new_val); Ok(()) } diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs index db9e4bc31d65721b009c7ba5bf3aa8b9fb8d7e60..385fad42eb260bc8be30de7052b28533e6bf4c6b 100644 --- a/srml/support/src/storage/mod.rs +++ b/srml/support/src/storage/mod.rs @@ -18,7 +18,7 @@ use crate::rstd::prelude::*; use crate::rstd::borrow::Borrow; -use codec::{Codec, Encode, Decode, KeyedVec, Input, EncodeAppend}; +use codec::{Codec, Encode, Decode, KeyedVec, EncodeAppend}; use hashed::generator::{HashedStorage, StorageHasher}; use unhashed::generator::UnhashedStorage; @@ -27,35 +27,6 @@ pub mod storage_items; pub mod unhashed; pub mod hashed; -struct IncrementalInput<'a> { - key: &'a [u8], - pos: usize, -} - -impl<'a> Input for IncrementalInput<'a> { - fn read(&mut self, into: &mut [u8]) -> usize { - let len = runtime_io::read_storage(self.key, into, self.pos).unwrap_or(0); - let read = crate::rstd::cmp::min(len, into.len()); - self.pos += read; - read - } -} - -struct IncrementalChildInput<'a> { - storage_key: &'a [u8], - key: &'a [u8], - pos: usize, -} - -impl<'a> Input for IncrementalChildInput<'a> { - fn read(&mut self, into: &mut [u8]) -> usize { - let len = runtime_io::read_child_storage(self.storage_key, self.key, into, self.pos).unwrap_or(0); - let read = crate::rstd::cmp::min(len, into.len()); - self.pos += read; - read - } -} - /// The underlying runtime storage. pub struct RuntimeStorage; @@ -104,7 +75,7 @@ impl UnhashedStorage for RuntimeStorage { } /// Put a value in under a key. - fn put(&mut self, key: &[u8], val: &T) { + fn put(&mut self, key: &[u8], val: &T) { unhashed::put(key, val) } @@ -220,6 +191,9 @@ pub trait StorageMap { /// Load the value associated with the given key from the map. fn get>(key: KeyArg) -> Self::Query; + /// Swap the values of two keys. + fn swap, KeyArg2: Borrow>(key1: KeyArg1, key2: KeyArg2); + /// Store a value to be associated with the given key from the map. fn insert, ValArg: Borrow>(key: KeyArg, val: ValArg); @@ -256,6 +230,10 @@ impl StorageMap for U where U: hashed::generator::S U::get(key.borrow(), &RuntimeStorage) } + fn swap, KeyArg2: Borrow>(key1: KeyArg1, key2: KeyArg2) { + U::swap(key1.borrow(), key2.borrow(), &mut RuntimeStorage) + } + fn insert, ValArg: Borrow>(key: KeyArg, val: ValArg) { U::insert(key.borrow(), val.borrow(), &mut RuntimeStorage) } @@ -332,60 +310,83 @@ impl EnumerableStorageMap for U /// is a hash of a `Key2`. /// /// /!\ be careful while choosing the Hash, indeed malicious could craft second keys to lower the trie. -pub trait StorageDoubleMap { +pub trait StorageDoubleMap { /// The type that get/take returns. type Query; - /// Get the prefix key in storage. fn prefix() -> &'static [u8]; - /// Get the storage key used to fetch a value corresponding to a specific key. - fn key_for, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Vec; - - /// Get the storage prefix used to fetch keys corresponding to a specific key1. - fn prefix_for>(k1: KArg1) -> Vec; + fn key_for(k1: &KArg1, k2: &KArg2) -> Vec + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; - /// true if the value is defined in storage. - fn exists, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> bool; + fn prefix_for(k1: &KArg1) -> Vec where KArg1: ?Sized + Encode, K1: Borrow; - /// Load the value associated with the given key from the map. - fn get, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query; + fn exists(k1: &KArg1, k2: &KArg2) -> bool + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; - /// Take the value under a key. - fn take, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query; + fn get(k1: &KArg1, k2: &KArg2) -> Self::Query + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; - /// Store a value to be associated with the given key from the map. - fn insert, KArg2: Borrow, VArg: Borrow>(k1: KArg1, k2: KArg2, val: VArg); + fn take(k1: &KArg1, k2: &KArg2) -> Self::Query + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; - /// Remove the value under a key. - fn remove, KArg2: Borrow>(k1: KArg1, k2: KArg2); + fn insert(k1: &KArg1, k2: &KArg2, val: &VArg) + where + K1: Borrow, + K2: Borrow, + V: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + VArg: ?Sized + Encode; + + fn remove(k1: &KArg1, k2: &KArg2) + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; - /// Removes all entries that shares the `k1` as the first key. - fn remove_prefix>(k1: KArg1); + fn remove_prefix(k1: &KArg1) where KArg1: ?Sized + Encode, K1: Borrow; - /// Mutate the value under a key. - fn mutate(k1: KArg1, k2: KArg2, f: F) -> R + fn mutate(k1: &KArg1, k2: &KArg2, f: F) -> R where - KArg1: Borrow, - KArg2: Borrow, + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, F: FnOnce(&mut Self::Query) -> R; - /// Append the given items to the value under the key specified. - /// - /// `V` is required to implement `codec::EncodeAppend`. fn append( - k1: KArg1, - k2: KArg2, + k1: &KArg1, + k2: &KArg2, items: &[I], ) -> Result<(), &'static str> where - KArg1: Borrow, - KArg2: Borrow, + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, I: codec::Encode, V: EncodeAppend; } -impl StorageDoubleMap for U +impl StorageDoubleMap for U where U: unhashed::generator::StorageDoubleMap { @@ -395,59 +396,101 @@ where >::prefix() } - fn key_for, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Vec { - >::key_for(k1.borrow(), k2.borrow()) + fn key_for(k1: &KArg1, k2: &KArg2) -> Vec + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + { + >::key_for(k1, k2) } - fn prefix_for>(k1: KArg1) -> Vec { - >::prefix_for(k1.borrow()) + fn prefix_for(k1: &KArg1) -> Vec where KArg1: ?Sized + Encode, K1: Borrow { + >::prefix_for(k1) } - fn exists, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> bool { - U::exists(k1.borrow(), k2.borrow(), &RuntimeStorage) + fn exists(k1: &KArg1, k2: &KArg2) -> bool + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + { + U::exists(k1, k2, &RuntimeStorage) } - fn get, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query { - U::get(k1.borrow(), k2.borrow(), &RuntimeStorage) + fn get(k1: &KArg1, k2: &KArg2) -> Self::Query + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + { + U::get(k1, k2, &RuntimeStorage) } - fn take, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query { + fn take(k1: &KArg1, k2: &KArg2) -> Self::Query + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + { U::take(k1.borrow(), k2.borrow(), &mut RuntimeStorage) } - fn insert, KArg2: Borrow, VArg: Borrow>(k1: KArg1, k2: KArg2, val: VArg) { - U::insert(k1.borrow(), k2.borrow(), val.borrow(), &mut RuntimeStorage) + fn insert(k1: &KArg1, k2: &KArg2, val: &VArg) + where + K1: Borrow, + K2: Borrow, + V: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + VArg: ?Sized + Encode, + { + U::insert(k1, k2, val, &mut RuntimeStorage) } - fn remove, KArg2: Borrow>(k1: KArg1, k2: KArg2) { - U::remove(k1.borrow(), k2.borrow(), &mut RuntimeStorage) + fn remove(k1: &KArg1, k2: &KArg2) + where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + { + U::remove(k1, k2, &mut RuntimeStorage) } - fn remove_prefix>(k1: KArg1) { - U::remove_prefix(k1.borrow(), &mut RuntimeStorage) + fn remove_prefix(k1: &KArg1) where KArg1: ?Sized + Encode, K1: Borrow { + U::remove_prefix(k1, &mut RuntimeStorage) } - fn mutate(k1: KArg1, k2: KArg2, f: F) -> R + fn mutate(k1: &KArg1, k2: &KArg2, f: F) -> R where - KArg1: Borrow, - KArg2: Borrow, + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, F: FnOnce(&mut Self::Query) -> R { - U::mutate(k1.borrow(), k2.borrow(), f, &mut RuntimeStorage) + U::mutate(k1, k2, f, &mut RuntimeStorage) } fn append( - k1: KArg1, - k2: KArg2, + k1: &KArg1, + k2: &KArg2, items: &[I], ) -> Result<(), &'static str> where - KArg1: Borrow, - KArg2: Borrow, + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, I: codec::Encode, V: EncodeAppend, { - U::append(k1.borrow(), k2.borrow(), items, &mut RuntimeStorage) + U::append(k1, k2, items, &mut RuntimeStorage) } } @@ -457,17 +500,12 @@ where /// Note that `storage_key` must be unique and strong (strong in the sense of being long enough to /// avoid collision from a resistant hash function (which unique implies)). pub mod child { - use super::{Codec, Decode, Vec, IncrementalChildInput}; + use super::{Codec, Decode, Vec}; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get(storage_key: &[u8], key: &[u8]) -> Option { - runtime_io::read_child_storage(storage_key, key, &mut [0; 0][..], 0).map(|_| { - let mut input = IncrementalChildInput { - storage_key, - key, - pos: 0, - }; - Decode::decode(&mut input).expect("storage is not null, therefore must be a valid type") + runtime_io::child_storage(storage_key, key).map(|v| { + Decode::decode(&mut &v[..]).expect("storage is not null, therefore must be a valid type") }) } diff --git a/srml/support/src/storage/storage_items.rs b/srml/support/src/storage/storage_items.rs index f67dbf0529419c1d8790d1ab7d932b13c1ce6ad3..06cb8fc55b5cd7c3c7bc64aa03b0509799172257 100644 --- a/srml/support/src/storage/storage_items.rs +++ b/srml/support/src/storage/storage_items.rs @@ -379,7 +379,7 @@ mod tests { COMPLEXTYPE3: ([u32;25]); } add_extra_genesis { - build(|_, _, _| {}); + build(|_, _| {}); } } @@ -390,325 +390,330 @@ mod tests { type BlockNumber = u32; } - const EXPECTED_METADATA: &[StorageEntryMetadata] = &[ - StorageEntryMetadata { - name: DecodeDifferent::Encode("U32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[ " Hello, this is doc!" ]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBU32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("U32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("T::Origin")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETU32WITHCONFIG"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETU32WITHCONFIG(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETU32WITHCONFIG"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIG(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETU32MYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETU32WITHCONFIGMYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETU32WITHCONFIGMYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEFOPT"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEFOPT(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - - StorageEntryMetadata { - name: DecodeDifferent::Encode("MAPU32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBMAPU32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("MAPU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBMAPU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETMAPU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETMAPU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETMAPU32MYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETMAPU32MYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: false, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("LINKEDMAPU32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructLINKEDMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBLINKEDMAPU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBLINKEDMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETLINKEDMAPU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETLINKEDMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETLINKEDMAPU32MYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETLINKEDMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("COMPLEXTYPE1"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("::std::vec::Vec<::Origin>")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructCOMPLEXTYPE1(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("COMPLEXTYPE2"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("(Vec)>>, u32)")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructCOMPLEXTYPE2(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("COMPLEXTYPE3"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Plain(DecodeDifferent::Encode("([u32; 25])")), - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructCOMPLEXTYPE3(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - ]; + const EXPECTED_METADATA: StorageMetadata = StorageMetadata { + prefix: DecodeDifferent::Encode("TestStorage"), + entries: DecodeDifferent::Encode( + &[ + StorageEntryMetadata { + name: DecodeDifferent::Encode("U32"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[ " Hello, this is doc!" ]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBU32"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("U32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBU32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETU32"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("T::Origin")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETU32"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETU32WITHCONFIG"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETU32WITHCONFIG(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETU32WITHCONFIG"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIG(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETU32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETU32MYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETU32WITHCONFIGMYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETU32WITHCONFIGMYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEFOPT"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEFOPT(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + + StorageEntryMetadata { + name: DecodeDifferent::Encode("MAPU32"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBMAPU32"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("MAPU32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBMAPU32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETMAPU32"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETMAPU32"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETMAPU32MYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETMAPU32MYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("LINKEDMAPU32"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructLINKEDMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBLINKEDMAPU32MYDEF"), + modifier: StorageEntryModifier::Optional, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBLINKEDMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("GETLINKEDMAPU32"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGETLINKEDMAPU32(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("PUBGETLINKEDMAPU32MYDEF"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u32"), + value: DecodeDifferent::Encode("String"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructPUBGETLINKEDMAPU32MYDEF(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("COMPLEXTYPE1"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("::std::vec::Vec<::Origin>")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructCOMPLEXTYPE1(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("COMPLEXTYPE2"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("(Vec)>>, u32)")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructCOMPLEXTYPE2(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("COMPLEXTYPE3"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("([u32; 25])")), + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructCOMPLEXTYPE3(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + ] + ), + }; #[test] fn store_metadata() { - let metadata = Module::::store_metadata_functions(); + let metadata = Module::::storage_metadata(); assert_eq!(EXPECTED_METADATA, metadata); } @@ -750,7 +755,7 @@ mod test2 { add_extra_genesis { config(_marker) : ::std::marker::PhantomData; config(extra_field) : u32 = 32; - build(|_, _, _| {}); + build(|_, _| {}); } } diff --git a/srml/support/src/storage/unhashed/generator.rs b/srml/support/src/storage/unhashed/generator.rs index 3c56ae0ac5fd4cb2119ece2d289031ff0e00d3fe..a5385af8fb2f97154361dfe8846f6e673c3cb2bd 100644 --- a/srml/support/src/storage/unhashed/generator.rs +++ b/srml/support/src/storage/unhashed/generator.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::codec; -use crate::rstd::vec::Vec; +use crate::codec::{self, Encode, EncodeAppend}; +use crate::rstd::{borrow::Borrow, vec::Vec}; /// Abstraction around storage with unhashed access. pub trait UnhashedStorage { @@ -38,7 +38,7 @@ pub trait UnhashedStorage { } /// Put a value in under a key. - fn put(&mut self, key: &[u8], val: &T); + fn put(&mut self, key: &[u8], val: &T); /// Remove the bytes of a key from storage. fn kill(&mut self, key: &[u8]); @@ -82,7 +82,7 @@ impl UnhashedStorage for sr_primitives::StorageOverlay { .map(|x| codec::Decode::decode(&mut x.as_slice()).expect("Unable to decode expected type.")) } - fn put(&mut self, key: &[u8], val: &T) { + fn put(&mut self, key: &[u8], val: &T) { self.insert(key.to_vec(), codec::Encode::encode(val)); } @@ -117,7 +117,7 @@ impl UnhashedStorage for sr_primitives::StorageOverlay { /// is a hash of a `Key2`. /// /// /!\ be careful while choosing the Hash, indeed malicious could craft second keys to lower the trie. -pub trait StorageDoubleMap { +pub trait StorageDoubleMap { /// The type that get/take returns. type Query; @@ -125,56 +125,116 @@ pub trait StorageDoubleMap fn prefix() -> &'static [u8]; /// Get the storage key used to fetch a value corresponding to a specific key. - fn key_for(k1: &K1, k2: &K2) -> Vec; + fn key_for( + k1: &KArg1, + k2: &KArg2, + ) -> Vec where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; /// Get the storage prefix used to fetch keys corresponding to a specific key1. - fn prefix_for(k1: &K1) -> Vec; + fn prefix_for(k1: &KArg1) -> Vec where KArg1: ?Sized + Encode, K1: Borrow; /// true if the value is defined in storage. - fn exists(k1: &K1, k2: &K2, storage: &S) -> bool { + fn exists( + k1: &KArg1, + k2: &KArg2, + storage: &S, + ) -> bool where K1: Borrow, K2: Borrow, KArg1: ?Sized + Encode, KArg2: ?Sized + Encode { storage.exists(&Self::key_for(k1, k2)) } /// Load the value associated with the given key from the map. - fn get(k1: &K1, k2: &K2, storage: &S) -> Self::Query; + fn get( + k1: &KArg1, + k2: &KArg2, + storage: &S, + ) -> Self::Query where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; /// Take the value under a key. - fn take(k1: &K1, k2: &K2, storage: &mut S) -> Self::Query; + fn take( + k1: &KArg1, + k2: &KArg2, + storage: &mut S, + ) -> Self::Query where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode; /// Store a value to be associated with the given key from the map. - fn insert(k1: &K1, k2: &K2, val: &V, storage: &mut S) { + fn insert( + k1: &KArg1, + k2: &KArg2, + val: &VArg, + storage: &mut S, + ) where + K1: Borrow, + K2: Borrow, + V: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + VArg: ?Sized + Encode, + { storage.put(&Self::key_for(k1, k2), val); } /// Remove the value under a key. - fn remove(k1: &K1, k2: &K2, storage: &mut S) { + fn remove( + k1: &KArg1, + k2: &KArg2, + storage: &mut S, + ) where K1: Borrow, K2: Borrow, KArg1: ?Sized + Encode, KArg2: ?Sized + Encode { storage.kill(&Self::key_for(k1, k2)); } /// Removes all entries that shares the `k1` as the first key. - fn remove_prefix(k1: &K1, storage: &mut S) { + fn remove_prefix( + k1: &KArg1, + storage: &mut S, + ) where KArg1: ?Sized + Encode, K1: Borrow { storage.kill_prefix(&Self::prefix_for(k1)); } /// Mutate the value under a key. - fn mutate R, S: UnhashedStorage>(k1: &K1, k2: &K2, f: F, storage: &mut S) -> R; + fn mutate( + k1: &KArg1, + k2: &KArg2, + f: F, + storage: &mut S, + ) -> R where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, + F: FnOnce(&mut Self::Query) -> R; /// Append the given items to the value under the key specified. - fn append( - k1: &K1, - k2: &K2, + fn append( + k1: &KArg1, + k2: &KArg2, items: &[I], storage: &mut S, ) -> Result<(), &'static str> where + K1: Borrow, + K2: Borrow, + KArg1: ?Sized + Encode, + KArg2: ?Sized + Encode, I: codec::Encode, - V: codec::EncodeAppend, + V: EncodeAppend, { let key = Self::key_for(k1, k2); let new_val = ::append( storage.get_raw(&key).unwrap_or_default(), items, - ).ok_or_else(|| "Could not append given item")?; + ).map_err(|_| "Could not append given item")?; storage.put_raw(&key, &new_val); Ok(()) } diff --git a/srml/support/src/storage/unhashed/mod.rs b/srml/support/src/storage/unhashed/mod.rs index 40e18d0cd212a3bd198745cab7af999175f92b9a..5d086c36c4819aa8c97183e393828f9615d4a4c9 100644 --- a/srml/support/src/storage/unhashed/mod.rs +++ b/srml/support/src/storage/unhashed/mod.rs @@ -17,18 +17,14 @@ //! Operation on unhashed runtime storage use crate::rstd::borrow::Borrow; -use super::{Codec, Encode, Decode, KeyedVec, Vec, IncrementalInput}; +use super::{Codec, Encode, Decode, KeyedVec, Vec}; pub mod generator; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get(key: &[u8]) -> Option { - runtime_io::read_storage(key, &mut [0; 0][..], 0).map(|_| { - let mut input = IncrementalInput { - key, - pos: 0, - }; - Decode::decode(&mut input).expect("storage is not null, therefore must be a valid type") + runtime_io::storage(key).map(|val| { + Decode::decode(&mut &val[..]).expect("storage is not null, therefore must be a valid type") }) } @@ -51,7 +47,7 @@ pub fn get_or_else T>(key: &[u8], default_valu } /// Put `value` in storage under `key`. -pub fn put(key: &[u8], value: &T) { +pub fn put(key: &[u8], value: &T) { value.using_encoded(|slice| runtime_io::set_storage(key, slice)); } diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index 86071a37a2720390cd93eaeccee136a598e4832f..2766ba0a98767e7510332336e1da0d0751a240aa 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -18,13 +18,11 @@ //! //! NOTE: If you're looking for `parameter_types`, it has moved in to the top-level module. -use crate::rstd::{result, marker::PhantomData, ops::Div}; +use crate::rstd::{prelude::*, result, marker::PhantomData, ops::Div}; use crate::codec::{Codec, Encode, Decode}; -use substrate_primitives::u32_trait::Value as U32; -use crate::runtime_primitives::traits::{ - MaybeSerializeDebug, SimpleArithmetic, Saturating -}; -use crate::runtime_primitives::ConsensusEngineId; +use primitives::u32_trait::Value as U32; +use crate::sr_primitives::traits::{MaybeSerializeDebug, SimpleArithmetic, Saturating}; +use crate::sr_primitives::ConsensusEngineId; use super::for_each_tuple; @@ -91,19 +89,6 @@ pub enum UpdateBalanceOutcome { AccountKilled, } -/// Simple trait designed for hooking into a transaction payment. -/// -/// It operates over a single generic `AccountId` type. -pub trait MakePayment { - /// Make transaction payment from `who` for an extrinsic of encoded length - /// `encoded_len` bytes. Return `Ok` iff the payment was successful. - fn make_payment(who: &AccountId, encoded_len: usize) -> Result<(), &'static str>; -} - -impl MakePayment for () { - fn make_payment(_: &T, _: usize) -> Result<(), &'static str> { Ok(()) } -} - /// A trait for finding the author of a block header based on the `PreRuntime` digests contained /// within it. pub trait FindAuthor { @@ -630,6 +615,12 @@ bitmask! { } } +pub trait Time { + type Moment: SimpleArithmetic + Codec + Clone + Default; + + fn now() -> Self::Moment; +} + impl WithdrawReasons { /// Choose all variants except for `one`. pub fn except(one: WithdrawReason) -> WithdrawReasons { @@ -640,12 +631,61 @@ impl WithdrawReasons { } /// Trait for type that can handle incremental changes to a set of account IDs. -pub trait ChangeMembers { +pub trait ChangeMembers { + /// A number of members `incoming` just joined the set and replaced some `outgoing` ones. The + /// new set is given by `new`, and need not be sorted. + fn change_members(incoming: &[AccountId], outgoing: &[AccountId], mut new: Vec) { + new.sort_unstable(); + Self::change_members_sorted(incoming, outgoing, &new[..]); + } + /// A number of members `_incoming` just joined the set and replaced some `_outgoing` ones. The - /// new set is thus given by `_new`. - fn change_members(_incoming: &[AccountId], _outgoing: &[AccountId], _new: &[AccountId]); + /// new set is thus given by `sorted_new` and **must be sorted**. + /// + /// NOTE: This is the only function that needs to be implemented in `ChangeMembers`. + fn change_members_sorted( + incoming: &[AccountId], + outgoing: &[AccountId], + sorted_new: &[AccountId], + ); + + /// Set the new members; they **must already be sorted**. This will compute the diff and use it to + /// call `change_members_sorted`. + fn set_members_sorted(new_members: &[AccountId], old_members: &[AccountId]) { + let mut old_iter = old_members.iter(); + let mut new_iter = new_members.iter(); + let mut incoming = Vec::new(); + let mut outgoing = Vec::new(); + let mut old_i = old_iter.next(); + let mut new_i = new_iter.next(); + loop { + match (old_i, new_i) { + (None, None) => break, + (Some(old), Some(new)) if old == new => { + old_i = old_iter.next(); + new_i = new_iter.next(); + } + (Some(old), Some(new)) if old < new => { + outgoing.push(old.clone()); + old_i = old_iter.next(); + } + (Some(old), None) => { + outgoing.push(old.clone()); + old_i = old_iter.next(); + } + (_, Some(new)) => { + incoming.push(new.clone()); + new_i = new_iter.next(); + } + } + } + + Self::change_members_sorted(&incoming[..], &outgoing[..], &new_members); + } } -impl ChangeMembers for () { - fn change_members(_incoming: &[T], _outgoing: &[T], _new_set: &[T]) {} +impl ChangeMembers for () { + fn change_members(_: &[T], _: &[T], _: Vec) {} + fn change_members_sorted(_: &[T], _: &[T], _: &[T]) {} + fn set_members_sorted(_: &[T], _: &[T]) {} } diff --git a/srml/support/src/unsigned.rs b/srml/support/src/unsigned.rs index 8ea613461a1a83ddd25c421f03c276b7fe52da51..1c62dd0c58435670e1e1ee3a562d2539deb0c2ac 100644 --- a/srml/support/src/unsigned.rs +++ b/srml/support/src/unsigned.rs @@ -15,11 +15,11 @@ // along with Substrate. If not, see . #[doc(hidden)] -pub use crate::runtime_primitives::traits::ValidateUnsigned; +pub use crate::sr_primitives::traits::ValidateUnsigned; #[doc(hidden)] -pub use crate::runtime_primitives::transaction_validity::TransactionValidity; +pub use crate::sr_primitives::transaction_validity::TransactionValidity; #[doc(hidden)] -pub use crate::runtime_primitives::ApplyError; +pub use crate::sr_primitives::ApplyError; /// Implement `ValidateUnsigned` for `Runtime`. diff --git a/srml/support/test/Cargo.toml b/srml/support/test/Cargo.toml index fa4529d71e623bac39a548a9b8a1a9a890ea9b20..fa3a04d3bc32a1dfb4ec33b610eadce55081180d 100644 --- a/srml/support/test/Cargo.toml +++ b/srml/support/test/Cargo.toml @@ -6,18 +6,19 @@ edition = "2018" [dependencies] serde = { version = "1.0", default-features = false, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } runtime_io = { package = "sr-io", path = "../../../core/sr-io", default-features = false } srml-support = { version = "2", path = "../", default-features = false } inherents = { package = "substrate-inherents", path = "../../../core/inherents", default-features = false } primitives = { package = "substrate-primitives", path = "../../../core/primitives", default-features = false } trybuild = "1" +pretty_assertions = "0.6.1" [features] default = ["std"] std = [ "serde/std", - "parity-codec/std", + "codec/std", "runtime_io/std", "srml-support/std", "inherents/std", diff --git a/srml/support/test/tests/final_keys.rs b/srml/support/test/tests/final_keys.rs index 888ef48cb2f7d516566ce5001da877bd271bff6a..9c770075c46493c0a4bde76d74fc520fa13b43f5 100644 --- a/srml/support/test/tests/final_keys.rs +++ b/srml/support/test/tests/final_keys.rs @@ -17,7 +17,7 @@ use runtime_io::{with_externalities, Blake2Hasher}; use srml_support::{StorageValue, StorageMap, StorageDoubleMap}; use srml_support::storage::unhashed; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; pub trait Trait { type Origin; @@ -29,7 +29,7 @@ srml_support::decl_module! { } srml_support::decl_storage!{ - trait Store for Module as Module { + trait Store for Module as FinalKeys { pub Value config(value): u32; pub Map: map u32 => u32; @@ -53,44 +53,44 @@ impl Trait for Test { } fn new_test_ext() -> runtime_io::TestExternalities { - GenesisConfig::::default().build_storage().unwrap().0.into() + GenesisConfig::::default().build_storage().unwrap().into() } #[test] fn final_keys() { with_externalities(&mut new_test_ext(), || { Value::put(1); - assert_eq!(unhashed::get::(&runtime_io::twox_128(b"Module Value")), Some(1u32)); + assert_eq!(unhashed::get::(&runtime_io::twox_128(b"FinalKeys Value")), Some(1u32)); Map::insert(1, 2); - let mut k = b"Module Map".to_vec(); + let mut k = b"FinalKeys Map".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); Map2::insert(1, 2); - let mut k = b"Module Map2".to_vec(); + let mut k = b"FinalKeys Map2".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); LinkedMap::insert(1, 2); - let mut k = b"Module LinkedMap".to_vec(); + let mut k = b"FinalKeys LinkedMap".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); LinkedMap2::insert(1, 2); - let mut k = b"Module LinkedMap2".to_vec(); + let mut k = b"FinalKeys LinkedMap2".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); - DoubleMap::insert(1, 2, 3); - let mut k = b"Module DoubleMap".to_vec(); + DoubleMap::insert(&1, &2, &3); + let mut k = b"FinalKeys DoubleMap".to_vec(); k.extend(1u32.encode()); let mut k = runtime_io::blake2_256(&k).to_vec(); k.extend(&runtime_io::blake2_256(&2u32.encode())); assert_eq!(unhashed::get::(&k), Some(3u32)); - DoubleMap2::insert(1, 2, 3); - let mut k = b"Module DoubleMap2".to_vec(); + DoubleMap2::insert(&1, &2, &3); + let mut k = b"FinalKeys DoubleMap2".to_vec(); k.extend(1u32.encode()); let mut k = runtime_io::twox_128(&k).to_vec(); k.extend(&runtime_io::blake2_128(&2u32.encode())); diff --git a/srml/support/test/tests/genesisconfig.rs b/srml/support/test/tests/genesisconfig.rs index 717c7105b587bf36b39c541af93699402a1335e4..b190fa8b747f3e161ff956930bbcc86689f2fea1 100644 --- a/srml/support/test/tests/genesisconfig.rs +++ b/srml/support/test/tests/genesisconfig.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . pub trait Trait { - type BlockNumber: parity_codec::Codec + Default; + type BlockNumber: codec::Codec + Default; type Origin; } @@ -41,4 +41,4 @@ fn init_genesis_config() { GenesisConfig:: { t: Default::default(), }; -} \ No newline at end of file +} diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index 9c42298d460feeefee95633fa0f818e663ab18df..440fb9e779996b5ae5e7ce77bb5cb3787731e2a7 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -18,12 +18,16 @@ use runtime_io::{with_externalities, Blake2Hasher}; use srml_support::{ Parameter, traits::Get, parameter_types, - runtime_primitives::{generic, BuildStorage, traits::{BlakeTwo256, Block as _, Verify}}, + sr_primitives::{generic, BuildStorage, traits::{BlakeTwo256, Block as _, Verify}}, + metadata::{ + DecodeDifferent, StorageMetadata, StorageEntryModifier, StorageEntryType, DefaultByteGetter, + StorageEntryMetadata, StorageHasher + }, }; use inherents::{ ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError }; -use srml_support::{StorageValue, StorageMap, StorageDoubleMap}; +use srml_support::{StorageValue, StorageMap, StorageDoubleMap, EnumerableStorageMap}; use primitives::{H256, sr25519}; mod system; @@ -41,7 +45,7 @@ mod module1 { type Event: From> + Into<::Event>; type Origin: From>; type SomeParameter: Get; - type GenericType: Default + Clone + parity_codec::Codec; + type GenericType: Default + Clone + codec::Codec; } srml_support::decl_module! { @@ -71,7 +75,7 @@ mod module1 { add_extra_genesis { config(test) : T::BlockNumber; - build(|_, _, config: &Self| { + build(|_, config: &Self| { println!("{}", config.test); }); } @@ -136,7 +140,7 @@ mod module2 { trait Store for Module, I: Instance=DefaultInstance> as Module2 { pub Value config(value): T::Amount; pub Map config(map): map u64 => u64; - pub LinkedMap config(linked_map): linked_map u64 => u64; + pub LinkedMap config(linked_map): linked_map u64 => Vec; pub DoubleMap config(double_map): double_map u64, blake2_256(u64) => u64; } } @@ -269,7 +273,7 @@ srml_support::construct_runtime!( pub type Header = generic::Header; pub type Block = generic::Block; -pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; fn new_test_ext() -> runtime_io::TestExternalities { GenesisConfig{ @@ -284,18 +288,18 @@ fn new_test_ext() -> runtime_io::TestExternalities { module2: Some(module2::GenesisConfig { value: 4, map: vec![(0, 0)], - linked_map: vec![(0, 0)], + linked_map: vec![(0, vec![0])], double_map: vec![(0, 0, 0)], }), module2_Instance1: Some(module2::GenesisConfig { value: 4, map: vec![(0, 0)], - linked_map: vec![(0, 0)], + linked_map: vec![(0, vec![0])], double_map: vec![(0, 0, 0)], }), module2_Instance2: None, module2_Instance3: None, - }.build_storage().unwrap().0.into() + }.build_storage().unwrap().into() } #[test] @@ -335,14 +339,14 @@ fn storage_instance_independance() { module2::LinkedMap::::key_for(1).to_vec(), module2::LinkedMap::::key_for(1).to_vec(), module2::LinkedMap::::key_for(1).to_vec(), - module2::DoubleMap::::prefix_for(1), - module2::DoubleMap::::prefix_for(1).to_vec(), - module2::DoubleMap::::prefix_for(1).to_vec(), - module2::DoubleMap::::prefix_for(1).to_vec(), - module2::DoubleMap::::key_for(1, 1), - module2::DoubleMap::::key_for(1, 1).to_vec(), - module2::DoubleMap::::key_for(1, 1).to_vec(), - module2::DoubleMap::::key_for(1, 1).to_vec(), + module2::DoubleMap::::prefix_for(&1), + module2::DoubleMap::::prefix_for(&1).to_vec(), + module2::DoubleMap::::prefix_for(&1).to_vec(), + module2::DoubleMap::::prefix_for(&1).to_vec(), + module2::DoubleMap::::key_for(&1, &1), + module2::DoubleMap::::key_for(&1, &1).to_vec(), + module2::DoubleMap::::key_for(&1, &1).to_vec(), + module2::DoubleMap::::key_for(&1, &1).to_vec(), ].iter() { assert!(map.insert(key, ()).is_none()) } @@ -384,27 +388,128 @@ fn storage_with_instance_basic_operation() { assert_eq!(LinkedMap::exists(0), true); assert_eq!(LinkedMap::exists(key), false); - LinkedMap::insert(key, 1); - assert_eq!(LinkedMap::get(key), 1); - assert_eq!(LinkedMap::take(key), 1); - assert_eq!(LinkedMap::get(key), 0); - LinkedMap::mutate(key, |a| *a=2); - assert_eq!(LinkedMap::get(key), 2); + LinkedMap::insert(key, vec![1]); + assert_eq!(LinkedMap::enumerate().count(), 2); + assert_eq!(LinkedMap::get(key), vec![1]); + assert_eq!(LinkedMap::take(key), vec![1]); + assert_eq!(LinkedMap::enumerate().count(), 1); + assert_eq!(LinkedMap::get(key), vec![]); + LinkedMap::mutate(key, |a| *a=vec![2]); + assert_eq!(LinkedMap::enumerate().count(), 2); + assert_eq!(LinkedMap::get(key), vec![2]); LinkedMap::remove(key); + assert_eq!(LinkedMap::enumerate().count(), 1); assert_eq!(LinkedMap::exists(key), false); - assert_eq!(LinkedMap::get(key), 0); + assert_eq!(LinkedMap::get(key), vec![]); + assert_eq!(LinkedMap::exists(key), false); + assert_eq!(LinkedMap::enumerate().count(), 1); + LinkedMap::insert_ref(key, &vec![1]); + assert_eq!(LinkedMap::enumerate().count(), 2); let key1 = 1; let key2 = 1; - assert_eq!(DoubleMap::exists(0, 0), true); - assert_eq!(DoubleMap::exists(key1, key2), false); - DoubleMap::insert(key1, key2, 1); - assert_eq!(DoubleMap::get(key1, key2), 1); - assert_eq!(DoubleMap::take(key1, key2), 1); - assert_eq!(DoubleMap::get(key1, key2), 0); - DoubleMap::mutate(key1, key2, |a| *a=2); - assert_eq!(DoubleMap::get(key1, key2), 2); - DoubleMap::remove(key1, key2); - assert_eq!(DoubleMap::get(key1, key2), 0); + assert_eq!(DoubleMap::exists(&0, &0), true); + assert_eq!(DoubleMap::exists(&key1, &key2), false); + DoubleMap::insert(&key1, &key2, &1); + assert_eq!(DoubleMap::get(&key1, &key2), 1); + assert_eq!(DoubleMap::take(&key1, &key2), 1); + assert_eq!(DoubleMap::get(&key1, &key2), 0); + DoubleMap::mutate(&key1, &key2, |a| *a=2); + assert_eq!(DoubleMap::get(&key1, &key2), 2); + DoubleMap::remove(&key1, &key2); + assert_eq!(DoubleMap::get(&key1, &key2), 0); }); } + +const EXPECTED_METADATA: StorageMetadata = StorageMetadata { + prefix: DecodeDifferent::Encode("Instance2Module2"), + entries: DecodeDifferent::Encode( + &[ + StorageEntryMetadata { + name: DecodeDifferent::Encode("Value"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Plain(DecodeDifferent::Encode("T::Amount")), + default: DecodeDifferent::Encode( + DefaultByteGetter( + &module2::__GetByteStructValue( + std::marker::PhantomData::<(Runtime, module2::Instance2)> + ) + ) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("Map"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u64"), + value: DecodeDifferent::Encode("u64"), + is_linked: false, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter( + &module2::__GetByteStructMap( + std::marker::PhantomData::<(Runtime, module2::Instance2)> + ) + ) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("LinkedMap"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::Map { + hasher: StorageHasher::Blake2_256, + key: DecodeDifferent::Encode("u64"), + value: DecodeDifferent::Encode("Vec"), + is_linked: true, + }, + default: DecodeDifferent::Encode( + DefaultByteGetter( + &module2::__GetByteStructLinkedMap( + std::marker::PhantomData::<(Runtime, module2::Instance2)> + ) + ) + ), + documentation: DecodeDifferent::Encode(&[]), + }, + StorageEntryMetadata { + name: DecodeDifferent::Encode("DoubleMap"), + modifier: StorageEntryModifier::Default, + ty: StorageEntryType::DoubleMap { + hasher: StorageHasher::Blake2_256, + key2_hasher: StorageHasher::Blake2_256, + key1: DecodeDifferent::Encode("u64"), + key2: DecodeDifferent::Encode("u64"), + value: DecodeDifferent::Encode("u64"), + }, + default: DecodeDifferent::Encode( + DefaultByteGetter( + &module2::__GetByteStructDoubleMap( + std::marker::PhantomData::<(Runtime, module2::Instance2)> + ) + ) + ), + documentation: DecodeDifferent::Encode(&[]), + } + ] + ) +}; + +#[test] +fn test_instance_storage_metadata() { + let metadata = Module2_2::storage_metadata(); + pretty_assertions::assert_eq!(EXPECTED_METADATA, metadata); +} + +#[test] +fn instance_prefix_is_prefix_of_entries() { + use module2::Instance; + + let prefix = module2::Instance2::PREFIX; + assert!(module2::Instance2::PREFIX_FOR_Value.starts_with(prefix)); + assert!(module2::Instance2::PREFIX_FOR_Map.starts_with(prefix)); + assert!(module2::Instance2::PREFIX_FOR_LinkedMap.starts_with(prefix)); + assert!(module2::Instance2::PREFIX_FOR_DoubleMap.starts_with(prefix)); +} diff --git a/srml/support/test/tests/issue2219.rs b/srml/support/test/tests/issue2219.rs index e057f2c7c79f9b166165cf1db82e8e33d18f7d69..cb8b4cef09f0d61ed7b6ea79c6a72a76d385dfad 100644 --- a/srml/support/test/tests/issue2219.rs +++ b/srml/support/test/tests/issue2219.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use srml_support::runtime_primitives::generic; -use srml_support::runtime_primitives::traits::{BlakeTwo256, Block as _, Verify}; +use srml_support::sr_primitives::generic; +use srml_support::sr_primitives::traits::{BlakeTwo256, Block as _, Verify}; use srml_support::codec::{Encode, Decode}; use primitives::{H256, sr25519}; use serde::{Serialize, Deserialize}; @@ -152,7 +152,7 @@ pub type BlockNumber = u64; pub type Index = u64; pub type Header = generic::Header; pub type Block = generic::Block; -pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; impl system::Trait for Runtime { type Hash = H256; diff --git a/srml/system/Cargo.toml b/srml/system/Cargo.toml index d6039499e15fbd470a2c14e310c84502f3d8fd34..98165556216fc344ae75289fd099d614c486fa06 100644 --- a/srml/system/Cargo.toml +++ b/srml/system/Cargo.toml @@ -7,11 +7,11 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } [dev-dependencies] @@ -22,12 +22,12 @@ default = ["std"] std = [ "serde", "safe-mix/std", - "parity-codec/std", - "substrate-primitives/std", + "codec/std", + "primitives/std", "rstd/std", "runtime_io/std", "srml-support/std", - "primitives/std", + "sr-primitives/std", ] [[bench]] diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs index a3068463e7fdec5eb166c35e36f15304cb4909ed..521123118d274a00f5708a96099d2f0a460f8227 100644 --- a/srml/system/benches/bench.rs +++ b/srml/system/benches/bench.rs @@ -18,11 +18,8 @@ use criterion::{Criterion, criterion_group, criterion_main, black_box}; use srml_system as system; use srml_support::{decl_module, decl_event, impl_outer_origin, impl_outer_event}; use runtime_io::{with_externalities, Blake2Hasher}; -use substrate_primitives::H256; -use primitives::{ - BuildStorage, traits::{BlakeTwo256, IdentityLookup}, - testing::Header, -}; +use primitives::H256; +use sr_primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; mod module { use super::*; @@ -54,24 +51,30 @@ impl_outer_event! { } } -#[allow(non_camel_case_types)] -pub enum Error { - system(system::Error) +srml_support::parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; + pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - #[derive(Clone, Eq, PartialEq)] pub struct Runtime; impl system::Trait for Runtime { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = Event; - type Error = Error; + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; } impl module::Trait for Runtime { @@ -79,7 +82,7 @@ impl module::Trait for Runtime { } fn new_test_ext() -> runtime_io::TestExternalities { - system::GenesisConfig::::default().build_storage().unwrap().0.into() + system::GenesisConfig::default().build_storage::().unwrap().into() } fn deposit_events(n: usize) { diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index 85e69277ef1c089c2378529c97c8d441fcedd6f0..67e7843470a19bae15c18bef74be76401ac6c369 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -77,28 +77,32 @@ use serde::Serialize; use rstd::prelude::*; #[cfg(any(feature = "std", test))] use rstd::map; -use primitives::{ - generic, PrimitiveError, DispatchError, - traits::{ - self, CheckEqual, SimpleArithmetic, - SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, CurrentHeight, BlockNumberToHash, - MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, One, Bounded, Lookup, - Zero - } +use rstd::marker::PhantomData; +use sr_primitives::generic::{self, Era}; +use sr_primitives::Perbill; +use sr_primitives::weights::{ + Weight, DispatchInfo, DispatchClass, WeightMultiplier, SimpleDispatchInfo +}; +use sr_primitives::transaction_validity::{ + ValidTransaction, TransactionPriority, TransactionLongevity +}; +use sr_primitives::traits::{self, CheckEqual, SimpleArithmetic, Zero, SignedExtension, Convert, + SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, DispatchError, SaturatedConversion, + MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, One, Bounded, Lookup, }; -use substrate_primitives::storage::well_known_keys; +use primitives::{storage::well_known_keys, DispatchError}; use srml_support::{ - storage, decl_module, decl_event, decl_storage, decl_error, StorageDoubleMap, StorageValue, - StorageMap, Parameter, for_each_tuple, traits::{Contains, Get}, + storage, decl_module, decl_event, decl_storage, StorageDoubleMap, StorageValue, StorageMap, + Parameter, for_each_tuple, traits::{Contains, Get} }; use safe_mix::TripletMix; -use parity_codec::{Encode, Decode}; +use codec::{Encode, Decode}; #[cfg(any(feature = "std", test))] use runtime_io::{twox_128, TestExternalities, Blake2Hasher}; #[cfg(any(feature = "std", test))] -use substrate_primitives::ChangesTrieConfiguration; +use primitives::ChangesTrieConfiguration; /// Handler for when a new account has been created. pub trait OnNewAccount { @@ -137,20 +141,23 @@ impl IsDeadAccount for () { } /// Compute the trie root of a list of extrinsics. -pub fn extrinsics_root(extrinsics: &[E]) -> H::Output { - extrinsics_data_root::(extrinsics.iter().map(parity_codec::Encode::encode).collect()) +pub fn extrinsics_root(extrinsics: &[E]) -> H::Output { + extrinsics_data_root::(extrinsics.iter().map(codec::Encode::encode).collect()) } /// Compute the trie root of a list of extrinsics. pub fn extrinsics_data_root(xts: Vec>) -> H::Output { let xts = xts.iter().map(Vec::as_slice).collect::>(); - H::enumerated_trie_root(&xts) + H::ordered_trie_root(&xts) } pub trait Trait: 'static + Eq + Clone { /// The aggregated `Origin` type used by dispatchable calls. type Origin: Into, Self::Origin>> + From>; + /// The aggregated `Call` type. + type Call; + /// Account index (aka nonce) type. This stores the number of previous transactions associated with a sender /// account. type Index: @@ -180,6 +187,14 @@ pub trait Trait: 'static + Eq + Clone { // TODO: avoid &'static str error type #2953 type Lookup: StaticLookup; + /// Handler for updating the weight multiplier at the end of each block. + /// + /// It receives the current block's weight as input and returns the next weight multiplier for next + /// block. + /// + /// Note that passing `()` will keep the value constant. + type WeightMultiplierUpdate: Convert<(Weight, WeightMultiplier), WeightMultiplier>; + /// The block header. type Header: Parameter + traits::Header< Number = Self::BlockNumber, @@ -191,6 +206,18 @@ pub trait Trait: 'static + Eq + Clone { /// Maximum number of block number to block hash mappings to keep (oldest pruned first). type BlockHashCount: Get; + + /// The maximum weight of a block. + type MaximumBlockWeight: Get; + + /// The maximum length of a block (in bytes). + type MaximumBlockLength: Get; + + /// The portion of the block that is available to normal transaction. The rest can only be used + /// by operational transactions. This can be applied to any resource limit managed by the system + /// module, including weight and length. + type AvailableBlockRatio: Get; + } pub type DigestOf = generic::Digest<::Hash>; @@ -208,24 +235,35 @@ decl_module! { Self::deposit_event_indexed(&[], event); } + /// A big dispatch that will disallow any other transaction to be included. + // TODO: this must be preferable available for testing really (not possible at the moment). + #[weight = SimpleDispatchInfo::MaxOperational] + fn fill_block(origin) { + ensure_root(origin)?; + } + /// Make some on-chain remark. + #[weight = SimpleDispatchInfo::FixedNormal(10_000)] fn remark(origin, _remark: Vec) { ensure_signed(origin)?; } /// Set the number of pages in the WebAssembly environment's heap. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_heap_pages(origin, pages: u64) { ensure_root(origin)?; storage::unhashed::put_raw(well_known_keys::HEAP_PAGES, &pages.encode()); } /// Set the new code. + #[weight = SimpleDispatchInfo::FixedOperational(200_000)] pub fn set_code(origin, new: Vec) { ensure_root(origin)?; storage::unhashed::put_raw(well_known_keys::CODE, &new); } /// Set some items of storage. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set_storage(origin, items: Vec) { ensure_root(origin)?; for i in &items { @@ -234,6 +272,7 @@ decl_module! { } /// Kill some items from storage. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn kill_storage(origin, keys: Vec) { ensure_root(origin)?; for key in &keys { @@ -358,7 +397,12 @@ decl_storage! { /// Total extrinsics count for the current block. ExtrinsicCount: Option; /// Total weight for all extrinsics put together, for the current block. - AllExtrinsicsWeight: Option; + AllExtrinsicsWeight: Option; + /// Total length (in bytes) for all extrinsics put together, for the current block. + AllExtrinsicsLen: Option; + /// The next weight multiplier. This should be updated at the end of each block based on the + /// saturation level (weight). + pub NextWeightMultiplier get(next_weight_multiplier): WeightMultiplier = Default::default(); /// Map of block numbers to block hashes. pub BlockHash get(block_hash) build(|_| vec![(T::BlockNumber::zero(), hash69())]): map T::BlockNumber => T::Hash; /// Extrinsics data for the current block (maps an extrinsic's index to its data). @@ -402,17 +446,20 @@ decl_storage! { } add_extra_genesis { config(changes_trie_config): Option; - #[serde(with = "substrate_primitives::bytes")] + #[serde(with = "primitives::bytes")] config(code): Vec; - build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| { - use parity_codec::Encode; + build( + |storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay), + config: &GenesisConfig| + { + use codec::Encode; - storage.insert(well_known_keys::CODE.to_vec(), config.code.clone()); - storage.insert(well_known_keys::EXTRINSIC_INDEX.to_vec(), 0u32.encode()); + storage.0.insert(well_known_keys::CODE.to_vec(), config.code.clone()); + storage.0.insert(well_known_keys::EXTRINSIC_INDEX.to_vec(), 0u32.encode()); if let Some(ref changes_trie_config) = config.changes_trie_config { - storage.insert( + storage.0.insert( well_known_keys::CHANGES_TRIE_CONFIG.to_vec(), changes_trie_config.encode()); } @@ -581,10 +628,25 @@ impl Module { } /// Gets a total weight of all executed extrinsics. - pub fn all_extrinsics_weight() -> u32 { + pub fn all_extrinsics_weight() -> Weight { AllExtrinsicsWeight::get().unwrap_or_default() } + pub fn all_extrinsics_len() -> u32 { + AllExtrinsicsLen::get().unwrap_or_default() + } + + /// Update the next weight multiplier. + /// + /// This should be called at then end of each block, before `all_extrinsics_weight` is cleared. + pub fn update_weight_multiplier() { + // update the multiplier based on block weight. + let current_weight = Self::all_extrinsics_weight(); + NextWeightMultiplier::mutate(|fm| { + *fm = T::WeightMultiplierUpdate::convert((current_weight, *fm)) + }); + } + /// Start the execution of a particular block. pub fn initialize( number: &T::BlockNumber, @@ -613,7 +675,9 @@ impl Module { /// Remove temporary "environment" entries in storage. pub fn finalize() -> T::Header { ExtrinsicCount::kill(); + Self::update_weight_multiplier(); AllExtrinsicsWeight::kill(); + AllExtrinsicsLen::kill(); let number = >::take(); let parent_hash = >::take(); @@ -662,11 +726,11 @@ impl Module { /// Get the basic externalities for this module, useful for tests. #[cfg(any(feature = "std", test))] pub fn externalities() -> TestExternalities { - TestExternalities::new(map![ + TestExternalities::new((map![ twox_128(&>::key_for(T::BlockNumber::zero())).to_vec() => [69u8; 32].encode(), twox_128(>::key()).to_vec() => T::BlockNumber::one().encode(), twox_128(>::key()).to_vec() => [69u8; 32].encode() - ]) + ], map![])) } /// Set the block number to something in particular. Can be used as an alternative to @@ -768,34 +832,277 @@ impl Module { } /// To be called immediately after an extrinsic has been applied. - pub fn note_applied_extrinsic(r: &Result<(), DispatchError>, encoded_len: u32) { + pub fn note_applied_extrinsic(r: &Result<(), &'static str>, _encoded_len: u32) { Self::deposit_event(match r { Ok(_) => Event::ExtrinsicSuccess, Err(err) => Event::ExtrinsicFailed(err.clone()), }.into()); let next_extrinsic_index = Self::extrinsic_index().unwrap_or_default() + 1u32; - let total_length = encoded_len.saturating_add(Self::all_extrinsics_weight()); storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &next_extrinsic_index); - AllExtrinsicsWeight::put(&total_length); } /// To be called immediately after `note_applied_extrinsic` of the last extrinsic of the block /// has been called. pub fn note_finished_extrinsics() { - let extrinsic_index: u32 = storage::unhashed::take(well_known_keys::EXTRINSIC_INDEX).unwrap_or_default(); + let extrinsic_index: u32 = storage::unhashed::take(well_known_keys::EXTRINSIC_INDEX) + .unwrap_or_default(); ExtrinsicCount::put(extrinsic_index); } /// Remove all extrinsic data and save the extrinsics trie root. pub fn derive_extrinsics() { - let extrinsics = (0..ExtrinsicCount::get().unwrap_or_default()).map(ExtrinsicData::take).collect(); + let extrinsics = (0..ExtrinsicCount::get().unwrap_or_default()) + .map(ExtrinsicData::take).collect(); let xts_root = extrinsics_data_root::(extrinsics); >::put(xts_root); } } +/// resource limit check. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct CheckWeight(PhantomData); + +impl CheckWeight { + + /// Get the quota ratio of each dispatch class type. This indicates that all operational + /// dispatches can use the full capacity of any resource, while user-triggered ones can consume + /// a portion. + fn get_dispatch_limit_ratio(class: DispatchClass) -> Perbill { + match class { + DispatchClass::Operational => Perbill::one(), + // TODO: this must be some sort of a constant. + DispatchClass::Normal => T::AvailableBlockRatio::get(), + } + } + + /// Checks if the current extrinsic can fit into the block with respect to block weight limits. + /// + /// Upon successes, it returns the new block weight as a `Result`. + fn check_weight(info: DispatchInfo) -> Result { + let current_weight = Module::::all_extrinsics_weight(); + let maximum_weight = T::MaximumBlockWeight::get(); + let limit = Self::get_dispatch_limit_ratio(info.class) * maximum_weight; + let added_weight = info.weight.min(limit); + let next_weight = current_weight.saturating_add(added_weight); + if next_weight > limit { + return Err(DispatchError::Exhausted) + } + Ok(next_weight) + } + + /// Checks if the current extrinsic can fit into the block with respect to block length limits. + /// + /// Upon successes, it returns the new block length as a `Result`. + fn check_block_length(info: DispatchInfo, len: usize) -> Result { + let current_len = Module::::all_extrinsics_len(); + let maximum_len = T::MaximumBlockLength::get(); + let limit = Self::get_dispatch_limit_ratio(info.class) * maximum_len; + let added_len = len as u32; + let next_len = current_len.saturating_add(added_len); + if next_len > limit { + return Err(DispatchError::Exhausted) + } + Ok(next_len) + } + + /// get the priority of an extrinsic denoted by `info`. + fn get_priority(info: DispatchInfo) -> TransactionPriority { + match info.class { + DispatchClass::Normal => info.weight.into(), + DispatchClass::Operational => Bounded::max_value() + } + } + + /// Utility constructor for tests and client code. + #[cfg(feature = "std")] + pub fn new() -> Self { + Self(PhantomData) + } +} + +impl SignedExtension for CheckWeight { + type AccountId = T::AccountId; + type Call = T::Call; + type AdditionalSigned = (); + type Pre = (); + + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } + + fn pre_dispatch( + self, + _who: &Self::AccountId, + _call: &Self::Call, + info: DispatchInfo, + len: usize, + ) -> Result<(), DispatchError> { + let next_len = Self::check_block_length(info, len)?; + AllExtrinsicsLen::put(next_len); + let next_weight = Self::check_weight(info)?; + AllExtrinsicsWeight::put(next_weight); + Ok(()) + } + + fn validate( + &self, + _who: &Self::AccountId, + _call: &Self::Call, + info: DispatchInfo, + len: usize, + ) -> Result { + // There is no point in writing to storage here since changes are discarded. This basically + // discards any transaction which is bigger than the length or weight limit **alone**,which + // is a guarantee that it will fail in the pre-dispatch phase. + let _ = Self::check_block_length(info, len)?; + let _ = Self::check_weight(info)?; + Ok(ValidTransaction { priority: Self::get_priority(info), ..Default::default() }) + } +} + +#[cfg(feature = "std")] +impl rstd::fmt::Debug for CheckWeight { + fn fmt(&self, f: &mut rstd::fmt::Formatter) -> rstd::fmt::Result { + write!(f, "CheckWeight") + } +} + +/// Nonce check and increment to give replay protection for transactions. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct CheckNonce(#[codec(compact)] T::Index); + +#[cfg(feature = "std")] +impl CheckNonce { + /// utility constructor. Used only in client/factory code. + pub fn from(nonce: T::Index) -> Self { + Self(nonce) + } +} + +#[cfg(feature = "std")] +impl rstd::fmt::Debug for CheckNonce { + fn fmt(&self, f: &mut rstd::fmt::Formatter) -> rstd::fmt::Result { + self.0.fmt(f) + } +} + +impl SignedExtension for CheckNonce { + type AccountId = T::AccountId; + type Call = T::Call; + type AdditionalSigned = (); + type Pre = (); + + fn additional_signed(&self) -> rstd::result::Result<(), &'static str> { Ok(()) } + + fn pre_dispatch( + self, + who: &Self::AccountId, + _call: &Self::Call, + _info: DispatchInfo, + _len: usize, + ) -> Result<(), DispatchError> { + let expected = >::get(who); + if self.0 != expected { + return Err( + if self.0 < expected { DispatchError::Stale } else { DispatchError::Future } + ) + } + >::insert(who, expected + T::Index::one()); + Ok(()) + } + + fn validate( + &self, + who: &Self::AccountId, + _call: &Self::Call, + info: DispatchInfo, + _len: usize, + ) -> Result { + // check index + let expected = >::get(who); + if self.0 < expected { + return Err(DispatchError::Stale) + } + + let provides = vec![Encode::encode(&(who, self.0))]; + let requires = if expected < self.0 { + vec![Encode::encode(&(who, self.0 - One::one()))] + } else { + vec![] + }; + + Ok(ValidTransaction { + priority: info.weight as TransactionPriority, + requires, + provides, + longevity: TransactionLongevity::max_value(), + propagate: true, + }) + } +} + +/// Nonce check and increment to give replay protection for transactions. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct CheckEra((Era, rstd::marker::PhantomData)); + +#[cfg(feature = "std")] +impl CheckEra { + /// utility constructor. Used only in client/factory code. + pub fn from(era: Era) -> Self { + Self((era, rstd::marker::PhantomData)) + } +} + +#[cfg(feature = "std")] +impl rstd::fmt::Debug for CheckEra { + fn fmt(&self, f: &mut rstd::fmt::Formatter) -> rstd::fmt::Result { + self.0.fmt(f) + } +} + +impl SignedExtension for CheckEra { + type AccountId = T::AccountId; + type Call = T::Call; + type AdditionalSigned = T::Hash; + type Pre = (); + + fn additional_signed(&self) -> Result { + let current_u64 = >::block_number().saturated_into::(); + let n = (self.0).0.birth(current_u64).saturated_into::(); + if !>::exists(n) { Err("transaction birth block ancient")? } + Ok(>::block_hash(n)) + } +} + +/// Nonce check and increment to give replay protection for transactions. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct CheckGenesis(rstd::marker::PhantomData); + +#[cfg(feature = "std")] +impl rstd::fmt::Debug for CheckGenesis { + fn fmt(&self, _f: &mut rstd::fmt::Formatter) -> rstd::fmt::Result { + Ok(()) + } +} + +#[cfg(feature = "std")] +impl CheckGenesis { + pub fn new() -> Self { + Self(std::marker::PhantomData) + } +} + +impl SignedExtension for CheckGenesis { + type AccountId = T::AccountId; + type Call = ::Call; + type AdditionalSigned = T::Hash; + type Pre = (); + + fn additional_signed(&self) -> Result { + Ok(>::block_hash(T::BlockNumber::zero())) + } +} + pub struct ChainContext(::rstd::marker::PhantomData); impl Default for ChainContext { fn default() -> Self { @@ -812,27 +1119,12 @@ impl Lookup for ChainContext { } } -impl CurrentHeight for ChainContext { - type BlockNumber = T::BlockNumber; - fn current_height(&self) -> Self::BlockNumber { - >::block_number() - } -} - -impl BlockNumberToHash for ChainContext { - type BlockNumber = T::BlockNumber; - type Hash = T::Hash; - fn block_number_to_hash(&self, n: Self::BlockNumber) -> Option { - Some(>::block_hash(n)) - } -} - #[cfg(test)] mod tests { use super::*; use runtime_io::with_externalities; - use substrate_primitives::H256; - use primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use primitives::H256; + use sr_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; use srml_support::{impl_outer_origin, parameter_types}; impl_outer_origin! { @@ -844,10 +1136,14 @@ mod tests { parameter_types! { pub const BlockHashCount: u64 = 10; + pub const MaximumBlockWeight: Weight = 1024; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); + pub const MaximumBlockLength: u32 = 1024; } impl Trait for Test { type Origin = Origin; + type Call = (); type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -855,8 +1151,12 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = u16; type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; } impl From for u16 { @@ -870,8 +1170,18 @@ mod tests { type System = Module; + const CALL: &::Call = &(); + fn new_test_ext() -> runtime_io::TestExternalities { - GenesisConfig::default().build_storage::().unwrap().0.into() + GenesisConfig::default().build_storage::().unwrap().into() + } + + fn normal_weight_limit() -> Weight { + ::AvailableBlockRatio::get() * ::MaximumBlockWeight::get() + } + + fn normal_length_limit() -> u32 { + ::AvailableBlockRatio::get() * ::MaximumBlockLength::get() } #[test] @@ -1007,4 +1317,157 @@ mod tests { } }) } + + #[test] + fn signed_ext_check_nonce_works() { + with_externalities(&mut new_test_ext(), || { + >::insert(1, 1); + let info = DispatchInfo::default(); + let len = 0_usize; + // stale + assert!(CheckNonce::(0).validate(&1, CALL, info, len).is_err()); + assert!(CheckNonce::(0).pre_dispatch(&1, CALL, info, len).is_err()); + // correct + assert!(CheckNonce::(1).validate(&1, CALL, info, len).is_ok()); + assert!(CheckNonce::(1).pre_dispatch(&1, CALL, info, len).is_ok()); + // future + assert!(CheckNonce::(5).validate(&1, CALL, info, len).is_ok()); + assert!(CheckNonce::(5).pre_dispatch(&1, CALL, info, len).is_err()); + }) + } + + #[test] + fn signed_ext_check_weight_works_normal_tx() { + with_externalities(&mut new_test_ext(), || { + let normal_limit = normal_weight_limit(); + let small = DispatchInfo { weight: 100, ..Default::default() }; + let medium = DispatchInfo { + weight: normal_limit - 1, + ..Default::default() + }; + let big = DispatchInfo { + weight: normal_limit + 1, + ..Default::default() + }; + let len = 0_usize; + + let reset_check_weight = |i, f, s| { + AllExtrinsicsWeight::put(s); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, i, len); + if f { assert!(r.is_err()) } else { assert!(r.is_ok()) } + }; + + reset_check_weight(small, false, 0); + reset_check_weight(medium, false, 0); + reset_check_weight(big, true, 1); + }) + } + + #[test] + fn signed_ext_check_weight_fee_works() { + with_externalities(&mut new_test_ext(), || { + let free = DispatchInfo { weight: 0, ..Default::default() }; + let len = 0_usize; + + assert_eq!(System::all_extrinsics_weight(), 0); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, free, len); + assert!(r.is_ok()); + assert_eq!(System::all_extrinsics_weight(), 0); + }) + } + + #[test] + fn signed_ext_check_weight_max_works() { + with_externalities(&mut new_test_ext(), || { + let max = DispatchInfo { weight: Weight::max_value(), ..Default::default() }; + let len = 0_usize; + let normal_limit = normal_weight_limit(); + + assert_eq!(System::all_extrinsics_weight(), 0); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, max, len); + assert!(r.is_ok()); + assert_eq!(System::all_extrinsics_weight(), normal_limit); + }) + } + + #[test] + fn signed_ext_check_weight_works_operational_tx() { + with_externalities(&mut new_test_ext(), || { + let normal = DispatchInfo { weight: 100, ..Default::default() }; + let op = DispatchInfo { weight: 100, class: DispatchClass::Operational }; + let len = 0_usize; + let normal_limit = normal_weight_limit(); + + // given almost full block + AllExtrinsicsWeight::put(normal_limit); + // will not fit. + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, CALL, normal, len).is_err()); + // will fit. + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, CALL, op, len).is_ok()); + + // likewise for length limit. + let len = 100_usize; + AllExtrinsicsLen::put(normal_length_limit()); + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, CALL, normal, len).is_err()); + assert!(CheckWeight::(PhantomData).pre_dispatch(&1, CALL, op, len).is_ok()); + }) + } + + #[test] + fn signed_ext_check_weight_priority_works() { + with_externalities(&mut new_test_ext(), || { + let normal = DispatchInfo { weight: 100, class: DispatchClass::Normal }; + let op = DispatchInfo { weight: 100, class: DispatchClass::Operational }; + let len = 0_usize; + + assert_eq!( + CheckWeight::(PhantomData).validate(&1, CALL, normal, len).unwrap().priority, + 100, + ); + assert_eq!( + CheckWeight::(PhantomData).validate(&1, CALL, op, len).unwrap().priority, + Bounded::max_value(), + ); + }) + } + + #[test] + fn signed_ext_check_weight_block_size_works() { + with_externalities(&mut new_test_ext(), || { + let normal = DispatchInfo::default(); + let normal_limit = normal_weight_limit() as usize; + let reset_check_weight = |tx, s, f| { + AllExtrinsicsLen::put(0); + let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, tx, s); + if f { assert!(r.is_err()) } else { assert!(r.is_ok()) } + }; + + reset_check_weight(normal, normal_limit - 1, false); + reset_check_weight(normal, normal_limit, false); + reset_check_weight(normal, normal_limit + 1, true); + + // Operational ones don't have this limit. + let op = DispatchInfo { weight: 0, class: DispatchClass::Operational }; + reset_check_weight(op, normal_limit, false); + reset_check_weight(op, normal_limit + 100, false); + reset_check_weight(op, 1024, false); + reset_check_weight(op, 1025, true); + }) + } + + #[test] + fn signed_ext_check_era_should_work() { + with_externalities(&mut new_test_ext(), || { + // future + assert_eq!( + CheckEra::::from(Era::mortal(4, 2)).additional_signed().err().unwrap(), + "transaction birth block ancient" + ); + + // correct + System::set_block_number(13); + >::insert(12, H256::repeat_byte(1)); + assert!(CheckEra::::from(Era::mortal(4, 12)).additional_signed().is_ok()); + }) + } } diff --git a/srml/timestamp/Cargo.toml b/srml/timestamp/Cargo.toml index bb82d1a42b8ebac9af43d71c9ceb4e669afcd96e..9b066a15058d72192460553c663e8689f0f544cd 100644 --- a/srml/timestamp/Cargo.toml +++ b/srml/timestamp/Cargo.toml @@ -6,24 +6,24 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] runtime_io = { package = "sr-io", path = "../../core/sr-io" } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] std = [ "inherents/std", - "parity-codec/std", + "codec/std", "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", "srml-support/std", "serde", "system/std", diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index 48a0d04c32198275f2fa03f8d43e580344609be9..502acadf61e330bc2fda515caa11ba7025d89852 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -90,14 +90,18 @@ #![cfg_attr(not(feature = "std"), no_std)] -use rstd::{result, ops::{Mul, Div}, cmp}; -use parity_codec::Encode; +use rstd::{result, cmp}; +use codec::Encode; #[cfg(feature = "std")] -use parity_codec::Decode; +use codec::Decode; #[cfg(feature = "std")] use inherents::ProvideInherentData; -use srml_support::{StorageValue, Parameter, decl_storage, decl_module, for_each_tuple, traits::Get}; -use runtime_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion}; +use srml_support::{StorageValue, Parameter, decl_storage, decl_module, for_each_tuple}; +use srml_support::traits::{Time, Get}; +use sr_primitives::traits::{ + SimpleArithmetic, Zero, SaturatedConversion, Scale +}; +use sr_primitives::weights::SimpleDispatchInfo; use system::ensure_none; use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData}; @@ -131,7 +135,7 @@ impl InherentError { #[cfg(feature = "std")] pub fn try_from(id: &InherentIdentifier, data: &[u8]) -> Option { if id == &INHERENT_IDENTIFIER { - ::decode(&mut &data[..]) + ::decode(&mut &data[..]).ok() } else { None } @@ -168,7 +172,7 @@ impl ProvideInherentData for InherentDataProvider { .map_err(|_| { "Current time is before unix epoch".into() }).and_then(|d| { - let duration: InherentType = d.as_secs(); + let duration: InherentType = d.as_millis() as u64; inherent_data.put_data(INHERENT_IDENTIFIER, &duration) }) } @@ -205,8 +209,7 @@ for_each_tuple!(impl_timestamp_set); pub trait Trait: system::Trait { /// Type used for expressing timestamp. type Moment: Parameter + Default + SimpleArithmetic - + Mul - + Div; + + Scale; /// Something which can be notified when the timestamp is set. Set this to `()` if not needed. type OnTimestampSet: OnTimestampSet; @@ -235,6 +238,7 @@ decl_module! { /// `MinimumPeriod`. /// /// The dispatch origin for this call must be `Inherent`. + #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn set(origin, #[compact] now: T::Moment) { ensure_none(origin)?; assert!(!::DidUpdate::exists(), "Timestamp must be updated only once in the block"); @@ -321,14 +325,23 @@ impl ProvideInherent for Module { } } +impl Time for Module { + type Moment = T::Moment; + + /// Before the first set of now with inherent the value returned is zero. + fn now() -> Self::Moment { + Self::now() + } +} + #[cfg(test)] mod tests { use super::*; use srml_support::{impl_outer_origin, assert_ok, parameter_types}; use runtime_io::{with_externalities, TestExternalities}; - use substrate_primitives::H256; - use runtime_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header}; + use primitives::H256; + use sr_primitives::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; impl_outer_origin! { pub enum Origin for Test {} @@ -338,18 +351,26 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const MinimumPeriod: u64 = 5; @@ -364,7 +385,7 @@ mod tests { #[test] fn timestamp_works() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE)); assert_eq!(Timestamp::now(), 69); @@ -375,7 +396,7 @@ mod tests { #[should_panic(expected = "Timestamp must be updated only once in the block")] fn double_timestamp_should_fail() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE)); let _ = Timestamp::dispatch(Call::set(70), Origin::NONE); @@ -386,7 +407,7 @@ mod tests { #[should_panic(expected = "Timestamp must increment by at least between sequential blocks")] fn block_period_minimum_enforced() { let t = system::GenesisConfig::default().build_storage::().unwrap(); - with_externalities(&mut TestExternalities::new_with_children(t), || { + with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); let _ = Timestamp::dispatch(Call::set(46), Origin::NONE); }); diff --git a/srml/treasury/Cargo.toml b/srml/treasury/Cargo.toml index 64190f9c4fb8123560db3b0f4c138b91fab37a17..ae2681e11b48e5e7ac665dd517d06e171d61d4e1 100644 --- a/srml/treasury/Cargo.toml +++ b/srml/treasury/Cargo.toml @@ -6,24 +6,24 @@ edition = "2018" [dependencies] serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } balances = { package = "srml-balances", path = "../balances", default-features = false } [dev-dependencies] runtime_io = { package = "sr-io", path = "../../core/sr-io" } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } [features] default = ["std"] std = [ "serde", - "parity-codec/std", + "codec/std", "rstd/std", - "runtime_primitives/std", + "sr-primitives/std", "srml-support/std", "system/std", "balances/std", diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index 268233c37e419d12119bc647becefaf3606aca59..25cb9ebda9d8b2997fba323dda880fe360875a1b 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -75,11 +75,12 @@ use srml_support::traits::{ Currency, ExistenceRequirement, Get, Imbalance, OnDilution, OnUnbalanced, ReservableCurrency, WithdrawReason }; -use runtime_primitives::{Permill, ModuleId}; -use runtime_primitives::traits::{ +use sr_primitives::{Permill, ModuleId}; +use sr_primitives::traits::{ Zero, EnsureOrigin, StaticLookup, CheckedSub, CheckedMul, AccountIdConversion }; -use parity_codec::{Encode, Decode}; +use sr_primitives::weights::SimpleDispatchInfo; +use codec::{Encode, Decode}; use system::ensure_signed; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -153,6 +154,7 @@ decl_module! { /// - Limited storage reads. /// - One DB change, one extra DB entry. /// # + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] fn propose_spend( origin, #[compact] value: BalanceOf, @@ -179,6 +181,7 @@ decl_module! { /// - Limited storage reads. /// - One DB clear. /// # + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) { T::RejectOrigin::ensure_origin(origin)?; let proposal = >::take(proposal_id).ok_or("No proposal at that index")?; @@ -196,6 +199,7 @@ decl_module! { /// - Limited storage reads. /// - One DB change. /// # + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) { T::ApproveOrigin::ensure_origin(origin)?; @@ -359,8 +363,8 @@ mod tests { use runtime_io::with_externalities; use srml_support::{assert_noop, assert_ok, impl_outer_origin, parameter_types}; - use substrate_primitives::{H256, Blake2Hasher}; - use runtime_primitives::{traits::{BlakeTwo256, OnFinalize, IdentityLookup}, testing::Header}; + use primitives::{H256, Blake2Hasher}; + use sr_primitives::{Perbill, traits::{BlakeTwo256, OnFinalize, IdentityLookup}, testing::Header}; impl_outer_origin! { pub enum Origin for Test {} @@ -370,18 +374,26 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: u32 = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; + type Call = (); type Hash = H256; type Hashing = BlakeTwo256; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; + type WeightMultiplierUpdate = (); type Event = (); type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type AvailableBlockRatio = AvailableBlockRatio; + type MaximumBlockLength = MaximumBlockLength; } parameter_types! { pub const ExistentialDeposit: u64 = 0; @@ -403,6 +415,7 @@ mod tests { type CreationFee = CreationFee; type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; + type WeightToFee = (); } parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); @@ -426,11 +439,11 @@ mod tests { type Treasury = Module; fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap().0; - t.extend(balances::GenesisConfig::{ + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + balances::GenesisConfig::{ balances: vec![(0, 100), (1, 99), (2, 1)], vesting: vec![], - }.build_storage().unwrap().0); + }.assimilate_storage(&mut t).unwrap(); t.into() } diff --git a/subkey/Cargo.toml b/subkey/Cargo.toml index 699448e17407c39dffc4fa0b48a098089b56fb70..9e7112a029c203d84eeac2ee79fb2d05fe542a5e 100644 --- a/subkey/Cargo.toml +++ b/subkey/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -substrate-primitives = { version = "*", path = "../core/primitives" } +primitives = { package = "substrate-primitives", version = "*", path = "../core/primitives" } node-runtime = { version = "*", path = "../node/runtime" } node-primitives = { version = "*", path = "../node/primitives" } sr-primitives = { version = "*", path = "../core/sr-primitives" } @@ -13,11 +13,12 @@ rand = "0.6" clap = { version = "~2.32", features = ["yaml"] } tiny-bip39 = "0.6.0" rustc-hex = "2.0" -substrate-bip39 = "0.2.2" -schnorrkel = "0.1.1" +substrate-bip39 = "0.3.1" hex = "0.3" hex-literal = "0.2" -parity-codec = "4.1.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } +system = { package = "srml-system", path = "../srml/system" } +balances = { package = "srml-balances", path = "../srml/balances" } [features] bench = [] diff --git a/subkey/src/cli.yml b/subkey/src/cli.yml index 89190df3624f5e3310ad125eacf98fce2ce622db..b4f99f8743fa545898a93e06e9693c737b66bc16 100644 --- a/subkey/src/cli.yml +++ b/subkey/src/cli.yml @@ -18,6 +18,12 @@ args: takes_value: true required: false help: The password for the key + - network: + short: n + long: network + takes_value: true + required: false + help: Specify a network. One of substrate (default), polkadot and kusama. subcommands: - generate: about: Generate a random account diff --git a/subkey/src/main.rs b/subkey/src/main.rs index 7cff0d6414f262578acf645fbcc1a0f92a8bd840..fde301b44f25c7b9954a8517a7c7f56579f46cdc 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -18,15 +18,18 @@ #[cfg(feature = "bench")] extern crate test; -use std::{str::FromStr, io::{stdin, Read}}; +use std::{str::FromStr, io::{stdin, Read}, convert::TryInto}; use hex_literal::hex; use clap::load_yaml; use bip39::{Mnemonic, Language, MnemonicType}; -use substrate_primitives::{ed25519, sr25519, hexdisplay::HexDisplay, Pair, Public, crypto::Ss58Codec, blake2_256}; -use parity_codec::{Encode, Decode, Compact}; +use primitives::{ + ed25519, sr25519, hexdisplay::HexDisplay, Pair, Public, blake2_256, + crypto::{Ss58Codec, set_default_ss58_version, Ss58AddressFormat} +}; +use codec::{Encode, Decode}; use sr_primitives::generic::Era; use node_primitives::{Balance, Index, Hash}; -use node_runtime::{Call, UncheckedExtrinsic, BalancesCall}; +use node_runtime::{Call, UncheckedExtrinsic, BalancesCall, Runtime}; mod vanity; @@ -38,7 +41,11 @@ trait Crypto { } fn ss58_from_pair(pair: &Self::Pair) -> String { pair.public().to_ss58check() } fn public_from_pair(pair: &Self::Pair) -> Vec { pair.public().as_ref().to_owned() } - fn print_from_uri(uri: &str, password: Option<&str>) where ::Public: Sized + Ss58Codec + AsRef<[u8]> { + fn print_from_uri( + uri: &str, + password: Option<&str>, + network_override: Option, + ) where ::Public: Sized + Ss58Codec + AsRef<[u8]> { if let Ok((pair, seed)) = Self::Pair::from_phrase(uri, password) { println!("Secret phrase `{}` is account:\n Secret seed: 0x{}\n Public key (hex): 0x{}\n Address (SS58): {}", uri, @@ -52,11 +59,13 @@ trait Crypto { HexDisplay::from(&Self::public_from_pair(&pair)), Self::ss58_from_pair(&pair) ); - } else if let Ok(public) = ::Public::from_string(uri) { - println!("Public Key URI `{}` is account:\n Public key (hex): 0x{}\n Address (SS58): {}", + } else if let Ok((public, v)) = ::Public::from_string_with_version(uri) { + let v = network_override.unwrap_or(v); + println!("Public Key URI `{}` is account:\n Network ID/version: {}\n Public key (hex): 0x{}\n Address (SS58): {}", uri, + String::from(v), HexDisplay::from(&public.as_ref()), - public.to_ss58check() + public.to_ss58check_with_version(v) ); } else { println!("Invalid phrase/URI given"); @@ -84,9 +93,25 @@ impl Crypto for Sr25519 { fn execute(matches: clap::ArgMatches) where <::Pair as Pair>::Signature: AsRef<[u8]> + AsMut<[u8]> + Default, - <::Pair as Pair>::Public: Sized + AsRef<[u8]> + Ss58Codec + AsRef<<::Pair as Pair>::Public>, + <::Pair as Pair>::Public: Sized + AsRef<[u8]> + Ss58Codec, { + let extra = |i: Index, f: Balance| { + ( + system::CheckGenesis::::new(), + system::CheckEra::::from(Era::Immortal), + system::CheckNonce::::from(i), + system::CheckWeight::::new(), + balances::TakeFees::::from(f), + ) + }; let password = matches.value_of("password"); + let maybe_network: Option = matches.value_of("network") + .map(|network| network.try_into() + .expect("Invalid network name: must be polkadot/substrate/kusama") + ); + if let Some(network) = maybe_network { + set_default_ss58_version(network); + } match matches.subcommand() { ("generate", Some(matches)) => { // create a new randomly generated mnemonic phrase @@ -96,17 +121,21 @@ fn execute(matches: clap::ArgMatches) where .expect("Invalid number of words given for phrase: must be 12/15/18/21/24") ).unwrap_or(MnemonicType::Words12); let mnemonic = Mnemonic::new(words, Language::English); - C::print_from_uri(mnemonic.phrase(), password); + C::print_from_uri(mnemonic.phrase(), password, maybe_network); } ("inspect", Some(matches)) => { let uri = matches.value_of("uri") .expect("URI parameter is required; thus it can't be None; qed"); - C::print_from_uri(uri, password); + C::print_from_uri(uri, password, maybe_network); } ("vanity", Some(matches)) => { let desired: String = matches.value_of("pattern").map(str::to_string).unwrap_or_default(); let result = vanity::generate_key::(&desired).expect("Key generation failed"); - C::print_from_uri(&format!("0x{}", HexDisplay::from(&result.seed.as_ref())), None); + C::print_from_uri( + &format!("0x{}", HexDisplay::from(&result.seed.as_ref())), + None, + maybe_network + ); } ("sign", Some(matches)) => { let suri = matches.value_of("suri") @@ -146,14 +175,17 @@ fn execute(matches: clap::ArgMatches) where let genesis_hash: Hash = match matches.value_of("genesis").unwrap_or("alex") { "elm" => hex!["10c08714a10c7da78f40a60f6f732cf0dba97acfb5e2035445b032386157d5c3"].into(), "alex" => hex!["dcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b"].into(), - h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..])) - .expect("Invalid genesis hash or unrecognised chain identifier"), + h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..]).ok()) + .expect("Invalid genesis hash or unrecognised chain identifier"), }; println!("Using a genesis hash of {}", HexDisplay::from(&genesis_hash.as_ref())); - let era = Era::immortal(); - let raw_payload = (Compact(index), function, era, genesis_hash); + let raw_payload = ( + function, + extra(index, 0), + (&genesis_hash, &genesis_hash), + ); let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { signer.sign(&blake2_256(payload)[..]) } else { @@ -161,11 +193,10 @@ fn execute(matches: clap::ArgMatches) where signer.sign(payload) }); let extrinsic = UncheckedExtrinsic::new_signed( - index, - raw_payload.1, + raw_payload.0, signer.public().into(), signature.into(), - era, + extra(index, 0), ); println!("0x{}", hex::encode(&extrinsic.encode())); } @@ -182,17 +213,22 @@ fn execute(matches: clap::ArgMatches) where let call = matches.value_of("call") .expect("call is required; thus it can't be None; qed"); let function: Call = hex::decode(&call).ok() - .and_then(|x| Decode::decode(&mut &x[..])).unwrap(); + .and_then(|x| Decode::decode(&mut &x[..]).ok()).unwrap(); - let h = matches.value_of("prior-block-hash") - .expect("prior-block-hash is required; thus it can't be None; qed"); - let prior_block_hash: Hash = hex::decode(h).ok() - .and_then(|x| Decode::decode(&mut &x[..])) - .expect("Invalid prior block hash"); + let genesis_hash: Hash = match matches.value_of("genesis").unwrap_or("alex") { + "elm" => hex!["10c08714a10c7da78f40a60f6f732cf0dba97acfb5e2035445b032386157d5c3"].into(), + "alex" => hex!["dcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b"].into(), + h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..]).ok()) + .expect("Invalid genesis hash or unrecognised chain identifier"), + }; - let era = Era::immortal(); + println!("Using a genesis hash of {}", HexDisplay::from(&genesis_hash.as_ref())); - let raw_payload = (Compact(index), function, era, prior_block_hash); + let raw_payload = ( + function, + extra(index, 0), + (&genesis_hash, &genesis_hash), + ); let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { signer.sign(&blake2_256(payload)[..]) @@ -202,11 +238,10 @@ fn execute(matches: clap::ArgMatches) where ); let extrinsic = UncheckedExtrinsic::new_signed( - index, - raw_payload.1, + raw_payload.0, signer.public().into(), signature.into(), - era, + extra(index, 0), ); println!("0x{}", hex::encode(&extrinsic.encode())); @@ -264,7 +299,7 @@ mod tests { fn should_work() { let s = "0123456789012345678901234567890123456789012345678901234567890123"; - let d1: Hash = hex::decode(s).ok().and_then(|x| Decode::decode(&mut &x[..])).unwrap(); + let d1: Hash = hex::decode(s).ok().and_then(|x| Decode::decode(&mut &x[..]).ok()).unwrap(); let d2: Hash = { let mut gh: [u8; 32] = Default::default(); diff --git a/subkey/src/vanity.rs b/subkey/src/vanity.rs index ea1a609218e65a5efd2b27c90ce0a523baeb142c..988055c67cac4402c67f8c2da3d2afe469027ec9 100644 --- a/subkey/src/vanity.rs +++ b/subkey/src/vanity.rs @@ -16,7 +16,7 @@ use rand::{rngs::OsRng, RngCore}; use super::Crypto; -use substrate_primitives::Pair; +use primitives::Pair; fn good_waypoint(done: u64) -> u64 { match done { @@ -103,7 +103,7 @@ pub(super) fn generate_key(desired: &str) -> Result, &str> mod tests { use super::*; use super::super::Ed25519; - use substrate_primitives::{Pair, crypto::Ss58Codec}; + use primitives::{Pair, crypto::Ss58Codec}; #[cfg(feature = "bench")] use test::Bencher; diff --git a/test-utils/chain-spec-builder/Cargo.toml b/test-utils/chain-spec-builder/Cargo.toml index a54094d8c7920b9a0be8b2a3176464d25f76099f..1e048a91cdb92d51ff78293dcb133f98772dc60e 100644 --- a/test-utils/chain-spec-builder/Cargo.toml +++ b/test-utils/chain-spec-builder/Cargo.toml @@ -7,5 +7,5 @@ edition = "2018" [dependencies] clap = { version = "~2.32", features = ["yaml"] } node-cli = { path = "../../node/cli" } -substrate-primitives = { path = "../../core/primitives" } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } substrate-service = { path = "../../core/service" } diff --git a/test-utils/chain-spec-builder/src/main.rs b/test-utils/chain-spec-builder/src/main.rs index 211e8321e3fd1c409c64f8ee8f5d7cd16d9125e0..13b4cc38a16463f3166f18fef09a482e8ffb52db 100644 --- a/test-utils/chain-spec-builder/src/main.rs +++ b/test-utils/chain-spec-builder/src/main.rs @@ -1,6 +1,6 @@ use clap::{App, load_yaml}; -use node_cli::chain_spec; +use node_cli::chain_spec::{self, AccountId}; use substrate_service::chain_ops::build_spec; fn genesis_constructor() -> chain_spec::GenesisConfig { @@ -13,11 +13,11 @@ fn genesis_constructor() -> chain_spec::GenesisConfig { let endowed_accounts = matches.values_of("endowed_account_seed") .unwrap() - .map(chain_spec::get_account_id_from_seed) + .map(chain_spec::get_from_seed::) .collect(); let sudo_key_seed = matches.value_of("sudo_key_seed").unwrap(); - let sudo_key = chain_spec::get_account_id_from_seed(sudo_key_seed); + let sudo_key = chain_spec::get_from_seed::(sudo_key_seed); let enable_println = true; diff --git a/test-utils/transaction-factory/Cargo.toml b/test-utils/transaction-factory/Cargo.toml index 2868b4f5372eedf4dae28ad887a20ebb3b2844ef..f3c392c3d66ded30d9a3798b3cde37297588a57a 100644 --- a/test-utils/transaction-factory/Cargo.toml +++ b/test-utils/transaction-factory/Cargo.toml @@ -9,14 +9,14 @@ cli = { package = "substrate-cli", path = "../../core/cli" } client = { package = "substrate-client", path = "../../core/client" } consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } log = "0.4" -parity-codec = { version = "4.1.1", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } -sr_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } substrate-service = { path = "../../core/service" } [features] default = ["std"] std = [ - "parity-codec/std", - "primitives/std", + "codec/std", + "sr-primitives/std", ] diff --git a/test-utils/transaction-factory/src/complex_mode.rs b/test-utils/transaction-factory/src/complex_mode.rs index 0d383c30256f9390ea8ddf530cc31e6a57c0537b..25170f8c1888b8e425ac3781186eb25fdd7574c7 100644 --- a/test-utils/transaction-factory/src/complex_mode.rs +++ b/test-utils/transaction-factory/src/complex_mode.rs @@ -54,6 +54,7 @@ use crate::{RuntimeAdapter, create_block}; pub fn next( factory_state: &mut RA, client: &Arc>>, + genesis_hash: ::Hash, prior_block_hash: ::Hash, prior_block_id: BlockId, ) -> Option<::Block> @@ -83,19 +84,15 @@ where let seed = factory_state.start_number() + factory_state.block_no(); let to = RA::gen_random_account_id(&seed); - let amount; - if factory_state.round() == RA::Number::zero() { - amount = RA::minimum_balance() * factory_state.rounds(); - } else { - let rounds_left = factory_state.rounds() - factory_state.round(); - amount = RA::minimum_balance() * rounds_left; - }; + let rounds_left = factory_state.rounds() - factory_state.round(); + let amount = RA::minimum_balance() * rounds_left.into(); let transfer = factory_state.transfer_extrinsic( &from.0, &from.1, &to, &amount, + &genesis_hash, &prior_block_hash, ); diff --git a/test-utils/transaction-factory/src/lib.rs b/test-utils/transaction-factory/src/lib.rs index e90ca412ac7d9aa3a21e85282780dc26e65c953e..ab7dfb8ceab221c7159bf3ea4e7576ccc6e8cf7c 100644 --- a/test-utils/transaction-factory/src/lib.rs +++ b/test-utils/transaction-factory/src/lib.rs @@ -21,7 +21,6 @@ use std::collections::HashMap; use std::sync::Arc; -use std::ops::Mul; use std::cmp::PartialOrd; use std::fmt::Display; @@ -30,11 +29,11 @@ use log::info; use client::block_builder::api::BlockBuilder; use client::runtime_api::ConstructRuntimeApi; use consensus_common::{ - BlockOrigin, ImportBlock, InherentData, ForkChoiceStrategy, + BlockOrigin, BlockImportParams, InherentData, ForkChoiceStrategy, SelectChain }; use consensus_common::block_import::BlockImport; -use parity_codec::{Decode, Encode}; +use codec::{Decode, Encode}; use sr_primitives::generic::BlockId; use sr_primitives::traits::{ Block as BlockT, Header as HeaderT, ProvideRuntimeApi, SimpleArithmetic, @@ -51,7 +50,7 @@ mod simple_modes; pub trait RuntimeAdapter { type AccountId: Display; - type Balance: Display + Mul; + type Balance: Display + SimpleArithmetic + From; type Block: BlockT; type Index: Copy; type Number: Display + PartialOrd + SimpleArithmetic + Zero + One; @@ -77,13 +76,14 @@ pub trait RuntimeAdapter { sender: &Self::AccountId, key: &Self::Secret, destination: &Self::AccountId, - amount: &Self::Number, + amount: &Self::Balance, + genesis_hash: &::Hash, prior_block_hash: &::Hash, ) -> ::Extrinsic; fn inherent_extrinsics(&self) -> InherentData; - fn minimum_balance() -> Self::Number; + fn minimum_balance() -> Self::Balance; fn master_account_id() -> Self::AccountId; fn master_account_secret() -> Self::Secret; fn extract_index(&self, account_id: &Self::AccountId, block_hash: &::Hash) -> Self::Index; @@ -119,12 +119,24 @@ where select_chain.best_chain().map_err(|e| format!("{:?}", e).into()); let mut best_hash = best_header?.hash(); let best_block_id = BlockId::::hash(best_hash); + let genesis_hash = client.block_hash(Zero::zero())? + .expect("Genesis block always exists; qed").into(); while let Some(block) = match factory_state.mode() { - Mode::MasterToNToM => - complex_mode::next::(&mut factory_state, &client, best_hash.into(), best_block_id), - _ => - simple_modes::next::(&mut factory_state, &client, best_hash.into(), best_block_id) + Mode::MasterToNToM => complex_mode::next::( + &mut factory_state, + &client, + genesis_hash, + best_hash.into(), + best_block_id, + ), + _ => simple_modes::next::( + &mut factory_state, + &client, + genesis_hash, + best_hash.into(), + best_block_id, + ), } { best_hash = block.header().hash(); import_block::(&client, block); @@ -166,7 +178,7 @@ fn import_block( block: ::Block ) -> () where F: ServiceFactory { - let import = ImportBlock { + let import = BlockImportParams { origin: BlockOrigin::File, header: block.header().clone(), post_digests: Vec::new(), diff --git a/test-utils/transaction-factory/src/simple_modes.rs b/test-utils/transaction-factory/src/simple_modes.rs index 4ce7b47e6fc52d2c887964d35150c09dd0fe267b..0554678fbbd0d058e1224c2930c67f41dafde59a 100644 --- a/test-utils/transaction-factory/src/simple_modes.rs +++ b/test-utils/transaction-factory/src/simple_modes.rs @@ -49,6 +49,7 @@ use crate::{Mode, RuntimeAdapter, create_block}; pub fn next( factory_state: &mut RA, client: &Arc>>, + genesis_hash: ::Hash, prior_block_hash: ::Hash, prior_block_id: BlockId, ) -> Option<::Block> @@ -82,6 +83,7 @@ where &from.1, &to, &amount, + &genesis_hash, &prior_block_hash, );